]> gitweb.factorcode.org Git - factor.git/commitdiff
Merge branch 'master' into propagation
authorDaniel Ehrenberg <littledan@Macintosh-122.local>
Tue, 15 Jun 2010 17:26:01 +0000 (13:26 -0400)
committerDaniel Ehrenberg <littledan@Macintosh-122.local>
Tue, 15 Jun 2010 17:26:01 +0000 (13:26 -0400)
385 files changed:
GNUmakefile
Nmakefile
basis/alarms/alarms-docs.factor
basis/alarms/alarms-tests.factor
basis/alarms/alarms.factor
basis/alien/arrays/arrays.factor
basis/alien/c-types/c-types-docs.factor
basis/alien/c-types/c-types.factor
basis/alien/data/data-tests.factor [new file with mode: 0644]
basis/alien/data/data.factor
basis/alien/fortran/fortran.factor
basis/alien/libraries/libraries.factor
basis/alien/parser/parser.factor
basis/alien/prettyprint/prettyprint-tests.factor [new file with mode: 0644]
basis/alien/prettyprint/prettyprint.factor
basis/bootstrap/image/download/download.factor
basis/bootstrap/image/image.factor
basis/bootstrap/stage2.factor
basis/calendar/model/model.factor
basis/checksums/md5/md5.factor
basis/checksums/openssl/openssl.factor
basis/checksums/sha/sha.factor
basis/classes/struct/struct-tests.factor
basis/classes/struct/struct.factor
basis/cocoa/messages/messages.factor
basis/cocoa/nibs/nibs.factor
basis/cocoa/plists/plists.factor
basis/combinators/smart/smart.factor
basis/command-line/command-line.factor
basis/compiler/cfg/build-stack-frame/build-stack-frame.factor
basis/compiler/cfg/builder/alien/alien.factor
basis/compiler/cfg/builder/alien/boxing/authors.txt [new file with mode: 0644]
basis/compiler/cfg/builder/alien/boxing/boxing.factor [new file with mode: 0644]
basis/compiler/cfg/builder/alien/params/params.factor
basis/compiler/cfg/cfg.factor
basis/compiler/cfg/def-use/def-use.factor
basis/compiler/cfg/finalization/finalization.factor
basis/compiler/cfg/gc-checks/gc-checks-tests.factor
basis/compiler/cfg/gc-checks/gc-checks.factor
basis/compiler/cfg/instructions/instructions.factor
basis/compiler/cfg/intrinsics/intrinsics.factor
basis/compiler/cfg/intrinsics/misc/misc.factor
basis/compiler/cfg/intrinsics/simd/backend/backend.factor
basis/compiler/cfg/intrinsics/simd/simd.factor
basis/compiler/cfg/linear-scan/allocation/allocation.factor
basis/compiler/cfg/linear-scan/allocation/state/state.factor
basis/compiler/cfg/linear-scan/assignment/assignment.factor
basis/compiler/cfg/linear-scan/linear-scan-tests.factor
basis/compiler/cfg/linear-scan/linear-scan.factor
basis/compiler/cfg/linear-scan/live-intervals/live-intervals.factor
basis/compiler/cfg/liveness/liveness.factor
basis/compiler/cfg/representations/preferred/preferred.factor
basis/compiler/cfg/save-contexts/save-contexts.factor
basis/compiler/cfg/ssa/destruction/destruction.factor
basis/compiler/cfg/ssa/interference/interference-tests.factor
basis/compiler/cfg/ssa/interference/interference.factor
basis/compiler/cfg/ssa/interference/live-ranges/live-ranges.factor
basis/compiler/cfg/stack-frame/stack-frame.factor
basis/compiler/cfg/stacks/uninitialized/uninitialized.factor
basis/compiler/cfg/value-numbering/comparisons/comparisons.factor
basis/compiler/cfg/value-numbering/simd/simd.factor
basis/compiler/cfg/value-numbering/value-numbering-tests.factor
basis/compiler/codegen/codegen.factor
basis/compiler/codegen/fixup/fixup-tests.factor [new file with mode: 0644]
basis/compiler/codegen/fixup/fixup.factor
basis/compiler/tests/alien.factor
basis/compiler/tests/float.factor
basis/compiler/tests/spilling.factor
basis/compiler/tree/propagation/known-words/known-words.factor
basis/compiler/tree/propagation/transforms/transforms.factor
basis/concurrency/conditions/conditions.factor
basis/core-foundation/core-foundation.factor
basis/core-foundation/fsevents/fsevents.factor
basis/core-foundation/strings/strings.factor
basis/core-graphics/types/types.factor
basis/core-text/core-text.factor
basis/cpu/architecture/architecture.factor
basis/cpu/ppc/linux/linux.factor
basis/cpu/ppc/macosx/macosx.factor
basis/cpu/ppc/ppc.factor
basis/cpu/x86/32/32.factor
basis/cpu/x86/32/bootstrap.factor
basis/cpu/x86/64/64-tests.factor
basis/cpu/x86/64/64.factor
basis/cpu/x86/64/bootstrap.factor
basis/cpu/x86/64/unix/unix.factor
basis/cpu/x86/64/winnt/winnt.factor
basis/cpu/x86/assembler/assembler-tests.factor
basis/cpu/x86/assembler/assembler.factor
basis/cpu/x86/assembler/operands/operands.factor
basis/cpu/x86/assembler/syntax/syntax.factor
basis/cpu/x86/features/features.factor
basis/cpu/x86/sse/authors.txt [new file with mode: 0644]
basis/cpu/x86/sse/sse.factor [new file with mode: 0644]
basis/cpu/x86/sse/tags.txt [new file with mode: 0644]
basis/cpu/x86/x86.factor
basis/cpu/x86/x87/authors.txt [new file with mode: 0644]
basis/cpu/x86/x87/tags.txt [new file with mode: 0644]
basis/cpu/x86/x87/x87.factor [new file with mode: 0644]
basis/db/postgresql/lib/lib.factor
basis/db/sqlite/lib/lib.factor
basis/db/tuples/tuples.factor
basis/delegate/delegate.factor
basis/furnace/cache/cache.factor
basis/game/input/x11/x11.factor
basis/generalizations/generalizations-docs.factor
basis/generalizations/generalizations-tests.factor
basis/generalizations/generalizations.factor
basis/grouping/grouping-docs.factor
basis/help/lint/checks/checks.factor
basis/images/bitmap/bitmap.factor
basis/images/normalization/normalization.factor
basis/images/png/png.factor
basis/inverse/inverse.factor
basis/io/backend/unix/unix.factor
basis/io/backend/windows/nt/nt.factor [changed mode: 0644->0755]
basis/io/backend/windows/nt/privileges/privileges.factor
basis/io/encodings/iana/iana.factor
basis/io/files/info/windows/windows.factor [changed mode: 0644->0755]
basis/io/launcher/unix/unix.factor
basis/io/launcher/windows/windows.factor
basis/io/ports/ports-tests.factor
basis/io/sockets/windows/nt/nt.factor
basis/io/thread/thread.factor
basis/io/timeouts/timeouts.factor
basis/iokit/iokit.factor
basis/json/reader/reader-docs.factor
basis/json/reader/reader-tests.factor
basis/json/reader/reader.factor
basis/libc/libc.factor
basis/locals/rewrite/sugar/sugar.factor
basis/logging/insomniac/insomniac.factor
basis/logging/logging.factor
basis/math/bitwise/bitwise.factor
basis/math/floats/env/x86/64/64.factor
basis/math/primes/factors/factors.factor
basis/math/primes/primes-tests.factor
basis/math/primes/primes.factor
basis/math/vectors/conversion/conversion-tests.factor
basis/math/vectors/simd/intrinsics/intrinsics.factor
basis/math/vectors/simd/mirrors/mirrors.factor
basis/math/vectors/simd/simd-tests.factor
basis/math/vectors/simd/simd.factor
basis/mirrors/mirrors.factor
basis/models/arrow/smart/smart.factor
basis/models/delay/delay.factor
basis/models/models.factor
basis/models/range/range.factor
basis/nibble-arrays/nibble-arrays.factor
basis/nmake/nmake.factor
basis/opengl/framebuffers/framebuffers.factor
basis/opengl/gl/extensions/extensions.factor
basis/opengl/gl/unix/authors.txt [deleted file]
basis/opengl/gl/unix/platforms.txt [deleted file]
basis/opengl/gl/unix/unix.factor [deleted file]
basis/opengl/gl/x11/authors.txt [new file with mode: 0755]
basis/opengl/gl/x11/platforms.txt [new file with mode: 0644]
basis/opengl/gl/x11/x11.factor [new file with mode: 0644]
basis/opengl/opengl.factor
basis/opengl/shaders/shaders.factor
basis/opengl/textures/textures.factor
basis/pango/cairo/cairo.factor
basis/prettyprint/backend/backend.factor
basis/random/sfmt/sfmt.factor
basis/random/windows/windows.factor [changed mode: 0644->0755]
basis/sequences/cords/cords.factor
basis/sequences/generalizations/generalizations-docs.factor
basis/sequences/generalizations/generalizations-tests.factor
basis/sequences/generalizations/generalizations.factor
basis/sequences/unrolled/authors.txt [new file with mode: 0644]
basis/sequences/unrolled/summary.txt [new file with mode: 0644]
basis/sequences/unrolled/unrolled-docs.factor [new file with mode: 0644]
basis/sequences/unrolled/unrolled-tests.factor [new file with mode: 0644]
basis/sequences/unrolled/unrolled.factor [new file with mode: 0644]
basis/shuffle/shuffle.factor
basis/specialized-arrays/mirrors/mirrors.factor
basis/specialized-arrays/specialized-arrays-docs.factor
basis/specialized-arrays/specialized-arrays-tests.factor
basis/specialized-arrays/specialized-arrays.factor
basis/specialized-vectors/mirrors/authors.txt [new file with mode: 0644]
basis/specialized-vectors/mirrors/mirrors.factor [new file with mode: 0644]
basis/specialized-vectors/specialized-vectors-docs.factor
basis/specialized-vectors/specialized-vectors.factor
basis/stack-checker/alien/alien.factor
basis/system-info/windows/nt/nt-tests.factor [new file with mode: 0755]
basis/system-info/windows/nt/nt.factor
basis/tools/annotations/annotations.factor
basis/tools/completion/completion.factor
basis/tools/deploy/macosx/macosx.factor
basis/tools/errors/model/model.factor
basis/tools/memory/memory.factor
basis/tools/test/test.factor
basis/typed/prettyprint/prettyprint.factor
basis/typed/typed-tests.factor
basis/typed/typed.factor
basis/ui/backend/cocoa/cocoa.factor
basis/ui/backend/windows/windows.factor
basis/ui/backend/x11/x11.factor
basis/ui/gadgets/editors/editors.factor
basis/ui/gadgets/worlds/worlds.factor
basis/ui/gestures/gestures.factor
basis/ui/render/render.factor
basis/ui/tools/listener/listener.factor
basis/ui/tools/tools.factor
basis/ui/ui-docs.factor
basis/ui/ui.factor
basis/unicode/data/data.factor
basis/unix/ffi/ffi.factor
basis/unix/process/process.factor
basis/unix/unix.factor
basis/vocabs/refresh/monitor/monitor.factor
basis/windows/com/wrapper/wrapper.factor
basis/windows/dwmapi/dwmapi.factor
basis/windows/offscreen/offscreen.factor
basis/windows/uniscribe/uniscribe.factor [changed mode: 0644->0755]
basis/x11/clipboard/clipboard.factor
basis/x11/events/events.factor
basis/x11/windows/platforms.txt [deleted file]
basis/x11/windows/windows.factor
basis/x11/xinput2/authors.txt [new file with mode: 0644]
basis/x11/xinput2/constants/authors.txt [new file with mode: 0644]
basis/x11/xinput2/constants/constants.factor [new file with mode: 0644]
basis/x11/xinput2/ffi/authors.txt [new file with mode: 0644]
basis/x11/xinput2/ffi/ffi.factor [new file with mode: 0644]
basis/x11/xinput2/xinput2.factor [new file with mode: 0644]
basis/x11/xlib/xlib.factor
basis/xml/syntax/inverse/inverse.factor
basis/xml/syntax/syntax.factor
basis/xmode/catalog/catalog.factor
basis/xmode/modes/catalog
basis/xmode/modes/cuda.xml [new file with mode: 0644]
build-support/factor.cmd [new file with mode: 0644]
build-support/http-get.vbs [new file with mode: 0644]
core/combinators/combinators-docs.factor
core/effects/effects-docs.factor
core/io/files/files-tests.factor
core/io/streams/byte-array/byte-array-tests.factor
core/io/streams/c/c-tests.factor
core/sets/sets-docs.factor
core/syntax/syntax-docs.factor
core/vocabs/loader/loader-docs.factor
core/vocabs/loader/loader.factor
extra/alien/data/map/map-tests.factor
extra/audio/engine/engine.factor
extra/audio/engine/test/test.factor
extra/benchmark/binary-trees/binary-trees.factor
extra/benchmark/binary-trees/deploy.factor [new file with mode: 0644]
extra/benchmark/fasta/deploy.factor [new file with mode: 0644]
extra/benchmark/knucleotide/deploy.factor [new file with mode: 0644]
extra/benchmark/knucleotide/knucleotide-input.txt
extra/benchmark/knucleotide/knucleotide.factor
extra/benchmark/nbody-simd/deploy.factor [new file with mode: 0644]
extra/benchmark/nbody-simd/nbody-simd.factor
extra/benchmark/regex-dna/deploy.factor
extra/benchmark/regex-dna/regex-dna.factor
extra/benchmark/reverse-complement/deploy.factor [new file with mode: 0644]
extra/benchmark/spectral-norm-simd/authors.txt [new file with mode: 0644]
extra/benchmark/spectral-norm-simd/spectral-norm-simd.factor [new file with mode: 0644]
extra/benchmark/spectral-norm/deploy.factor [new file with mode: 0644]
extra/benchmark/spectral-norm/spectral-norm.factor
extra/bson/bson-tests.factor
extra/bson/bson.factor
extra/bson/constants/constants.factor
extra/bson/reader/reader.factor
extra/bson/summary.txt
extra/bson/writer/writer.factor
extra/c/lexer/lexer.factor
extra/chipmunk/demo/demo.factor
extra/constructors/constructors.factor
extra/cuda/contexts/contexts.factor [new file with mode: 0644]
extra/cuda/cuda.factor
extra/cuda/demos/hello-world/hello-world.factor
extra/cuda/demos/prefix-sum/prefix-sum.factor
extra/cuda/devices/devices.factor
extra/cuda/ffi/ffi.factor
extra/cuda/gl/ffi/ffi.factor
extra/cuda/gl/gl.factor
extra/cuda/libraries/libraries.factor
extra/cuda/memory/memory.factor
extra/cuda/syntax/syntax.factor
extra/cuda/utils/utils.factor [deleted file]
extra/db/info/info.factor [deleted file]
extra/demos/demos.factor
extra/descriptive/descriptive.factor
extra/ecdsa/ecdsa.factor
extra/elf/elf.factor
extra/fluids/fluids.factor
extra/game/debug/tests/tests.factor
extra/game/input/demos/joysticks/authors.txt [new file with mode: 0644]
extra/game/input/demos/joysticks/deploy.factor [new file with mode: 0644]
extra/game/input/demos/joysticks/joysticks.factor [new file with mode: 0644]
extra/game/input/demos/joysticks/summary.txt [new file with mode: 0644]
extra/game/input/demos/joysticks/tags.txt [new file with mode: 0755]
extra/game/input/demos/key-caps/authors.txt [new file with mode: 0644]
extra/game/input/demos/key-caps/key-caps.factor [new file with mode: 0644]
extra/game/input/demos/key-caps/summary.txt [new file with mode: 0644]
extra/game/input/demos/key-caps/tags.txt [new file with mode: 0755]
extra/game/loop/loop-docs.factor
extra/game/loop/loop.factor
extra/game/worlds/worlds-docs.factor
extra/game/worlds/worlds.factor
extra/geo-ip/geo-ip.factor
extra/gpu/buffers/buffers-docs.factor
extra/gpu/buffers/buffers.factor
extra/gpu/demos/bunny/bunny.factor
extra/gpu/demos/raytrace/raytrace.factor
extra/gpu/render/render.factor
extra/gpu/textures/textures.factor
extra/grid-meshes/grid-meshes-tests.factor
extra/images/viewer/tags.txt [new file with mode: 0644]
extra/images/viewer/viewer-docs.factor [new file with mode: 0644]
extra/images/viewer/viewer-tests.factor [new file with mode: 0644]
extra/images/viewer/viewer.factor
extra/io/encodings/detect/authors.txt [new file with mode: 0644]
extra/io/encodings/detect/detect-tests.factor [new file with mode: 0644]
extra/io/encodings/detect/detect.factor [new file with mode: 0644]
extra/io/encodings/detect/summary.txt [new file with mode: 0644]
extra/joystick-demo/authors.txt [deleted file]
extra/joystick-demo/deploy.factor [deleted file]
extra/joystick-demo/joystick-demo.factor [deleted file]
extra/joystick-demo/summary.txt [deleted file]
extra/joystick-demo/tags.txt [deleted file]
extra/key-caps/authors.txt [deleted file]
extra/key-caps/key-caps.factor [deleted file]
extra/key-caps/summary.txt [deleted file]
extra/key-caps/tags.txt [deleted file]
extra/key-logger/authors.txt [new file with mode: 0644]
extra/key-logger/deploy.factor [new file with mode: 0644]
extra/key-logger/key-logger.factor [new file with mode: 0644]
extra/koszul/koszul.factor
extra/llvm/invoker/invoker.factor
extra/mason/updates/updates.factor
extra/math/matrices/simd/simd.factor
extra/model-viewer/model-viewer.factor
extra/mongodb/benchmark/benchmark.factor
extra/mongodb/cmd/cmd.factor [new file with mode: 0644]
extra/mongodb/connection/connection.factor
extra/mongodb/driver/driver.factor
extra/mongodb/gridfs/gridfs.factor [new file with mode: 0644]
extra/mongodb/mongodb-docs.factor
extra/mongodb/msg/msg.factor
extra/mongodb/operations/operations.factor
extra/mongodb/tuple/persistent/persistent.factor
extra/mongodb/tuple/tuple.factor
extra/multi-methods/multi-methods.factor
extra/nehe/2/2.factor
extra/nehe/4/4.factor
extra/nehe/5/5.factor
extra/noise/noise.factor
extra/project-euler/206/206.factor
extra/site-watcher/site-watcher.factor
extra/smalltalk/compiler/compiler.factor
extra/terrain/terrain.factor
extra/tetris/tetris.factor
vm/alien.cpp
vm/alien.hpp
vm/bitwise_hacks.hpp
vm/byte_arrays.cpp
vm/byte_arrays.hpp
vm/callstack.cpp
vm/code_block_visitor.hpp
vm/code_blocks.hpp
vm/collector.hpp
vm/compaction.cpp
vm/contexts.cpp
vm/contexts.hpp
vm/data_heap.cpp
vm/fixup.hpp [new file with mode: 0644]
vm/free_list_allocator.hpp
vm/full_collector.cpp
vm/full_collector.hpp
vm/gc.cpp
vm/gc.hpp
vm/gc_info.cpp [new file with mode: 0644]
vm/gc_info.hpp [new file with mode: 0644]
vm/image.cpp
vm/jit.cpp
vm/layouts.hpp
vm/mark_bits.hpp
vm/master.hpp
vm/math.cpp
vm/math.hpp
vm/objects.cpp
vm/slot_visitor.hpp
vm/vm.hpp

index 300a62f71cb8646b2c8560eef2c5d5df8daa3767..89f7ae1446319fa668d35a0c1facba72abfe38a0 100755 (executable)
@@ -46,6 +46,7 @@ ifdef CONFIG
                vm/free_list.o \
                vm/full_collector.o \
                vm/gc.o \
+               vm/gc_info.o \
                vm/image.o \
                vm/inline_cache.o \
                vm/instruction_operands.o \
index d0b543d7abde02fe8837031ba727191c5f1930da..a8b7e103ec21b312b3d862cc57a65671a615c3fb 100755 (executable)
--- a/Nmakefile
+++ b/Nmakefile
@@ -1,3 +1,7 @@
+!IF !DEFINED(BOOTIMAGE_VERSION)
+BOOTIMAGE_VERSION = latest
+!ENDIF
+
 !IF DEFINED(PLATFORM)
 
 LINK_FLAGS = /nologo shell32.lib
@@ -44,6 +48,7 @@ DLL_OBJS = $(PLAF_DLL_OBJS) \
        vm\free_list.obj \
        vm\full_collector.obj \
        vm\gc.obj \
+       vm/gc_info.obj \
        vm\image.obj \
        vm\inline_cache.obj \
        vm\instruction_operands.obj \
@@ -102,18 +107,19 @@ default:
        @exit 1
 
 x86-32:
-       nmake PLATFORM=x86-32 /f Nmakefile all
+       nmake /nologo PLATFORM=x86-32 /f Nmakefile all
 
 x86-64:
-       nmake PLATFORM=x86-64 /f Nmakefile all
+       nmake /nologo PLATFORM=x86-64 /f Nmakefile all
 
 clean:
        del vm\*.obj
-       del factor.lib
-       del factor.com
-       del factor.exe
-       del factor.dll
-       del factor.dll.lib
+       if exist factor.lib del factor.lib
+       if exist factor.res del factor.res
+       if exist factor.com del factor.com
+       if exist factor.exe del factor.exe
+       if exist factor.dll del factor.dll
+       if exist factor.dll.lib del factor.dll.lib
 
 .PHONY: all default x86-32 x86-64 clean
 
index 396011a3515e26d791e29a7a8153ea6cf7924d47..3b70b43a2892782e994e731d564122a3d791044b 100644 (file)
@@ -2,46 +2,49 @@ USING: help.markup help.syntax calendar quotations system ;
 IN: alarms\r
 \r
 HELP: alarm\r
-{ $class-description "An alarm. Can be passed to " { $link cancel-alarm } "." } ;\r
+{ $class-description "An alarm. Can be passed to " { $link stop-alarm } "." } ;\r
 \r
-HELP: current-alarm\r
-{ $description "A symbol that contains the currently executing alarm, availble only to the alarm quotation. One use for this symbol is if a repeated alarm wishes to cancel itself from executing in the future."\r
-}\r
+HELP: start-alarm\r
+{ $values { "alarm" alarm } }\r
+{ $description "Starts an alarm." } ;\r
+\r
+HELP: restart-alarm\r
+{ $values { "alarm" alarm } }\r
+{ $description "Starts or restarts an alarm. Restarting an alarm causes the a sleep of initial delay nanoseconds before looping. An alarm's parameters may be modified and restarted with this word." } ;\r
+\r
+HELP: stop-alarm\r
+{ $values { "alarm" alarm } }\r
+{ $description "Prevents an alarm from calling its quotation again. Has no effect on alarms that are not currently running." } ;\r
+\r
+HELP: every\r
+{ $values\r
+     { "quot" quotation } { "interval-duration" duration }\r
+     { "alarm" alarm } }\r
+{ $description "Creates an alarm that calls the quotation repeatedly, using " { $snippet "duration" } " as the frequency. The first call of " { $snippet "quot" } " will happen immediately. If the quotation throws an exception, the alarm will stop." }\r
 { $examples\r
     { $unchecked-example\r
-        """USING: alarms calendar io threads ;"""\r
-        """["""\r
-        """    "Hi, this should only get printed once..." print flush"""\r
-        """    current-alarm get cancel-alarm"""\r
-        """] 1 seconds every"""\r
+        "USING: alarms io calendar ;"\r
+        """[ "Hi Buddy." print flush ] 10 seconds every drop"""\r
         ""\r
     }\r
 } ;\r
 \r
-HELP: add-alarm\r
-{ $values { "quot" quotation } { "start" duration } { "interval" { $maybe "duration/f" } } { "alarm" alarm } }\r
-{ $description "Creates and registers an alarm to start at " { $snippet "start" } " offset from the current time. If " { $snippet "interval" } " is " { $link f } ", this will be a one-time alarm, otherwise it will fire with the given frequency, with scheduling happening before the quotation is called in order to ensure that the next event will happen on time. The quotation will be called from a new thread spawned by the alarm thread. If a repeated alarm's quotation throws an exception, the alarm will not be rescheduled." } ;\r
-\r
 HELP: later\r
-{ $values { "quot" quotation } { "duration" duration } { "alarm" alarm } }\r
-{ $description "Creates and registers an alarm which calls the quotation once at " { $snippet "duration" } " offset from now." }\r
+{ $values { "quot" quotation } { "delay-duration" duration } { "alarm" alarm } }\r
+{ $description "Sleeps for " { $snippet "duration" } " and then calls a " { $snippet "quot" } ". The user may cancel the alarm before " { $snippet "quot" } " runs. This alarm is not repeated." }\r
 { $examples\r
     { $unchecked-example\r
         "USING: alarms io calendar ;"\r
-        """[ "Break's over!" print flush ] 15 minutes drop"""\r
+        """[ "Break's over!" print flush ] 15 minutes later drop"""\r
         ""\r
     }\r
 } ;\r
 \r
-HELP: cancel-alarm\r
-{ $values { "alarm" alarm } }\r
-{ $description "Cancels an alarm. Does nothing if the alarm is not active." } ;\r
-\r
-HELP: every\r
+HELP: delayed-every\r
 { $values\r
      { "quot" quotation } { "duration" duration }\r
      { "alarm" alarm } }\r
-{ $description "Creates and registers an alarm which calls the quotation repeatedly, using " { $snippet "dt" } " as the frequency. If the quotation throws an exception that is not caught inside it, the alarm scheduler will cancel the alarm and will not reschedule it again." }\r
+{ $description "Creates an alarm that calls " { $snippet "quot" } " repeatedly, waiting " { $snippet "duration" } " before calling " { $snippet "quot" } " the first time and then waiting " { $snippet "duration" } " between further calls. If the quotation throws an exception, the alarm will stop." }\r
 { $examples\r
     { $unchecked-example\r
         "USING: alarms io calendar ;"\r
@@ -51,19 +54,21 @@ HELP: every
 } ;\r
 \r
 ARTICLE: "alarms" "Alarms"\r
-"The " { $vocab-link "alarms" } " vocabulary provides a lightweight way to schedule one-time and recurring tasks without spawning a new thread. Alarms use " { $link nano-count } ", so they continue to work across system clock changes." $nl\r
+"The " { $vocab-link "alarms" } " vocabulary provides a lightweight way to schedule one-time and recurring tasks. Alarms run in a single green thread per alarm and consist of a quotation, a delay duration, and an interval duration. After starting an alarm, the alarm thread sleeps for the delay duration and calls the quotation. Then it waits out the interval duration and calls the quotation again until something stops the alarm. If a recurring alarm's quotation would be scheduled to run again before the previous quotation has finished processing, the alarm will be run again immediately afterwards. This may result in the alarm falling behind indefinitely, in which case the it will run as often as possible while still allowing other green threads to run. Recurring alarms that execute 'on time' or 'catch up' will always be scheduled for an exact multiple of the interval from the original starting time to prevent the alarm from drifting over time. Alarms use " { $link nano-count } " as the timing primitive, so they will continue to work across system clock changes." $nl\r
 "The alarm class:"\r
 { $subsections alarm }\r
-"Register a recurring alarm:"\r
+"Create an alarm before starting it:"\r
+{ $subsections <alarm> }\r
+"Starting an alarm:"\r
+{ $subsections start-alarm restart-alarm }\r
+"Stopping an alarm:"\r
+{ $subsections stop-alarm }\r
+\r
+"A recurring alarm without an initial delay:"\r
 { $subsections every }\r
-"Register a one-time alarm:"\r
+"A one-time alarm with an initial delay:"\r
 { $subsections later }\r
-"The currently executing alarm:"\r
-{ $subsections current-alarm }\r
-"Low-level interface to add alarms:"\r
-{ $subsections add-alarm }\r
-"Cancelling an alarm:"\r
-{ $subsections cancel-alarm }\r
-"Alarms do not persist across image saves. Saving and restoring an image has the effect of calling " { $link cancel-alarm } " on all " { $link alarm } " instances." ;\r
+"A recurring alarm with an initial delay:"\r
+{ $subsections delayed-every } ;\r
 \r
 ABOUT: "alarms"\r
index 8f7868324d1f874061bf0f07de26015280f96c23..ed1ab632aef62d152a320161b364b8df99f776f0 100644 (file)
@@ -1,11 +1,12 @@
-USING: alarms alarms.private kernel calendar sequences\r
-tools.test threads concurrency.count-downs ;\r
+USING: alarms alarms.private calendar concurrency.count-downs\r
+concurrency.promises fry kernel math math.order sequences\r
+threads tools.test tools.time ;\r
 IN: alarms.tests\r
 \r
 [ ] [\r
     1 <count-down>\r
     { f } clone 2dup\r
-    [ first cancel-alarm count-down ] 2curry 1 seconds later\r
+    [ first stop-alarm count-down ] 2curry 1 seconds later\r
     swap set-first\r
     await\r
 ] unit-test\r
@@ -14,3 +15,53 @@ IN: alarms.tests
     self [ resume ] curry instant later drop\r
     "test" suspend drop\r
 ] unit-test\r
+\r
+[ t ] [\r
+    [\r
+        <promise>\r
+        [ '[ t _ fulfill ] 2 seconds later drop ]\r
+        [ 5 seconds ?promise-timeout drop ] bi\r
+    ] benchmark 1,500,000,000 2,500,000,000 between?\r
+] unit-test\r
+\r
+[ { 3 } ] [\r
+    { 3 } dup\r
+    '[ 4 _ set-first ] 2 seconds later\r
+    1/2 seconds sleep\r
+    stop-alarm\r
+] unit-test\r
+\r
+[ { 1 } ] [\r
+    { 0 }\r
+    dup '[ 0 _ [ 1 + ] change-nth ] 3 seconds later\r
+    [ stop-alarm ] [ start-alarm ] bi\r
+    4 seconds sleep\r
+] unit-test\r
+\r
+[ { 0 } ] [\r
+    { 0 }\r
+    dup '[ 3 seconds sleep 1 _ set-first ] 1 seconds later\r
+    2 seconds sleep stop-alarm\r
+    1/2 seconds sleep\r
+] unit-test\r
+\r
+[ { 0 } ] [\r
+    { 0 }\r
+    dup '[ 1 _ set-first ] 300 milliseconds later\r
+    150 milliseconds sleep\r
+    [ restart-alarm ] [ 200 milliseconds sleep stop-alarm ] bi\r
+] unit-test\r
+\r
+[ { 1 } ] [\r
+    { 0 }\r
+    dup '[ 0 _ [ 1 + ] change-nth ] 200 milliseconds later\r
+    100 milliseconds sleep restart-alarm 300 milliseconds sleep\r
+] unit-test\r
+\r
+[ { 4 } ] [\r
+    { 0 }\r
+    dup '[ 0 _ [ 1 + ] change-nth ] 300 milliseconds 300 milliseconds\r
+    <alarm> dup start-alarm\r
+    700 milliseconds sleep dup restart-alarm\r
+    700 milliseconds sleep stop-alarm 500 milliseconds sleep\r
+] unit-test\r
index 9ab30a1fa4db79b3fde7bb4417e2308b6ddc8cf9..92035a19c8d16277267cf6491c238eb93de19935 100644 (file)
 ! Copyright (C) 2005, 2008 Slava Pestov, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs boxes calendar combinators.short-circuit
-continuations fry heaps init kernel math.order
-namespaces quotations threads math system ;
+USING: accessors assocs calendar combinators.short-circuit fry
+heaps init kernel math math.functions math.parser namespaces
+quotations sequences system threads ;
 IN: alarms
 
 TUPLE: alarm
     { quot callable initial: [ ] }
-    { start integer }
-    interval
-    { entry box } ;
-
-SYMBOL: alarms
-SYMBOL: alarm-thread
-SYMBOL: current-alarm
-
-: cancel-alarm ( alarm -- )
-    entry>> [ alarms get-global heap-delete ] if-box? ;
+    start-nanos 
+    delay-nanos
+    interval-nanos
+    iteration-start-nanos
+    quotation-running?
+    restart?
+    thread ;
 
 <PRIVATE
 
-: notify-alarm-thread ( -- )
-    alarm-thread get-global interrupt ;
-
 GENERIC: >nanoseconds ( obj -- duration/f )
 M: f >nanoseconds ;
 M: real >nanoseconds >integer ;
 M: duration >nanoseconds duration>nanoseconds >integer ;
 
-: <alarm> ( quot start interval -- alarm )
-    alarm new
-        swap >nanoseconds >>interval
-        swap >nanoseconds nano-count + >>start
-        swap >>quot
-        <box> >>entry ;
-
-: register-alarm ( alarm -- )
-    [ dup start>> alarms get-global heap-push* ]
-    [ entry>> >box ] bi
-    notify-alarm-thread ;
-
-: alarm-expired? ( alarm n -- ? )
-    [ start>> ] dip <= ;
-
-: reschedule-alarm ( alarm -- )
-    dup interval>> nano-count + >>start register-alarm ;
+: set-next-alarm-time ( alarm -- alarm )
+    ! start + delay + ceiling((now - (start + delay)) / interval) * interval
+    nano-count 
+    over start-nanos>> -
+    over delay-nanos>> [ - ] when*
+    over interval-nanos>> / ceiling
+    over interval-nanos>> *
+    over start-nanos>> +
+    over delay-nanos>> [ + ] when*
+    >>iteration-start-nanos ;
+
+: stop-alarm? ( alarm -- ? )
+    { [ thread>> self eq? not ] [ restart?>> ] } 1|| ;
+
+DEFER: call-alarm-loop
+
+: loop-alarm ( alarm -- )
+    nano-count over
+    [ iteration-start-nanos>> - ] [ interval-nanos>> ] bi <
+    [ set-next-alarm-time ] dip
+    [ dup iteration-start-nanos>> ] [ 0 ] if
+    0 or sleep-until call-alarm-loop ;
+
+: maybe-loop-alarm ( alarm -- )
+    dup { [ stop-alarm? ] [ interval-nanos>> not ] } 1||
+    [ drop ] [ loop-alarm ] if ;
+
+: call-alarm-loop ( alarm -- )
+    dup stop-alarm? [
+        drop
+    ] [
+        [
+            [ t >>quotation-running? drop ]
+            [ quot>> call( -- ) ]
+            [ f >>quotation-running? drop ] tri
+        ] keep
+        maybe-loop-alarm
+    ] if ;
 
-: call-alarm ( alarm -- )
-    [ entry>> box> drop ]
-    [ dup interval>> [ reschedule-alarm ] [ drop ] if ]
-    [
-        [ ] [ quot>> ] [ ] tri
-        '[
-            _ current-alarm
-            [
-                _ [ _ dup interval>> [ cancel-alarm ] [ drop ] if rethrow ]
-                recover
-            ] with-variable
-        ] "Alarm execution" spawn drop
-    ] tri ;
-
-: (trigger-alarms) ( alarms n -- )
-    over heap-empty? [
-        2drop
+: sleep-delay ( alarm -- )
+    dup stop-alarm? [
+        drop
     ] [
-        over heap-peek drop over alarm-expired? [
-            over heap-pop drop call-alarm (trigger-alarms)
-        ] [
-            2drop
-        ] if
+        nano-count >>start-nanos
+        delay-nanos>> [ sleep ] when*
     ] if ;
 
-: trigger-alarms ( alarms -- )
-    nano-count (trigger-alarms) ;
+: alarm-loop ( alarm -- )
+    [ sleep-delay ]
+    [ nano-count >>iteration-start-nanos call-alarm-loop ]
+    [ dup restart?>> [ f >>restart? alarm-loop ] [ drop ] if ] tri ;
 
-: next-alarm ( alarms -- nanos/f )
-    dup heap-empty? [ drop f ] [ heap-peek drop start>> ] if ;
+PRIVATE>
 
-: alarm-thread-loop ( -- )
-    alarms get-global
-    dup next-alarm sleep-until
-    trigger-alarms ;
+: <alarm> ( quot delay-duration/f interval-duration/f -- alarm )
+    alarm new
+        swap >nanoseconds >>interval-nanos
+        swap >nanoseconds >>delay-nanos
+        swap >>quot ; inline
 
-: cancel-alarms ( alarms -- )
+: start-alarm ( alarm -- )
     [
-        heap-pop-all [ nip entry>> box> drop ] assoc-each
-    ] when* ;
+        '[ _ alarm-loop ] "Alarm execution" spawn
+    ] keep thread<< ;
+
+: stop-alarm ( alarm -- )
+    dup quotation-running?>> [
+        f >>thread drop
+    ] [
+        [ [ interrupt ] when* f ] change-thread drop
+    ] if ;
 
-: init-alarms ( -- )
-    alarms [ cancel-alarms <min-heap> ] change-global
-    [ alarm-thread-loop t ] "Alarms" spawn-server
-    alarm-thread set-global ;
+: restart-alarm ( alarm -- )
+    t >>restart?
+    dup quotation-running?>> [
+        drop
+    ] [
+        dup thread>> [ nip interrupt ] [ start-alarm ] if*
+    ] if ;
+
+<PRIVATE
 
-[ init-alarms ] "alarms" add-startup-hook
+: (start-alarm) ( quot start-duration interval-duration -- alarm )
+    <alarm> [ start-alarm ] keep ;
 
 PRIVATE>
 
-: add-alarm ( quot start interval -- alarm )
-    <alarm> [ register-alarm ] keep ;
+: every ( quot interval-duration -- alarm )
+    [ f ] dip (start-alarm) ;
 
-: later ( quot duration -- alarm ) f add-alarm ;
+: later ( quot delay-duration -- alarm )
+    f (start-alarm) ;
 
-: every ( quot duration -- alarm ) dup add-alarm ;
+: delayed-every ( quot duration -- alarm )
+    dup (start-alarm) ;
index a58549627cce7148f596c3ad64550a0279c7db3a..42e40483f6789a79a014058421e6e16ad440ccc1 100644 (file)
@@ -24,8 +24,6 @@ M: array c-type-align-first first c-type-align-first ;
 
 M: array base-type drop void* base-type ;
 
-M: array stack-size drop void* stack-size ;
-
 PREDICATE: string-type < pair
     first2 [ c-string = ] [ word? ] bi* and ;
 
@@ -43,8 +41,6 @@ M: string-type c-type-align-first drop void* c-type-align-first ;
 
 M: string-type base-type drop void* base-type ;
 
-M: string-type stack-size drop void* stack-size ;
-
 M: string-type c-type-rep drop int-rep ;
 
 M: string-type c-type-boxer-quot
index bf26dd5f88687adba8de6c1ea4a50d72c7a5c9d5..32c1d18d51d0154eec25e0bd7faa69b3b1f536da 100644 (file)
@@ -1,47 +1,42 @@
 USING: alien alien.complex help.syntax help.markup libc kernel.private
 byte-arrays strings hashtables alien.syntax alien.strings sequences
 io.encodings.string debugger destructors vocabs.loader
-classes.struct ;
+classes.struct math kernel ;
 QUALIFIED: math
 QUALIFIED: sequences
 IN: alien.c-types
 
 HELP: heap-size
-{ $values { "name" "a C type name" } { "size" math:integer } }
+{ $values { "name" c-type-name } { "size" math:integer } }
 { $description "Outputs the number of bytes needed for a heap-allocated value of this C type." }
 { $examples
     { $example "USING: alien alien.c-types prettyprint ;\nint heap-size ." "4" }
 }
 { $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ;
 
-HELP: stack-size
-{ $values { "name" "a C type name" } { "size" math:integer } }
-{ $description "Outputs the number of bytes to reserve on the C stack by a value of this C type. In most cases this is equal to " { $link heap-size } ", except on some platforms where C structs are passed by invisible reference, in which case a C struct type only uses as much space as a pointer on the C stack." }
-{ $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ;
-
 HELP: <c-type>
 { $values { "c-type" c-type } }
 { $description "Creates a prototypical C type. User code should use higher-level facilities to define C types; see " { $link "c-data" } "." } ;
 
 HELP: no-c-type
-{ $values { "name" "a C type name" } }
+{ $values { "name" c-type-name } }
 { $description "Throws a " { $link no-c-type } " error." }
 { $error-description "Thrown by " { $link c-type } " if a given string does not name a C type. When thrown during compile time, indicates a typo in an " { $link alien-invoke } " or " { $link alien-callback } " form." } ;
 
 HELP: c-type
-{ $values { "name" "a C type" } { "c-type" c-type } }
+{ $values { "name" c-type-name } { "c-type" c-type } }
 { $description "Looks up a C type by name." }
 { $errors "Throws a " { $link no-c-type } " error if the type does not exist, or the word is not a C type." } ;
 
-HELP: c-getter
-{ $values { "name" "a C type" } { "quot" { $quotation "( c-ptr n -- obj )" } } }
-{ $description "Outputs a quotation which reads values of this C type from a C structure." }
+HELP: alien-value
+{ $values { "c-ptr" c-ptr } { "offset" integer } { "c-type" c-type-name } { "value" object } }
+{ $description "Loads a value at a byte offset from a base C pointer." }
 { $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ;
 
-HELP: c-setter
-{ $values { "name" "a C type" } { "quot" { $quotation "( obj c-ptr n -- )" } } }
-{ $description "Outputs a quotation which writes values of this C type to a C structure." }
-{ $errors "Throws an error if the type does not exist." } ;
+HELP: set-alien-value
+{ $values { "value" object } { "c-ptr" c-ptr } { "offset" integer } { "c-type" c-type-name } }
+{ $description "Stores a value at a byte offset from a base C pointer." }
+{ $errors "Throws a " { $link no-c-type } " error if the type does not exist." } ;
 
 HELP: define-deref
 { $values { "c-type" "a C type" } }
index 03c35d62516c726d168c34a22eacfe77a7fb2ee3..412bf9259a89e82cc18654ef99858eac5e91d8ee 100644 (file)
@@ -6,7 +6,7 @@ words splitting cpu.architecture alien alien.accessors
 alien.strings quotations layouts system compiler.units io
 io.files io.encodings.binary io.streams.memory accessors
 combinators effects continuations fry classes vocabs
-vocabs.loader words.symbol ;
+vocabs.loader words.symbol macros ;
 QUALIFIED: math
 IN: alien.c-types
 
@@ -17,8 +17,7 @@ SYMBOLS:
     long ulong
     longlong ulonglong
     float double
-    void* bool
-    (stack-value) ;
+    void* bool ;
 
 SINGLETON: void
 
@@ -94,7 +93,7 @@ GENERIC: c-type-setter ( name -- quot )
 
 M: c-type c-type-setter setter>> ;
 
-GENERIC: c-type-align ( name -- n )
+GENERIC: c-type-align ( name -- n ) foldable
 
 M: abstract-c-type c-type-align align>> ;
 
@@ -114,24 +113,24 @@ GENERIC: heap-size ( name -- size )
 
 M: abstract-c-type heap-size size>> ;
 
-GENERIC: stack-size ( name -- size )
-
-M: c-type stack-size size>> cell align ;
-
 MIXIN: value-type
 
-: c-getter ( name -- quot )
+MACRO: alien-value ( c-type -- quot: ( c-ptr offset -- value ) )
     [ c-type-getter ] [ c-type-boxer-quot ] bi append ;
 
-: c-setter ( name -- quot )
+MACRO: set-alien-value ( c-type -- quot: ( value c-ptr offset -- ) )
     [ c-type-unboxer-quot [ [ ] ] [ '[ _ 2dip ] ] if-empty ]
     [ c-type-setter ]
     bi append ;
 
-: array-accessor ( c-type quot -- def )
-    [
-        \ swap , [ heap-size , [ * >fixnum ] % ] [ % ] bi*
-    ] [ ] make ;
+: array-accessor ( n c-ptr c-type -- c-ptr offset c-type )
+    [ swapd heap-size * >fixnum ] keep ; inline
+
+: alien-element ( n c-ptr c-type -- value )
+    array-accessor alien-value ; inline
+
+: set-alien-element ( value n c-ptr c-type -- )
+    array-accessor set-alien-value ; inline
 
 PROTOCOL: c-type-protocol 
     c-type-class
@@ -144,8 +143,7 @@ PROTOCOL: c-type-protocol
     c-type-align
     c-type-align-first
     base-type
-    heap-size
-    stack-size ;
+    heap-size ;
 
 CONSULT: c-type-protocol c-type-name
     c-type ;
@@ -165,12 +163,13 @@ TUPLE: long-long-type < c-type ;
     long-long-type new ;
 
 : define-deref ( c-type -- )
-    [ name>> CHAR: * prefix "alien.c-types" create ] [ c-getter 0 prefix ] bi
-    (( c-ptr -- value )) define-inline ;
+    [ name>> CHAR: * prefix "alien.c-types" create ]
+    [ '[ 0 _ alien-value ] ]
+    bi (( c-ptr -- value )) define-inline ;
 
 : define-out ( c-type -- )
     [ name>> "alien.c-types" constructor-word ]
-    [ dup c-setter '[ _ heap-size (byte-array) [ 0 @ ] keep ] ] bi
+    [ dup '[ _ heap-size (byte-array) [ 0 _ set-alien-value ] keep ] ] bi
     (( value -- c-ptr )) define-inline ;
 
 : define-primitive-type ( c-type name -- )
@@ -195,15 +194,19 @@ CONSTANT: primitive-types
         c-string
     }
 
-: (pointer-c-type) ( void* type -- void*' )
-    [ clone ] dip c-type-boxer-quot '[ _ [ f ] if* ] >>boxer-quot ;
-
 : >c-bool ( ? -- int ) 1 0 ? ; inline
 
 : c-bool> ( int -- ? ) 0 = not ; inline
 
 <PRIVATE
 
+: 8-byte-alignment ( c-type -- c-type )
+    {
+        { [ cpu ppc? os macosx? and ] [ 4 >>align 8 >>align-first ] }
+        { [ cpu x86.32? os windows? not and ] [ 4 >>align 4 >>align-first ] }
+        [ 8 >>align 8 >>align-first ]
+    } cond ;
+
 : resolve-pointer-typedef ( type -- base-type )
     dup "c-type" word-prop dup word?
     [ nip resolve-pointer-typedef ] [
@@ -215,19 +218,15 @@ CONSTANT: primitive-types
         resolve-pointer-typedef [ void? ] [ primitive-types member? ] bi or
     ] [ drop t ] if ;
 
+: (pointer-c-type) ( void* type -- void*' )
+    [ clone ] dip c-type-boxer-quot '[ _ [ f ] if* ] >>boxer-quot ;
+
 PRIVATE>
 
 M: pointer c-type
     [ \ void* c-type ] dip
     to>> dup primitive-pointer-type? [ drop ] [ (pointer-c-type) ] if ;
 
-: 8-byte-alignment ( c-type -- c-type )
-    {
-        { [ cpu ppc? os macosx? and ] [ 4 >>align 8 >>align-first ] }
-        { [ cpu x86.32? os windows? not and ] [ 4 >>align 4 >>align-first ] }
-        [ 8 >>align 8 >>align-first ]
-    } cond ;
-
 [
     <c-type>
         c-ptr >>class
@@ -448,9 +447,6 @@ M: pointer c-type
         object >>boxed-class
     \ bool define-primitive-type
 
-    \ void* c-type clone stack-params >>rep
-    \ (stack-value) define-primitive-type
-
 ] with-compilation-unit
 
 M: char-16-rep rep-component-type drop char ;
diff --git a/basis/alien/data/data-tests.factor b/basis/alien/data/data-tests.factor
new file mode 100644 (file)
index 0000000..20a6c26
--- /dev/null
@@ -0,0 +1,41 @@
+USING: alien alien.c-types alien.data alien.syntax
+classes.struct kernel sequences specialized-arrays
+specialized-arrays.private tools.test compiler.units vocabs ;
+IN: alien.data.tests
+
+STRUCT: foo { a int } { b void* } { c bool } ;
+
+SPECIALIZED-ARRAY: foo
+
+[ t ] [ 0 binary-zero? ] unit-test
+[ f ] [ 1 binary-zero? ] unit-test
+[ f ] [ -1 binary-zero? ] unit-test
+[ t ] [ 0.0 binary-zero? ] unit-test
+[ f ] [ 1.0 binary-zero? ] unit-test
+[ f ] [ -0.0 binary-zero? ] unit-test
+[ t ] [ C{ 0.0 0.0 } binary-zero? ] unit-test
+[ f ] [ C{ 1.0 0.0 } binary-zero? ] unit-test
+[ f ] [ C{ -0.0 0.0 } binary-zero? ] unit-test
+[ f ] [ C{ 0.0 1.0 } binary-zero? ] unit-test
+[ f ] [ C{ 0.0 -0.0 } binary-zero? ] unit-test
+[ t ] [ f binary-zero? ] unit-test
+[ t ] [ 0 <alien> binary-zero? ] unit-test
+[ f ] [ 1 <alien> binary-zero? ] unit-test
+[ f ] [ B{ } binary-zero? ] unit-test
+[ t ] [ S{ foo f 0 f f } binary-zero? ] unit-test
+[ f ] [ S{ foo f 1 f f } binary-zero? ] unit-test
+[ f ] [ S{ foo f 0 ALIEN: 8 f } binary-zero? ] unit-test
+[ f ] [ S{ foo f 0 f t } binary-zero? ] unit-test
+[ t t f ] [
+    foo-array{
+        S{ foo f 0 f f }
+        S{ foo f 0 f f }
+        S{ foo f 1 f f }
+    } [ first binary-zero? ] [ second binary-zero? ] [ third binary-zero? ] tri
+] unit-test
+
+[ ] [
+    [
+        foo specialized-array-vocab forget-vocab
+    ] with-compilation-unit
+] unit-test
index 9922463b3333d4bf5a887472002bd2498c44175d..2f5e4b72c6803d0e8404a59137a3f4c254b076c1 100644 (file)
@@ -1,7 +1,9 @@
 ! (c)2009, 2010 Slava Pestov, Joe Groff bsd license
 USING: accessors alien alien.c-types alien.arrays alien.strings
 arrays byte-arrays cpu.architecture fry io io.encodings.binary
-io.files io.streams.memory kernel libc math sequences words ;
+io.files io.streams.memory kernel libc math math.functions 
+sequences words macros combinators generalizations ;
+QUALIFIED: math
 IN: alien.data
 
 GENERIC: require-c-array ( c-type -- )
@@ -74,3 +76,43 @@ M: array c-type-boxer-quot
     unclip [ array-length ] dip [ <c-direct-array> ] 2curry ;
 
 M: array c-type-unboxer-quot drop [ >c-ptr ] ;
+
+ERROR: local-allocation-error ;
+
+<PRIVATE
+
+: (local-allot) ( size align -- alien ) local-allocation-error ;
+
+: (cleanup-allot) ( -- )
+    ! Inhibit TCO in order for the last word in the quotation
+    ! to still be abl to access scope-allocated data.
+    ;
+
+MACRO: (local-allots) ( c-types -- quot )
+    [ '[ _ [ heap-size ] [ c-type-align ] bi (local-allot) ] ] map [ ] join ;
+
+MACRO: box-values ( c-types -- quot )
+    [ c-type-boxer-quot ] map '[ _ spread ] ;
+
+MACRO: out-parameters ( c-types -- quot )
+    [ length ] [ [ '[ 0 _ alien-value ] ] map ] bi
+    '[ _ nkeep _ spread ] ;
+
+PRIVATE>
+
+: with-scoped-allocation ( c-types quot -- )
+    [ [ (local-allots) ] [ box-values ] bi ] dip call
+    (cleanup-allot) ; inline
+
+: with-out-parameters ( c-types quot finish -- values )
+    [ [ drop (local-allots) ] [ swap out-parameters ] 2bi ] dip call
+    (cleanup-allot) ; inline
+
+GENERIC: binary-zero? ( value -- ? )
+
+M: object binary-zero? drop f ; inline
+M: f binary-zero? drop t ; inline
+M: integer binary-zero? zero? ; inline
+M: math:float binary-zero? double>bits zero? ; inline
+M: complex binary-zero? >rect [ binary-zero? ] both? ; inline
+
index 27bd183a2e848f9341849744db7203949a8b526f..3d874310841dc3b81dc59b6ca5b8b6d9e46848e9 100755 (executable)
@@ -1,11 +1,12 @@
 ! (c) 2009 Joe Groff, see BSD license
-USING: accessors alien alien.c-types alien.complex alien.data alien.parser
-grouping alien.strings alien.syntax arrays ascii assocs
-byte-arrays combinators combinators.short-circuit fry generalizations
-kernel lexer macros math math.parser namespaces parser sequences
-splitting stack-checker vectors vocabs.parser words locals
-io.encodings.ascii io.encodings.string shuffle effects math.ranges
-math.order sorting strings system alien.libraries ;
+USING: accessors alien alien.c-types alien.complex alien.data
+alien.parser grouping alien.strings alien.syntax arrays ascii
+assocs byte-arrays combinators combinators.short-circuit fry
+generalizations kernel lexer macros math math.parser namespaces
+parser sequences sequences.generalizations splitting
+stack-checker vectors vocabs.parser words locals
+io.encodings.ascii io.encodings.string shuffle effects
+math.ranges math.order sorting strings system alien.libraries ;
 QUALIFIED-WITH: alien.c-types c
 IN: alien.fortran
 
index 86249436aa2a675fe8aaf2bc4451b0bfda76d8cc..a3f52df09858237d0eed78251ec41f7b06d43f89 100755 (executable)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2009, 2010 Slava Pestov, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.strings assocs io.backend
-kernel namespaces destructors sequences system io.pathnames ;
+kernel namespaces destructors sequences strings
+system io.pathnames ;
 IN: alien.libraries
 
 : dlopen ( path -- dll ) native-string>alien (dlopen) ;
@@ -12,7 +13,7 @@ SYMBOL: libraries
 
 libraries [ H{ } clone ] initialize
 
-TUPLE: library path abi dll ;
+TUPLE: library { path string } { abi abi initial: cdecl } dll ;
 
 ERROR: no-library name ;
 
index dea96279708693113f9e6bdbe2d6311c9d0c61ac..332683a0ac02218a9400b0463ac0b16eb3dc24d3 100755 (executable)
@@ -168,8 +168,8 @@ PREDICATE: alien-callback-type-word < typedef-word
     "callback-effect" word-prop ;
 
 : global-quot ( type word -- quot )
-    name>> current-library get '[ _ _ address-of 0 ]
-    swap c-getter append ;
+    swap [ name>> current-library get ] dip
+    '[ _ _ address-of 0 _ alien-value ] ;
 
 : define-global ( type word -- )
     [ nip ] [ global-quot ] 2bi (( -- value )) define-declared ;
diff --git a/basis/alien/prettyprint/prettyprint-tests.factor b/basis/alien/prettyprint/prettyprint-tests.factor
new file mode 100644 (file)
index 0000000..3a51471
--- /dev/null
@@ -0,0 +1,55 @@
+USING: alien.c-types alien.prettyprint alien.syntax\r
+io.streams.string see tools.test prettyprint ;\r
+IN: alien.prettyprint.tests\r
+\r
+CONSTANT: FOO 10\r
+\r
+FUNCTION: int function_test ( float x, int[4][FOO] y, char* z, ushort *w ) ;\r
+\r
+[ "USING: alien.c-types alien.syntax ;\r
+IN: alien.prettyprint.tests\r
+FUNCTION: int function_test\r
+    ( float x, int[4][FOO] y, char* z, ushort* w ) ;\r
+" ] [\r
+    [ \ function_test see ] with-string-writer\r
+] unit-test\r
+\r
+FUNCTION-ALIAS: function-test int function_test\r
+    ( float x, int[4][FOO] y, char* z, ushort *w ) ;\r
+\r
+[ "USING: alien.c-types alien.syntax ;\r
+IN: alien.prettyprint.tests\r
+FUNCTION-ALIAS: function-test int function_test\r
+    ( float x, int[4][FOO] y, char* z, ushort* w ) ;\r
+" ] [\r
+    [ \ function-test see ] with-string-writer\r
+] unit-test\r
+\r
+C-TYPE: opaque-c-type\r
+\r
+[ "USING: alien.syntax ;\r
+IN: alien.prettyprint.tests\r
+C-TYPE: opaque-c-type\r
+" ] [\r
+    [ \ opaque-c-type see ] with-string-writer\r
+] unit-test\r
+\r
+TYPEDEF: pointer: int pint\r
+\r
+[ "USING: alien.c-types alien.syntax ;\r
+IN: alien.prettyprint.tests\r
+TYPEDEF: int* pint\r
+" ] [\r
+    [ \ pint see ] with-string-writer\r
+] unit-test\r
+\r
+[ "pointer: int" ] [ pointer: int unparse ] unit-test\r
+\r
+CALLBACK: void callback-test ( int x, float[4] y ) ;\r
+\r
+[ "USING: alien.c-types alien.syntax ;\r
+IN: alien.prettyprint.tests\r
+CALLBACK: void callback-test ( int x, float[4] y ) ;\r
+" ] [\r
+    [ \ callback-test see ] with-string-writer\r
+] unit-test\r
index 8ba1328dcd793e22dc8e550a43384d3fb48dc6ec..2cf90e938dfcf1fd55ae60d5f80d4419b18160f1 100644 (file)
@@ -1,10 +1,10 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel combinators alien alien.enums
 alien.strings alien.c-types alien.parser alien.syntax arrays
-assocs effects math.parser prettyprint.backend prettyprint.custom
-prettyprint.sections definitions see see.private sequences
-strings words ;
+assocs effects math.parser prettyprint prettyprint.backend
+prettyprint.custom prettyprint.sections definitions see
+see.private sequences strings words ;
 IN: alien.prettyprint
 
 M: alien pprint*
@@ -23,21 +23,26 @@ M: c-type-word declarations. drop ;
 <PRIVATE
 GENERIC: pointer-string ( pointer -- string/f )
 M: object pointer-string drop f ;
-M: word pointer-string name>> ;
+M: word pointer-string [ record-vocab ] [ name>> ] bi ;
 M: pointer pointer-string to>> pointer-string [ CHAR: * suffix ] [ f ] if* ;
+
+GENERIC: c-type-string ( c-type -- string )
+
+M: word c-type-string [ record-vocab ] [ name>> ] bi ;
+M: pointer c-type-string dup pointer-string [ ] [ unparse ] ?if ;
+M: wrapper c-type-string wrapped>> c-type-string ;
+M: array c-type-string
+    unclip
+    [ [ unparse "[" "]" surround ] map ]
+    [ c-type-string ] bi*
+    prefix "" join ;
 PRIVATE>
 
-GENERIC: pprint-c-type ( c-type -- )
-M: word pprint-c-type pprint-word ;
-M: pointer pprint-c-type
-    dup pointer-string
-    [ swap present-text ]
-    [ pprint* ] if* ;
-M: wrapper pprint-c-type wrapped>> pprint-word ;
-M: string pprint-c-type text ;
-M: array pprint-c-type pprint* ;
+: pprint-c-type ( c-type -- )
+    [ c-type-string ] keep present-text ;
 
-M: pointer pprint* \ pointer: pprint-word to>> pprint-c-type ;
+M: pointer pprint*
+    <flow \ pointer: pprint-word to>> pprint* block> ;
 
 M: typedef-word definer drop \ TYPEDEF: f ;
 
@@ -102,11 +107,11 @@ M: alien-callback-type-word synopsis*
         [ seeing-word ]
         [ "callback-library" word-prop pprint-library ]
         [ definer. ]
-        [ def>> first pprint-c-type ]
+        [ def>> first first pprint-c-type ]
         [ pprint-word ]
         [
             <block "(" text 
-            [ def>> second ] [ "callback-effect" word-prop in>> ] bi
+            [ def>> first second ] [ "callback-effect" word-prop in>> ] bi
             pprint-function-args
             ")" text block>
         ]
index e2de6219844e439ea8488777a7e77ea80fa04e64..3a1abb3b2d0a300b5e3d67f7b247d2882c6cb5e4 100644 (file)
@@ -18,20 +18,19 @@ CONSTANT: url URL" http://factorcode.org/images/latest/"
         bi = not
     ] [ drop t ] if ;
 
-: download-image ( arch -- )
-    url swap boot-image-name >url derive-url download ;
-
-: maybe-download-image ( arch -- )
-    dup boot-image-name need-new-image? [
-         dup download-image
-         need-new-image? [
-             "Boot image corrupt, or checksums.txt on server out of date" throw
-         ] when
-    ] [
-        "Boot image up to date" print
-        drop
-    ] if ;
-
-: download-my-image ( -- ) my-arch maybe-download-image ;
+: verify-image ( image -- )
+    need-new-image? [ "Boot image corrupt" throw ] when ;
+
+: download-image ( image -- )
+    [ url swap >url derive-url download ]
+    [ verify-image ]
+    bi ;
+
+: maybe-download-image ( image -- ? )
+    dup need-new-image?
+    [ download-image t ] [ drop f ] if ;
+
+: download-my-image ( -- )
+    my-arch boot-image-name maybe-download-image drop ;
 
 MAIN: download-my-image
index 62240f73ce1f044183db3af5f84f7933a5156c0c..68fbf55105c3530ec648cf3b275c893ce255cdb2 100644 (file)
@@ -3,11 +3,11 @@
 USING: alien alien.strings arrays byte-arrays generic hashtables
 hashtables.private io io.binary io.files io.encodings.binary
 io.pathnames kernel kernel.private math namespaces make parser
-prettyprint sequences strings sbufs vectors words quotations
-assocs system layouts splitting grouping growable classes
-classes.private classes.builtin classes.tuple
-classes.tuple.private vocabs vocabs.loader source-files
-definitions debugger quotations.private combinators
+prettyprint sequences sequences.generalizations strings sbufs
+vectors words quotations assocs system layouts splitting
+grouping growable classes classes.private classes.builtin
+classes.tuple classes.tuple.private vocabs vocabs.loader
+source-files definitions debugger quotations.private combinators
 combinators.short-circuit math.order math.private accessors
 slots.private generic.single.private compiler.units
 compiler.constants fry locals bootstrap.image.syntax
index da4fbc444b8f0cad187d96b22d3de51a9a42f32c..e3e8b5ddbc0c7cd6bdc045d7cb8fcc4311186cac 100644 (file)
@@ -58,7 +58,6 @@ SYMBOL: bootstrap-time
     original-error set-global
     error set-global ; inline
 
-
 [
     ! We time bootstrap
     nano-count
index 38ad986952c224800a29ca4e4b58ca1c4a94fb9e..305c31c385e2d4f90db3ff47b13ebed027aece6e 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Slava Pestov\r
+! Copyright (C) 2008, 2010 Slava Pestov\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: calendar namespaces models threads kernel init ;\r
 IN: calendar.model\r
@@ -15,5 +15,7 @@ SYMBOL: time
         (time-thread)\r
     ] "Time model update" spawn drop ;\r
 \r
-f <model> time set-global\r
-[ time-thread ] "calendar.model" add-startup-hook\r
+[\r
+    f <model> time set-global\r
+    time-thread\r
+] "calendar.model" add-startup-hook\r
index 63fdb4dee07737dbdd85b1af11cd6fe5855c64fe..f83d0354f658ebc2f8b67134d4846870da5ab259 100644 (file)
@@ -182,10 +182,10 @@ HINTS: (process-md5-block-I) { uint-array md5-state } ;
         ] each
     ] unless ;
 
-: byte-array>uint-array-le ( byte-array -- uint-array )
-    byte-array>le byte-array>uint-array ;
+: uint-array-cast-le ( byte-array -- uint-array )
+    byte-array>le uint-array-cast ;
 
-HINTS: byte-array>uint-array-le byte-array ;
+HINTS: uint-array-cast-le byte-array ;
 
 : uint-array>byte-array-le ( uint-array -- byte-array )
     underlying>> byte-array>le ;
@@ -194,7 +194,7 @@ HINTS: uint-array>byte-array-le uint-array ;
 
 M: md5-state checksum-block ( block state -- )
     [
-        [ byte-array>uint-array-le ] [ state>> ] bi* {
+        [ uint-array-cast-le ] [ state>> ] bi* {
             [ (process-md5-block-F) ]
             [ (process-md5-block-G) ]
             [ (process-md5-block-H) ]
index 095ab38ace5e0f15737ab47a5f4810fae44b3222..1fec109d5f105219ee545c69de34f75cb2e38e2d 100644 (file)
@@ -1,4 +1,4 @@
-! copyright (C) 2008 Slava Pestov
+! Copyright (C) 2008, 2010 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors byte-arrays alien.c-types alien.data kernel
 continuations destructors sequences io openssl openssl.libcrypto
@@ -47,9 +47,10 @@ M: evp-md-context dispose*
 
 : digest-value ( ctx -- value )
     handle>>
-    EVP_MAX_MD_SIZE <byte-array> 0 <int>
-    [ EVP_DigestFinal_ex ssl-error ] 2keep
-    *int memory>byte-array ;
+    { { int EVP_MAX_MD_SIZE } int }
+    [ EVP_DigestFinal_ex ssl-error ]
+    [ memory>byte-array ]
+    with-out-parameters ;
 
 PRIVATE>
 
index af0f95fa76a71d5f5c72eadf646f992b23b1e655..82d2c2b4919606e33739a5e274842e295868b15f 100644 (file)
@@ -4,7 +4,7 @@ USING: accessors checksums checksums.common checksums.stream
 combinators combinators.smart fry generalizations grouping
 io.binary kernel literals locals make math math.bitwise
 math.ranges multiline namespaces sbufs sequences
-sequences.private splitting strings ;
+sequences.generalizations sequences.private splitting strings ;
 IN: checksums.sha
 
 SINGLETON: sha1
index e841881d28190257f38862e3780646be3470958b..8bdfb8dd57852c049e857904b09e71b02f38f524 100644 (file)
@@ -2,7 +2,7 @@
 USING: accessors alien alien.c-types alien.data alien.syntax ascii
 assocs byte-arrays classes.struct classes.tuple.parser
 classes.tuple.private classes.tuple combinators compiler.tree.debugger
-compiler.units destructors io.encodings.utf8 io.pathnames
+compiler.units delegate destructors io.encodings.utf8 io.pathnames
 io.streams.string kernel libc literals math mirrors namespaces
 prettyprint prettyprint.config see sequences specialized-arrays
 system tools.test parser lexer eval layouts generic.single classes
@@ -461,3 +461,17 @@ cpu ppc? [
     [ 12 ] [ ppc-align-test-2 heap-size ] unit-test
     [ 4 ] [ "x" ppc-align-test-2 offset-of ] unit-test
 ] when
+
+STRUCT: struct-test-delegate
+    { a int } ;
+STRUCT: struct-test-delegator
+    { del struct-test-delegate }
+    { b int } ;
+CONSULT: struct-test-delegate struct-test-delegator del>> ;
+
+[ S{ struct-test-delegator f S{ struct-test-delegate f 7 } 8 } ] [
+    struct-test-delegator <struct>
+        7 >>a
+        8 >>b
+] unit-test
+
index 37cea6b9f2e2b15c17ed46df319ad7f6b6b3dba6..c15e21f65184650c6063a8c9c62ccf265b67d526 100644 (file)
@@ -10,6 +10,7 @@ slots slots.private specialized-arrays vectors words summary
 namespaces assocs vocabs.parser math.functions
 classes.struct.bit-accessors bit-arrays
 stack-checker.dependencies system layouts ;
+FROM: delegate.private => group-words slot-group-words ;
 QUALIFIED: math
 IN: classes.struct
 
@@ -38,6 +39,9 @@ SLOT: fields
 : struct-slots ( struct-class -- slots )
     "c-type" word-prop fields>> ;
 
+M: struct-class group-words
+    struct-slots slot-group-words ;
+
 ! struct allocation
 
 M: struct >c-ptr
@@ -101,8 +105,7 @@ MACRO: <struct-boa> ( class -- quot: ( ... -- struct ) )
 GENERIC: (reader-quot) ( slot -- quot )
 
 M: struct-slot-spec (reader-quot)
-    [ type>> c-getter ]
-    [ offset>> [ >c-ptr ] swap suffix ] bi prepend ;
+    [ offset>> ] [ type>> ] bi '[ >c-ptr _ _ alien-value ] ;
 
 M: struct-bit-slot-spec (reader-quot)
     [ [ offset>> ] [ bits>> ] bi bit-reader ]
@@ -113,12 +116,10 @@ M: struct-bit-slot-spec (reader-quot)
 GENERIC: (writer-quot) ( slot -- quot )
 
 M: struct-slot-spec (writer-quot)
-    [ type>> c-setter ]
-    [ offset>> [ >c-ptr ] swap suffix ] bi prepend ;
+    [ offset>> ] [ type>> ] bi '[ >c-ptr _ _ set-alien-value ] ;
 
 M: struct-bit-slot-spec (writer-quot)
-    [ offset>> ] [ bits>> ] bi bit-writer
-    [ >c-ptr ] prepose ;
+    [ offset>> ] [ bits>> ] bi bit-writer [ >c-ptr ] prepose ;
 
 : (boxer-quot) ( class -- quot )
     '[ _ memory>struct ] ;
@@ -168,14 +169,6 @@ M: struct-c-type c-type ;
 
 M: struct-c-type base-type ;
 
-M: struct-c-type stack-size
-    dup value-struct? [ heap-size cell align ] [ drop cell ] if ;
-
-HOOK: flatten-struct-type cpu ( type -- pairs )
-
-M: object flatten-struct-type
-    stack-size cell /i { int-rep f } <repetition> ;
-
 : large-struct? ( type -- ? )
     {
         { [ dup void? ] [ drop f ] }
@@ -238,17 +231,11 @@ M: struct-bit-slot-spec compute-slot-offset
 PRIVATE>
 
 M: struct byte-length class "struct-size" word-prop ; foldable
+M: struct binary-zero? binary-object <direct-uchar-array> [ 0 = ] all? ; inline
 
 ! class definition
 
 <PRIVATE
-GENERIC: binary-zero? ( value -- ? )
-
-M: object binary-zero? drop f ;
-M: f binary-zero? drop t ;
-M: number binary-zero? 0 = ;
-M: struct binary-zero? >c-ptr [ 0 = ] all? ;
-
 : struct-needs-prototype? ( class -- ? )
     struct-slots [ initial>> binary-zero? ] all? not ;
 
index 5cce0401ce675bc38a576ef14fb21a29e674939c..029b3f46e6150a4ed41fe96b7d709dc030afa1d0 100644 (file)
@@ -1,11 +1,11 @@
 ! Copyright (C) 2006, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien alien.c-types alien.strings arrays assocs
-classes.struct continuations combinators compiler
+USING: accessors alien alien.c-types alien.data alien.strings
+arrays assocs classes.struct continuations combinators compiler
 core-graphics.types stack-checker kernel math namespaces make
 quotations sequences strings words cocoa.runtime cocoa.types io
-macros memoize io.encodings.utf8 effects layouts libc
-lexer init core-foundation fry generalizations specialized-arrays ;
+macros memoize io.encodings.utf8 effects layouts libc lexer init
+core-foundation fry generalizations specialized-arrays ;
 QUALIFIED-WITH: alien.c-types c
 IN: cocoa.messages
 
@@ -216,7 +216,7 @@ ERROR: no-objc-type name ;
     objc-methods get set-at ;
 
 : each-method-in-class ( class quot -- )
-    [ 0 <uint> [ class_copyMethodList ] keep *uint ] dip
+    [ { uint } [ class_copyMethodList ] [ ] with-out-parameters ] dip
     over 0 = [ 3drop ] [
         [ <direct-void*-array> ] dip
         [ each ] [ drop (free) ] 2bi
index a39cc794d0f09d2f41f2468d563975f2a54c8896..d4a11cc9d59606fc1ecd06c5536b4cfa1b729173 100644 (file)
@@ -1,8 +1,8 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: cocoa.application cocoa.messages cocoa.classes
-cocoa.runtime kernel cocoa alien.c-types core-foundation
-core-foundation.arrays ;
+USING: alien.c-types alien.data cocoa.application cocoa.messages
+cocoa.classes cocoa.runtime cocoa core-foundation
+core-foundation.arrays kernel ;
 IN: cocoa.nibs
 
 : load-nib ( name -- )
@@ -15,5 +15,7 @@ IN: cocoa.nibs
     dup [ -> autorelease ] when ;
 
 : nib-objects ( anNSNib -- objects/f )
-    f f <void*> [ -> instantiateNibWithOwner:topLevelObjects: ] keep
-    swap [ *void* CF>array ] [ drop f ] if ;
\ No newline at end of file
+    f
+    { void* } [ -> instantiateNibWithOwner:topLevelObjects: ] [ ]
+    with-out-parameters
+    swap [ CF>array ] [ drop f ] if ;
\ No newline at end of file
index 86b13b2ddc2e83341c83480bad3b81b16e20ea17..80d58e634061525383bd2db22899468c62a8e913 100644 (file)
@@ -36,9 +36,11 @@ DEFER: plist>
     NSFastEnumeration-map >hashtable ;
 
 : (read-plist) ( NSData -- id )
-    NSPropertyListSerialization swap kCFPropertyListImmutable f f <void*>
-    [ -> propertyListFromData:mutabilityOption:format:errorDescription: ] keep
-    *void* [ -> release "read-plist failed" throw ] when* ;
+    NSPropertyListSerialization swap kCFPropertyListImmutable f
+    { void* }
+    [ -> propertyListFromData:mutabilityOption:format:errorDescription: ] [ ]
+    with-out-parameters
+    [ -> release "read-plist failed" throw ] when* ;
 
 MACRO: objc-class-case ( alist -- quot )
     [
index a907d2d29754fc492c0a9fded5bd0b3250d97fce..c0ce938abb20e9dc49e3b271a805da2a5a84ec67 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors fry generalizations kernel macros math.order
-stack-checker math sequences ;
+USING: accessors fry generalizations sequences.generalizations
+kernel macros math.order stack-checker math sequences ;
 IN: combinators.smart
 
 MACRO: drop-outputs ( quot -- quot' )
index 643afef669b1f7ec476aab5193554d50f1ed5281..f30182b93673e2f5fb74a13ea4cc53c9e495bc3c 100644 (file)
@@ -28,7 +28,7 @@ SYMBOL: command-line
 : load-vocab-roots ( -- )
     "user-init" get [
         "factor-roots" rc-path dup exists? [
-            utf8 file-lines [ add-vocab-root ] each
+            utf8 file-lines harvest [ add-vocab-root ] each
         ] [ drop ] if
     ] when ;
 
index 747e0f54cfe0c51a4ba00776727a60e35da04a3b..a973a3721c4c5441af8ea13db212d7002bb185ba 100644 (file)
@@ -1,47 +1,77 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: namespaces accessors math.order assocs kernel sequences
-combinators classes words cpu.architecture layouts compiler.cfg
-compiler.cfg.rpo compiler.cfg.instructions
-compiler.cfg.registers compiler.cfg.stack-frame ;
+USING: namespaces accessors math math.order assocs kernel
+sequences combinators classes words system fry locals
+cpu.architecture layouts compiler.cfg compiler.cfg.rpo
+compiler.cfg.instructions compiler.cfg.registers
+compiler.cfg.stack-frame ;
 IN: compiler.cfg.build-stack-frame
 
-SYMBOL: frame-required?
+SYMBOLS: param-area-size allot-area-size allot-area-align
+frame-required? ;
+
+: frame-required ( -- ) frame-required? on ;
 
 GENERIC: compute-stack-frame* ( insn -- )
 
-: request-stack-frame ( stack-frame -- )
-    frame-required? on
-    stack-frame [ max-stack-frame ] change ;
+M:: ##local-allot compute-stack-frame* ( insn -- )
+    frame-required
+    insn size>> :> s
+    insn align>> :> a
+    allot-area-align [ a max ] change
+    allot-area-size [ a align [ insn offset<< ] [ s + ] bi ] change ;
 
 M: ##stack-frame compute-stack-frame*
-    stack-frame>> request-stack-frame ;
+    frame-required
+    stack-frame>> param-area-size [ max ] change ;
+
+: vm-frame-required ( -- )
+    frame-required
+    vm-stack-space param-area-size [ max ] change ;
+
+M: ##call-gc compute-stack-frame* drop vm-frame-required ;
+M: ##box compute-stack-frame* drop vm-frame-required ;
+M: ##unbox compute-stack-frame* drop vm-frame-required ;
+M: ##box-long-long compute-stack-frame* drop vm-frame-required ;
+M: ##begin-callback compute-stack-frame* drop vm-frame-required ;
+M: ##end-callback compute-stack-frame* drop vm-frame-required ;
+M: ##unary-float-function compute-stack-frame* drop vm-frame-required ;
+M: ##binary-float-function compute-stack-frame* drop vm-frame-required ;
+
+M: ##call compute-stack-frame* drop frame-required ;
+M: ##alien-callback compute-stack-frame* drop frame-required ;
+M: ##spill compute-stack-frame* drop frame-required ;
+M: ##reload compute-stack-frame* drop frame-required ;
+
+M: ##float>integer compute-stack-frame*
+    drop integer-float-needs-stack-frame? [ frame-required ] when ;
 
-M: ##call compute-stack-frame* drop frame-required? on ;
+M: ##integer>float compute-stack-frame*
+    drop integer-float-needs-stack-frame? [ frame-required ] when ;
 
-M: ##call-gc compute-stack-frame*
-    drop
-    frame-required? on
-    stack-frame new t >>calls-vm? request-stack-frame ;
+M: insn compute-stack-frame* drop ;
 
-M: insn compute-stack-frame*
-    class "frame-required?" word-prop
-    [ frame-required? on ] when ;
+: finalize-stack-frame ( stack-frame -- )
+    dup [ params>> ] [ allot-area-align>> ] bi align >>allot-area-base
+    dup [ [ allot-area-base>> ] [ allot-area-size>> ] bi + ] [ spill-area-align>> ] bi align >>spill-area-base
+    dup stack-frame-size >>total-size drop ;
 
-: initial-stack-frame ( -- stack-frame )
-    stack-frame new cfg get spill-area-size>> >>spill-area-size ;
+: <stack-frame> ( cfg -- stack-frame )
+    [ stack-frame new ] dip
+    [ spill-area-size>> >>spill-area-size ]
+    [ spill-area-align>> >>spill-area-align ] bi
+    allot-area-size get >>allot-area-size
+    allot-area-align get >>allot-area-align
+    param-area-size get >>params
+    dup finalize-stack-frame ;
 
-: compute-stack-frame ( insns -- )
-    frame-required? off
-    initial-stack-frame stack-frame set
-    [ instructions>> [ compute-stack-frame* ] each ] each-basic-block
-    stack-frame get dup stack-frame-size >>total-size drop ;
+: compute-stack-frame ( cfg -- stack-frame/f )
+    [ [ instructions>> [ compute-stack-frame* ] each ] each-basic-block ]
+    [ frame-required? get [ <stack-frame> ] [ drop f ] if ]
+    bi ;
 
 : build-stack-frame ( cfg -- cfg )
-    [
-        [ compute-stack-frame ]
-        [
-            frame-required? get stack-frame get f ?
-            >>stack-frame
-        ] bi
-    ] with-scope ;
+    0 param-area-size set
+    0 allot-area-size set
+    cell allot-area-align set
+    dup compute-stack-frame >>stack-frame ;
index 3f529fce9da30e0ee639addf4786c278b72e0b63..04ac2bf4969d78ab1052063e84e230992f54818a 100644 (file)
-! Copyright (C) 2008, 2010 Slava Pestov.\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: accessors arrays layouts math math.order math.parser\r
-combinators combinators.short-circuit fry make sequences locals\r
-alien alien.private alien.strings alien.c-types alien.libraries\r
-classes.struct namespaces kernel strings libc quotations words\r
-cpu.architecture compiler.utilities compiler.tree compiler.cfg\r
-compiler.cfg.builder compiler.cfg.builder.alien.params\r
-compiler.cfg.builder.blocks compiler.cfg.instructions\r
-compiler.cfg.stack-frame compiler.cfg.stacks\r
-compiler.cfg.registers compiler.cfg.hats ;\r
-FROM: compiler.errors => no-such-symbol no-such-library ;\r
-IN: compiler.cfg.builder.alien\r
-\r
-! output is triples with shape { vreg rep on-stack? }\r
-GENERIC: unbox ( src c-type -- vregs )\r
-\r
-M: c-type unbox\r
-    [ [ unboxer>> ] [ rep>> ] bi ^^unbox ] [ rep>> ] bi\r
-    f 3array 1array ;\r
-\r
-M: long-long-type unbox\r
-    unboxer>> int-rep ^^unbox\r
-    0 cell\r
-    [\r
-        int-rep f ^^load-memory-imm\r
-        int-rep long-long-on-stack? 3array\r
-    ] bi-curry@ bi 2array ;\r
-\r
-GENERIC: unbox-parameter ( src c-type -- vregs )\r
-\r
-M: c-type unbox-parameter unbox ;\r
-\r
-M: long-long-type unbox-parameter unbox ;\r
-\r
-M:: struct-c-type unbox-parameter ( src c-type -- )\r
-    src ^^unbox-any-c-ptr :> src\r
-    c-type value-struct? [\r
-        c-type flatten-struct-type\r
-        [| pair i |\r
-            src i cells pair first f ^^load-memory-imm\r
-            pair first2 3array\r
-        ] map-index\r
-    ] [ { { src int-rep f } } ] if ;\r
-\r
-: unbox-parameters ( parameters -- vregs )\r
-    [\r
-        [ length iota <reversed> ] keep\r
-        [\r
-            [ <ds-loc> ^^peek ] [ base-type ] bi*\r
-            unbox-parameter\r
-        ] 2map concat\r
-    ]\r
-    [ length neg ##inc-d ] bi ;\r
-\r
-: prepare-struct-area ( vregs return -- vregs )\r
-    #! Return offset on C stack where to store unboxed\r
-    #! parameters. If the C function is returning a structure,\r
-    #! the first parameter is an implicit target area pointer,\r
-    #! so we need to use a different offset.\r
-    large-struct? [\r
-        ^^prepare-struct-area int-rep struct-return-on-stack?\r
-        3array prefix\r
-    ] when ;\r
-\r
-: (objects>registers) ( vregs -- )\r
-    ! Place ##store-stack-param instructions first. This ensures\r
-    ! that no registers are used after the ##store-reg-param\r
-    ! instructions.\r
-    [\r
-        first3 [ dup reg-class-of reg-class-full? ] dip or\r
-        [ [ alloc-stack-param ] keep \ ##store-stack-param new-insn ]\r
-        [ [ next-reg-param ] keep \ ##store-reg-param new-insn ]\r
-        if\r
-    ] map [ ##store-stack-param? ] partition [ % ] bi@ ;\r
-\r
-: objects>registers ( params -- stack-size )\r
-    [ abi>> ] [ parameters>> ] [ return>> ] tri\r
-    '[ \r
-        _ unbox-parameters\r
-        _ prepare-struct-area\r
-        (objects>registers)\r
-        stack-params get\r
-    ] with-param-regs ;\r
-\r
-GENERIC: box-return ( c-type -- dst )\r
-\r
-M: c-type box-return\r
-    [ f ] dip [ rep>> ] [ boxer>> ] bi ^^box ;\r
-\r
-M: long-long-type box-return\r
-    [ f ] dip boxer>> ^^box-long-long ;\r
-\r
-M: struct-c-type box-return\r
-    dup return-struct-in-registers?\r
-    [ ^^box-small-struct ] [ [ f ] dip ^^box-large-struct ] if ;\r
-\r
-: box-return* ( node -- )\r
-    return>> [ ] [ base-type box-return 1 ##inc-d D 0 ##replace ] if-void ;\r
-\r
-GENERIC# dlsym-valid? 1 ( symbols dll -- ? )\r
-\r
-M: string dlsym-valid? dlsym ;\r
-\r
-M: array dlsym-valid? '[ _ dlsym ] any? ;\r
-\r
-: check-dlsym ( symbols dll -- )\r
-    dup dll-valid? [\r
-        dupd dlsym-valid?\r
-        [ drop ] [ cfg get word>> no-such-symbol ] if\r
-    ] [ dll-path cfg get word>> no-such-library drop ] if ;\r
-\r
-: decorated-symbol ( params -- symbols )\r
-    [ function>> ] [ parameters>> [ stack-size ] map-sum number>string ] bi\r
-    {\r
-        [ drop ]\r
-        [ "@" glue ]\r
-        [ "@" glue "_" prepend ]\r
-        [ "@" glue "@" prepend ]\r
-    } 2cleave\r
-    4array ;\r
-\r
-: alien-invoke-dlsym ( params -- symbols dll )\r
-    [ dup abi>> callee-cleanup? [ decorated-symbol ] [ function>> ] if ]\r
-    [ library>> load-library ]\r
-    bi 2dup check-dlsym ;\r
-\r
-: return-size ( c-type -- n )\r
-    #! Amount of space we reserve for a return value.\r
-    {\r
-        { [ dup void? ] [ drop 0 ] }\r
-        { [ dup base-type struct-c-type? not ] [ drop 0 ] }\r
-        { [ dup large-struct? not ] [ drop 2 cells ] }\r
-        [ heap-size ]\r
-    } cond ;\r
-\r
-: alien-node-height ( params -- )\r
-    [ out-d>> length ] [ in-d>> length ] bi - adjust-d ;\r
-\r
-: emit-alien-block ( node quot: ( params -- ) -- )\r
-    '[\r
-        make-kill-block\r
-        params>>\r
-        _ [ alien-node-height ] bi\r
-    ] emit-trivial-block ; inline\r
-\r
-: <alien-stack-frame> ( stack-size return -- stack-frame )\r
-    stack-frame new\r
-        swap return-size >>return\r
-        swap >>params\r
-        t >>calls-vm? ;\r
-\r
-: emit-stack-frame ( stack-size params -- )\r
-    [ return>> ] [ abi>> ] bi\r
-    [ stack-cleanup ##cleanup ]\r
-    [ drop <alien-stack-frame> ##stack-frame ] 3bi ;\r
-\r
-M: #alien-invoke emit-node\r
-    [\r
-        {\r
-            [ objects>registers ]\r
-            [ alien-invoke-dlsym ##alien-invoke ]\r
-            [ emit-stack-frame ]\r
-            [ box-return* ]\r
-        } cleave\r
-    ] emit-alien-block ;\r
-\r
-M:: #alien-indirect emit-node ( node -- )\r
-    node [\r
-        D 0 ^^peek -1 ##inc-d ^^unbox-any-c-ptr :> src\r
-        {\r
-            [ objects>registers ]\r
-            [ drop src ##alien-indirect ]\r
-            [ emit-stack-frame ]\r
-            [ box-return* ]\r
-        } cleave\r
-    ] emit-alien-block ;\r
-\r
-M: #alien-assembly emit-node\r
-    [\r
-        {\r
-            [ objects>registers ]\r
-            [ quot>> ##alien-assembly ]\r
-            [ emit-stack-frame ]\r
-            [ box-return* ]\r
-        } cleave\r
-    ] emit-alien-block ;\r
-\r
-GENERIC: box-parameter ( n c-type -- dst )\r
-\r
-M: c-type box-parameter\r
-    [ rep>> ] [ boxer>> ] bi ^^box ;\r
-\r
-M: long-long-type box-parameter\r
-    boxer>> ^^box-long-long ;\r
-\r
-: if-value-struct ( ctype true false -- )\r
-    [ dup value-struct? ] 2dip '[ drop void* @ ] if ; inline\r
-\r
-M: struct-c-type box-parameter\r
-    [ ^^box-large-struct ] [ base-type box-parameter ] if-value-struct ;\r
-\r
-: parameter-offsets ( types -- offsets )\r
-    0 [ stack-size + ] accumulate nip ;\r
-\r
-: prepare-parameters ( parameters -- offsets types indices )\r
-    [ length iota <reversed> ] [ parameter-offsets ] [ ] tri ;\r
-\r
-: alien-parameters ( params -- seq )\r
-    [ parameters>> ] [ return>> large-struct? ] bi\r
-    [ struct-return-on-stack? (stack-value) void* ? prefix ] when ;\r
-\r
-: box-parameters ( params -- )\r
-    alien-parameters\r
-    [ length ##inc-d ]\r
-    [\r
-        prepare-parameters\r
-        [\r
-            next-vreg next-vreg ##save-context\r
-            base-type box-parameter swap <ds-loc> ##replace\r
-        ] 3each\r
-    ] bi ;\r
-\r
-:: alloc-parameter ( rep -- reg rep )\r
-    rep dup reg-class-of reg-class-full?\r
-    [ alloc-stack-param stack-params ] [ [ next-reg-param ] keep ] if ;\r
-\r
-GENERIC: flatten-c-type ( type -- reps )\r
-\r
-M: struct-c-type flatten-c-type\r
-    flatten-struct-type [ first2 [ drop stack-params ] when ] map ;\r
-    \r
-M: long-long-type flatten-c-type drop { int-rep int-rep } ;\r
-\r
-M: c-type flatten-c-type\r
-    rep>> {\r
-        { int-rep [ { int-rep } ] }\r
-        { float-rep [ float-on-stack? { stack-params } { float-rep } ? ] }\r
-        { double-rep [\r
-            float-on-stack?\r
-            cell 4 = { stack-params stack-params } { stack-params } ?\r
-            { double-rep } ?\r
-        ] }\r
-        { stack-params [ { stack-params } ] }\r
-    } case ;\r
-    \r
-M: object flatten-c-type base-type flatten-c-type ;\r
-\r
-: flatten-c-types ( types -- reps )\r
-    [ flatten-c-type ] map concat ;\r
-\r
-: (registers>objects) ( params -- )\r
-    [ 0 ] dip alien-parameters flatten-c-types [\r
-        [ alloc-parameter ##save-param-reg ]\r
-        [ rep-size cell align + ]\r
-        2bi\r
-    ] each drop ; inline\r
-\r
-: registers>objects ( params -- )\r
-    ! Generate code for boxing input parameters in a callback.\r
-    dup abi>> [\r
-        dup (registers>objects)\r
-        ##begin-callback\r
-        next-vreg next-vreg ##restore-context\r
-        box-parameters\r
-    ] with-param-regs ;\r
-\r
-: callback-return-quot ( ctype -- quot )\r
-    return>> {\r
-        { [ dup void? ] [ drop [ ] ] }\r
-        { [ dup large-struct? ] [ heap-size '[ _ memcpy ] ] }\r
-        [ c-type c-type-unboxer-quot ]\r
-    } cond ;\r
-\r
-: callback-prep-quot ( params -- quot )\r
-    parameters>> [ c-type c-type-boxer-quot ] map spread>quot ;\r
-\r
-: wrap-callback-quot ( params -- quot )\r
-    [ callback-prep-quot ] [ quot>> ] [ callback-return-quot ] tri 3append\r
-     yield-hook get\r
-     '[ _ _ do-callback ]\r
-     >quotation ;\r
-\r
-GENERIC: unbox-return ( src c-type -- )\r
-\r
-M: c-type unbox-return\r
-    unbox first first2 ##store-return ;\r
-\r
-M: long-long-type unbox-return\r
-    unbox first2 [ first ] bi@ ##store-long-long-return ;\r
-\r
-M: struct-c-type unbox-return\r
-    [ ^^unbox-any-c-ptr ] dip ##store-struct-return ;\r
-\r
-: emit-callback-stack-frame ( params -- )\r
-    [ alien-parameters [ stack-size ] map-sum ] [ return>> ] bi\r
-    <alien-stack-frame> ##stack-frame ;\r
-\r
-: stack-args-size ( params -- n )\r
-    dup abi>> [\r
-        alien-parameters flatten-c-types\r
-        [ alloc-parameter 2drop ] each\r
-        stack-params get\r
-    ] with-param-regs ;\r
-\r
-: callback-stack-cleanup ( params -- )\r
-    [ xt>> ] [ [ stack-args-size ] [ return>> ] [ abi>> ] tri stack-cleanup ] bi\r
-    "stack-cleanup" set-word-prop ;\r
-\r
-M: #alien-callback emit-node\r
-    dup params>> xt>> dup\r
-    [\r
-        ##prologue\r
-        [\r
-            {\r
-                [ registers>objects ]\r
-                [ emit-callback-stack-frame ]\r
-                [ callback-stack-cleanup ]\r
-                [ wrap-callback-quot ##alien-callback ]\r
-                [\r
-                    return>> {\r
-                        { [ dup void? ] [ drop ##end-callback ] }\r
-                        { [ dup large-struct? ] [ drop ##end-callback ] }\r
-                        [\r
-                            [ D 0 ^^peek ] dip\r
-                            ##end-callback\r
-                            base-type unbox-return\r
-                        ]\r
-                    } cond\r
-                ]\r
-            } cleave\r
-        ] emit-alien-block\r
-        ##epilogue\r
-        ##return\r
-    ] with-cfg-builder ;\r
+! Copyright (C) 2008, 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs arrays layouts math math.order math.parser
+combinators combinators.short-circuit fry make sequences
+sequences.generalizations alien alien.private alien.strings
+alien.c-types alien.libraries classes.struct namespaces kernel
+strings libc locals quotations words cpu.architecture
+compiler.utilities compiler.tree compiler.cfg
+compiler.cfg.builder compiler.cfg.builder.alien.params
+compiler.cfg.builder.alien.boxing compiler.cfg.builder.blocks
+compiler.cfg.instructions compiler.cfg.stack-frame
+compiler.cfg.stacks compiler.cfg.registers compiler.cfg.hats ;
+FROM: compiler.errors => no-such-symbol no-such-library ;
+IN: compiler.cfg.builder.alien
+
+: unbox-parameters ( parameters -- vregs reps )
+    [
+        [ length iota <reversed> ] keep
+        [ [ <ds-loc> ^^peek ] [ base-type ] bi* unbox-parameter ]
+        2 2 mnmap [ concat ] bi@
+    ]
+    [ length neg ##inc-d ] bi ;
+
+: prepare-struct-caller ( vregs reps return -- vregs' reps' return-vreg/f )
+    dup large-struct? [
+        heap-size cell f ^^local-allot [
+            '[ _ prefix ]
+            [ int-rep struct-return-on-stack? 2array prefix ] bi*
+        ] keep
+    ] [ drop f ] if ;
+
+: caller-parameter ( vreg rep on-stack? -- insn )
+    [ dup reg-class-of reg-class-full? ] dip or
+    [ [ alloc-stack-param ] keep \ ##store-stack-param new-insn ]
+    [ [ next-reg-param ] keep \ ##store-reg-param new-insn ]
+    if ;
+
+: (caller-parameters) ( vregs reps -- )
+    ! Place ##store-stack-param instructions first. This ensures
+    ! that no registers are used after the ##store-reg-param
+    ! instructions.
+    [ first2 caller-parameter ] 2map
+    [ ##store-stack-param? ] partition [ % ] bi@ ;
+
+: caller-parameters ( params -- stack-size )
+    [ abi>> ] [ parameters>> ] [ return>> ] tri
+    '[ 
+        _ unbox-parameters
+        _ prepare-struct-caller struct-return-area set
+        (caller-parameters)
+        stack-params get
+        struct-return-area get
+    ] with-param-regs
+    struct-return-area set ;
+
+: box-return* ( node -- )
+    return>> [ ] [ base-type box-return 1 ##inc-d D 0 ##replace ] if-void ;
+
+GENERIC# dlsym-valid? 1 ( symbols dll -- ? )
+
+M: string dlsym-valid? dlsym ;
+
+M: array dlsym-valid? '[ _ dlsym ] any? ;
+
+: check-dlsym ( symbols dll -- )
+    dup dll-valid? [
+        dupd dlsym-valid?
+        [ drop ] [ cfg get word>> no-such-symbol ] if
+    ] [ dll-path cfg get word>> no-such-library drop ] if ;
+
+: decorated-symbol ( params -- symbols )
+    [ function>> ] [ parameters>> [ stack-size ] map-sum number>string ] bi
+    {
+        [ drop ]
+        [ "@" glue ]
+        [ "@" glue "_" prepend ]
+        [ "@" glue "@" prepend ]
+    } 2cleave
+    4array ;
+
+: alien-invoke-dlsym ( params -- symbols dll )
+    [ dup abi>> callee-cleanup? [ decorated-symbol ] [ function>> ] if ]
+    [ library>> load-library ]
+    bi 2dup check-dlsym ;
+
+: alien-node-height ( params -- )
+    [ out-d>> length ] [ in-d>> length ] bi - adjust-d ;
+
+: emit-alien-block ( node quot: ( params -- ) -- )
+    '[
+        make-kill-block
+        params>>
+        _ [ alien-node-height ] bi
+    ] emit-trivial-block ; inline
+
+: emit-stack-frame ( stack-size params -- )
+    [ [ return>> ] [ abi>> ] bi stack-cleanup ##cleanup ]
+    [ drop ##stack-frame ]
+    2bi ;
+
+M: #alien-invoke emit-node
+    [
+        {
+            [ caller-parameters ]
+            [ ##prepare-var-args alien-invoke-dlsym <gc-map> ##alien-invoke ]
+            [ emit-stack-frame ]
+            [ box-return* ]
+        } cleave
+    ] emit-alien-block ;
+
+M:: #alien-indirect emit-node ( node -- )
+    node [
+        D 0 ^^peek -1 ##inc-d ^^unbox-any-c-ptr :> src
+        [ caller-parameters src <gc-map> ##alien-indirect ]
+        [ emit-stack-frame ]
+        [ box-return* ]
+        tri
+    ] emit-alien-block ;
+
+M: #alien-assembly emit-node
+    [
+        {
+            [ caller-parameters ]
+            [ quot>> ##alien-assembly ]
+            [ emit-stack-frame ]
+            [ box-return* ]
+        } cleave
+    ] emit-alien-block ;
+
+: callee-parameter ( rep on-stack? -- dst insn )
+    [ next-vreg dup ] 2dip
+    [ dup reg-class-of reg-class-full? ] dip or
+    [ [ alloc-stack-param ] keep \ ##load-stack-param new-insn ]
+    [ [ next-reg-param ] keep \ ##load-reg-param new-insn ]
+    if ;
+
+: prepare-struct-callee ( c-type -- vreg )
+    large-struct?
+    [ int-rep struct-return-on-stack? callee-parameter , ] [ f ] if ;
+
+: (callee-parameters) ( params -- vregs reps )
+    [ flatten-parameter-type ] map
+    [
+        [ [ first2 callee-parameter ] 1 2 mnmap ] 1 2 mnmap
+        concat [ ##load-reg-param? ] partition [ % ] bi@
+    ]
+    [ [ keys ] map ]
+    bi ;
+
+: box-parameters ( vregs reps params -- )
+    ##begin-callback
+    next-vreg next-vreg ##restore-context
+    [
+        next-vreg next-vreg ##save-context
+        box-parameter
+        1 ##inc-d D 0 ##replace
+    ] 3each ;
+
+: callee-parameters ( params -- stack-size )
+    [ abi>> ] [ return>> ] [ parameters>> ] tri
+    '[ 
+        _ prepare-struct-callee struct-return-area set
+        _ [ base-type ] map [ (callee-parameters) ] [ box-parameters ] bi
+        stack-params get
+        struct-return-area get
+    ] with-param-regs
+    struct-return-area set ;
+
+: callback-stack-cleanup ( stack-size params -- )
+    [ nip xt>> ] [ [ return>> ] [ abi>> ] bi stack-cleanup ] 2bi
+    "stack-cleanup" set-word-prop ;
+
+: needs-frame-pointer ( -- )
+    cfg get t >>frame-pointer? drop ;
+
+M: #alien-callback emit-node
+    dup params>> xt>> dup
+    [
+        needs-frame-pointer
+
+        ##prologue
+        [
+            {
+                [ callee-parameters ]
+                [ quot>> ##alien-callback ]
+                [
+                    return>> [ ##end-callback ] [
+                        [ D 0 ^^peek ] dip
+                        ##end-callback
+                        base-type unbox-return
+                    ] if-void
+                ]
+                [ callback-stack-cleanup ]
+            } cleave
+        ] emit-alien-block
+        ##epilogue
+        ##return
+    ] with-cfg-builder ;
diff --git a/basis/compiler/cfg/builder/alien/boxing/authors.txt b/basis/compiler/cfg/builder/alien/boxing/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/basis/compiler/cfg/builder/alien/boxing/boxing.factor b/basis/compiler/cfg/builder/alien/boxing/boxing.factor
new file mode 100644 (file)
index 0000000..1992d75
--- /dev/null
@@ -0,0 +1,145 @@
+! Copyright (C) 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alien.c-types arrays assocs classes.struct fry
+kernel layouts locals math namespaces sequences
+sequences.generalizations system
+compiler.cfg.builder.alien.params compiler.cfg.hats
+compiler.cfg.instructions cpu.architecture ;
+IN: compiler.cfg.builder.alien.boxing
+
+SYMBOL: struct-return-area
+
+! pairs have shape { rep on-stack? }
+GENERIC: flatten-c-type ( c-type -- pairs )
+
+M: c-type flatten-c-type
+    rep>> f 2array 1array ;
+
+M: long-long-type flatten-c-type
+    drop 2 [ int-rep long-long-on-stack? 2array ] replicate ;
+
+HOOK: flatten-struct-type cpu ( type -- pairs )
+
+M: object flatten-struct-type
+    heap-size cell align cell /i { int-rep f } <repetition> ;
+
+M: struct-c-type flatten-c-type
+    flatten-struct-type ;
+
+: stack-size ( c-type -- n )
+    base-type flatten-c-type keys 0 [ rep-size + ] reduce ;
+
+: component-offsets ( reps -- offsets )
+    0 [ rep-size + ] accumulate nip ;
+
+:: explode-struct ( src c-type -- vregs reps )
+    c-type flatten-struct-type :> reps
+    reps keys dup component-offsets
+    [| rep offset | src offset rep f ^^load-memory-imm ] 2map
+    reps ;
+
+:: implode-struct ( src vregs reps -- )
+    vregs reps dup component-offsets
+    [| vreg rep offset | vreg src offset rep f ##store-memory-imm ] 3each ;
+
+GENERIC: unbox ( src c-type -- vregs reps )
+
+M: c-type unbox
+    [ unboxer>> ] [ rep>> ] bi
+    [ ^^unbox 1array ] [ nip f 2array 1array ] 2bi ;
+
+M: long-long-type unbox
+    [ 8 cell f ^^local-allot ] dip '[ _ unboxer>> ##unbox-long-long ] keep
+    0 cell [ int-rep f ^^load-memory-imm ] bi-curry@ bi 2array
+    int-rep long-long-on-stack? 2array dup 2array ;
+
+M: struct-c-type unbox ( src c-type -- vregs )
+    [ ^^unbox-any-c-ptr ] dip explode-struct ;
+
+: frob-struct ( c-type -- c-type )
+    dup value-struct? [ drop void* base-type ] unless ;
+
+GENERIC: unbox-parameter ( src c-type -- vregs reps )
+
+M: c-type unbox-parameter unbox ;
+
+M: long-long-type unbox-parameter unbox ;
+
+M: struct-c-type unbox-parameter
+    dup value-struct? [ unbox ] [
+        [ nip heap-size cell f ^^local-allot dup ]
+        [ [ ^^unbox-any-c-ptr ] dip explode-struct keys ] 2bi
+        implode-struct
+        1array { { int-rep f } }
+    ] if ;
+
+GENERIC: unbox-return ( src c-type -- )
+
+: store-return ( vregs reps -- )
+    [
+        [ [ next-return-reg ] keep ##store-reg-param ] 2each
+    ] with-return-regs ;
+
+: (unbox-return) ( src c-type -- vregs reps )
+    ! Don't care about on-stack? flag when looking at return
+    ! values.
+    unbox keys ;
+
+M: c-type unbox-return (unbox-return) store-return ;
+
+M: long-long-type unbox-return (unbox-return) store-return ;
+
+M: struct-c-type unbox-return
+    dup return-struct-in-registers?
+    [ (unbox-return) store-return ]
+    [ [ struct-return-area get ] 2dip (unbox-return) implode-struct ] if ;
+
+GENERIC: flatten-parameter-type ( c-type -- reps )
+
+M: c-type flatten-parameter-type flatten-c-type ;
+
+M: long-long-type flatten-parameter-type flatten-c-type ;
+
+M: struct-c-type flatten-parameter-type frob-struct flatten-c-type ;
+
+GENERIC: box ( vregs reps c-type -- dst )
+
+M: c-type box
+    [ first ] [ drop ] [ [ boxer>> ] [ rep>> ] bi ] tri* <gc-map> ^^box ;
+
+M: long-long-type box
+    [ first2 ] [ drop ] [ boxer>> ] tri* <gc-map> ^^box-long-long ;
+
+M: struct-c-type box
+    '[ _ heap-size <gc-map> ^^allot-byte-array dup ^^unbox-byte-array ] 2dip
+    implode-struct ;
+
+GENERIC: box-parameter ( vregs reps c-type -- dst )
+
+M: c-type box-parameter box ;
+
+M: long-long-type box-parameter box ;
+
+M: struct-c-type box-parameter
+    dup value-struct?
+    [ [ [ drop first ] dip explode-struct keys ] keep ] unless
+    box ;
+
+GENERIC: box-return ( c-type -- dst )
+
+: load-return ( c-type -- vregs reps )
+    [
+        flatten-c-type keys
+        [ [ [ next-return-reg ] keep ^^load-reg-param ] map ] keep
+    ] with-return-regs ;
+
+M: c-type box-return [ load-return ] keep box ;
+
+M: long-long-type box-return [ load-return ] keep box ;
+
+M: struct-c-type box-return
+    [
+        dup return-struct-in-registers?
+        [ load-return ]
+        [ [ struct-return-area get ] dip explode-struct keys ] if
+    ] keep box ;
index 85e9176c44b8887dbd20430dac0b193fac1dec4b..4509401af0e7370a50d272efd0a0d3ff99e7477d 100644 (file)
@@ -1,9 +1,11 @@
 ! Copyright (C) 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: cpu.architecture fry kernel layouts math math.order
-namespaces sequences vectors ;
+namespaces sequences vectors assocs ;
 IN: compiler.cfg.builder.alien.params
 
+SYMBOL: stack-params
+
 : alloc-stack-param ( rep -- n )
     stack-params get
     [ rep-size cell align stack-params +@ ] dip ;
@@ -23,27 +25,29 @@ IN: compiler.cfg.builder.alien.params
 GENERIC: next-reg-param ( rep -- reg )
 
 M: int-rep next-reg-param
-    [ ?dummy-stack-params ] [ ?dummy-fp-params ] bi int-regs get pop ;
+    [ ?dummy-stack-params ] [ ?dummy-fp-params ] bi
+    int-regs get pop ;
 
 M: float-rep next-reg-param
-    [ ?dummy-stack-params ] [ ?dummy-int-params ] bi float-regs get pop ;
+    [ ?dummy-stack-params ] [ ?dummy-int-params ] bi
+    float-regs get pop ;
 
 M: double-rep next-reg-param
-    [ ?dummy-stack-params ] [ ?dummy-int-params ] bi float-regs get pop ;
-
-GENERIC: reg-class-full? ( reg-class -- ? )
-
-M: stack-params reg-class-full? drop t ;
+    [ ?dummy-stack-params ] [ ?dummy-int-params ] bi
+    float-regs get pop ;
 
-M: reg-class reg-class-full? get empty? ;
+: reg-class-full? ( reg-class -- ? ) get empty? ;
 
 : init-reg-class ( abi reg-class -- )
-    [ swap param-regs <reversed> >vector ] keep set ;
+    [ swap param-regs at <reversed> >vector ] keep set ;
+
+: init-regs ( regs -- )
+    [ <reversed> >vector swap set ] assoc-each ;
 
 : with-param-regs ( abi quot -- )
-    '[
-        [ int-regs init-reg-class ]
-        [ float-regs init-reg-class ] bi
-        0 stack-params set
-        @
-    ] with-scope ; inline
+    '[ param-regs init-regs 0 stack-params set @ ] with-scope ; inline
+
+: next-return-reg ( rep -- reg ) reg-class-of get pop ;
+
+: with-return-regs ( quot -- )
+    '[ return-regs init-regs @ ] with-scope ; inline
index 5f5283bcd51de173509b8bc16973c078a1727686..7fde6c137149911d2211a08433fafa55e7306663 100644 (file)
@@ -22,8 +22,9 @@ number
 M: basic-block hashcode* nip id>> ;
 
 TUPLE: cfg { entry basic-block } word label
-spill-area-size
+spill-area-size spill-area-align
 stack-frame
+frame-pointer?
 post-order linear-order
 predecessors-valid? dominance-valid? loops-valid? ;
 
index 93c1a53b44b9aaf3a0e8845865d541ebfb0578b7..a2a0b2d8be41bbd2b1e0c9cffccf80dc42a55ec3 100644 (file)
@@ -1,9 +1,9 @@
 ! Copyright (C) 2008, 2010 Slava Pestov, Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs arrays classes combinators
-compiler.units fry generalizations generic kernel locals
-namespaces quotations sequences sets slots words
-compiler.cfg.instructions compiler.cfg.instructions.syntax
+compiler.units fry generalizations sequences.generalizations
+generic kernel locals namespaces quotations sequences sets slots
+words compiler.cfg.instructions compiler.cfg.instructions.syntax
 compiler.cfg.rpo ;
 FROM: namespaces => set ;
 FROM: sets => members ;
index 5440ba6eef6924936c118cd77a73f5266f1c1e9f..83bcc0b0b1b542347b8859a32228a812ccd14ea4 100644 (file)
@@ -1,15 +1,17 @@
 ! Copyright (C) 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: compiler.cfg.gc-checks compiler.cfg.representations
-compiler.cfg.save-contexts compiler.cfg.ssa.destruction
-compiler.cfg.build-stack-frame compiler.cfg.linear-scan
-compiler.cfg.scheduling ;
+USING: kernel compiler.cfg.gc-checks
+compiler.cfg.representations compiler.cfg.save-contexts
+compiler.cfg.ssa.destruction compiler.cfg.build-stack-frame
+compiler.cfg.linear-scan compiler.cfg.scheduling
+compiler.cfg.stacks.uninitialized ;
 IN: compiler.cfg.finalization
 
 : finalize-cfg ( cfg -- cfg' )
     select-representations
     schedule-instructions
     insert-gc-checks
+    dup compute-uninitialized-sets
     insert-save-contexts
     destruct-ssa
     linear-scan
index 496954de2c83cd87d6c51a7e1a251cc6b39b3730..698caa5e683cc3aa0f1713dba8a5714ea6011c6c 100644 (file)
@@ -29,14 +29,6 @@ V{
 
 2 \ vreg-counter set-global
 
-[
-    V{
-        T{ ##load-tagged f 3 0 }
-        T{ ##replace f 3 D 0 }
-        T{ ##replace f 3 R 3 }
-    }
-] [ [ { D 0 R 3 } wipe-locs ] V{ } make ] unit-test
-
 : gc-check? ( bb -- ? )
     instructions>>
     {
@@ -50,15 +42,13 @@ V{
 
 [
     V{
-        T{ ##load-tagged f 5 0 }
-        T{ ##replace f 5 D 0 }
-        T{ ##replace f 5 R 3 }
-        T{ ##call-gc f { 0 1 2 } }
+        T{ ##gc-map f V{ 0 } V{ 3 } { 0 1 2 } }
+        T{ ##call-gc }
         T{ ##branch }
     }
 ]
 [
-    { D 0 R 3 } { 0 1 2 } <gc-call> instructions>>
+    V{ D 0 R 3 } { 0 1 2 } <gc-call> instructions>>
 ] unit-test
 
 30 \ vreg-counter set-global
@@ -156,11 +146,8 @@ H{
 
 [
     V{
-        T{ ##load-tagged f 31 0 }
-        T{ ##replace f 31 D 0 }
-        T{ ##replace f 31 D 1 }
-        T{ ##replace f 31 D 2 }
-        T{ ##call-gc f { 2 } }
+        T{ ##gc-map f V{ 0 1 2 } V{ } { 2 } }
+        T{ ##call-gc }
         T{ ##branch }
     }
 ] [ 2 get predecessors>> second instructions>> ] unit-test
index 255e5476e684992d433e6ef530d12f204422fb0d..50cd67567c6fef82e70d6b27178303278073ebf7 100644 (file)
@@ -9,10 +9,7 @@ compiler.cfg.registers
 compiler.cfg.utilities
 compiler.cfg.comparisons
 compiler.cfg.instructions
-compiler.cfg.predecessors
-compiler.cfg.liveness
-compiler.cfg.liveness.ssa
-compiler.cfg.stacks.uninitialized ;
+compiler.cfg.predecessors ;
 IN: compiler.cfg.gc-checks
 
 <PRIVATE
@@ -50,16 +47,9 @@ IN: compiler.cfg.gc-checks
         ] bi*
     ] V{ } make >>instructions ;
 
-: wipe-locs ( uninitialized-locs -- )
-    '[
-        int-rep next-vreg-rep
-        [ 0 ##load-tagged ]
-        [ '[ [ _ ] dip ##replace ] each ] bi
-    ] unless-empty ;
-
-: <gc-call> ( uninitialized-locs gc-roots -- bb )
-    [ <basic-block> ] 2dip
-    [ [ wipe-locs ] [ ##call-gc ] bi* ##branch ] V{ } make
+: <gc-call> ( -- bb )
+    <basic-block>
+    [ <gc-map> ##call-gc ##branch ] V{ } make
     >>instructions t >>unlikely? ;
 
 :: insert-guard ( body check bb -- )
@@ -73,7 +63,7 @@ IN: compiler.cfg.gc-checks
 
     check predecessors>> [ bb check update-successors ] each ;
 
-: (insert-gc-check) ( uninitialized-locs gc-roots phis size bb -- )
+: (insert-gc-check) ( phis size bb -- )
     [ [ <gc-call> ] 2dip <gc-check> ] dip insert-guard ;
 
 GENERIC: allocation-size* ( insn -- n )
@@ -89,35 +79,17 @@ M: ##box-displaced-alien allocation-size* drop 5 cells ;
     [ ##allocation? ] filter
     [ allocation-size* data-alignment get align ] map-sum ;
 
-: gc-live-in ( bb -- vregs )
-    [ live-in keys ] [ instructions>> [ ##phi? ] filter [ dst>> ] map ] bi
-    append ;
-
-: live-tagged ( bb -- vregs )
-    gc-live-in [ rep-of tagged-rep? ] filter ;
-
 : remove-phis ( bb -- phis )
     [ [ ##phi? ] partition ] change-instructions drop ;
 
 : insert-gc-check ( bb -- )
-    {
-        [ uninitialized-locs ]
-        [ live-tagged ]
-        [ remove-phis ]
-        [ allocation-size ]
-        [ ]
-    } cleave
-    (insert-gc-check) ;
+    [ remove-phis ] [ allocation-size ] [ ] tri (insert-gc-check) ;
 
 PRIVATE>
 
 : insert-gc-checks ( cfg -- cfg' )
     dup blocks-with-gc [
-        [
-            needs-predecessors
-            dup compute-ssa-live-sets
-            dup compute-uninitialized-sets
-        ] dip
+        [ needs-predecessors ] dip
         [ insert-gc-check ] each
         cfg-changed
     ] unless-empty ;
index f2ba0fefbb6288a047928169e6b80c86a267ba78..39d2ab81cd557507b3661e03970e7e400ea77f0f 100644 (file)
@@ -219,6 +219,10 @@ PURE-INSN: ##log2
 def: dst/int-rep
 use: src/int-rep ;
 
+PURE-INSN: ##bit-count
+def: dst/int-rep
+use: src/int-rep ;
+
 ! Float arithmetic
 PURE-INSN: ##add-float
 def: dst/double-rep
@@ -291,11 +295,26 @@ def: dst
 use: src1/scalar-rep src2/scalar-rep
 literal: rep ;
 
+PURE-INSN: ##gather-int-vector-2
+def: dst
+use: src1/int-rep src2/int-rep
+literal: rep ;
+
 PURE-INSN: ##gather-vector-4
 def: dst
 use: src1/scalar-rep src2/scalar-rep src3/scalar-rep src4/scalar-rep
 literal: rep ;
 
+PURE-INSN: ##gather-int-vector-4
+def: dst
+use: src1/int-rep src2/int-rep src3/int-rep src4/int-rep
+literal: rep ;
+
+PURE-INSN: ##select-vector
+def: dst/int-rep
+use: src
+literal: n rep ;
+
 PURE-INSN: ##shuffle-vector
 def: dst
 use: src shuffle
@@ -326,6 +345,11 @@ def: dst
 use: src1 src2
 literal: rep ;
 
+PURE-INSN: ##float-pack-vector
+def: dst
+use: src
+literal: rep ;
+
 PURE-INSN: ##signed-pack-vector
 def: dst
 use: src1 src2
@@ -619,6 +643,10 @@ def: dst
 use: src/tagged-rep
 literal: unboxer rep ;
 
+INSN: ##unbox-long-long
+use: src/tagged-rep out/int-rep
+literal: unboxer ;
+
 INSN: ##store-reg-param
 use: src
 literal: reg rep ;
@@ -627,51 +655,47 @@ INSN: ##store-stack-param
 use: src
 literal: n rep ;
 
-INSN: ##store-return
-use: src
-literal: rep ;
-
-INSN: ##store-struct-return
-use: src/int-rep
-literal: c-type ;
+INSN: ##load-reg-param
+def: dst
+literal: reg rep ;
 
-INSN: ##store-long-long-return
-use: src1/int-rep src2/int-rep ;
+INSN: ##load-stack-param
+def: dst
+literal: n rep ;
 
-INSN: ##prepare-struct-area
-def: dst/int-rep ;
+INSN: ##local-allot
+def: dst/int-rep
+literal: size align offset ;
 
 INSN: ##box
 def: dst/tagged-rep
-literal: n rep boxer ;
+use: src
+literal: boxer rep gc-map ;
 
 INSN: ##box-long-long
 def: dst/tagged-rep
-literal: n boxer ;
+use: src1/int-rep src2/int-rep
+literal: boxer gc-map ;
 
-INSN: ##box-small-struct
+INSN: ##allot-byte-array
 def: dst/tagged-rep
-literal: c-type ;
+literal: size gc-map ;
 
-INSN: ##box-large-struct
-def: dst/tagged-rep
-literal: n c-type ;
+INSN: ##prepare-var-args ;
 
 INSN: ##alien-invoke
-literal: symbols dll ;
+literal: symbols dll gc-map ;
 
 INSN: ##cleanup
 literal: n ;
 
 INSN: ##alien-indirect
-use: src/int-rep ;
+use: src/int-rep
+literal: gc-map ;
 
 INSN: ##alien-assembly
 literal: quot ;
 
-INSN: ##save-param-reg
-literal: offset reg rep ;
-
 INSN: ##begin-callback ;
 
 INSN: ##alien-callback
@@ -796,8 +820,7 @@ INSN: ##check-nursery-branch
 literal: size cc
 temp: temp1/int-rep temp2/int-rep ;
 
-INSN: ##call-gc
-literal: gc-roots ;
+INSN: ##call-gc literal: gc-map ;
 
 ! Spills and reloads, inserted by register allocator
 TUPLE: spill-slot { n integer } ;
@@ -835,27 +858,49 @@ UNION: conditional-branch-insn
 UNION: ##read ##slot ##slot-imm ##vm-field ##alien-global ;
 UNION: ##write ##set-slot ##set-slot-imm ##set-vm-field ;
 
-! Instructions that clobber registers
-UNION: clobber-insn
+! Instructions that contain subroutine calls to functions which
+! allocate memory
+UNION: gc-map-insn
 ##call-gc
-##unary-float-function
-##binary-float-function
+##alien-invoke
+##alien-indirect
 ##box
 ##box-long-long
-##box-small-struct
-##box-large-struct
-##unbox
+##allot-byte-array ;
+
+M: gc-map-insn clone call-next-method [ clone ] change-gc-map ;
+
+! Each one has a gc-map slot
+TUPLE: gc-map scrub-d scrub-r gc-roots ;
+
+: <gc-map> ( -- gc-map ) gc-map new ;
+
+! Instructions that clobber registers. They receive inputs and
+! produce outputs in spill slots.
+UNION: hairy-clobber-insn
+##load-reg-param
 ##store-reg-param
-##store-return
-##store-struct-return
-##store-long-long-return
+##call-gc
 ##alien-invoke
 ##alien-indirect
 ##alien-assembly
-##save-param-reg
 ##begin-callback
 ##end-callback ;
 
+! Instructions that clobber registers but are allowed to produce
+! outputs in registers. Inputs are in spill slots, except for
+! inputs coalesced with the output, in which case that input
+! will be in a register.
+UNION: clobber-insn
+hairy-clobber-insn
+##unary-float-function
+##binary-float-function
+##unbox
+##unbox-long-long
+##box
+##box-long-long
+##allot-byte-array ;
+
 ! Instructions that have complex expansions and require that the
 ! output registers are not equal to any of the input registers
 UNION: def-is-use-insn
index 4faa4809e5c27e782d73036f3c095f42e0409df4..bf8ba96c342647bdfcf17fff09614e6b6b827bd0 100644 (file)
@@ -14,6 +14,7 @@ compiler.cfg.intrinsics.misc
 compiler.cfg.comparisons ;
 QUALIFIED: alien
 QUALIFIED: alien.accessors
+QUALIFIED: alien.data.private
 QUALIFIED: alien.c-types
 QUALIFIED: kernel
 QUALIFIED: arrays
@@ -23,6 +24,7 @@ QUALIFIED: slots.private
 QUALIFIED: strings.private
 QUALIFIED: classes.tuple.private
 QUALIFIED: math.private
+QUALIFIED: math.bitwise.private
 QUALIFIED: math.integers.private
 QUALIFIED: math.floats.private
 QUALIFIED: math.libm
@@ -63,6 +65,8 @@ IN: compiler.cfg.intrinsics
     { byte-arrays:<byte-array> [ emit-<byte-array> ] }
     { byte-arrays:(byte-array) [ emit-(byte-array) ] }
     { kernel:<wrapper> [ emit-simple-allot ] }
+    { alien.data.private:(local-allot) [ emit-local-allot ] }
+    { alien.data.private:(cleanup-allot) [ drop emit-cleanup-allot ] }
     { alien:<displaced-alien> [ emit-<displaced-alien> ] }
     { alien.accessors:alien-unsigned-1 [ int-rep alien.c-types:uchar emit-load-memory ] }
     { alien.accessors:set-alien-unsigned-1 [ int-rep alien.c-types:uchar emit-store-memory ] }
@@ -155,5 +159,10 @@ IN: compiler.cfg.intrinsics
         { math.integers.private:fixnum-log2 [ drop [ ^^log2 ] unary-op ] }
     } enable-intrinsics ;
 
+: enable-bit-count ( -- )
+    {
+        { math.bitwise.private:fixnum-bit-count [ drop [ ^^bit-count ] unary-op ] }
+    } enable-intrinsics ;
+
 : emit-intrinsic ( node word -- )
     "intrinsic" word-prop call( node -- ) ;
index 31c3bac37bd39f245b99eb49ff745d0664f0c43e..62bb15f95333c65809913f316d1c507df6ad2ae0 100644 (file)
@@ -52,3 +52,12 @@ IN: compiler.cfg.intrinsics.misc
         0 int-rep f ^^load-memory-imm
         hashcode-shift ^^shr-imm
     ] unary-op ;
+
+: emit-local-allot ( node -- )
+    dup node-input-infos first2 [ literal>> ] bi@ 2dup [ integer? ] both?
+    [ ds-drop ds-drop f ^^local-allot ^^box-alien ds-push drop ]
+    [ 2drop emit-primitive ]
+    if ;
+
+: emit-cleanup-allot ( -- )
+    [ ##no-tco ] emit-trivial-block ;
index 34e238bc81ad3d6a9d012cb30b125896e5b74d6d..84ffc208d5975bff0d49a1a9bf4b4ed067a8a22e 100644 (file)
@@ -6,7 +6,7 @@ compiler.cfg.stacks.local compiler.tree.propagation.info
 compiler.cfg.instructions
 cpu.architecture effects fry generalizations
 kernel locals macros make math namespaces quotations sequences
-splitting stack-checker words ;
+sequences.generalizations splitting stack-checker words ;
 IN: compiler.cfg.intrinsics.simd.backend
 
 ! Selection of implementation based on available CPU instructions
@@ -19,12 +19,16 @@ M: ##zero-vector insn-available? rep>> %zero-vector-reps member? ;
 M: ##fill-vector insn-available? rep>> %fill-vector-reps member? ;
 M: ##gather-vector-2 insn-available? rep>> %gather-vector-2-reps member? ;
 M: ##gather-vector-4 insn-available? rep>> %gather-vector-4-reps member? ;
+M: ##gather-int-vector-2 insn-available? rep>> %gather-int-vector-2-reps member? ;
+M: ##gather-int-vector-4 insn-available? rep>> %gather-int-vector-4-reps member? ;
+M: ##select-vector insn-available? rep>> %select-vector-reps member? ;
 M: ##store-memory-imm insn-available? rep>> %alien-vector-reps member? ;
 M: ##shuffle-vector insn-available? rep>> %shuffle-vector-reps member? ;
 M: ##shuffle-vector-imm insn-available? rep>> %shuffle-vector-imm-reps member? ;
 M: ##shuffle-vector-halves-imm insn-available? rep>> %shuffle-vector-halves-imm-reps member? ;
 M: ##merge-vector-head insn-available? rep>> %merge-vector-reps member? ;
 M: ##merge-vector-tail insn-available? rep>> %merge-vector-reps member? ;
+M: ##float-pack-vector insn-available? rep>> %float-pack-vector-reps member? ;
 M: ##signed-pack-vector insn-available? rep>> %signed-pack-vector-reps member? ;
 M: ##unsigned-pack-vector insn-available? rep>> %unsigned-pack-vector-reps member? ;
 M: ##unpack-vector-head insn-available? rep>> %unpack-vector-head-reps member? ;
index b18eb9ded41eec897a482958244dba62028bd3df..9d15feb96f0a8323e1d15ccd7780128b86f8017a 100644 (file)
@@ -303,7 +303,10 @@ PREDICATE: fixnum-vector-rep < int-vector-rep
     [ ^^scalar>vector ] keep [ 0 ] dip ^broadcast-vector ;
 
 : ^select-vector ( src n rep -- dst )
-    [ ^broadcast-vector ] keep ^^vector>scalar ;
+    {
+        [ ^^select-vector ]
+        [ [ ^broadcast-vector ] keep ^^vector>scalar ]
+    } vl-vector-op ;
 
 ! intrinsic emitters
 
@@ -567,7 +570,12 @@ PREDICATE: fixnum-vector-rep < int-vector-rep
 
 : emit-simd-vpack-signed ( node -- )
     {
-        [ ^^signed-pack-vector ]
+        { double-2-rep [| src1 src2 rep |
+            src1 double-2-rep ^^float-pack-vector :> dst-head
+            src2 double-2-rep ^^float-pack-vector :> dst-tail
+            dst-head dst-tail { 0 1 0 1 } float-4-rep ^^shuffle-vector-halves-imm
+        ] }
+        { int-vector-rep [ ^^signed-pack-vector ] }
     } emit-vv-vector-op ;
 
 : emit-simd-vpack-unsigned ( node -- )
@@ -593,12 +601,14 @@ PREDICATE: fixnum-vector-rep < int-vector-rep
 
 : emit-simd-gather-2 ( node -- )
     {
+        { fixnum-vector-rep [ ^^gather-int-vector-2 ] }
         { fixnum-vector-rep [ ^^gather-vector-2 ] }
         { float-vector-rep  [ ^^gather-vector-2 ] }
     } emit-vv-vector-op ;
 
 : emit-simd-gather-4 ( node -- )
     {
+        { fixnum-vector-rep [ ^^gather-int-vector-4 ] }
         { fixnum-vector-rep [ ^^gather-vector-4 ] }
         { float-vector-rep  [ ^^gather-vector-4 ] }
     } emit-vvvv-vector-op ;
index 361f5896fb801bc1df318ac5798a8cdd925aeecf..722698e7890e6328fece5c6399ea2535713dc3e7 100644 (file)
@@ -36,31 +36,39 @@ IN: compiler.cfg.linear-scan.allocation
         [ drop assign-blocked-register ]
     } cond ;
 
-: spill-at-sync-point ( n live-interval -- ? )
-    ! If the live interval has a definition at 'n', don't spill
-    2dup find-use
-    { [ ] [ def-rep>> ] } 1&&
-    [ 2drop t ] [ swap spill f ] if ;
+: spill-at-sync-point? ( sync-point live-interval -- ? )
+    ! If the live interval has a definition at a keep-dst?
+    ! sync-point, don't spill.
+    {
+        [ drop keep-dst?>> not ]
+        [ [ n>> ] dip find-use dup [ def-rep>> ] when not ]
+    } 2|| ;
+
+: spill-at-sync-point ( sync-point live-interval -- ? )
+    2dup spill-at-sync-point?
+    [ swap n>> spill f ] [ 2drop t ] if ;
+
+GENERIC: handle-progress* ( obj -- )
+
+M: live-interval handle-progress* drop ;
 
-: handle-sync-point ( n -- )
+M: sync-point handle-progress*
     active-intervals get values
     [ [ spill-at-sync-point ] with filter! drop ] with each ;
 
-:: handle-progress ( n sync? -- )
-    n {
-        [ progress set ]
-        [ deactivate-intervals ]
-        [ sync? [ handle-sync-point ] [ drop ] if ]
-        [ activate-intervals ]
-    } cleave ;
+:: handle-progress ( n obj -- )
+    n progress set
+    n deactivate-intervals
+    obj handle-progress*
+    n activate-intervals ;
 
 GENERIC: handle ( obj -- )
 
 M: live-interval handle ( live-interval -- )
-    [ start>> f handle-progress ] [ assign-register ] bi ;
+    [ [ start>> ] keep handle-progress ] [ assign-register ] bi ;
 
 M: sync-point handle ( sync-point -- )
-    n>> t handle-progress ;
+    [ n>> ] keep handle-progress ;
 
 : smallest-heap ( heap1 heap2 -- heap )
     ! If heap1 and heap2 have the same key, favors heap1.
index 89ec1b778531815d649ad41365da536d7cc8690b..e0cc80f15c02825f0f9a3ffde4d02b7db326e897 100644 (file)
@@ -1,7 +1,7 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: arrays accessors assocs combinators cpu.architecture fry
-heaps kernel math math.order namespaces sequences vectors
+heaps kernel math math.order namespaces layouts sequences vectors
 linked-assocs compiler.cfg compiler.cfg.registers
 compiler.cfg.instructions
 compiler.cfg.linear-scan.live-intervals ;
@@ -122,6 +122,9 @@ SYMBOL: unhandled-intervals
     [ swap [ align dup ] [ + ] bi ] change-spill-area-size drop
     <spill-slot> ;
 
+: align-spill-area ( align -- )
+    cfg get [ max ] change-spill-area-align drop ;
+
 ! Minheap of sync points which still need to be processed
 SYMBOL: unhandled-sync-points
 
@@ -129,7 +132,10 @@ SYMBOL: unhandled-sync-points
 SYMBOL: spill-slots
 
 : assign-spill-slot ( coalesced-vreg rep -- spill-slot )
-    rep-size spill-slots get [ nip next-spill-slot ] 2cache ;
+    rep-size
+    [ align-spill-area ]
+    [ spill-slots get [ nip next-spill-slot ] 2cache ]
+    bi ;
 
 : lookup-spill-slot ( coalesced-vreg rep -- spill-slot )
     rep-size 2array spill-slots get ?at [ ] [ bad-vreg ] if ;
@@ -141,7 +147,7 @@ SYMBOL: spill-slots
     [ V{ } clone ] reg-class-assoc active-intervals set
     [ V{ } clone ] reg-class-assoc inactive-intervals set
     V{ } clone handled-intervals set
-    cfg get 0 >>spill-area-size drop
+    cfg get 0 >>spill-area-size cell >>spill-area-align drop
     H{ } clone spill-slots set
     -1 progress set ;
 
index 1780a1c907793d46a857ab3e21c9f6107253d052..cab4438ec9b189ff54ea2073fafdaa16aae71af5 100644 (file)
@@ -142,9 +142,10 @@ RENAMING: assign [ vreg>reg ] [ vreg>reg ] [ vreg>reg ]
 M: vreg-insn assign-registers-in-insn
     [ assign-insn-defs ] [ assign-insn-uses ] [ assign-insn-temps ] tri ;
 
-M: ##call-gc assign-registers-in-insn
-    dup call-next-method
-    [ [ vreg>reg ] map ] change-gc-roots drop ;
+M: gc-map-insn assign-registers-in-insn
+    [ [ assign-insn-defs ] [ assign-insn-uses ] [ assign-insn-temps ] tri ]
+    [ gc-map>> [ [ vreg>reg ] map ] change-gc-roots drop ]
+    bi ;
 
 M: insn assign-registers-in-insn drop ;
 
index c6252c2ea6a6021e81edf0fe2a3a4ae180b11757..873ba6ee5ce1273472fe47636355a9724cde4bba 100644 (file)
@@ -76,7 +76,7 @@ check-numbering? on
     { T{ live-range f 0 5 } } 0 split-ranges
 ] unit-test
 
-cfg new 0 >>spill-area-size cfg set
+cfg new 0 >>spill-area-size 4 >>spill-area-align cfg set
 H{ } spill-slots set
 
 H{
index 7657937d33e5a7449b4c4b4d15d79c5c723df1ee..5f1abd31658a8cc03d3abb977e1cf37ad7e0d277 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel accessors namespaces make locals
+USING: kernel accessors assocs sequences namespaces make locals
 cpu.architecture
 compiler.cfg
 compiler.cfg.rpo
@@ -37,5 +37,12 @@ IN: compiler.cfg.linear-scan
     cfg resolve-data-flow
     cfg check-numbering ;
 
+: admissible-registers ( cfg -- regs )
+    [ machine-registers ] dip
+    frame-pointer?>> [
+        [ int-regs ] dip [ clone ] map
+        [ [ [ frame-reg ] dip remove ] change-at ] keep
+    ] when ;
+
 : linear-scan ( cfg -- cfg' )
-    dup machine-registers (linear-scan) ;
+    dup dup admissible-registers (linear-scan) ;
index d874d0b5fbdfd42814581d070ed48a9b04effec8..65f341feb8be1420f3404841c941a821ad8fd735 100644 (file)
@@ -134,7 +134,7 @@ M: vreg-insn compute-live-intervals* ( insn -- )
     ] if ;
 
 ! A location where all registers have to be spilled
-TUPLE: sync-point n ;
+TUPLE: sync-point n keep-dst? ;
 
 C: <sync-point> sync-point
 
@@ -143,8 +143,11 @@ SYMBOL: sync-points
 
 GENERIC: compute-sync-points* ( insn -- )
 
+M: hairy-clobber-insn compute-sync-points*
+    insn#>> f <sync-point> sync-points get push ;
+
 M: clobber-insn compute-sync-points*
-    insn#>> <sync-point> sync-points get push ;
+    insn#>> <sync-point> sync-points get push ;
 
 M: insn compute-sync-points* drop ;
 
index a10b48cc0ce034332acc1dbda673ca6d11290b59..1a5287355d63363307e311f6c90b8fde4226c5fa 100644 (file)
@@ -1,25 +1,40 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors assocs sequences sets
 compiler.cfg.def-use compiler.cfg.dataflow-analysis
-compiler.cfg.instructions ;
+compiler.cfg.instructions compiler.cfg.registers
+cpu.architecture ;
 IN: compiler.cfg.liveness
 
 ! See http://en.wikipedia.org/wiki/Liveness_analysis
-! Do not run after SSA construction
+! Do not run after SSA construction; compiler.cfg.liveness.ssa
+! should be used instead. The transfer-liveness word is used
+! by SSA liveness too, so it handles ##phi instructions.
 
 BACKWARD-ANALYSIS: live
 
-GENERIC: insn-liveness ( live-set insn -- )
+GENERIC: visit-insn ( live-set insn -- live-set )
 
 : kill-defs ( live-set insn -- live-set )
-    defs-vreg [ over delete-at ] when* ;
+    defs-vreg [ over delete-at ] when* ; inline
 
 : gen-uses ( live-set insn -- live-set )
-    dup ##phi? [ drop ] [ uses-vregs [ over conjoin ] each ] if ;
+    uses-vregs [ over conjoin ] each ; inline
+
+M: vreg-insn visit-insn [ kill-defs ] [ gen-uses ] bi ;
+
+: fill-gc-map ( live-set insn -- live-set )
+    gc-map>> over keys [ rep-of tagged-rep? ] filter >>gc-roots drop ;
+
+M: gc-map-insn visit-insn
+    [ kill-defs ] [ fill-gc-map ] [ gen-uses ] tri ;
+
+M: ##phi visit-insn kill-defs ;
+
+M: insn visit-insn drop ;
 
 : transfer-liveness ( live-set instructions -- live-set' )
-    [ clone ] [ <reversed> ] bi* [ [ kill-defs ] [ gen-uses ] bi ] each ;
+    [ clone ] [ <reversed> ] bi* [ visit-insn ] each ;
 
 : local-live-in ( instructions -- live-set )
     [ H{ } ] dip transfer-liveness keys ;
index e1a9ec0d939160575c248575d794f68f93f2c1dc..8ca91c4389069cd5453beb49cdcfc1782efd7ced 100644 (file)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors sequences arrays fry namespaces generic
-words sets combinators generalizations cpu.architecture compiler.units
-compiler.cfg.utilities compiler.cfg compiler.cfg.rpo
-compiler.cfg.instructions compiler.cfg.def-use ;
+words sets combinators generalizations sequences.generalizations
+cpu.architecture compiler.units compiler.cfg.utilities
+compiler.cfg compiler.cfg.rpo compiler.cfg.instructions
+compiler.cfg.def-use ;
 FROM: compiler.cfg.instructions.syntax => insn-def-slot insn-use-slots insn-temp-slots scalar-rep ;
 FROM: namespaces => set ;
 IN: compiler.cfg.representations.preferred
index e5edd7cdffb37fa296b9d28d0139df313e8ba2e1..e2ccf943ad93405fcdb28d8e8903d6096130a85b 100644 (file)
@@ -10,7 +10,6 @@ IN: compiler.cfg.save-contexts
 : needs-save-context? ( insns -- ? )
     [
         {
-            [ ##call-gc? ]
             [ ##unary-float-function? ]
             [ ##binary-float-function? ]
             [ ##alien-invoke? ]
index b4cca42ad630266fce6f8e4e73463603f0e73d46..1bb19bd8b062f7d7675b1c4f800e2b0e8caecf1f 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays assocs fry kernel namespaces
+USING: accessors arrays assocs fry locals kernel namespaces
 sequences sequences.deep
 sets vectors
 cpu.architecture
@@ -46,35 +46,39 @@ SYMBOL: class-element-map
 ! Sequence of vreg pairs
 SYMBOL: copies
 
+: value-of ( vreg -- value )
+    insn-of dup ##tagged>integer? [ src>> ] [ dst>> ] if ;
+
 : init-coalescing ( -- )
-    defs get keys
-    [ [ dup ] H{ } map>assoc leader-map set ]
-    [ [ dup 1vector ] H{ } map>assoc class-element-map set ] bi
+    defs get
+    [ [ drop dup ] assoc-map leader-map set ]
+    [ [ [ dup dup value-of ] dip <vreg-info> 1array ] assoc-map class-element-map set ] bi
     V{ } clone copies set ;
 
-: classes-interfere? ( vreg1 vreg2 -- ? )
-    [ leader ] bi@ 2dup eq? [ 2drop f ] [
-        [ class-elements flatten ] bi@ sets-interfere?
-    ] if ;
-
-: update-leaders ( vreg1 vreg2 -- )
+: coalesce-leaders ( vreg1 vreg2 -- )
+    ! leader2 becomes the leader.
     swap leader-map get set-at ;
 
-: merge-classes ( vreg1 vreg2 -- )
-    [ [ class-elements ] bi@ push ]
-    [ drop class-element-map get delete-at ] 2bi ;
+: coalesce-elements ( merged vreg1 vreg2 -- )
+    ! delete leader1's class, and set leader2's class to merged.
+    class-element-map get [ delete-at ] [ set-at ] bi-curry bi* ;
+
+: coalesce-vregs ( merged leader1 leader2 -- )
+    [ coalesce-leaders ] [ coalesce-elements ] 2bi ;
 
-: eliminate-copy ( vreg1 vreg2 -- )
-    [ leader ] bi@
-    2dup eq? [ 2drop ] [
-        [ update-leaders ]
-        [ merge-classes ]
-        2bi
-    ] if ;
+:: maybe-eliminate-copy ( vreg1 vreg2 -- )
+    ! Eliminate a copy of possible.
+    vreg1 leader :> vreg1
+    vreg2 leader :> vreg2
+    vreg1 vreg2 eq? [
+        vreg1 class-elements vreg2 class-elements sets-interfere?
+        [ drop ] [ vreg1 vreg2 coalesce-vregs ] if
+    ] unless ;
 
 GENERIC: prepare-insn ( insn -- )
 
-: try-to-coalesce ( dst src -- ) 2array copies get push ;
+: maybe-eliminate-copy-later ( dst src -- )
+    2array copies get push ;
 
 M: insn prepare-insn drop ;
 
@@ -85,19 +89,19 @@ M: vreg-insn prepare-insn
         2dup empty? not and [
             first
             2dup [ rep-of reg-class-of ] bi@ eq?
-            [ try-to-coalesce ] [ 2drop ] if
+            [ maybe-eliminate-copy-later ] [ 2drop ] if
         ] [ 2drop ] if
     ] bi ;
 
 M: ##copy prepare-insn
-    [ dst>> ] [ src>> ] bi try-to-coalesce ;
+    [ dst>> ] [ src>> ] bi maybe-eliminate-copy-later ;
 
 M: ##tagged>integer prepare-insn
-    [ dst>> ] [ src>> ] bi eliminate-copy ;
+    [ dst>> ] [ src>> ] bi maybe-eliminate-copy ;
 
 M: ##phi prepare-insn
     [ dst>> ] [ inputs>> values ] bi
-    [ eliminate-copy ] with each ;
+    [ maybe-eliminate-copy ] with each ;
 
 : prepare-block ( bb -- )
     instructions>> [ prepare-insn ] each ;
@@ -107,10 +111,7 @@ M: ##phi prepare-insn
     [ prepare-block ] each-basic-block ;
 
 : process-copies ( -- )
-    copies get [
-        2dup classes-interfere?
-        [ 2drop ] [ eliminate-copy ] if
-    ] assoc-each ;
+    copies get [ maybe-eliminate-copy ] assoc-each ;
 
 GENERIC: useful-insn? ( insn -- ? )
 
@@ -135,6 +136,7 @@ PRIVATE>
 
     dup construct-cssa
     dup compute-defs
+    dup compute-insns
     dup compute-ssa-live-sets
     dup compute-live-ranges
     dup prepare-coalescing
index c48ae4ad58b1aca61cc64a3a5676fce30f999486..4e3da1c6dcf1fea0fd640562714133d3dac8ff9a 100644 (file)
@@ -2,17 +2,35 @@ USING: accessors compiler.cfg compiler.cfg.debugger
 compiler.cfg.def-use compiler.cfg.dominance
 compiler.cfg.instructions compiler.cfg.liveness.ssa
 compiler.cfg.registers compiler.cfg.predecessors
-compiler.cfg.ssa.interference
-compiler.cfg.ssa.interference.live-ranges cpu.architecture
-kernel namespaces tools.test ;
+compiler.cfg.comparisons compiler.cfg.ssa.interference
+compiler.cfg.ssa.interference.private
+compiler.cfg.ssa.interference.live-ranges
+cpu.architecture kernel namespaces tools.test alien.c-types
+arrays sequences slots ;
 IN: compiler.cfg.ssa.interference.tests
 
 : test-interference ( -- )
     cfg new 0 get >>entry
     dup compute-ssa-live-sets
     dup compute-defs
+    dup compute-insns
     compute-live-ranges ;
 
+: <test-vreg-info> ( vreg -- info )
+    [ ] [ insn-of dup ##tagged>integer? [ src>> ] [ dst>> ] if ] [ def-of ] tri
+    <vreg-info> ;
+
+: test-vregs-intersect? ( vreg1 vreg2 -- ? )
+    [ <test-vreg-info> ] bi@ vregs-intersect? ;
+
+: test-vregs-interfere? ( vreg1 vreg2 -- ? )
+    [ <test-vreg-info> ] bi@
+    [ blue >>color ] [ red >>color ] bi*
+    vregs-interfere? ;
+
+: test-sets-interfere? ( seq1 seq2 -- merged ? )
+    [ [ <test-vreg-info> ] map ] bi@ sets-interfere? ;
+
 V{
     T{ ##peek f 0 D 0 }
     T{ ##peek f 2 D 0 }
@@ -34,17 +52,310 @@ V{
 
 [ ] [ test-interference ] unit-test
 
-[ f ] [ 0 1 vregs-interfere? ] unit-test
-[ f ] [ 1 0 vregs-interfere? ] unit-test
-[ f ] [ 2 3 vregs-interfere? ] unit-test
-[ f ] [ 3 2 vregs-interfere? ] unit-test
-[ t ] [ 0 2 vregs-interfere? ] unit-test
-[ t ] [ 2 0 vregs-interfere? ] unit-test
-[ f ] [ 1 3 vregs-interfere? ] unit-test
-[ f ] [ 3 1 vregs-interfere? ] unit-test
-[ t ] [ 3 4 vregs-interfere? ] unit-test
-[ t ] [ 4 3 vregs-interfere? ] unit-test
-[ t ] [ 3 5 vregs-interfere? ] unit-test
-[ t ] [ 5 3 vregs-interfere? ] unit-test
-[ f ] [ 3 6 vregs-interfere? ] unit-test
-[ f ] [ 6 3 vregs-interfere? ] unit-test
\ No newline at end of file
+[ f ] [ 0 1 test-vregs-intersect? ] unit-test
+[ f ] [ 1 0 test-vregs-intersect? ] unit-test
+[ f ] [ 2 3 test-vregs-intersect? ] unit-test
+[ f ] [ 3 2 test-vregs-intersect? ] unit-test
+[ t ] [ 0 2 test-vregs-intersect? ] unit-test
+[ t ] [ 2 0 test-vregs-intersect? ] unit-test
+[ f ] [ 1 3 test-vregs-intersect? ] unit-test
+[ f ] [ 3 1 test-vregs-intersect? ] unit-test
+[ t ] [ 3 4 test-vregs-intersect? ] unit-test
+[ t ] [ 4 3 test-vregs-intersect? ] unit-test
+[ t ] [ 3 5 test-vregs-intersect? ] unit-test
+[ t ] [ 5 3 test-vregs-intersect? ] unit-test
+[ f ] [ 3 6 test-vregs-intersect? ] unit-test
+[ f ] [ 6 3 test-vregs-intersect? ] unit-test
+
+V{
+    T{ ##prologue }
+    T{ ##branch }
+} 0 test-bb
+
+
+V{
+    T{ ##inc-d f -3 }
+    T{ ##peek f 12 D -2 }
+    T{ ##peek f 23 D -1 }
+    T{ ##sar-imm f 13 23 4 }
+    T{ ##peek f 24 D -3 }
+    T{ ##sar-imm f 14 24 4 }
+    T{ ##mul f 15 13 13 }
+    T{ ##mul f 16 15 15 }
+    T{ ##tagged>integer f 17 12 }
+    T{ ##store-memory f 16 17 14 0 7 int-rep uchar }
+    T{ ##branch }
+} 1 test-bb
+
+V{
+    T{ ##epilogue }
+    T{ ##return }
+} 2 test-bb
+
+0 1 edge
+1 2 edge
+
+[ ] [ test-interference ] unit-test
+
+[ t ] [ { 15 } { 23 13 } test-sets-interfere? nip ] unit-test
+
+V{
+    T{ ##prologue f }
+    T{ ##branch f }
+} 0 test-bb
+
+V{
+    T{ ##inc-d f 2 }
+    T{ ##peek f 32 D 2 }
+    T{ ##load-reference f 33 ##check-nursery-branch }
+    T{ ##load-integer f 34 11 }
+    T{ ##tagged>integer f 35 32 }
+    T{ ##and-imm f 36 35 15 }
+    T{ ##compare-integer-imm-branch f 36 7 cc= }
+} 1 test-bb
+
+V{
+    T{ ##slot-imm f 48 32 1 7 }
+    T{ ##slot-imm f 50 48 1 2 }
+    T{ ##sar-imm f 65 50 4 }
+    T{ ##compare-integer-branch f 34 65 cc<= }
+} 2 test-bb
+
+V{
+    T{ ##inc-d f -2 }
+    T{ ##slot-imm f 57 48 11 2 }
+    T{ ##compare f 58 33 57 cc= 20 }
+    T{ ##replace f 58 D 0 }
+    T{ ##branch f }
+} 3 test-bb
+
+V{
+    T{ ##epilogue f }
+    T{ ##return f }
+} 4 test-bb
+
+V{
+    T{ ##inc-d f -2 }
+    T{ ##replace-imm f f D 0 }
+    T{ ##branch f }
+} 5 test-bb
+
+V{
+    T{ ##epilogue f }
+    T{ ##return f }
+} 6 test-bb
+
+V{
+    T{ ##inc-d f -2 }
+    T{ ##replace-imm f f D 0 }
+    T{ ##branch f }
+} 7 test-bb
+
+V{
+    T{ ##epilogue f }
+    T{ ##return f }
+} 8 test-bb
+
+0 1 edge
+1 { 2 7 } edges
+2 { 3 5 } edges
+3 4 edge
+5 6 edge
+7 8 edge
+
+[ ] [ test-interference ] unit-test
+
+[ f ] [ { 48 } { 32 35 } test-sets-interfere? nip ] unit-test
+
+TUPLE: bab ;
+TUPLE: gfg { x bab } ;
+: bah ( -- x ) f ;
+
+V{
+    T{ ##prologue }
+    T{ ##branch }
+} 0 test-bb
+
+V{
+    T{ ##check-nursery-branch f 16 cc<= 75 76 }
+} 1 test-bb
+
+V{
+    T{ ##save-context f 77 78 }
+    T{ ##call-gc f { } }
+    T{ ##branch }
+} 2 test-bb
+
+V{
+    T{ ##inc-d f 1 }
+    T{ ##load-reference f 37 T{ bab } }
+    T{ ##load-reference f 38 { gfg 1 1 tuple 57438726 gfg 7785907 } }
+    T{ ##allot f 40 12 tuple 4 }
+    T{ ##set-slot-imm f 38 40 1 7 }
+    T{ ##set-slot-imm f 37 40 2 7 }
+    T{ ##replace f 40 D 0 }
+    T{ ##branch }
+} 3 test-bb
+
+V{
+    T{ ##call f bah }
+    T{ ##branch }
+} 4 test-bb
+
+V{
+    T{ ##inc-r f 1 }
+    T{ ##inc-d f 1 }
+    T{ ##peek f 43 D 1 }
+    T{ ##peek f 44 D 2 }
+    T{ ##tagged>integer f 45 43 }
+    T{ ##and-imm f 46 45 15 }
+    T{ ##compare-integer-imm-branch f 46 7 cc= }
+} 5 test-bb
+
+V{
+    T{ ##inc-d f -1 }
+    T{ ##slot-imm f 58 43 1 7 }
+    T{ ##slot-imm f 60 58 7 2 }
+    T{ ##compare-imm-branch f 60 bab cc= }
+} 6 test-bb
+
+V{
+    T{ ##branch }
+} 7 test-bb
+
+V{
+    T{ ##inc-r f -1 }
+    T{ ##inc-d f -1 }
+    T{ ##set-slot-imm f 43 44 2 7 }
+    T{ ##write-barrier-imm f 44 2 7 34 35 }
+    T{ ##branch }
+} 8 test-bb
+
+V{
+    T{ ##epilogue }
+    T{ ##return }
+} 9 test-bb
+
+V{
+    T{ ##inc-d f 1 }
+    T{ ##replace f 44 R 0 }
+    T{ ##replace-imm f bab D 0 }
+    T{ ##branch }
+} 10 test-bb
+
+V{
+    T{ ##call f bad-slot-value }
+    T{ ##branch }
+} 11 test-bb
+
+V{
+    T{ ##no-tco }
+} 12 test-bb
+
+V{
+    T{ ##inc-d f -1 }
+    T{ ##branch }
+} 13 test-bb
+
+V{
+    T{ ##inc-d f 1 }
+    T{ ##replace f 44 R 0 }
+    T{ ##replace-imm f bab D 0 }
+    T{ ##branch }
+} 14 test-bb
+
+V{
+    T{ ##call f bad-slot-value }
+    T{ ##branch }
+} 15 test-bb
+
+V{
+    T{ ##no-tco }
+} 16 test-bb
+
+0 1 edge
+1 { 3 2 } edges
+2 3 edge
+3 4 edge
+4 5 edge
+5 { 6 13 } edges
+6 { 7 10 } edges
+7 8 edge
+8 9 edge
+10 11 edge
+11 12 edge
+13 14 edge
+14 15 edge
+15 16 edge
+
+[ ] [ test-interference ] unit-test
+
+[ t ] [ 43 45 test-vregs-intersect? ] unit-test
+[ f ] [ 43 45 test-vregs-interfere? ] unit-test
+
+[ t ] [ 43 46 test-vregs-intersect? ] unit-test
+[ t ] [ 43 46 test-vregs-interfere? ] unit-test
+
+[ f ] [ 45 46 test-vregs-intersect? ] unit-test
+[ f ] [ 45 46 test-vregs-interfere? ] unit-test
+
+[ f ] [ { 43 } { 45 } test-sets-interfere? nip ] unit-test
+
+[ t f ] [
+    { 46 } { 43 } { 45 }
+    [ [ <test-vreg-info> ] map ] tri@
+    sets-interfere? [ sets-interfere? nip ] dip
+] unit-test
+
+V{
+    T{ ##prologue f }
+    T{ ##branch f }
+} 0 test-bb
+
+V{
+    T{ ##inc-d f 1 }
+    T{ ##peek f 31 D 1 }
+    T{ ##sar-imm f 16 31 4 }
+    T{ ##load-integer f 17 0 }
+    T{ ##copy f 33 17 int-rep }
+    T{ ##branch f }
+} 1 test-bb
+
+V{
+    T{ ##phi f 21 H{ { 1 33 } { 3 32 } } }
+    T{ ##compare-integer-branch f 21 16 cc< }
+} 2 test-bb
+
+V{
+    T{ ##add-imm f 27 21 1 }
+    T{ ##copy f 32 27 int-rep }
+    T{ ##branch f }
+} 3 test-bb
+
+V{
+    T{ ##inc-d f -2 }
+    T{ ##branch f }
+} 4 test-bb
+
+V{
+    T{ ##epilogue f }
+    T{ ##return f }
+} 5 test-bb
+
+0 1 edge
+1 2 edge
+2 { 3 4 } edges
+3 2 edge
+4 5 edge
+
+[ ] [ test-interference ] unit-test
+
+[ f f ] [
+    { 33 } { 21 } { 32 }
+    [ [ <test-vreg-info> ] map ] tri@
+    sets-interfere? [ sets-interfere? nip ] dip
+] unit-test
+
+[ f ] [ 33 21 test-vregs-intersect? ] unit-test
+[ f ] [ 32 21 test-vregs-intersect? ] unit-test
+[ f ] [ 32 33 test-vregs-intersect? ] unit-test
\ No newline at end of file
index a76b55cd83dcc8fecd489af7f800e10d05ea85ae..0beb9ef01035d03e6a273121ea7b99b506158233 100644 (file)
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs combinators combinators.short-circuit fry
-kernel math math.order sorting namespaces sequences locals
-compiler.cfg.def-use compiler.cfg.dominance
-compiler.cfg.ssa.interference.live-ranges ;
+USING: accessors arrays assocs combinators
+combinators.short-circuit fry kernel math math.order sorting
+sorting.slots namespaces sequences locals compiler.cfg.def-use
+compiler.cfg.dominance compiler.cfg.ssa.interference.live-ranges ;
 IN: compiler.cfg.ssa.interference
 
-! Interference testing using SSA properties. Actually the only SSA property
-! used here is that definitions dominate uses; because of this, the input
-! is allowed to have multiple definitions of each vreg as long as they're
-! all in the same basic block. This is needed because two-operand conversion
-! runs before coalescing, which uses SSA interference testing.
+! Interference testing using SSA properties.
+!
+! Based on:
+!
+! Revisiting Out-of-SSA Translation for Correctness, Code Quality, and Efficiency
+! http://hal.archives-ouvertes.fr/docs/00/34/99/25/PDF/OutSSA-RR.pdf
+
+TUPLE: vreg-info vreg value def-index bb pre-of color equal-anc-in equal-anc-out ;
+
+:: <vreg-info> ( vreg value bb -- info )
+    vreg-info new
+        vreg >>vreg
+        bb >>bb
+        value >>value
+        bb pre-of >>pre-of
+        vreg bb def-index >>def-index ;
+
 <PRIVATE
 
-:: kill-after-def? ( vreg1 vreg2 bb -- ? )
+! Our dominance pass computes dominance information on a
+! per-basic block level. Rig up a more fine-grained dominance
+! test here.
+: locally-dominates? ( vreg1 vreg2 -- ? )
+    [ def-index>> ] bi@ < ;
+
+:: vreg-dominates? ( vreg1 vreg2 -- ? )
+    vreg1 bb>> :> bb1
+    vreg2 bb>> :> bb2
+    bb1 bb2 eq?
+    [ vreg1 vreg2 locally-dominates? ] [ bb1 bb2 dominates? ] if ;
+
+! Testing individual vregs for live range intersection.
+: kill-after-def? ( vreg1 vreg2 bb -- ? )
     ! If first register is used after second one is defined, they interfere.
     ! If they are used in the same instruction, no interference. If the
     ! instruction is a def-is-use-insn, then there will be a use at +1
     ! (instructions are 2 apart) and so outputs will interfere with
     ! inputs.
-    vreg1 bb kill-index
-    vreg2 bb def-index > ;
+    [ kill-index ] [ def-index ] bi-curry bi* > ;
 
-:: interferes-same-block? ( vreg1 vreg2 bb1 bb2 -- ? )
-    ! If both are defined in the same basic block, they interfere if their
-    ! local live ranges intersect.
-    vreg1 bb1 def-index
-    vreg2 bb1 def-index <
-    [ vreg1 vreg2 ] [ vreg2 vreg1 ] if
-    bb1 kill-after-def? ;
-
-: interferes-first-dominates? ( vreg1 vreg2 bb1 bb2 -- ? )
+: interferes-first-dominates? ( vreg1 vreg2 -- ? )
     ! If vreg1 dominates vreg2, then they interfere if vreg2's definition
     ! occurs before vreg1 is killed.
-    nip
-    kill-after-def? ;
+    [ [ vreg>> ] bi@ ] [ nip bb>> ] 2bi kill-after-def? ;
 
-: interferes-second-dominates? ( vreg1 vreg2 bb1 bb2 -- ? )
+: interferes-second-dominates? ( vreg1 vreg2 -- ? )
     ! If vreg2 dominates vreg1, then they interfere if vreg1's definition
     ! occurs before vreg2 is killed.
-    drop
-    swapd kill-after-def? ;
-
-PRIVATE>
+    swap interferes-first-dominates? ;
 
-: vregs-interfere? ( vreg1 vreg2 -- ? )
-    2dup [ def-of ] bi@ {
-        { [ 2dup eq? ] [ interferes-same-block? ] }
-        { [ 2dup dominates? ] [ interferes-first-dominates? ] }
-        { [ 2dup swap dominates? ] [ interferes-second-dominates? ] }
-        [ 2drop 2drop f ]
+: interferes-same-block? ( vreg1 vreg2 -- ? )
+    ! If both are defined in the same basic block, they interfere if their
+    ! local live ranges intersect.
+    2dup locally-dominates? [ swap ] unless
+    interferes-first-dominates? ;
+
+:: vregs-intersect? ( vreg1 vreg2 -- ? )
+    vreg1 bb>> :> bb1
+    vreg2 bb>> :> bb2
+    {
+        { [ bb1 bb2 eq? ] [ vreg1 vreg2 interferes-same-block? ] }
+        { [ bb1 bb2 dominates? ] [ vreg1 vreg2 interferes-first-dominates? ] }
+        { [ bb2 bb1 dominates? ] [ vreg1 vreg2 interferes-second-dominates? ] }
+        [ f ]
     } cond ;
 
-<PRIVATE
-
-! Debug this stuff later
+! Value-based interference test.
+: chain-intersect ( vreg1 vreg2 -- vreg )
+    [ 2dup { [ nip ] [ vregs-intersect? not ] } 2&& ]
+    [ equal-anc-in>> ]
+    while nip ;
 
-: quadratic-test? ( seq1 seq2 -- ? ) [ length ] bi@ + 10 < ;
+: update-equal-anc-out ( vreg1 vreg2 -- )
+    dupd chain-intersect >>equal-anc-out drop ;
 
-: quadratic-test ( seq1 seq2 -- ? )
-    '[ _ [ vregs-interfere? ] with any? ] any? ;
+: same-sets? ( vreg1 vreg2 -- ? )
+    [ color>> ] bi@ eq? ;
 
-: sort-vregs-by-bb ( vregs -- alist )
-    defs get
-    '[ dup _ at ] { } map>assoc
-    [ second pre-of ] sort-with ;
+: same-values? ( vreg1 vreg2 -- ? )
+    [ value>> ] bi@ eq? ;
 
-: ?last ( seq -- elt/f ) [ f ] [ last ] if-empty ; inline
-
-: find-parent ( dom current -- parent )
+: vregs-interfere? ( vreg1 vreg2 -- ? )
+    [ f >>equal-anc-out ] dip
+
+    2dup same-sets? [ equal-anc-out>> ] when
+
+    2dup same-values?
+    [ update-equal-anc-out f ] [ chain-intersect >boolean ] if ;
+
+! Merging lists of vregs sorted by dominance.
+M: vreg-info <=> ( vreg1 vreg2 -- <=> )
+    { { pre-of>> <=> } { def-index>> <=> } } compare-slots ;
+
+SYMBOLS: blue red ;
+
+TUPLE: iterator seq n ;
+: <iterator> ( seq -- iterator ) 0 iterator boa ; inline
+: done? ( iterator -- ? ) [ seq>> length ] [ n>> ] bi = ; inline
+: this ( iterator -- obj ) [ n>> ] [ seq>> ] bi nth ; inline
+: ++ ( iterator -- ) [ 1 + ] change-n drop ; inline
+: take ( iterator -- obj ) [ this ] [ ++ ] bi ; inline
+
+: blue-smaller? ( blue red -- ? )
+    [ this ] bi@ before? ; inline
+
+: take-blue? ( blue red -- ? )
+    {
+        [ nip done? ]
+        [
+            {
+                [ drop done? not ]
+                [ blue-smaller? ]
+            } 2&&
+        ]
+    } 2|| ; inline
+
+: merge-sets ( blue red -- seq )
+    [ <iterator> ] bi@
+    [ 2dup [ done? ] both? not ]
+    [
+        2dup take-blue?
+        [ over take blue >>color ]
+        [ dup take red >>color ]
+        if
+    ] produce 2nip ;
+
+: update-for-merge ( seq -- )
+    [
+        dup [ equal-anc-in>> ] [ equal-anc-out>> ] bi
+        2dup and [ [ vreg-dominates? ] most ] [ or ] if
+        >>equal-anc-in
+        drop
+    ] each ;
+
+! Linear-time live range intersection test in a merged set.
+: find-parent ( dom current -- vreg )
     over empty? [ 2drop f ] [
-        over last over dominates? [ drop last ] [
-            over pop* find-parent
-        ] if
+        over last over vreg-dominates?
+        [ drop last ] [ over pop* find-parent ] if
     ] if ;
 
-:: linear-test ( seq1 seq2 -- ? )
-    ! Instead of sorting, SSA destruction should keep equivalence
-    ! classes sorted by merging them on append
+:: linear-interference-test ( seq -- ? )
     V{ } clone :> dom
-    seq1 seq2 append sort-vregs-by-bb [| pair |
-        pair first :> current
-        dom current find-parent
-        dup [ current vregs-interfere? ] when
-        [ t ] [ current dom push f ] if
+    seq [| vreg |
+        dom vreg find-parent
+        { [ ] [ vreg same-sets? not ] [ vreg swap vregs-interfere? ] } 1&&
+        [ t ] [ vreg dom push f ] if
     ] any? ;
 
+: sets-interfere-1? ( seq1 seq2 -- merged/f ? )
+    [ first ] bi@
+    2dup before? [ swap ] unless
+    2dup same-values? [
+        2dup equal-anc-in<<
+        2array f
+    ] [
+        2dup vregs-intersect?
+        [ 2drop f t ] [ 2array f ] if
+    ] if ;
+
 PRIVATE>
 
-: sets-interfere? ( seq1 seq2 -- ? )
-    quadratic-test ;
\ No newline at end of file
+: sets-interfere? ( seq1 seq2 -- merged/f ? )
+    2dup [ length 1 = ] both? [ sets-interfere-1? ] [
+        merge-sets dup linear-interference-test
+        [ drop f t ] [ dup update-for-merge f ] if
+    ] if ;
\ No newline at end of file
index be454851346eab547c3ca0c0a03433cfea84d5d9..d0c729556d97d7ccbae58957b7e1efe0aea8198f 100644 (file)
@@ -25,15 +25,23 @@ SYMBOLS: local-def-indices local-kill-indices ;
         [ 1 + ] dip [ local-kill-indices get set-at ] with each
     ] if ;
 
-: visit-insn ( insn n -- )
-    2 * swap [ record-def ] [ record-uses ] 2bi ;
+GENERIC: record-insn ( n insn -- )
+
+M: ##phi record-insn
+    record-def ;
+
+M: vreg-insn record-insn
+    [ 2 * ] dip [ record-def ] [ record-uses ] 2bi ;
+
+M: insn record-insn
+    2drop ;
 
 SYMBOLS: def-indices kill-indices ;
 
 : compute-local-live-ranges ( bb -- )
     H{ } clone local-def-indices set
     H{ } clone local-kill-indices set
-    [ instructions>> [ visit-insn ] each-index ]
+    [ instructions>> [ swap record-insn ] each-index ]
     [ [ local-def-indices get ] dip def-indices get set-at ]
     [ [ local-kill-indices get ] dip kill-indices get set-at ]
     tri ;
index 8ad55d76d81e86a63a2f20b46fa988585c54ed05..790d93a907bad1a26a5cd2e0484a730f83ef4b88 100644 (file)
@@ -1,39 +1,26 @@
 ! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math math.order namespaces accessors kernel layouts
-combinators combinators.smart assocs sequences cpu.architecture
+combinators assocs sequences cpu.architecture
 words compiler.cfg.instructions ;
 IN: compiler.cfg.stack-frame
 
 TUPLE: stack-frame
 { params integer }
-{ return integer }
+{ allot-area-size integer }
+{ allot-area-align integer }
 { spill-area-size integer }
+{ spill-area-align integer }
+
 { total-size integer }
-{ calls-vm? boolean } ;
+{ allot-area-base integer }
+{ spill-area-base integer } ;
 
-! Stack frame utilities
-: param-base ( -- n )
-    stack-frame get [ params>> ] [ return>> ] bi + ;
+: local-allot-offset ( n -- offset )
+    stack-frame get allot-area-base>> + ;
 
 : spill-offset ( n -- offset )
-    param-base + ;
+    stack-frame get spill-area-base>> + ;
 
 : (stack-frame-size) ( stack-frame -- n )
-    [
-        [ params>> ] [ return>> ] [ spill-area-size>> ] tri
-    ] sum-outputs ;
-
-: max-stack-frame ( frame1 frame2 -- frame3 )
-    [ stack-frame new ] 2dip
-    {
-        [ [ params>> ] bi@ max >>params ]
-        [ [ return>> ] bi@ max >>return ]
-        [ [ spill-area-size>> ] bi@ max >>spill-area-size ]
-        [ [ calls-vm?>> ] bi@ or >>calls-vm? ]
-    } 2cleave ;
-
-! PowerPC backend sets frame-required? for ##integer>float too
-\ ##spill t "frame-required?" set-word-prop
-\ ##unary-float-function t "frame-required?" set-word-prop
-\ ##binary-float-function t "frame-required?" set-word-prop
\ No newline at end of file
+    [ spill-area-base>> ] [ spill-area-size>> ] bi + ;
index 3d7519e14ba9e79dcbaeba863af4ece84c793c74..7498cddf109e7e1a4b74214192c520566525b7d8 100644 (file)
@@ -9,11 +9,17 @@ IN: compiler.cfg.stacks.uninitialized
 
 ! Consider the following sequence of instructions:
 ! ##inc-d 2
-! ##gc
+! ...
+! ##allot
 ! ##replace ... D 0
 ! ##replace ... D 1
-! The GC check runs before stack locations 0 and 1 have been initialized,
-! and it needs to zero them out so that GC doesn't try to trace them.
+! The GC check runs before stack locations 0 and 1 have been
+! initialized, and so the GC needs to scrub them so that they
+! don't get traced. This is achieved by computing uninitialized
+! locations with a dataflow analysis, and recording the
+! information in GC maps. The scrub_contexts() method on
+! vm/gc.cpp reads this information from GC maps and performs
+! the scrubbing.
 
 <PRIVATE
 
@@ -28,7 +34,6 @@ GENERIC: visit-insn ( insn -- )
     ] change ;
 
 M: ##inc-d visit-insn n>> ds-loc handle-inc ;
-
 M: ##inc-r visit-insn n>> rs-loc handle-inc ;
 
 ERROR: uninitialized-peek insn ;
@@ -46,6 +51,12 @@ M: ##peek visit-insn visit-peek ;
 M: ##replace visit-insn visit-replace ;
 M: ##replace-imm visit-insn visit-replace ;
 
+M: gc-map-insn visit-insn
+    gc-map>>
+    ds-loc get clone >>scrub-d
+    rs-loc get clone >>scrub-r
+    drop ;
+
 M: insn visit-insn drop ;
 
 : prepare ( pair -- )
@@ -59,9 +70,6 @@ M: insn visit-insn drop ;
 : (join-sets) ( seq1 seq2 -- seq )
     2dup [ length ] bi@ max '[ _ 1 pad-tail ] bi@ [ bitand ] 2map ;
 
-: (uninitialized-locs) ( seq quot -- seq' )
-    [ [ drop 0 = ] selector [ each-index ] dip ] dip map ; inline
-
 PRIVATE>
 
 FORWARD-ANALYSIS: uninitialized
@@ -71,11 +79,3 @@ M: uninitialized-analysis transfer-set ( pair bb analysis -- pair' )
 
 M: uninitialized-analysis join-sets ( sets analysis -- pair )
     2drop sift [ f ] [ [ ] [ [ (join-sets) ] 2map ] map-reduce ] if-empty ;
-
-: uninitialized-locs ( bb -- locs )
-    uninitialized-in dup [
-        first2
-        [ [ <ds-loc> ] (uninitialized-locs) ]
-        [ [ <rs-loc> ] (uninitialized-locs) ]
-        bi* append
-    ] when ;
index ed037c4d0610b47b902a0cc90161672bf29a85fc..8bbacd2f299d674e60ef56ba884cbdac0741f9f3 100644 (file)
@@ -280,21 +280,29 @@ M: ##compare-integer-imm rewrite
 
 M: ##test rewrite
     {
-        { [ dup src1>> vreg>insn ##load-integer? ] [ t >test-imm ] }
-        { [ dup src2>> vreg>insn ##load-integer? ] [ f >test-imm ] }
-        { [ dup diagonal? not ] [ drop f ] }
-        { [ dup src1>> vreg>insn ##and? ] [ simplify-test ] }
-        { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm ] }
+        { [ dup src1>> vreg-immediate-comparand? ] [ t >test-imm ] }
+        { [ dup src2>> vreg-immediate-comparand? ] [ f >test-imm ] }
+        { [ dup diagonal? ] [
+            {
+                { [ dup src1>> vreg>insn ##and? ] [ simplify-test ] }
+                { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm ] }
+                [ drop f ]
+            } cond
+        ] }
         [ drop f ]
     } cond ;
 
 M: ##test-branch rewrite
     {
-        { [ dup src1>> vreg>insn ##load-integer? ] [ t >test-imm-branch ] }
-        { [ dup src2>> vreg>insn ##load-integer? ] [ f >test-imm-branch ] }
-        { [ dup diagonal? not ] [ drop f ] }
-        { [ dup src1>> vreg>insn ##and? ] [ simplify-test-branch ] }
-        { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm-branch ] }
+        { [ dup src1>> vreg-immediate-comparand? ] [ t >test-imm-branch ] }
+        { [ dup src2>> vreg-immediate-comparand? ] [ f >test-imm-branch ] }
+        { [ dup diagonal? ] [
+            {
+                { [ dup src1>> vreg>insn ##and? ] [ simplify-test-branch ] }
+                { [ dup src1>> vreg>insn ##and-imm? ] [ simplify-test-imm-branch ] }
+                [ drop f ]
+            } cond
+        ] }
         [ drop f ]
     } cond ;
 
index 1983c0719076ae58a8dad7e300493daf78dc7281..84acc95859b76cc21452162a2f47588a6b09ab40 100644 (file)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors combinators combinators.short-circuit arrays
 fry kernel layouts math namespaces sequences cpu.architecture
-math.bitwise math.order classes
-vectors locals make alien.c-types io.binary grouping
+math.bitwise math.order classes generalizations
+combinators.smart locals make alien.c-types io.binary grouping
 math.vectors.simd.intrinsics
 compiler.cfg
 compiler.cfg.registers
@@ -44,24 +44,72 @@ M: ##shuffle-vector-imm rewrite
         [ 2drop f ]
     } cond ;
 
+: scalar-value ( literal-insn rep -- byte-array )
+    {
+        { float-4-rep [ obj>> float>bits 4 >le ] }
+        { double-2-rep [ obj>> double>bits 8 >le ] }
+        [ [ val>> ] [ rep-component-type heap-size ] bi* >le ]
+    } case ;
+
 : (fold-scalar>vector) ( insn bytes -- insn' )
     [ [ dst>> ] [ rep>> rep-length ] bi ] dip <repetition> concat
     \ ##load-reference new-insn ;
 
 : fold-scalar>vector ( outer inner -- insn' )
-    obj>> over rep>> {
-        { float-4-rep [ float>bits 4 >le (fold-scalar>vector) ] }
-        { double-2-rep [ double>bits 8 >le (fold-scalar>vector) ] }
-        [ [ untag-fixnum ] dip rep-component-type heap-size >le (fold-scalar>vector) ]
-    } case ;
+    over rep>> scalar-value (fold-scalar>vector) ;
 
 M: ##scalar>vector rewrite
     dup src>> vreg>insn {
-        { [ dup ##load-reference? ] [ fold-scalar>vector ] }
+        { [ dup literal-insn? ] [ fold-scalar>vector ] }
         { [ dup ##vector>scalar? ] [ [ dst>> ] [ src>> ] bi* <copy> ] }
         [ 2drop f ]
     } cond ;
 
+:: fold-gather-vector-2 ( insn src1 src2 -- insn )
+    insn dst>>
+    src1 src2 [ insn rep>> scalar-value ] bi@ append
+    \ ##load-reference new-insn ;
+
+: rewrite-gather-vector-2 ( insn -- insn/f )
+    dup [ src1>> vreg>insn ] [ src2>> vreg>insn ] bi {
+        { [ 2dup [ literal-insn? ] both? ] [ fold-gather-vector-2 ] }
+        [ 3drop f ]
+    } cond ;
+
+M: ##gather-vector-2 rewrite rewrite-gather-vector-2 ;
+
+M: ##gather-int-vector-2 rewrite rewrite-gather-vector-2 ;
+
+:: fold-gather-vector-4 ( insn src1 src2 src3 src4 -- insn )
+    insn dst>>
+    [
+        src1 src2 src3 src4
+        [ insn rep>> scalar-value ] 4 napply
+    ] B{ } append-outputs-as
+    \ ##load-reference new-insn ;
+
+: rewrite-gather-vector-4 ( insn -- insn/f )
+    dup { [ src1>> ] [ src2>> ] [ src3>> ] [ src4>> ] } cleave [ vreg>insn ] 4 napply
+    {
+        { [ 4 ndup [ literal-insn? ] 4 napply and and and ] [ fold-gather-vector-4 ] }
+        [ 5 ndrop f ]
+    } cond ;
+
+M: ##gather-vector-4 rewrite rewrite-gather-vector-4 ;
+
+M: ##gather-int-vector-4 rewrite rewrite-gather-vector-4 ;
+
+: fold-shuffle-vector ( insn src1 src2 -- insn )
+    [ dst>> ] [ obj>> ] [ obj>> ] tri*
+    swap nths \ ##load-reference new-insn ;
+
+M: ##shuffle-vector rewrite
+    dup [ src>> vreg>insn ] [ shuffle>> vreg>insn ] bi
+    {
+        { [ 2dup [ ##load-reference? ] both? ] [ fold-shuffle-vector ] }
+        [ 3drop f ]
+    } cond ;
+
 M: ##xor-vector rewrite
     dup diagonal?
     [ [ dst>> ] [ rep>> ] bi \ ##zero-vector new-insn ] [ drop f ] if ;
index be387c3f3279250e0f0e073eba0a7dda09ba3ebc..015368cf98ba4aa435cfa80996b719a53666f266 100644 (file)
@@ -1163,6 +1163,51 @@ cpu x86.32? [
     } value-numbering-step
 ] unit-test
 
+[
+    {
+        T{ ##peek f 0 D 0 }
+        T{ ##load-integer f 1 10 }
+        T{ ##test-imm-branch f 0 10 cc= }
+    }
+] [
+    {
+        T{ ##peek f 0 D 0 }
+        T{ ##load-integer f 1 10 }
+        T{ ##test-branch f 1 0 cc= }
+    } value-numbering-step
+] unit-test
+
+! Make sure the immediate fits
+cpu x86.64? [
+    [
+        {
+            T{ ##peek f 0 D 0 }
+            T{ ##load-integer f 1 100000000000 }
+            T{ ##test f 2 1 0 cc= }
+        }
+    ] [
+        {
+            T{ ##peek f 0 D 0 }
+            T{ ##load-integer f 1 100000000000 }
+            T{ ##test f 2 1 0 cc= }
+        } value-numbering-step
+    ] unit-test
+
+    [
+        {
+            T{ ##peek f 0 D 0 }
+            T{ ##load-integer f 1 100000000000 }
+            T{ ##test-branch f 1 0 cc= }
+        }
+    ] [
+        {
+            T{ ##peek f 0 D 0 }
+            T{ ##load-integer f 1 100000000000 }
+            T{ ##test-branch f 1 0 cc= }
+        } value-numbering-step
+    ] unit-test
+] when
+
 ! Rewriting ##compare into ##test
 cpu x86? [
     [
@@ -2263,13 +2308,13 @@ cell 8 = [
 
 [
     {
-        T{ ##load-reference f 0 $[ 55 tag-fixnum ] }
+        T{ ##load-integer f 0 55 }
         T{ ##load-reference f 1 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
         T{ ##load-reference f 2 B{ 55 0 0 0  55 0 0 0  55 0 0 0  55 0 0 0 } }
     }
 ] [
     {
-        T{ ##load-reference f 0 $[ 55 tag-fixnum ] }
+        T{ ##load-integer f 0 55 }
         T{ ##scalar>vector f 1 0 int-4-rep }
         T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
     } value-numbering-step
@@ -2289,6 +2334,100 @@ cell 8 = [
     } value-numbering-step
 ] unit-test
 
+[
+    {
+        T{ ##load-reference f 0 1.25 }
+        T{ ##load-reference f 1 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
+        T{ ##load-reference f 2 B{ 0 0 160 63 0 0 160 63 0 0 160 63 0 0 160 63 } }
+    }
+] [
+    {
+        T{ ##load-reference f 0 1.25 }
+        T{ ##scalar>vector f 1 0 float-4-rep }
+        T{ ##shuffle-vector-imm f 2 1 { 0 0 0 0 } float-4-rep }
+    } value-numbering-step
+] unit-test
+
+[
+    {
+        T{ ##load-integer f 0 55 }
+        T{ ##load-reference f 1 B{ 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 } }
+        T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
+        T{ ##load-reference f 3 B{ 0 55 0 55 0 55 0 55 0 55 0 55 0 55 0 55 } }
+    }
+] [
+    {
+        T{ ##load-integer f 0 55 }
+        T{ ##scalar>vector f 1 0 short-8-rep }
+        T{ ##load-reference f 2 B{ 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 } }
+        T{ ##shuffle-vector f 3 1 2 float-4-rep }
+    } value-numbering-step
+] unit-test
+
+[
+    {
+        T{ ##load-reference f 0 1.25 }
+        T{ ##load-reference f 2 3.75 }
+        T{ ##load-reference f 4 B{ 0 0 0 0 0 0 244 63 0 0 0 0 0 0 14 64 } }
+    }
+] [
+    {
+        T{ ##load-reference f 0 1.25 }
+        T{ ##load-reference f 2 3.75 }
+        T{ ##gather-vector-2 f 4 0 2 double-2-rep }
+    } value-numbering-step
+] unit-test
+
+[
+    {
+        T{ ##load-integer f 0 125 }
+        T{ ##load-integer f 2 375 }
+        T{ ##load-reference f 4 B{ 125 0 0 0 0 0 0 0 119 1 0 0 0 0 0 0 } }
+    }
+] [
+    {
+        T{ ##load-integer f 0 125 }
+        T{ ##load-integer f 2 375 }
+        T{ ##gather-vector-2 f 4 0 2 longlong-2-rep }
+    } value-numbering-step
+] unit-test
+
+[
+    {
+        T{ ##load-reference f 0 1.25 }
+        T{ ##load-reference f 1 2.50 }
+        T{ ##load-reference f 2 3.75 }
+        T{ ##load-reference f 3 5.00 }
+        T{ ##load-reference f 4 B{ 0 0 160 63 0 0 32 64 0 0 112 64 0 0 160 64 } }
+    }
+] [
+    {
+        T{ ##load-reference f 0 1.25 }
+        T{ ##load-reference f 1 2.50 }
+        T{ ##load-reference f 2 3.75 }
+        T{ ##load-reference f 3 5.00 }
+        T{ ##gather-vector-4 f 4 0 1 2 3 float-4-rep }
+    } value-numbering-step
+] unit-test
+
+[
+    {
+        T{ ##load-integer f 0 125 }
+        T{ ##load-integer f 1 250 }
+        T{ ##load-integer f 2 375 }
+        T{ ##load-integer f 3 500 }
+        T{ ##load-reference f 4 B{ 125 0 0 0 250 0 0 0 119 1 0 0 244 1 0 0 } }
+    }
+] [
+    {
+        T{ ##load-integer f 0 125 }
+        T{ ##load-integer f 1 250 }
+        T{ ##load-integer f 2 375 }
+        T{ ##load-integer f 3 500 }
+        T{ ##gather-vector-4 f 4 0 1 2 3 int-4-rep }
+    } value-numbering-step
+] unit-test
+
 [
     {
         T{ ##zero-vector f 2 float-4-rep }
index 9d3e76d25b2c5fdae72871200cbccffa5dc95b54..68b01beed912467b4666f5f694f11bf53b330252 100755 (executable)
@@ -162,6 +162,7 @@ CODEGEN: ##max %max
 CODEGEN: ##not %not
 CODEGEN: ##neg %neg
 CODEGEN: ##log2 %log2
+CODEGEN: ##bit-count %bit-count
 CODEGEN: ##copy %copy
 CODEGEN: ##tagged>integer %tagged>integer
 CODEGEN: ##add-float %add-float
@@ -181,12 +182,16 @@ CODEGEN: ##zero-vector %zero-vector
 CODEGEN: ##fill-vector %fill-vector
 CODEGEN: ##gather-vector-2 %gather-vector-2
 CODEGEN: ##gather-vector-4 %gather-vector-4
+CODEGEN: ##gather-int-vector-2 %gather-int-vector-2
+CODEGEN: ##gather-int-vector-4 %gather-int-vector-4
+CODEGEN: ##select-vector %select-vector
 CODEGEN: ##shuffle-vector-imm %shuffle-vector-imm
 CODEGEN: ##shuffle-vector-halves-imm %shuffle-vector-halves-imm
 CODEGEN: ##shuffle-vector %shuffle-vector
 CODEGEN: ##tail>head-vector %tail>head-vector
 CODEGEN: ##merge-vector-head %merge-vector-head
 CODEGEN: ##merge-vector-tail %merge-vector-tail
+CODEGEN: ##float-pack-vector %float-pack-vector
 CODEGEN: ##signed-pack-vector %signed-pack-vector
 CODEGEN: ##unsigned-pack-vector %unsigned-pack-vector
 CODEGEN: ##unpack-vector-head %unpack-vector-head
@@ -282,17 +287,16 @@ CONDITIONAL: ##fixnum-mul %fixnum-mul
 
 ! FFI
 CODEGEN: ##unbox %unbox
+CODEGEN: ##unbox-long-long %unbox-long-long
 CODEGEN: ##store-reg-param %store-reg-param
 CODEGEN: ##store-stack-param %store-stack-param
-CODEGEN: ##store-return %store-return
-CODEGEN: ##store-struct-return %store-struct-return
-CODEGEN: ##store-long-long-return %store-long-long-return
-CODEGEN: ##prepare-struct-area %prepare-struct-area
+CODEGEN: ##load-reg-param %load-reg-param
+CODEGEN: ##load-stack-param %load-stack-param
+CODEGEN: ##local-allot %local-allot
 CODEGEN: ##box %box
 CODEGEN: ##box-long-long %box-long-long
-CODEGEN: ##box-large-struct %box-large-struct
-CODEGEN: ##box-small-struct %box-small-struct
-CODEGEN: ##save-param-reg %save-param-reg
+CODEGEN: ##allot-byte-array %allot-byte-array
+CODEGEN: ##prepare-var-args %prepare-var-args
 CODEGEN: ##alien-invoke %alien-invoke
 CODEGEN: ##cleanup %cleanup
 CODEGEN: ##alien-indirect %alien-indirect
diff --git a/basis/compiler/codegen/fixup/fixup-tests.factor b/basis/compiler/codegen/fixup/fixup-tests.factor
new file mode 100644 (file)
index 0000000..f068861
--- /dev/null
@@ -0,0 +1,72 @@
+USING: namespaces byte-arrays make compiler.codegen.fixup
+bit-arrays accessors classes.struct tools.test kernel math
+sequences alien.c-types specialized-arrays boxes
+compiler.cfg.instructions system cpu.architecture ;
+SPECIALIZED-ARRAY: uint
+IN: compiler.codegen.fixup.tests
+
+STRUCT: gc-info
+{ scrub-d-count uint }
+{ scrub-r-count uint }
+{ gc-root-count uint }
+{ return-address-count uint } ;
+
+SINGLETON: fake-cpu
+
+fake-cpu \ cpu set
+
+M: fake-cpu gc-root-offsets ;
+
+[ ] [
+    [
+        init-fixup
+
+        50 <byte-array> %
+
+        T{ gc-map f B{ } B{ } V{ } } gc-map-here
+
+        50 <byte-array> %
+
+        T{ gc-map f B{ 0 1 1 1 0 } B{ 1 0 } V{ 1 3 } } gc-map-here
+
+        emit-gc-info
+    ] B{ } make
+    "result" set
+] unit-test
+
+[ 0 ] [ "result" get length 16 mod ] unit-test
+
+[ ] [
+    [
+        100 <byte-array> %
+
+        ! The below data is 22 bytes -- 6 bytes padding needed to
+        ! align
+        6 <byte-array> %
+
+        ! Bitmap - 2 bytes
+        ?{
+            ! scrub-d
+            t f f f t
+            ! scrub-r
+            f t
+            ! gc-roots
+            f t f t
+        } underlying>> %
+
+        ! Return addresses - 4 bytes
+        uint-array{ 100 } underlying>> %
+
+        ! GC info footer - 16 bytes
+        S{ gc-info
+            { scrub-d-count 5 }
+            { scrub-r-count 2 }
+            { gc-root-count 4 }
+            { return-address-count 1 }
+        } (underlying)>> %
+    ] B{ } make
+    "expect" set
+] unit-test
+
+[ ] [ "result" get length "expect" get length assert= ] unit-test
+[ ] [ "result" get "expect" get assert= ] unit-test
index 518efc8055e3d54f852615f8fe81f61555a3c6d2..b4ef317b677a523ae04af74732d862f4ab173538 100644 (file)
@@ -1,10 +1,12 @@
 ! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays byte-arrays byte-vectors generic assocs hashtables
-io.binary kernel kernel.private math namespaces make sequences
-words quotations strings alien.accessors alien.strings layouts
-system combinators math.bitwise math.order generalizations
-accessors growable fry compiler.constants memoize ;
+USING: arrays bit-arrays byte-arrays byte-vectors generic assocs
+hashtables io.binary kernel kernel.private math namespaces make
+sequences words quotations strings alien.accessors alien.strings
+layouts system combinators math.bitwise math.order
+combinators.short-circuit combinators.smart accessors growable
+fry memoize compiler.constants compiler.cfg.instructions
+cpu.architecture ;
 IN: compiler.codegen.fixup
 
 ! Utilities
@@ -95,7 +97,7 @@ MEMO: cached-string>symbol ( symbol -- obj ) string>symbol ;
 : rel-decks-offset ( class -- )
     rt-decks-offset rel-fixup ;
 
-! And the rest
+! Labels
 : compute-target ( label-fixup -- offset )
     label>> offset>> [ "Unresolved label" throw ] unless* ;
 
@@ -112,13 +114,7 @@ MEMO: cached-string>symbol ( symbol -- obj ) string>symbol ;
     [ [ compute-relative-label ] map concat ]
     bi* ;
 
-: init-fixup ( -- )
-    V{ } clone parameter-table set
-    V{ } clone literal-table set
-    V{ } clone label-table set
-    BV{ } clone relocation-table set
-    V{ } clone binary-literal-table set ;
-
+! Binary literals
 : alignment ( align -- n )
     [ compiled-offset dup ] dip align swap - ;
 
@@ -136,14 +132,107 @@ MEMO: cached-string>symbol ( symbol -- obj ) string>symbol ;
 : emit-binary-literals ( -- )
     binary-literal-table get [ emit-data ] assoc-each ;
 
+! GC info
+
+! Every code block either ends with
+!
+! uint 0
+!
+! or
+!
+! bitmap, byte aligned, three subsequences:
+! - <scrubbed data stack locations>
+! - <scrubbed retain stack locations>
+! - <GC root spill slots>
+! uint[] <return addresses>
+! uint <largest scrubbed data stack location>
+! uint <largest scrubbed retain stack location>
+! uint <largest GC root spill slot>
+! uint <number of return addresses>
+
+SYMBOLS: return-addresses gc-maps ;
+
+: gc-map-needed? ( gc-map -- ? )
+    ! If there are no stack locations to scrub and no GC roots,
+    ! there's no point storing the GC map.
+    dup [
+        {
+            [ scrub-d>> empty? ]
+            [ scrub-r>> empty? ]
+            [ gc-roots>> empty? ]
+        } 1&& not
+    ] when ;
+
+: gc-map-here ( gc-map -- )
+    dup gc-map-needed? [
+        gc-maps get push
+        compiled-offset return-addresses get push
+    ] [ drop ] if ;
+
+: emit-scrub ( seqs -- n )
+    ! seqs is a sequence of sequences of 0/1
+    dup [ length ] [ max ] map-reduce
+    [ '[ [ 0 = ] ?{ } map-as _ f pad-tail % ] each ] keep ;
+
+: integers>bits ( seq n -- bit-array )
+    <bit-array> [ '[ [ t ] dip _ set-nth ] each ] keep ;
+
+: emit-gc-roots ( seqs -- n )
+    ! seqs is a sequence of sequences of integers 0..n-1
+    dup [ [ 0 ] [ supremum 1 + ] if-empty ] [ max ] map-reduce
+    [ '[ _ integers>bits % ] each ] keep ;
+
+: emit-uint ( n -- )
+    building get push-uint ;
+
+: gc-info ( -- byte-array )
+    [
+        return-addresses get empty? [ 0 emit-uint ] [
+            gc-maps get
+            [
+                [ [ scrub-d>> ] map emit-scrub ]
+                [ [ scrub-r>> ] map emit-scrub ]
+                [ [ gc-roots>> gc-root-offsets ] map emit-gc-roots ] tri
+            ] ?{ } make underlying>> %
+            return-addresses get [ emit-uint ] each
+            [ emit-uint ] tri@
+            return-addresses get length emit-uint
+        ] if
+    ] B{ } make ;
+
+: emit-gc-info ( -- )
+    ! We want to place the GC info so that the end is aligned
+    ! on a 16-byte boundary.
+    gc-info [
+        length compiled-offset +
+        [ data-alignment get align ] keep -
+        (align-code)
+    ] [ % ] bi ;
+
+: init-fixup ( -- )
+    V{ } clone parameter-table set
+    V{ } clone literal-table set
+    V{ } clone label-table set
+    BV{ } clone relocation-table set
+    V{ } clone binary-literal-table set
+    V{ } clone return-addresses set
+    V{ } clone gc-maps set ;
+
+: check-fixup ( seq -- )
+    length data-alignment get mod 0 assert= ;
+
 : with-fixup ( quot -- code )
     '[
         init-fixup
-        @
-        emit-binary-literals
-        label-table [ compute-labels ] change
-        parameter-table get >array
-        literal-table get >array
-        relocation-table get >byte-array
-        label-table get
-    ] B{ } make 5 narray ; inline
+        [
+            @
+            emit-binary-literals
+            emit-gc-info
+            label-table [ compute-labels ] change
+            parameter-table get >array
+            literal-table get >array
+            relocation-table get >byte-array
+            label-table get
+        ] B{ } make
+        dup check-fixup
+    ] output>array ; inline
index b8c48abfc3f57b3e2ef594f4663b5f37453baa53..476e6da39e0757da0043ef66da344d4dfd4a3a29 100755 (executable)
@@ -5,12 +5,20 @@ io.backend io.pathnames io.streams.string kernel
 math memory namespaces namespaces.private parser
 quotations sequences specialized-arrays stack-checker
 stack-checker.errors system threads tools.test words
-alien.complex concurrency.promises ;
+alien.complex concurrency.promises alien.data
+byte-arrays classes ;
 FROM: alien.c-types => float short ;
 SPECIALIZED-ARRAY: float
 SPECIALIZED-ARRAY: char
 IN: compiler.tests.alien
 
+! Make sure that invalid inputs don't pass the stack checker
+[ [ void { } "cdecl" alien-indirect ] infer ] must-fail
+[ [ "void" { } cdecl alien-indirect ] infer ] must-fail
+[ [ void* 3 cdecl alien-indirect ] infer ] must-fail
+[ [ void* { "int" } cdecl alien-indirect ] infer ] must-fail
+[ [ void* { int } cdecl { } alien-callback ] infer ] must-fail
+
 <<
 : libfactor-ffi-tests-path ( -- string )
     "resource:" absolute-path
@@ -448,11 +456,11 @@ STRUCT: double-rect
     void { void* void* double-rect } cdecl alien-indirect
     "example" get-global ;
 
-[ 1.0 2.0 3.0 4.0 ]
+[ byte-array 1.0 2.0 3.0 4.0 ]
 [
     1.0 2.0 3.0 4.0 <double-rect>
     double-rect-callback double-rect-test
-    >double-rect<
+    [ >c-ptr class ] [ >double-rect< ] bi
 ] unit-test
 
 STRUCT: test_struct_14
@@ -754,3 +762,33 @@ mingw? [
 
 [ S{ test-struct-11 f 7 -3 } ]
 [ 3 4 7 fastcall-struct-return-iii-callback fastcall-struct-return-iii-indirect ] unit-test
+
+: x64-regression-1 ( -- c )
+    int { int int int int int } cdecl [ + + + + ] alien-callback ;
+
+: x64-regression-2 ( x x x x x c -- y )
+    int { int int int int int } cdecl alien-indirect ; inline
+
+[ 661 ] [ 100 500 50 10 1 x64-regression-1 x64-regression-2 ] unit-test
+
+! Stack allocation
+: blah ( -- x ) { RECT } [ 1.5 >>x 2.0 >>y [ x>> ] [ y>> ] bi * >fixnum ] with-scoped-allocation ;
+
+[ 3 ] [ blah ] unit-test
+
+: out-param-test ( -- b )
+    { int } [ [ 12 ] dip 0 int set-alien-value ] [ ] with-out-parameters ;
+
+[ 12 ] [ out-param-test ] unit-test
+
+: out-param-callback ( -- a )
+    void { int pointer: int } cdecl
+    [ [ 2 * ] dip 0 int set-alien-value ] alien-callback ;
+
+: out-param-indirect ( a a -- b )
+    { int } [
+        swap void { int pointer: int } cdecl
+        alien-indirect
+    ] [ ] with-out-parameters ;
+
+[ 12 ] [ 6 out-param-callback out-param-indirect ] unit-test
index 968587093696d1e19ad3c5ef96e16bf4751fccea..6689ef8a586dac421603bf78fb2bc9b972865a66 100644 (file)
@@ -1,18 +1,14 @@
 USING: compiler.units compiler.test kernel kernel.private memory
 math math.private tools.test math.floats.private math.order fry
-specialized-arrays sequences ;
+specialized-arrays sequences math.functions layouts literals ;
 QUALIFIED-WITH: alien.c-types c
 SPECIALIZED-ARRAY: c:float
+SPECIALIZED-ARRAY: c:double
 IN: compiler.tests.float
 
-[ 5.0 ] [ [ 5.0 ] compile-call gc gc gc ] unit-test
-[ 2.0 3.0 ] [ 3.0 [ 2.0 swap ] compile-call ] unit-test
-
-[ 1 2 3 4.0 ] [ [ 1 2 3 4.0 ] compile-call ] unit-test
-
 [ 3.0 1 2 3 ] [ 1.0 2.0 [ float+ 1 2 3 ] compile-call ] unit-test
 
-[ 3 ] [ 1.0 [ 2.0 float+ tag ] compile-call ] unit-test
+[ $[ float type-number ] ] [ 1.0 [ 2.0 float+ tag ] compile-call ] unit-test
 
 [ 3.0 ] [ 1.0 [ 2.0 float+ ] compile-call ] unit-test
 [ 3.0 ] [ 1.0 [ 2.0 swap float+ ] compile-call ] unit-test
@@ -85,6 +81,9 @@ IN: compiler.tests.float
 [ t ] [ -0.0 [ dup 0.0 float= swap -0.0 float= or ] compile-call ] unit-test
 [ f ] [ 3.0 [ dup 0.0 float= swap -0.0 float= or ] compile-call ] unit-test
 
+[ 313.0 ] [ 313 [ fixnum>float ] compile-call ] unit-test
+[ -313 ] [ -313.5 [ float>fixnum ] compile-call ] unit-test
+[ 313 ] [ 313.5 [ float>fixnum ] compile-call ] unit-test
 [ 315 315.0 ] [ 313 [ 2 fixnum+fast dup fixnum>float ] compile-call ] unit-test
 
 [ t ] [ 0/0. 0/0. [ float-unordered? ] compile-call ] unit-test
@@ -131,3 +130,15 @@ IN: compiler.tests.float
     float-array{ 1.0 3.5 }
     [ { float-array } declare [ 1 + ] map ] compile-call
 ] unit-test
+
+[ t ] [
+    [ double-array{ 1.0 2.0 3.0 } 0.0 [ + ] reduce sqrt ] compile-call
+    2.44948 0.0001 ~
+] unit-test
+
+[ 7.5 3 ] [
+    [
+        double-array{ 1.0 2.0 3.0 }
+        1.5 [ + ] reduce dup 0.0 < [ 2 ] [ 3 ] if
+    ] compile-call
+] unit-test
index e518ff8df2fa73051db4abf15c7bc9f0cff6fc5c..2e4c48f930eecb3b88b9c6f15d35c3059abe6db7 100644 (file)
@@ -1,7 +1,9 @@
 USING: math.private kernel combinators accessors arrays
-generalizations tools.test words ;
+generalizations sequences.generalizations tools.test words ;
 IN: compiler.tests.spilling
 
+! These tests are stupid and don't trigger spilling anymore
+
 : float-spill-bug ( a -- b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b b )
     {
         [ dup float+ ]
@@ -163,7 +165,6 @@ IN: compiler.tests.spilling
 
 [ 4 ] [ 1 1 resolve-spill-bug ] unit-test
 
-! The above don't really test spilling...
 : spill-test-1 ( a -- b )
     dup 1 fixnum+fast
     dup 1 fixnum+fast
index aab40ec77c102a3538daa49e110365e109fb6987..6d2dec1c0d3d89d0c1e0a5dec03c136d44a46f26 100644 (file)
@@ -7,7 +7,7 @@ layouts words sequences sequences.private arrays assocs classes
 classes.algebra combinators generic.math splitting fry locals
 classes.tuple alien.accessors classes.tuple.private
 slots.private definitions strings.private vectors hashtables
-generic quotations alien
+generic quotations alien alien.data alien.data.private
 stack-checker.dependencies
 compiler.tree.comparisons
 compiler.tree.propagation.info
@@ -338,3 +338,5 @@ flog fpow fsqrt facosh fasinh fatanh } [
 
 \ fixnum-max { fixnum fixnum } "input-classes" set-word-prop
 \ fixnum-max [ interval-max ] [ fixnum-valued ] binary-op
+
+\ (local-allot) { alien } "default-output-classes" set-word-prop
index da081800df53769b098a3f3aa136a56ac9d73a6c..947f481cef60021a85affd4bbdaf3e199e4523f9 100644 (file)
@@ -6,9 +6,10 @@ definitions stack-checker.dependencies quotations
 classes.tuple.private math math.partial-dispatch math.private
 math.intervals sets.private math.floats.private
 math.integers.private layouts math.order vectors hashtables
-combinators effects generalizations assocs sets
-combinators.short-circuit sequences.private locals growable
-stack-checker namespaces compiler.tree.propagation.info ;
+combinators effects generalizations sequences.generalizations
+assocs sets combinators.short-circuit sequences.private locals
+growable stack-checker namespaces compiler.tree.propagation.info
+;
 FROM: math => float ;
 FROM: sets => set ;
 IN: compiler.tree.propagation.transforms
@@ -315,9 +316,7 @@ M\ set intersect [ intersect-quot ] 1 define-partial-eval
 ! We want to constant-fold calls to heap-size, and recompile those
 ! calls when a C type is redefined
 \ heap-size [
-    dup word? [
-        [ depends-on-definition ] [ heap-size '[ _ ] ] bi
-    ] [ drop f ] if
+    [ depends-on-c-type ] [ heap-size '[ _ ] ] bi
 ] 1 define-partial-eval
 
 ! Eliminates a few redundant checks here and there
index 2fb75226eb2e44272ffdbf82fc6e164204c57302..9353317f0bc758d9ed10c1e4c6162781282b9472 100644 (file)
@@ -28,7 +28,7 @@ ERROR: wait-timeout ;
 : wait ( queue timeout status -- )\r
     over [\r
         [ queue-timeout ] dip suspend\r
-        [ wait-timeout ] [ cancel-alarm ] if\r
+        [ wait-timeout ] [ stop-alarm ] if\r
     ] [\r
         [ drop queue ] dip suspend drop\r
     ] if ; inline\r
index 2ef388563e06990f2ae00bb89978260d00c18b59..0185387597bb11fb2954b2e66ac0cebd899bc5a5 100644 (file)
@@ -8,23 +8,20 @@ TYPEDEF: void* CFTypeRef
 TYPEDEF: void* CFAllocatorRef
 CONSTANT: kCFAllocatorDefault f
 
-TYPEDEF: bool      Boolean
-TYPEDEF: long      CFIndex
-TYPEDEF: uchar     UInt8
-TYPEDEF: ushort    UInt16
-TYPEDEF: uint      UInt32
+TYPEDEF: bool Boolean
+TYPEDEF: long CFIndex
+TYPEDEF: uchar UInt8
+TYPEDEF: ushort UInt16
+TYPEDEF: uint UInt32
 TYPEDEF: ulonglong UInt64
-TYPEDEF: char      SInt8
-TYPEDEF: short     SInt16
-TYPEDEF: int       SInt32
-TYPEDEF: longlong  SInt64
+TYPEDEF: char SInt8
+TYPEDEF: short SInt16
+TYPEDEF: int SInt32
+TYPEDEF: longlong SInt64
 TYPEDEF: ulong CFTypeID
 TYPEDEF: UInt32 CFOptionFlags
 TYPEDEF: void* CFUUIDRef
 
-ALIAS: <CFIndex> <long>
-ALIAS: *CFIndex *long
-
 STRUCT: CFRange
     { location CFIndex }
     { length CFIndex } ;
index ef1a3ff7f195c4fe09d3b7c7f0b3f11479fbe3fb..fd17843bf3dceb3c2eff158edb50b4394d1c30bd 100644 (file)
@@ -119,8 +119,7 @@ FUNCTION: CFStringRef FSEventStreamCopyDescription ( FSEventStreamRef streamRef
     flags
     FSEventStreamCreate ;
 
-: kCFRunLoopCommonModes ( -- string )
-    &: kCFRunLoopCommonModes *void* ;
+C-GLOBAL: void* kCFRunLoopCommonModes
 
 : schedule-event-stream ( event-stream -- )
     CFRunLoopGetMain
index 4c7e9ba26158869f2307e64e64ead1468c565ac2..b78e1046fee3822c33447aeb584e6ae9ed54a6ed 100644 (file)
@@ -1,8 +1,9 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien.c-types alien.syntax alien.strings io.encodings.string
-kernel sequences byte-arrays io.encodings.utf8 math core-foundation
-core-foundation.arrays destructors parser fry alien words ;
+USING: alien.c-types alien.data alien.syntax alien.strings
+io.encodings.string kernel sequences byte-arrays
+io.encodings.utf8 math core-foundation core-foundation.arrays
+destructors parser fry alien words ;
 IN: core-foundation.strings
 
 TYPEDEF: void* CFStringRef
@@ -75,8 +76,12 @@ FUNCTION: CFStringRef CFStringCreateWithCString (
 : CF>string ( alien -- string )
     dup CFStringGetLength
     [ 0 swap <CFRange> kCFStringEncodingUTF8 0 f ] keep
-    4 * 1 + <byte-array> [ dup length 0 <CFIndex> [ CFStringGetBytes drop ] keep ] keep
-    swap *CFIndex head-slice utf8 decode ;
+    4 * 1 + <byte-array> [
+        dup length
+        { CFIndex } [ CFStringGetBytes drop ] [ ]
+        with-out-parameters
+    ] keep
+    swap head-slice utf8 decode ;
 
 : CF>string-array ( alien -- seq )
     CF>array [ CF>string ] map ;
index 587154fb2f64abba4800fc4ff0b6cd26178dd860..ac0ba31270525e829cf8b6dcc9d18d49fe377d8e 100644 (file)
@@ -8,12 +8,6 @@ IN: core-graphics.types
 SYMBOL: CGFloat
 << cell 4 = float double ? \ CGFloat typedef >>
 
-: <CGFloat> ( x -- alien )
-    cell 4 = [ <float> ] [ <double> ] if ; inline
-
-: *CGFloat ( alien -- x )
-    cell 4 = [ *float ] [ *double ] if ; inline
-
 STRUCT: CGPoint
     { x CGFloat }
     { y CGFloat } ;
@@ -30,7 +24,7 @@ STRUCT: CGSize
 
 STRUCT: CGRect
     { origin CGPoint }
-    { size   CGSize  } ;
+    { size CGSize } ;
 
 : CGPoint>loc ( CGPoint -- loc )
     [ x>> ] [ y>> ] bi 2array ;
@@ -40,7 +34,7 @@ STRUCT: CGRect
 
 : CGRect>rect ( CGRect -- rect )
     [ origin>> CGPoint>loc ]
-    [ size>>   CGSize>dim ]
+    [ size>> CGSize>dim ]
     bi <rect> ; inline
 
 : CGRect-x ( CGRect -- x )
index 7af6792e79845d8d14517139ba4d86f0b66513b7..4de8b2c06a4fd3ef0df9b1dd5473420134e5b93d 100644 (file)
@@ -1,12 +1,12 @@
 ! Copyright (C) 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays alien alien.c-types alien.syntax kernel destructors
-accessors fry words hashtables strings sequences memoize assocs math
-math.order math.vectors math.rectangles math.functions locals init
-namespaces combinators fonts colors cache core-foundation
-core-foundation.strings core-foundation.attributed-strings
-core-foundation.utilities core-graphics core-graphics.types
-core-text.fonts ;
+USING: arrays alien alien.c-types alien.data alien.syntax kernel
+destructors accessors fry words hashtables strings sequences
+memoize assocs math math.order math.vectors math.rectangles
+math.functions locals init namespaces combinators fonts colors
+cache core-foundation core-foundation.strings
+core-foundation.attributed-strings core-foundation.utilities
+core-graphics core-graphics.types core-text.fonts ;
 IN: core-text
 
 TYPEDEF: void* CTLineRef
@@ -50,8 +50,8 @@ ERROR: not-a-string object ;
 TUPLE: line < disposable line metrics image loc dim ;
 
 : typographic-bounds ( line -- width ascent descent leading )
-    0 <CGFloat> 0 <CGFloat> 0 <CGFloat>
-    [ CTLineGetTypographicBounds ] 3keep [ *CGFloat ] tri@ ; inline
+    { CGFloat CGFloat CGFloat }
+    [ CTLineGetTypographicBounds ] [ ] with-out-parameters ; inline
 
 : store-typographic-bounds ( metrics width ascent descent leading -- metrics )
     {
index 5dff607abd82a270f5bce172bdb4d8d06b3b2617..931dccece123d5b69b6707e8680182ed64be15b2 100644 (file)
@@ -150,9 +150,6 @@ SINGLETONS: int-regs float-regs ;
 UNION: reg-class int-regs float-regs ;
 CONSTANT: reg-classes { int-regs float-regs }
 
-! A pseudo-register class for parameters spilled on the stack
-SINGLETON: stack-params
-
 ! On x86, vectors and floats are stored in the same register bank
 ! On PowerPC they are distinct
 HOOK: vector-regs cpu ( -- reg-class )
@@ -165,7 +162,6 @@ M: float-rep reg-class-of drop float-regs ;
 M: double-rep reg-class-of drop float-regs ;
 M: vector-rep reg-class-of drop vector-regs ;
 M: scalar-rep reg-class-of drop vector-regs ;
-M: stack-params reg-class-of drop stack-params ;
 
 GENERIC: rep-size ( rep -- n ) foldable
 
@@ -173,7 +169,6 @@ M: tagged-rep rep-size drop cell ;
 M: int-rep rep-size drop cell ;
 M: float-rep rep-size drop 4 ;
 M: double-rep rep-size drop 8 ;
-M: stack-params rep-size drop cell ;
 M: vector-rep rep-size drop 16 ;
 M: char-scalar-rep rep-size drop 1 ;
 M: uchar-scalar-rep rep-size drop 1 ;
@@ -217,11 +212,21 @@ M: ulonglong-2-rep scalar-rep-of drop ulonglong-scalar-rep ;
 ! Mapping from register class to machine registers
 HOOK: machine-registers cpu ( -- assoc )
 
+! Callbacks are not allowed to clobber this
+HOOK: frame-reg cpu ( -- reg )
+
+! Parameter space to reserve in anything making VM calls
+HOOK: vm-stack-space cpu ( -- n )
+
+M: object vm-stack-space 0 ;
+
 ! Specifies if %slot, %set-slot and %write-barrier accept the
 ! 'scale' and 'tag' parameters, and if %load-memory and
 ! %store-memory work
 HOOK: complex-addressing? cpu ( -- ? )
 
+HOOK: gc-root-offsets cpu ( seq -- seq' )
+
 HOOK: %load-immediate cpu ( reg val -- )
 HOOK: %load-reference cpu ( reg obj -- )
 HOOK: %load-float cpu ( reg val -- )
@@ -270,6 +275,7 @@ HOOK: %max     cpu ( dst src1 src2 -- )
 HOOK: %not     cpu ( dst src -- )
 HOOK: %neg     cpu ( dst src -- )
 HOOK: %log2    cpu ( dst src -- )
+HOOK: %bit-count cpu ( dst src -- )
 
 HOOK: %copy cpu ( dst src rep -- )
 
@@ -292,19 +298,25 @@ HOOK: %binary-float-function cpu ( dst src1 src2 func -- )
 HOOK: %single>double-float cpu ( dst src -- )
 HOOK: %double>single-float cpu ( dst src -- )
 
+HOOK: integer-float-needs-stack-frame? cpu ( -- ? )
+
 HOOK: %integer>float cpu ( dst src -- )
 HOOK: %float>integer cpu ( dst src -- )
 
 HOOK: %zero-vector cpu ( dst rep -- )
 HOOK: %fill-vector cpu ( dst rep -- )
 HOOK: %gather-vector-2 cpu ( dst src1 src2 rep -- )
+HOOK: %gather-int-vector-2 cpu ( dst src1 src2 rep -- )
 HOOK: %gather-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
+HOOK: %gather-int-vector-4 cpu ( dst src1 src2 src3 src4 rep -- )
+HOOK: %select-vector cpu ( dst src n rep -- )
 HOOK: %shuffle-vector cpu ( dst src shuffle rep -- )
 HOOK: %shuffle-vector-imm cpu ( dst src shuffle rep -- )
 HOOK: %shuffle-vector-halves-imm cpu ( dst src1 src2 shuffle rep -- )
 HOOK: %tail>head-vector cpu ( dst src rep -- )
 HOOK: %merge-vector-head cpu ( dst src1 src2 rep -- )
 HOOK: %merge-vector-tail cpu ( dst src1 src2 rep -- )
+HOOK: %float-pack-vector cpu ( dst src rep -- )
 HOOK: %signed-pack-vector cpu ( dst src1 src2 rep -- )
 HOOK: %unsigned-pack-vector cpu ( dst src1 src2 rep -- )
 HOOK: %unpack-vector-head cpu ( dst src rep -- )
@@ -353,12 +365,16 @@ HOOK: %scalar>vector cpu ( dst src rep -- )
 HOOK: %zero-vector-reps cpu ( -- reps )
 HOOK: %fill-vector-reps cpu ( -- reps )
 HOOK: %gather-vector-2-reps cpu ( -- reps )
+HOOK: %gather-int-vector-2-reps cpu ( -- reps )
 HOOK: %gather-vector-4-reps cpu ( -- reps )
+HOOK: %gather-int-vector-4-reps cpu ( -- reps )
+HOOK: %select-vector-reps cpu ( -- reps )
 HOOK: %alien-vector-reps cpu ( -- reps )
 HOOK: %shuffle-vector-reps cpu ( -- reps )
 HOOK: %shuffle-vector-imm-reps cpu ( -- reps )
 HOOK: %shuffle-vector-halves-imm-reps cpu ( -- reps )
 HOOK: %merge-vector-reps cpu ( -- reps )
+HOOK: %float-pack-vector-reps cpu ( -- reps )
 HOOK: %signed-pack-vector-reps cpu ( -- reps )
 HOOK: %unsigned-pack-vector-reps cpu ( -- reps )
 HOOK: %unpack-vector-head-reps cpu ( -- reps )
@@ -402,12 +418,16 @@ HOOK: %horizontal-shr-vector-imm-reps cpu ( -- reps )
 M: object %zero-vector-reps { } ;
 M: object %fill-vector-reps { } ;
 M: object %gather-vector-2-reps { } ;
+M: object %gather-int-vector-2-reps { } ;
 M: object %gather-vector-4-reps { } ;
+M: object %gather-int-vector-4-reps { } ;
+M: object %select-vector-reps { } ;
 M: object %alien-vector-reps { } ;
 M: object %shuffle-vector-reps { } ;
 M: object %shuffle-vector-imm-reps { } ;
 M: object %shuffle-vector-halves-imm-reps { } ;
 M: object %merge-vector-reps { } ;
+M: object %float-pack-vector-reps { } ;
 M: object %signed-pack-vector-reps { } ;
 M: object %unsigned-pack-vector-reps { } ;
 M: object %unpack-vector-head-reps { } ;
@@ -470,7 +490,7 @@ HOOK: %write-barrier-imm cpu ( src slot tag temp1 temp2 -- )
 
 ! GC checks
 HOOK: %check-nursery-branch cpu ( label size cc temp1 temp2 -- )
-HOOK: %call-gc cpu ( gc-roots -- )
+HOOK: %call-gc cpu ( gc-map -- )
 
 HOOK: %prologue cpu ( n -- )
 HOOK: %epilogue cpu ( n -- )
@@ -500,22 +520,6 @@ HOOK: %reload cpu ( dst rep src -- )
 
 HOOK: %loop-entry cpu ( -- )
 
-! FFI stuff
-
-! Return values of this class go here
-GENERIC: return-reg ( reg-class -- reg )
-
-! Sequence of registers used for parameter passing in class
-GENERIC# param-regs 1 ( reg-class abi -- regs )
-
-M: stack-params param-regs 2drop f ;
-
-GENERIC# param-reg 1 ( n reg-class abi -- reg )
-
-M: reg-class param-reg param-regs nth ;
-
-M: stack-params param-reg 2drop ;
-
 ! Does this architecture support %load-float, %load-double,
 ! and %load-vector?
 HOOK: fused-unboxing? cpu ( -- ? )
@@ -545,6 +549,14 @@ M: object immediate-comparand? ( n -- ? )
 : immediate-shift-count? ( n -- ? )
     0 cell-bits 1 - between? ;
 
+! FFI stuff
+
+! Return values of this class go here
+HOOK: return-regs cpu ( -- regs )
+
+! Registers used for parameter passing
+HOOK: param-regs cpu ( abi -- regs )
+
 ! Is this structure small enough to be returned in registers?
 HOOK: return-struct-in-registers? cpu ( c-type -- ? )
 
@@ -573,42 +585,42 @@ HOOK: struct-return-on-stack? cpu ( -- ? )
 ! can be passed to a C function, or returned from a callback
 HOOK: %unbox cpu ( dst src func rep -- )
 
+HOOK: %unbox-long-long cpu ( src out func -- )
+
 HOOK: %store-reg-param cpu ( src reg rep -- )
 
 HOOK: %store-stack-param cpu ( src n rep -- )
 
-HOOK: %store-return cpu ( src rep -- )
-
-HOOK: %store-struct-return cpu ( src reps -- )
-
-HOOK: %store-long-long-return cpu ( src1 src2 -- )
-
-HOOK: %prepare-struct-area cpu ( dst -- )
+HOOK: %local-allot cpu ( dst size align offset -- )
 
 ! Call a function to convert a value into a tagged pointer,
 ! possibly allocating a bignum, float, or alien instance,
 ! which is then pushed on the data stack
-HOOK: %box cpu ( dst n rep func -- )
-
-HOOK: %box-long-long cpu ( dst n func -- )
+HOOK: %box cpu ( dst src func rep gc-map -- )
 
-HOOK: %box-small-struct cpu ( dst c-type -- )
+HOOK: %box-long-long cpu ( dst src1 src2 func gc-map -- )
 
-HOOK: %box-large-struct cpu ( dst n c-type -- )
-
-HOOK: %save-param-reg cpu ( stack reg rep -- )
+HOOK: %allot-byte-array cpu ( dst size gc-map -- )
 
 HOOK: %restore-context cpu ( temp1 temp2 -- )
 
 HOOK: %save-context cpu ( temp1 temp2 -- )
 
-HOOK: %alien-invoke cpu ( function library -- )
+HOOK: %prepare-var-args cpu ( -- )
+
+M: object %prepare-var-args ;
+
+HOOK: %alien-invoke cpu ( function library gc-map -- )
 
 HOOK: %cleanup cpu ( n -- )
 
 M: object %cleanup ( n -- ) drop ;
 
-HOOK: %alien-indirect cpu ( src -- )
+HOOK: %alien-indirect cpu ( src gc-map -- )
+
+HOOK: %load-reg-param cpu ( dst reg rep -- )
+
+HOOK: %load-stack-param cpu ( dst n rep -- )
 
 HOOK: %begin-callback cpu ( -- )
 
index 59126325135fdb9ff6e212275d3fea1c414efadc..9191b6c202f4786e030bff0e9cd5662f3b5dc92f 100644 (file)
@@ -13,7 +13,11 @@ M: linux reserved-area-size 2 cells ;
 
 M: linux lr-save 1 cells ;
 
-M: float-regs param-regs 2drop { 1 2 3 4 5 6 7 8 } ;
+M: ppc param-regs
+    drop {
+        { int-regs { 3 4 5 6 7 8 9 10 } }
+        { float-regs { 1 2 3 4 5 6 7 8 } }
+    } ;
 
 M: ppc value-struct? drop f ;
 
index 49e9768cf67c76d57224b534592bba7501334d6f..989426b8d2f0f747172a8083602e79bf8455f01c 100644 (file)
@@ -8,7 +8,11 @@ M: macosx reserved-area-size 6 cells ;
 
 M: macosx lr-save 2 cells ;
 
-M: float-regs param-regs 2drop { 1 2 3 4 5 6 7 8 9 10 11 12 13 } ;
+M: ppc param-regs
+    drop {
+        { int-regs { 3 4 5 6 7 8 9 10 } }
+        { float-regs { 1 2 3 4 5 6 7 8 9 10 11 12 13 } }
+    } ;
 
 M: ppc value-struct? drop t ;
 
index 233f5eb538db6a4ca248eac1b474663812c68177..56ec02d851727adc203194ab5b767f3a5f78ca0d 100644 (file)
@@ -32,11 +32,6 @@ M: label BC [ 0 BC ] dip rc-relative-ppc-2 label-fixup ;
 
 enable-float-intrinsics
 
-<<
-\ ##integer>float t "frame-required?" set-word-prop
-\ ##float>integer t "frame-required?" set-word-prop
->>
-
 M: ppc machine-registers
     {
         { int-regs $[ 2 12 [a,b] 16 29 [a,b] append ] }
@@ -195,6 +190,8 @@ M: ppc %sub-float FSUB ;
 M: ppc %mul-float FMUL ;
 M: ppc %div-float FDIV ;
 
+M: ppc integer-float-needs-stack-frame? t ;
+
 M:: ppc %integer>float ( dst src -- )
     HEX: 4330 scratch-reg LIS
     scratch-reg 1 0 scratch@ STW
@@ -226,10 +223,10 @@ M: spill-slot float-function-param* [ 1 ] dip n>> spill@ LFD ;
 M: integer float-function-param* FMR ;
 
 : float-function-param ( i src -- )
-    [ float-regs cdecl param-regs nth ] dip float-function-param* ;
+    [ float-regs cdecl param-regs at nth ] dip float-function-param* ;
 
 : float-function-return ( reg -- )
-    float-regs return-reg double-rep %copy ;
+    float-regs return-regs at first double-rep %copy ;
 
 M:: ppc %unary-float-function ( dst src func -- )
     0 src float-function-param
@@ -665,11 +662,11 @@ M: ppc %reload ( dst rep src -- )
 
 M: ppc %loop-entry ;
 
-M: int-regs return-reg drop 3 ;
-
-M: int-regs param-regs 2drop { 3 4 5 6 7 8 9 10 } ;
-
-M: float-regs return-reg drop 1 ;
+M: ppc return-regs
+    {
+        { int-regs { 3 4 5 6 } }
+        { float-regs { 1 } }
+    } ;
 
 M:: ppc %save-param-reg ( stack reg rep -- )
     reg stack local@ rep store-to-frame ;
@@ -697,7 +694,7 @@ M: spill-slot store-param [ 1 ] dip n>> spill@ STW ;
 M:: ppc %unbox ( src n rep func -- )
     src func call-unbox-func
     ! Store the return value on the C stack
-    n [ rep reg-class-of return-reg rep %save-param-reg ] when* ;
+    n [ rep reg-class-of return-regs at first rep %save-param-reg ] when* ;
 
 M:: ppc %unbox-long-long ( src n func -- )
     src func call-unbox-func
index f663523999a1f48698e2641aae506f4b7d4927fc..48cc88a4f86eeb97ddfca4de8f417768dc7cb62a 100755 (executable)
@@ -2,37 +2,36 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: locals alien alien.c-types alien.libraries alien.syntax
 arrays kernel fry math namespaces sequences system layouts io
-vocabs.loader accessors init classes.struct combinators
-make words compiler.constants compiler.codegen.fixup
-compiler.cfg.instructions compiler.cfg.builder compiler.cfg.intrinsics
-compiler.cfg.stack-frame cpu.x86.assembler cpu.x86.assembler.operands
-cpu.x86 cpu.architecture vm ;
+vocabs.loader accessors init classes.struct combinators make
+words compiler.constants compiler.codegen.fixup
+compiler.cfg.instructions compiler.cfg.builder
+compiler.cfg.builder.alien.boxing compiler.cfg.intrinsics
+compiler.cfg.stack-frame cpu.x86.assembler
+cpu.x86.assembler.operands cpu.x86 cpu.architecture vm vocabs ;
 FROM: layouts => cell ;
 IN: cpu.x86.32
 
+: x86-float-regs ( -- seq )
+    "cpu.x86.sse" vocab
+    { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 }
+    { ST0 ST1 ST2 ST3 ST4 ST5 ST6 }
+    ? ;
+
 M: x86.32 machine-registers
-    {
-        { int-regs { EAX ECX EDX EBP EBX } }
-        { float-regs { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } }
-    } ;
+    { int-regs { EAX ECX EDX EBP EBX } }
+    float-regs x86-float-regs 2array
+    2array ;
 
 M: x86.32 ds-reg ESI ;
 M: x86.32 rs-reg EDI ;
 M: x86.32 stack-reg ESP ;
 M: x86.32 frame-reg EBP ;
-M: x86.32 temp-reg ECX ;
 
 M: x86.32 immediate-comparand? ( obj -- ? ) drop t ;
 
 M:: x86.32 %load-vector ( dst val rep -- )
     dst 0 [] rep copy-memory* val rc-absolute rel-binary-literal ;
 
-M: x86.32 %load-float ( dst val -- )
-    <float> float-rep %load-vector ;
-
-M: x86.32 %load-double ( dst val -- )
-    <double> double-rep %load-vector ;
-
 M: x86.32 %mov-vm-ptr ( reg -- )
     0 MOV 0 rc-absolute-cell rel-vm ;
 
@@ -45,11 +44,6 @@ M: x86.32 %set-vm-field ( dst field -- )
 M: x86.32 %vm-field-ptr ( dst field -- )
     [ 0 MOV ] dip rc-absolute-cell rel-vm ;
 
-: local@ ( n -- op )
-    stack-frame get extra-stack-space dup 16 assert= + stack@ ;
-
-M: x86.32 extra-stack-space calls-vm?>> 16 0 ? ;
-
 M: x86.32 %mark-card
     drop HEX: ffffffff [+] card-mark <byte> MOV
     building get pop
@@ -62,25 +56,11 @@ M: x86.32 %mark-deck
     rc-absolute-cell rel-decks-offset
     building get push ;
 
-M:: x86.32 %dispatch ( src temp -- )
-    ! Load jump table base.
-    temp src HEX: ffffffff [+] LEA
-    building get length :> start
-    0 rc-absolute-cell rel-here
-    ! Go
-    temp HEX: 7f [+] JMP
-    building get length :> end
-    ! Fix up the displacement above
-    cell alignment
-    [ end start - + building get dup pop* push ]
-    [ (align-code) ]
-    bi ;
-
 M: x86.32 pic-tail-reg EDX ;
 
 M: x86.32 reserved-stack-space 0 ;
 
-M: x86.32 %alien-invoke 0 CALL rc-relative rel-dlsym ;
+M: x86.32 vm-stack-space 16 ;
 
 : save-vm-ptr ( n -- )
     stack@ 0 MOV 0 rc-absolute-cell rel-vm ;
@@ -94,149 +74,109 @@ M: x86.32 return-struct-in-registers? ( c-type -- ? )
 
 ! On x86, parameters are usually never passed in registers,
 ! except with Microsoft's "thiscall" and "fastcall" abis
-M: int-regs return-reg drop EAX ;
-M: float-regs param-regs 2drop { } ;
-
-M: int-regs param-regs
-    nip {
-        { thiscall [ { ECX } ] }
-        { fastcall [ { ECX EDX } ] }
-        [ drop { } ]
+M: x86.32 param-regs
+    {
+        { thiscall [ { { int-regs { ECX } } { float-regs { } } } ] }
+        { fastcall [ { { int-regs { ECX EDX } } { float-regs { } } } ] }
+        [ drop { { int-regs { } } { float-regs { } } } ]
     } case ;
 
-GENERIC: load-return-reg ( src rep -- )
-GENERIC: store-return-reg ( dst rep -- )
+! Need a fake return-reg for floats
+M: x86.32 return-regs
+    {
+        { int-regs { EAX EDX } }
+        { float-regs { ST0 } }
+    } ;
 
-M: stack-params load-return-reg drop EAX swap MOV ;
-M: stack-params store-return-reg drop EAX MOV ;
+M: x86.32 %prologue ( n -- )
+    dup PUSH
+    0 PUSH rc-absolute-cell rel-this
+    3 cells - decr-stack-reg ;
 
-M: int-rep load-return-reg drop EAX swap MOV ;
-M: int-rep store-return-reg drop EAX MOV ;
+M: x86.32 %prepare-jump
+    pic-tail-reg 0 MOV xt-tail-pic-offset rc-absolute-cell rel-here ;
 
-:: load-float-return ( src x87-insn sse-insn -- )
-    src register? [
+:: load-float-return ( dst x87-insn rep -- )
+    dst register? [
         ESP 4 SUB
-        ESP [] src sse-insn execute
         ESP [] x87-insn execute
+        dst ESP [] rep %copy
         ESP 4 ADD
     ] [
-        src x87-insn execute
+        dst ?spill-slot x87-insn execute
     ] if ; inline
 
-:: store-float-return ( dst x87-insn sse-insn -- )
-    dst register? [
+M: x86.32 %load-reg-param ( dst reg rep -- )
+    {
+        { int-rep [ int-rep %copy ] }
+        { float-rep [ drop \ FSTPS float-rep load-float-return ] }
+        { double-rep [ drop \ FSTPL double-rep load-float-return ] }
+    } case ;
+
+:: store-float-return ( src x87-insn rep -- )
+    src register? [
         ESP 4 SUB
+        ESP [] src rep %copy
         ESP [] x87-insn execute
-        dst ESP [] sse-insn execute
         ESP 4 ADD
     ] [
-        dst x87-insn execute
+        src ?spill-slot x87-insn execute
     ] if ; inline
 
-M: float-rep load-return-reg
-    drop \ FLDS \ MOVSS load-float-return ;
-
-M: float-rep store-return-reg
-    drop \ FSTPS \ MOVSS store-float-return ;
-
-M: double-rep load-return-reg
-    drop \ FLDL \ MOVSD load-float-return ;
-
-M: double-rep store-return-reg
-    drop \ FSTPL \ MOVSD store-float-return ;
-
-M: x86.32 %prologue ( n -- )
-    dup PUSH
-    0 PUSH rc-absolute-cell rel-this
-    3 cells - decr-stack-reg ;
-
-M: x86.32 %prepare-jump
-    pic-tail-reg 0 MOV xt-tail-pic-offset rc-absolute-cell rel-here ;
+M: x86.32 %store-reg-param ( src reg rep -- )
+    {
+        { int-rep [ swap int-rep %copy ] }
+        { float-rep [ drop \ FLDS float-rep store-float-return ] }
+        { double-rep [ drop \ FLDL double-rep store-float-return ] }
+    } case ;
 
 :: call-unbox-func ( src func -- )
     EAX src tagged-rep %copy
     4 save-vm-ptr
     0 stack@ EAX MOV
-    func f %alien-invoke ;
+    func f %alien-invoke ;
 
 M:: x86.32 %unbox ( dst src func rep -- )
     src func call-unbox-func
-    dst ?spill-slot rep store-return-reg ;
+    dst rep %load-return ;
 
-M:: x86.32 %store-return ( src rep -- )
-    src ?spill-slot rep load-return-reg ;
-
-M:: x86.32 %store-long-long-return ( src1 src2 -- )
-    src2 EAX = [ src1 src2 XCHG src2 src1 ] [ src1 src2 ] if :> ( src1 src2 )
-    EAX src1 int-rep %copy
-    EDX src2 int-rep %copy ;
-
-M:: x86.32 %store-struct-return ( src c-type -- )
+M:: x86.32 %unbox-long-long ( src out func -- )
     EAX src int-rep %copy
-    EDX EAX 4 [+] MOV
-    EAX EAX [] MOV ;
-
-M: stack-params copy-register*
-    drop
-    {
-        { [ dup  integer? ] [ EAX swap next-stack@ MOV  EAX MOV ] }
-        { [ over integer? ] [ EAX swap MOV              param@ EAX MOV ] }
-    } cond ;
-
-M: x86.32 %save-param-reg [ local@ ] 2dip %copy ;
-
-: (%box) ( n rep -- )
-    #! If n is f, push the return register onto the stack; we
-    #! are boxing a return value of a C function. If n is an
-    #! integer, push [ESP+n] on the stack; we are boxing a
-    #! parameter being passed to a callback from C.
-    over [ [ local@ ] dip load-return-reg ] [ 2drop ] if ;
+    0 stack@ EAX MOV
+    EAX out int-rep %copy
+    4 stack@ EAX MOV
+    8 save-vm-ptr
+    func f f %alien-invoke ;
 
-M:: x86.32 %box ( dst n rep func -- )
-    n rep (%box)
+M:: x86.32 %box ( dst src func rep gc-map -- )
     rep rep-size save-vm-ptr
-    0 stack@ rep store-return-reg
-    func f %alien-invoke
+    src rep %store-return
+    0 stack@ rep %load-return
+    func f gc-map %alien-invoke
     dst EAX tagged-rep %copy ;
 
-: (%box-long-long) ( n -- )
-    [
-        [ EDX swap next-stack@ MOV ]
-        [ EAX swap cell - next-stack@ MOV ] bi
-    ] when* ;
-
-M:: x86.32 %box-long-long ( dst n func -- )
-    n (%box-long-long)
+M:: x86.32 %box-long-long ( dst src1 src2 func gc-map -- )
     8 save-vm-ptr
-    4 stack@ EDX MOV
-    0 stack@ EAX MOV
-    func f %alien-invoke
+    EAX src1 int-rep %copy
+    0 stack@ EAX int-rep %copy
+    EAX src2 int-rep %copy
+    4 stack@ EAX int-rep %copy
+    func f gc-map %alien-invoke
     dst EAX tagged-rep %copy ;
 
-M: x86.32 struct-return@ ( n -- operand )
-    [ next-stack@ ] [ stack-frame get params>> local@ ] if* ;
-
-M:: x86.32 %box-large-struct ( dst n c-type -- )
-    EDX n struct-return@ LEA
-    8 save-vm-ptr
-    4 stack@ c-type heap-size MOV
-    0 stack@ EDX MOV
-    "from_value_struct" f %alien-invoke
+M:: x86.32 %allot-byte-array ( dst size gc-map -- )
+    4 save-vm-ptr
+    0 stack@ size MOV
+    "allot_byte_array" f gc-map %alien-invoke
     dst EAX tagged-rep %copy ;
 
-M:: x86.32 %box-small-struct ( dst c-type -- )
-    #! Box a <= 8-byte struct returned in EAX:EDX. OS X only.
-    12 save-vm-ptr
-    8 stack@ c-type heap-size MOV
-    4 stack@ EDX MOV
-    0 stack@ EAX MOV
-    "from_small_struct" f %alien-invoke
-    dst EAX tagged-rep %copy ;
+M: x86.32 %alien-invoke
+    [ 0 CALL rc-relative rel-dlsym ] dip gc-map-here ;
 
 M: x86.32 %begin-callback ( -- )
     0 save-vm-ptr
     4 stack@ 0 MOV
-    "begin_callback" f %alien-invoke ;
+    "begin_callback" f %alien-invoke ;
 
 M: x86.32 %alien-callback ( quot -- )
     [ EAX ] dip %load-reference
@@ -244,36 +184,29 @@ M: x86.32 %alien-callback ( quot -- )
 
 M: x86.32 %end-callback ( -- )
     0 save-vm-ptr
-    "end_callback" f %alien-invoke ;
+    "end_callback" f %alien-invoke ;
 
-GENERIC: float-function-param ( stack-slot dst src -- )
+GENERIC: float-function-param ( n dst src -- )
 
-M:: spill-slot float-function-param ( stack-slot dst src -- )
+M:: spill-slot float-function-param ( n dst src -- )
     ! We can clobber dst here since its going to contain the
     ! final result
     dst src double-rep %copy
-    stack-slot dst double-rep %copy ;
+    dst n double-rep %store-stack-param ;
 
-M: register float-function-param
-    nip double-rep %copy ;
-
-: float-function-return ( reg -- )
-    ESP [] FSTPL
-    ESP [] MOVSD
-    ESP 16 ADD ;
+M:: register float-function-param ( n dst src -- )
+    src n double-rep %store-stack-param ;
 
 M:: x86.32 %unary-float-function ( dst src func -- )
-    ESP -16 [+] dst src float-function-param
-    ESP 16 SUB
-    func "libm" load-library %alien-invoke
-    dst float-function-return ;
+    0 dst src float-function-param
+    func "libm" load-library f %alien-invoke
+    dst double-rep %load-return ;
 
 M:: x86.32 %binary-float-function ( dst src1 src2 func -- )
-    ESP -16 [+] dst src1 float-function-param
-    ESP  -8 [+] dst src2 float-function-param
-    ESP 16 SUB
-    func "libm" load-library %alien-invoke
-    dst float-function-return ;
+    0 dst src1 float-function-param
+    8 dst src2 float-function-param
+    func "libm" load-library f %alien-invoke
+    dst double-rep %load-return ;
 
 : funny-large-struct-return? ( return abi -- ? )
     #! MINGW ABI incompatibility disaster
@@ -293,11 +226,6 @@ M:: x86.32 stack-cleanup ( stack-size return abi -- n )
 M: x86.32 %cleanup ( n -- )
     [ ESP swap SUB ] unless-zero ;
 
-M:: x86.32 %call-gc ( gc-roots -- )
-    4 save-vm-ptr
-    0 stack@ gc-roots gc-root-offsets %load-reference
-    "inline_gc" f %alien-invoke ;
-
 M: x86.32 dummy-stack-params? f ;
 
 M: x86.32 dummy-int-params? f ;
@@ -309,7 +237,7 @@ M: x86.32 long-long-on-stack? t ;
 M: x86.32 float-on-stack? t ;
 
 M: x86.32 flatten-struct-type
-    stack-size cell /i { int-rep t } <repetition> ;
+    call-next-method [ first t 2array ] map ;
 
 M: x86.32 struct-return-on-stack? os linux? not ;
 
index a52a3390acd150f9f999855e6b819004abafd2f1..2b82fa81178521b284afc834247d4b113d337a54 100644 (file)
@@ -63,6 +63,9 @@ IN: bootstrap.x86
     ds-reg ctx-reg context-datastack-offset [+] MOV
     rs-reg ctx-reg context-retainstack-offset [+] MOV ;
 
+: jit-scrub-return ( n -- )
+    ESP swap [+] 0 MOV ;
+
 [
     ! ctx-reg is preserved across the call because it is non-volatile
     ! in the C ABI
@@ -130,6 +133,7 @@ IN: bootstrap.x86
 
     ! Unwind stack frames
     ESP EDX MOV
+    0 jit-scrub-return
 
     jit-jump-quot
 ] \ unwind-native-frames define-sub-primitive
@@ -252,6 +256,8 @@ IN: bootstrap.x86
 
 ! Contexts
 : jit-switch-context ( reg -- )
+    -4 jit-scrub-return
+
     ! Save ds, rs registers
     jit-load-vm
     jit-save-context
index 2d2c89441c019b22f1abd681d5cf8180938a086a..3ade9e9e7f4805b6bbe10a57a3a6513484959e03 100644 (file)
@@ -1,5 +1,6 @@
 USING: alien alien.c-types cpu.architecture cpu.x86.64
-cpu.x86.assembler cpu.x86.assembler.operands tools.test ;
+cpu.x86.assembler cpu.x86.assembler.operands tools.test
+assocs sequences ;
 IN: cpu.x86.64.tests
 
 : assembly-test-1 ( -- x ) int { } cdecl [ RAX 3 MOV ] alien-assembly ;
@@ -9,7 +10,7 @@ IN: cpu.x86.64.tests
 : assembly-test-2 ( a b -- x )
     int { int int } cdecl [
         param-reg-0 param-reg-1 ADD
-        int-regs return-reg param-reg-0 MOV
+        int-regs return-regs at first param-reg-0 MOV
     ] alien-assembly ;
 
 [ 23 ] [ 17 6 assembly-test-2 ] unit-test
index 68bade8781868f9a775edd77dc1941dde54ff99b..7a5e8a1af3138b8a50223e3a66c623a6ce7c21a1 100644 (file)
@@ -11,23 +11,26 @@ cpu.architecture vm ;
 FROM: layouts => cell cells ;
 IN: cpu.x86.64
 
-: param-reg-0 ( -- reg ) 0 int-regs cdecl param-reg ; inline
-: param-reg-1 ( -- reg ) 1 int-regs cdecl param-reg ; inline
-: param-reg-2 ( -- reg ) 2 int-regs cdecl param-reg ; inline
-: param-reg-3 ( -- reg ) 3 int-regs cdecl param-reg ; inline
+: param-reg ( n -- reg ) int-regs cdecl param-regs at nth ;
+
+: param-reg-0 ( -- reg ) 0 param-reg ; inline
+: param-reg-1 ( -- reg ) 1 param-reg ; inline
+: param-reg-2 ( -- reg ) 2 param-reg ; inline
+: param-reg-3 ( -- reg ) 3 param-reg ; inline
 
 M: x86.64 pic-tail-reg RBX ;
 
-M: int-regs return-reg drop RAX ;
-M: float-regs return-reg drop XMM0 ;
+M: x86.64 return-regs
+    {
+        { int-regs { RAX EDX } }
+        { float-regs { XMM0 XMM1 } }
+    } ;
 
 M: x86.64 ds-reg R14 ;
 M: x86.64 rs-reg R15 ;
 M: x86.64 stack-reg RSP ;
 M: x86.64 frame-reg RBP ;
 
-M: x86.64 extra-stack-space drop 0 ;
-
 M: x86.64 machine-registers
     {
         { int-regs { RAX RCX RDX RBX RBP RSI RDI R8 R9 R10 R11 R12 } }
@@ -49,12 +52,6 @@ M: x86.64 %vm-field ( dst offset -- )
 M:: x86.64 %load-vector ( dst val rep -- )
     dst 0 [RIP+] rep copy-memory* val rc-relative rel-binary-literal ;
 
-M: x86.64 %load-float ( dst val -- )
-    <float> float-rep %load-vector ;
-
-M: x86.64 %load-double ( dst val -- )
-    <double> double-rep %load-vector ;
-
 M: x86.64 %set-vm-field ( src offset -- )
     [ vm-reg ] dip [+] swap MOV ;
 
@@ -62,9 +59,9 @@ M: x86.64 %vm-field-ptr ( dst offset -- )
     [ vm-reg ] dip [+] LEA ;
 
 M: x86.64 %prologue ( n -- )
-    temp-reg -7 [RIP+] LEA
+    R11 -7 [RIP+] LEA
     dup PUSH
-    temp-reg PUSH
+    R11 PUSH
     stack-reg swap 3 cells - SUB ;
 
 M: x86.64 %prepare-jump
@@ -84,110 +81,38 @@ M: x86.64 %mark-deck
     dup load-decks-offset
     [+] card-mark <byte> MOV ;
 
-M:: x86.64 %dispatch ( src temp -- )
-    ! Load jump table base.
-    temp HEX: ffffffff MOV
-    building get length :> start
-    0 rc-absolute-cell rel-here
-    ! Add jump table base
-    temp src ADD
-    temp HEX: 7f [+] JMP
-    building get length :> end
-    ! Fix up the displacement above
-    cell alignment
-    [ end start - + building get dup pop* push ]
-    [ (align-code) ]
-    bi ;
+M:: x86.64 %load-reg-param ( dst reg rep -- )
+    dst reg rep %copy ;
+
+M:: x86.64 %store-reg-param ( src reg rep -- )
+    reg src rep %copy ;
 
 M:: x86.64 %unbox ( dst src func rep -- )
     param-reg-0 src tagged-rep %copy
     param-reg-1 %mov-vm-ptr
-    func f %alien-invoke
-    dst rep reg-class-of return-reg rep %copy ;
-
-: with-return-regs ( quot -- )
-    [
-        V{ RDX RAX } clone int-regs set
-        V{ XMM1 XMM0 } clone float-regs set
-        call
-    ] with-scope ; inline
-
-: each-struct-component ( c-type quot -- )
-    '[
-        flatten-struct-type
-        [ [ first ] dip @ ] each-index
-    ] with-return-regs ; inline
-
-: %unbox-struct-component ( rep i -- )
-    R11 swap cells [+] swap reg-class-of {
-        { int-regs [ int-regs get pop swap MOV ] }
-        { float-regs [ float-regs get pop swap MOVSD ] }
-    } case ;
-
-M:: x86.64 %store-return ( src rep -- )
-    rep reg-class-of return-reg src rep %copy ;
-
-M:: x86.64 %store-struct-return ( src c-type -- )
-    ! Move src to R11 so that we don't clobber it.
-    R11 src int-rep %copy
-    c-type [ %unbox-struct-component ] each-struct-component ;
-
-M: stack-params copy-register*
-    drop
-    {
-        { [ dup  integer? ] [ R11 swap next-stack@ MOV  R11 MOV ] }
-        { [ over integer? ] [ R11 swap MOV              param@ R11 MOV ] }
-    } cond ;
+    func f f %alien-invoke
+    dst rep %load-return ;
 
-M: x86.64 %save-param-reg [ param@ ] 2dip %copy ;
-
-M:: x86.64 %box ( dst n rep func -- )
-    0 rep reg-class-of cdecl param-reg
-    n [ n param@ ] [ rep reg-class-of return-reg ] if rep %copy
+M:: x86.64 %box ( dst src func rep gc-map -- )
+    0 rep reg-class-of cdecl param-regs at nth src rep %copy
     rep int-rep? os windows? or param-reg-1 param-reg-0 ? %mov-vm-ptr
-    func f %alien-invoke
-    dst RAX tagged-rep %copy ;
-
-: box-struct-component@ ( i -- operand ) 1 + cells param@ ;
-
-: %box-struct-component ( rep i -- )
-    box-struct-component@ swap reg-class-of {
-        { int-regs [ int-regs get pop MOV ] }
-        { float-regs [ float-regs get pop MOVSD ] }
-    } case ;
-
-M:: x86.64 %box-small-struct ( dst c-type -- )
-    #! Box a <= 16-byte struct.
-    c-type [ %box-struct-component ] each-struct-component
-    param-reg-2 c-type heap-size MOV
-    param-reg-0 0 box-struct-component@ MOV
-    param-reg-1 1 box-struct-component@ MOV
-    param-reg-3 %mov-vm-ptr
-    "from_small_struct" f %alien-invoke
-    dst RAX tagged-rep %copy ;
-
-M: x86.64 struct-return@ ( n -- operand )
-    [ stack-frame get params>> ] unless* param@ ;
-
-M:: x86.64 %box-large-struct ( dst n c-type -- )
-    ! Struct size is parameter 2
-    param-reg-1 c-type heap-size MOV
-    ! Compute destination address
-    param-reg-0 n struct-return@ LEA
-    param-reg-2 %mov-vm-ptr
-    ! Copy the struct from the C stack
-    "from_value_struct" f %alien-invoke
-    dst RAX tagged-rep %copy ;
+    func f gc-map %alien-invoke
+    dst int-rep %load-return ;
+
+M:: x86.64 %allot-byte-array ( dst size gc-map -- )
+    param-reg-0 size MOV
+    param-reg-1 %mov-vm-ptr
+    "allot_byte_array" f gc-map %alien-invoke
+    dst int-rep %load-return ;
 
 M: x86.64 %alien-invoke
-    R11 0 MOV
-    rc-absolute-cell rel-dlsym
-    R11 CALL ;
+    [ R11 0 MOV rc-absolute-cell rel-dlsym R11 CALL ] dip
+    gc-map-here ;
 
 M: x86.64 %begin-callback ( -- )
     param-reg-0 %mov-vm-ptr
     param-reg-1 0 MOV
-    "begin_callback" f %alien-invoke ;
+    "begin_callback" f %alien-invoke ;
 
 M: x86.64 %alien-callback ( quot -- )
     [ param-reg-0 ] dip %load-reference
@@ -195,31 +120,23 @@ M: x86.64 %alien-callback ( quot -- )
 
 M: x86.64 %end-callback ( -- )
     param-reg-0 %mov-vm-ptr
-    "end_callback" f %alien-invoke ;
+    "end_callback" f %alien-invoke ;
 
 : float-function-param ( i src -- )
-    [ float-regs cdecl param-regs nth ] dip double-rep %copy ;
-
-: float-function-return ( reg -- )
-    float-regs return-reg double-rep %copy ;
+    [ float-regs cdecl param-regs at nth ] dip double-rep %copy ;
 
 M:: x86.64 %unary-float-function ( dst src func -- )
     0 src float-function-param
-    func "libm" load-library %alien-invoke
-    dst float-function-return ;
+    func "libm" load-library %alien-invoke
+    dst double-rep %load-return ;
 
 M:: x86.64 %binary-float-function ( dst src1 src2 func -- )
     ! src1 might equal dst; otherwise it will be a spill slot
     ! src2 is always a spill slot
     0 src1 float-function-param
     1 src2 float-function-param
-    func "libm" load-library %alien-invoke
-    dst float-function-return ;
-
-M:: x86.64 %call-gc ( gc-roots -- )
-    param-reg-0 gc-roots gc-root-offsets %load-reference
-    param-reg-1 %mov-vm-ptr
-    "inline_gc" f %alien-invoke ;
+    func "libm" load-library f %alien-invoke
+    dst double-rep %load-return ;
 
 M: x86.64 long-long-on-stack? f ;
 
@@ -237,3 +154,5 @@ USE: vocabs.loader
     { [ os unix? ] [ "cpu.x86.64.unix" require ] }
     { [ os winnt? ] [ "cpu.x86.64.winnt" require ] }
 } cond
+
+check-sse
index 393d1c9b8bf1e5afe74e530ce63643eeabb149a5..e81e92424555f8b28ce6abc6255af13c32215eef 100644 (file)
@@ -61,6 +61,9 @@ IN: bootstrap.x86
     ds-reg ctx-reg context-datastack-offset [+] MOV
     rs-reg ctx-reg context-retainstack-offset [+] MOV ;
 
+: jit-scrub-return ( n -- )
+    RSP swap [+] 0 MOV ;
+
 [
     ! ctx-reg is preserved across the call because it is non-volatile
     ! in the C ABI
@@ -111,6 +114,7 @@ IN: bootstrap.x86
 
     ! Unwind stack frames
     RSP arg2 MOV
+    0 jit-scrub-return
 
     ! Load VM pointer into vm-reg, since we're entering from
     ! C code
@@ -228,6 +232,8 @@ IN: bootstrap.x86
 
 ! Contexts
 : jit-switch-context ( reg -- )
+    -8 jit-scrub-return
+
     ! Save ds, rs registers
     jit-save-context
 
index c7b8d4017a1e3b76b56dfb1684f6646a9566cc95..2ce959d29a85c2de7bb4d41e6fd0e8fd91709974 100644 (file)
@@ -3,14 +3,15 @@
 USING: accessors arrays sequences math splitting make assocs
 kernel layouts system alien.c-types classes.struct
 cpu.architecture cpu.x86.assembler cpu.x86.assembler.operands
-cpu.x86 compiler.cfg.builder.alien compiler.cfg.registers ;
+cpu.x86 cpu.x86.64 compiler.cfg.builder.alien
+compiler.cfg.builder.alien.boxing compiler.cfg.registers ;
 IN: cpu.x86.64.unix
 
-M: int-regs param-regs
-    2drop { RDI RSI RDX RCX R8 R9 } ;
-
-M: float-regs param-regs
-    2drop { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } ;
+M: x86.64 param-regs
+    drop {
+        { int-regs { RDI RSI RDX RCX R8 R9 } }
+        { float-regs { XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7 } }
+    } ;
 
 M: x86.64 reserved-stack-space 0 ;
 
@@ -31,13 +32,9 @@ M: x86.64 reserved-stack-space 0 ;
         f 2array
     ] map ;
 
-: flatten-large-struct ( c-type -- seq )
-    stack-size cell /i { int-rep t } <repetition> ;
-
 M: x86.64 flatten-struct-type ( c-type -- seq )
-    dup heap-size 16 >
-    [ flatten-large-struct ]
-    [ flatten-small-struct ] if ;
+    dup heap-size 16 <=
+    [ flatten-small-struct ] [ call-next-method [ first t 2array ] map ] if ;
 
 M: x86.64 return-struct-in-registers? ( c-type -- ? )
     heap-size 2 cells <= ;
@@ -48,4 +45,4 @@ M: x86.64 dummy-int-params? f ;
 
 M: x86.64 dummy-fp-params? f ;
 
-M: x86.64 temp-reg R8 ;
+M: x86.64 %prepare-var-args RAX RAX XOR ;
index 5d8ecc5cfbb469aca2e088586d5775f3776d287e..7f1f29a6037b19ca463b82aee34df87b1d535730 100644 (file)
@@ -1,13 +1,15 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel layouts system math alien.c-types sequences
-compiler.cfg.registers cpu.architecture cpu.x86.assembler cpu.x86
-cpu.x86.assembler.operands ;
+compiler.cfg.registers cpu.architecture cpu.x86.assembler
+cpu.x86 cpu.x86.64 cpu.x86.assembler.operands ;
 IN: cpu.x86.64.winnt
 
-M: int-regs param-regs 2drop { RCX RDX R8 R9 } ;
-
-M: float-regs param-regs 2drop { XMM0 XMM1 XMM2 XMM3 } ;
+M: x86.64 param-regs
+    drop {
+        { int-regs { RCX RDX R8 R9 } }
+        { float-regs { XMM0 XMM1 XMM2 XMM3 } }
+    } ;
 
 M: x86.64 reserved-stack-space 4 cells ;
 
@@ -21,6 +23,3 @@ M: x86.64 dummy-stack-params? f ;
 M: x86.64 dummy-int-params? t ;
 
 M: x86.64 dummy-fp-params? t ;
-
-M: x86.64 temp-reg R11 ;
-
index 2959910f0e62af5fe109cc1eaf09d242dacb1619..83694cae94f836fec2c14d87b786608766c2996a 100644 (file)
@@ -2,6 +2,15 @@ USING: cpu.x86.assembler cpu.x86.assembler.operands
 kernel tools.test namespaces make layouts ;
 IN: cpu.x86.assembler.tests
 
+! small registers
+[ { 128 192 12 } ] [ [ AL 12 <byte> ADD ] { } make ] unit-test
+[ { 128 196 12 } ] [ [ AH 12 <byte> ADD ] { } make ] unit-test
+[ { 176 12 } ] [ [ AL 12 <byte> MOV ] { } make ] unit-test
+[ { 180 12 } ] [ [ AH 12 <byte> MOV ] { } make ] unit-test
+[ { 198 0 12 } ] [ [ EAX [] 12 <byte> MOV ] { } make ] unit-test
+[ { 0 235 } ] [ [ BL CH ADD ] { } make ] unit-test
+[ { 136 235 } ] [ [ BL CH MOV ] { } make ] unit-test
+
 ! immediate operands
 cell 4 = [
     [ { HEX: b9 HEX: 01 HEX: 00 HEX: 00 HEX: 00 } ] [ [ ECX 1 MOV ] { } make ] unit-test
@@ -190,6 +199,29 @@ cell 4 = [
 [ { HEX: 48 HEX: 6b HEX: c1 HEX: 03 } ] [ [ RAX RCX 3 IMUL3 ] { } make ] unit-test
 [ { HEX: 48 HEX: 69 HEX: c1 HEX: 44 HEX: 03 HEX: 00 HEX: 00 } ] [ [ RAX RCX HEX: 344 IMUL3 ] { } make ] unit-test
 
+! BT family instructions
+[ { HEX: 0f HEX: ba HEX: e0 HEX: 01 } ] [ [ EAX 1 BT ] { } make ] unit-test
+[ { HEX: 0f HEX: ba HEX: f8 HEX: 01 } ] [ [ EAX 1 BTC ] { } make ] unit-test
+[ { HEX: 0f HEX: ba HEX: e8 HEX: 01 } ] [ [ EAX 1 BTS ] { } make ] unit-test
+[ { HEX: 0f HEX: ba HEX: f0 HEX: 01 } ] [ [ EAX 1 BTR ] { } make ] unit-test
+[ { HEX: 48 HEX: 0f HEX: ba HEX: e0 HEX: 01 } ] [ [ RAX 1 BT ] { } make ] unit-test
+[ { HEX: 0f HEX: ba HEX: 20 HEX: 01 } ] [ [ EAX [] 1 BT ] { } make ] unit-test
+
+[ { HEX: 0f HEX: a3 HEX: d8 } ] [ [ EAX EBX BT ] { } make ] unit-test
+[ { HEX: 0f HEX: bb HEX: d8 } ] [ [ EAX EBX BTC ] { } make ] unit-test
+[ { HEX: 0f HEX: ab HEX: d8 } ] [ [ EAX EBX BTS ] { } make ] unit-test
+[ { HEX: 0f HEX: b3 HEX: d8 } ] [ [ EAX EBX BTR ] { } make ] unit-test
+[ { HEX: 0f HEX: a3 HEX: 18 } ] [ [ EAX [] EBX BT ] { } make ] unit-test
+
+! x87 instructions
+[ { HEX: D8 HEX: C5 } ] [ [ ST0 ST5 FADD ] { } make ] unit-test
+[ { HEX: DC HEX: C5 } ] [ [ ST5 ST0 FADD ] { } make ] unit-test
+[ { HEX: D8 HEX: 00 } ] [ [ ST0 EAX [] FADD ] { } make ] unit-test
+
+[ { HEX: D9 HEX: C2 } ] [ [ ST2 FLD  ] { } make ] unit-test
+[ { HEX: DD HEX: D2 } ] [ [ ST2 FST  ] { } make ] unit-test
+[ { HEX: DD HEX: DA } ] [ [ ST2 FSTP ] { } make ] unit-test
+
 [ { 15 183 195 } ] [ [ EAX BX MOVZX ] { } make ] unit-test
 
 bootstrap-cell 4 = [
index 76157bd7cc9b53067099f876d4837a1d209c4181..401152325b02900fb2929b882f1433f8581d951f 100644 (file)
@@ -152,8 +152,11 @@ M: register displacement, drop ;
 : immediate-operand-size-bit ( dst imm reg,rex.w,opcode -- imm dst reg,rex.w,opcode )
     over integer? [ first3 BIN: 1 opcode-or 3array ] when ;
 
+: immediate-1* ( dst imm reg,rex.w,opcode -- )
+    swap [ 1-operand ] dip 1, ;
+
 : immediate-1 ( dst imm reg,rex.w,opcode -- )
-    immediate-operand-size-bit swap [ 1-operand ] dip 1, ;
+    immediate-operand-size-bit immediate-1* ;
 
 : immediate-4 ( dst imm reg,rex.w,opcode -- )
     immediate-operand-size-bit swap [ 1-operand ] dip 4, ;
@@ -211,7 +214,13 @@ M: operand POP { BIN: 000 f HEX: 8f } 1-operand ;
 <PRIVATE
 
 GENERIC# (MOV-I) 1 ( dst src -- )
-M: register (MOV-I) [ t HEX: b8 short-operand ] [ cell, ] bi* ;
+
+M: register (MOV-I)
+    dup byte?
+    [ [ t HEX: b0 short-operand ] [ 1, ] bi* ]
+    [ [ t HEX: b8 short-operand ] [ cell, ] bi* ]
+    if ;
+
 M: operand (MOV-I)
     { BIN: 000 t HEX: c6 }
     over byte? [ immediate-1 ] [ immediate-4 ] if ;
@@ -238,6 +247,9 @@ M: operand CALL { BIN: 010 t HEX: ff } 1-operand ;
 GENERIC# JUMPcc 1 ( addr opcode -- )
 M: integer JUMPcc extended-opcode, 4, ;
 
+: SETcc ( dst opcode -- )
+    { BIN: 000 t } swap suffix 1-operand ;
+
 PRIVATE>
 
 : JO  ( dst -- ) HEX: 80 JUMPcc ;
@@ -257,6 +269,23 @@ PRIVATE>
 : JLE ( dst -- ) HEX: 8e JUMPcc ;
 : JG  ( dst -- ) HEX: 8f JUMPcc ;
 
+: SETO  ( dst -- ) { HEX: 0f HEX: 90 } SETcc ;
+: SETNO ( dst -- ) { HEX: 0f HEX: 91 } SETcc ;
+: SETB  ( dst -- ) { HEX: 0f HEX: 92 } SETcc ;
+: SETAE ( dst -- ) { HEX: 0f HEX: 93 } SETcc ;
+: SETE  ( dst -- ) { HEX: 0f HEX: 94 } SETcc ;
+: SETNE ( dst -- ) { HEX: 0f HEX: 95 } SETcc ;
+: SETBE ( dst -- ) { HEX: 0f HEX: 96 } SETcc ;
+: SETA  ( dst -- ) { HEX: 0f HEX: 97 } SETcc ;
+: SETS  ( dst -- ) { HEX: 0f HEX: 98 } SETcc ;
+: SETNS ( dst -- ) { HEX: 0f HEX: 99 } SETcc ;
+: SETP  ( dst -- ) { HEX: 0f HEX: 9a } SETcc ;
+: SETNP ( dst -- ) { HEX: 0f HEX: 9b } SETcc ;
+: SETL  ( dst -- ) { HEX: 0f HEX: 9c } SETcc ;
+: SETGE ( dst -- ) { HEX: 0f HEX: 9d } SETcc ;
+: SETLE ( dst -- ) { HEX: 0f HEX: 9e } SETcc ;
+: SETG  ( dst -- ) { HEX: 0f HEX: 9f } SETcc ;
+
 : LEAVE ( -- ) HEX: c9 , ;
 
 : RET ( n -- )
@@ -304,6 +333,22 @@ M: operand TEST OCT: 204 2-operand ;
 
 : BSR ( dst src -- ) { HEX: 0f HEX: bd } (2-operand) ;
 
+GENERIC: BT ( value n -- )
+M: immediate BT ( value n -- ) { BIN: 100 t { HEX: 0f HEX: ba } } immediate-1* ;
+M: operand   BT ( value n -- ) swap { HEX: 0f HEX: a3 } (2-operand) ;
+
+GENERIC: BTC ( value n -- )
+M: immediate BTC ( value n -- ) { BIN: 111 t { HEX: 0f HEX: ba } } immediate-1* ;
+M: operand   BTC ( value n -- ) swap { HEX: 0f HEX: bb } (2-operand) ;
+
+GENERIC: BTR ( value n -- )
+M: immediate BTR ( value n -- ) { BIN: 110 t { HEX: 0f HEX: ba } } immediate-1* ;
+M: operand   BTR ( value n -- ) swap { HEX: 0f HEX: b3 } (2-operand) ;
+
+GENERIC: BTS ( value n -- )
+M: immediate BTS ( value n -- ) { BIN: 101 t { HEX: 0f HEX: ba } } immediate-1* ;
+M: operand   BTS ( value n -- ) swap { HEX: 0f HEX: ab } (2-operand) ;
+
 : NOT  ( dst -- ) { BIN: 010 t HEX: f7 } 1-operand ;
 : NEG  ( dst -- ) { BIN: 011 t HEX: f7 } 1-operand ;
 : MUL  ( dst -- ) { BIN: 100 t HEX: f7 } 1-operand ;
@@ -400,6 +445,99 @@ PRIVATE>
 : FNCLEX ( -- ) HEX: db , HEX: e2 , ;
 : FNINIT ( -- ) HEX: db , HEX: e3 , ;
 
+ERROR: bad-x87-operands ;
+
+<PRIVATE
+
+:: (x87-op) ( operand opcode reg -- )
+    opcode ,
+    BIN: 1100,0000 reg
+    3 shift bitor
+    operand reg-code bitor , ;
+
+:: x87-st0-op ( src opcode reg -- )
+    src register?
+    [ src opcode reg (x87-op) ]
+    [ bad-x87-operands ] if ;
+
+:: x87-m-st0/n-op ( dst src opcode reg -- )
+    {
+        { [ dst ST0 = src indirect? and ] [
+            src { reg f opcode } 1-operand
+        ] }
+        { [ dst ST0 = src register? and ] [
+            src opcode reg (x87-op)
+        ] }
+        { [ src ST0 = dst register? and ] [
+            dst opcode 4 + reg (x87-op)
+        ] }
+        [ bad-x87-operands ]
+    } cond ;
+
+PRIVATE>
+
+: F2XM1 ( -- ) { HEX: D9 HEX: F0 } % ;
+: FABS ( -- ) { HEX: D9 HEX: E1 } % ;
+: FADD ( dst src -- ) HEX: D8 0 x87-m-st0/n-op ;
+: FCHS ( -- ) { HEX: D9 HEX: E0 } % ;
+
+: FCMOVB   ( src -- ) HEX: DA 0 x87-st0-op ;
+: FCMOVE   ( src -- ) HEX: DA 1 x87-st0-op ;
+: FCMOVBE  ( src -- ) HEX: DA 2 x87-st0-op ;
+: FCMOVU   ( src -- ) HEX: DA 3 x87-st0-op ;
+: FCMOVNB  ( src -- ) HEX: DB 0 x87-st0-op ;
+: FCMOVNE  ( src -- ) HEX: DB 1 x87-st0-op ;
+: FCMOVNBE ( src -- ) HEX: DB 2 x87-st0-op ;
+: FCMOVNU  ( src -- ) HEX: DB 3 x87-st0-op ;
+
+: FCOMI ( src -- ) HEX: DB 6 x87-st0-op ;
+: FUCOMI ( src -- ) HEX: DB 5 x87-st0-op ;
+: FCOS ( -- ) { HEX: D9 HEX: FF } % ;
+: FDECSTP ( -- ) { HEX: D9 HEX: F6 } % ;
+: FINCSTP ( -- ) { HEX: D9 HEX: F7 } % ;
+: FDIV  ( dst src -- ) HEX: D8 6 x87-m-st0/n-op ;
+: FDIVR ( dst src -- ) HEX: D8 7 x87-m-st0/n-op ;
+
+: FILDD ( src -- )  { BIN: 000 f HEX: DB } 1-operand ;
+: FILDQ ( src -- )  { BIN: 101 f HEX: DF } 1-operand ;
+: FISTPD ( dst -- ) { BIN: 011 f HEX: DB } 1-operand ;
+: FISTPQ ( dst -- ) { BIN: 111 f HEX: DF } 1-operand ;
+: FISTTPD ( dst -- ) { BIN: 001 f HEX: DB } 1-operand ;
+: FISTTPQ ( dst -- ) { BIN: 001 f HEX: DF } 1-operand ;
+
+: FLD    ( src -- ) HEX: D9 0 x87-st0-op ;
+: FLD1   ( -- ) { HEX: D9 HEX: E8 } % ;
+: FLDL2T ( -- ) { HEX: D9 HEX: E9 } % ;
+: FLDL2E ( -- ) { HEX: D9 HEX: EA } % ;
+: FLDPI  ( -- ) { HEX: D9 HEX: EB } % ;
+: FLDLG2 ( -- ) { HEX: D9 HEX: EC } % ;
+: FLDLN2 ( -- ) { HEX: D9 HEX: ED } % ;
+: FLDZ   ( -- ) { HEX: D9 HEX: EE } % ;
+
+: FMUL ( dst src -- ) HEX: D8 1 x87-m-st0/n-op ;
+: FNOP ( -- ) { HEX: D9 HEX: D0 } % ;
+: FPATAN ( -- ) { HEX: D9 HEX: F3 } % ;
+: FPREM  ( -- ) { HEX: D9 HEX: F8 } % ;
+: FPREM1 ( -- ) { HEX: D9 HEX: F5 } % ;
+: FRNDINT ( -- ) { HEX: D9 HEX: FC } % ;
+: FSCALE ( -- ) { HEX: D9 HEX: FD } % ;
+: FSIN ( -- ) { HEX: D9 HEX: FE } % ;
+: FSINCOS ( -- ) { HEX: D9 HEX: FB } % ;
+: FSQRT ( -- ) { HEX: D9 HEX: FA } % ;
+
+: FSUB  ( dst src -- ) HEX: D8 HEX: 4 x87-m-st0/n-op ;
+: FSUBR ( dst src -- ) HEX: D8 HEX: 5 x87-m-st0/n-op ;
+
+: FST  ( src -- ) HEX: DD 2 x87-st0-op ;
+: FSTP ( src -- ) HEX: DD 3 x87-st0-op ;
+
+: FXAM ( -- ) { HEX: D9 HEX: E5 } % ;
+: FXCH ( src -- ) HEX: D9 1 x87-st0-op ;
+
+: FXTRACT ( -- ) { HEX: D9 HEX: F4 } % ;
+: FYL2X ( -- ) { HEX: D9 HEX: F1 } % ;
+: FYL2XP1 ( -- ) { HEX: D9 HEX: F1 } % ;
+
 ! SSE multimedia instructions
 
 <PRIVATE
index 0ef2b030d127f7cc7e8f28cd6779d0e58a7f65df..2a2faa4039911995af8fbe9884a9dc9eb6838729 100644 (file)
@@ -6,22 +6,23 @@ IN: cpu.x86.assembler.operands
 
 REGISTERS: 8 AL CL DL BL SPL BPL SIL DIL R8B R9B R10B R11B R12B R13B R14B R15B ;
 
-ALIAS: AH SPL
-ALIAS: CH BPL
-ALIAS: DH SIL
-ALIAS: BH DIL
+HI-REGISTERS: 8 AH CH DH BH ;
 
 REGISTERS: 16 AX CX DX BX SP BP SI DI R8W R9W R10W R11W R12W R13W R14W R15W ;
 
 REGISTERS: 32 EAX ECX EDX EBX ESP EBP ESI EDI R8D R9D R10D R11D R12D R13D R14D R15D ;
 
-REGISTERS: 64
-RAX RCX RDX RBX RSP RBP RSI RDI R8 R9 R10 R11 R12 R13 R14 R15 ;
+REGISTERS: 64 RAX RCX RDX RBX RSP RBP RSI RDI R8 R9 R10 R11 R12 R13 R14 R15 ;
 
 REGISTERS: 128
 XMM0 XMM1 XMM2 XMM3 XMM4 XMM5 XMM6 XMM7
 XMM8 XMM9 XMM10 XMM11 XMM12 XMM13 XMM14 XMM15 ;
 
+REGISTERS: 80 ST0 ST1 ST2 ST3 ST4 ST5 ST6 ST7 ;
+
+: shuffle-down ( STn -- STn+1 )
+    "register" word-prop 1 + 80 registers get at nth ;
+
 PREDICATE: register < word
     "register" word-prop ;
 
index 5b65c19155055aa3b9b9db9a0113fef44f168a18..185d892ce7291c2037b8cc2090f0b0437c06b6d1 100644 (file)
@@ -1,7 +1,7 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel words words.symbol sequences lexer parser fry
-namespaces combinators assocs ;
+namespaces combinators assocs math ;
 IN: cpu.x86.assembler.syntax
 
 SYMBOL: registers
@@ -9,15 +9,21 @@ SYMBOL: registers
 registers [ H{ } clone ] initialize
 
 : define-register ( name num size -- word )
-    [ "cpu.x86.assembler.operands" create ] 2dip {
+    [ create-in ] 2dip {
         [ 2drop ]
         [ 2drop define-symbol ]
         [ drop "register" set-word-prop ]
         [ nip "register-size" set-word-prop ]
     } 3cleave ;
 
-: define-registers ( size names -- )
-    [ swap '[ _ define-register ] map-index ] [ drop ] 2bi
-    registers get set-at ;
+: (define-registers) ( names start size -- seq )
+    '[ _ + _ define-register ] map-index ;
 
-SYNTAX: REGISTERS: scan-word ";" parse-tokens define-registers ;
+: define-registers ( names size -- )
+    [ [ 0 ] dip (define-registers) ] keep registers get set-at ;
+
+SYNTAX: REGISTERS:
+    scan-word [ ";" parse-tokens ] dip define-registers ;
+
+SYNTAX: HI-REGISTERS:
+    scan-word [ ";" parse-tokens 4 ] dip (define-registers) drop ;
index 7913489178493267c5628a09419c077e5958cfcb..d62429f4f05684eea58082221976b29412fd351a 100644 (file)
@@ -1,13 +1,16 @@
 ! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien alien.c-types combinators compiler
-compiler.codegen.fixup compiler.units cpu.architecture
-cpu.x86.assembler cpu.x86.assembler.operands init io kernel
-locals math math.order math.parser memoize namespaces system ;
+USING: accessors assocs sequences alien alien.c-types
+combinators compiler compiler.codegen.fixup compiler.units
+cpu.architecture cpu.x86.assembler cpu.x86.assembler.operands
+init io kernel locals math math.order math.parser memoize
+namespaces system ;
 IN: cpu.x86.features
 
 <PRIVATE
 
+: return-reg ( -- reg ) int-regs return-regs at first ;
+
 : (sse-version) ( -- n )
     int { } cdecl [
         "sse-42" define-label
@@ -18,53 +21,53 @@ IN: cpu.x86.features
         "sse-1" define-label
         "end" define-label
 
-        int-regs return-reg 1 MOV
+        return-reg 1 MOV
 
         CPUID
 
-        ECX HEX: 100000 TEST
-        "sse-42" get JNE
+        ECX 20 BT
+        "sse-42" get JB
 
-        ECX HEX: 80000 TEST
-        "sse-41" get JNE
+        ECX 19 BT
+        "sse-41" get JB
 
-        ECX HEX: 200 TEST
-        "ssse-3" get JNE
+        ECX  9 BT
+        "ssse-3" get JB
 
-        ECX HEX: 1 TEST
-        "sse-3" get JNE
+        ECX  0 BT
+        "sse-3" get JB
 
-        EDX HEX: 4000000 TEST
-        "sse-2" get JNE
+        EDX 26 BT
+        "sse-2" get JB
 
-        EDX HEX: 2000000 TEST
-        "sse-1" get JNE
+        EDX 25 BT
+        "sse-1" get JB
 
-        int-regs return-reg 0 MOV
+        return-reg 0 MOV
         "end" get JMP
 
         "sse-42" resolve-label
-        int-regs return-reg 42 MOV
+        return-reg 42 MOV
         "end" get JMP
 
         "sse-41" resolve-label
-        int-regs return-reg 41 MOV
+        return-reg 41 MOV
         "end" get JMP
 
         "ssse-3" resolve-label
-        int-regs return-reg 33 MOV
+        return-reg 33 MOV
         "end" get JMP
 
         "sse-3" resolve-label
-        int-regs return-reg 30 MOV
+        return-reg 30 MOV
         "end" get JMP
 
         "sse-2" resolve-label
-        int-regs return-reg 20 MOV
+        return-reg 20 MOV
         "end" get JMP
 
         "sse-1" resolve-label
-        int-regs return-reg 10 MOV
+        return-reg 10 MOV
 
         "end" resolve-label
     ] alien-assembly ;
@@ -83,6 +86,15 @@ MEMO: sse-version ( -- n )
 : sse4.1? ( -- ? ) sse-version 41 >= ;
 : sse4.2? ( -- ? ) sse-version 42 >= ;
 
+: popcnt? ( -- ? )
+    bool { } cdecl [
+        return-reg 1 MOV
+        CPUID
+        ECX 23 BT
+        return-reg dup XOR
+        return-reg SETB
+    ] alien-assembly ;
+
 : sse-string ( version -- string )
     {
         { 00 [ "no SSE" ] }
diff --git a/basis/cpu/x86/sse/authors.txt b/basis/cpu/x86/sse/authors.txt
new file mode 100644 (file)
index 0000000..580f882
--- /dev/null
@@ -0,0 +1,2 @@
+Slava Pestov
+Joe Groff
diff --git a/basis/cpu/x86/sse/sse.factor b/basis/cpu/x86/sse/sse.factor
new file mode 100644 (file)
index 0000000..4d667b8
--- /dev/null
@@ -0,0 +1,924 @@
+! Copyright (C) 2009, 2010 Joe Groff, Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types arrays assocs combinators fry kernel locals
+macros math math.vectors namespaces quotations sequences system
+compiler.cfg.comparisons compiler.cfg.intrinsics
+compiler.codegen.fixup cpu.architecture cpu.x86
+cpu.x86.assembler cpu.x86.assembler.operands cpu.x86.features ;
+IN: cpu.x86.sse
+
+! Scalar floating point with SSE2
+M: x86 %load-float <float> float-rep %load-vector ;
+M: x86 %load-double <double> double-rep %load-vector ;
+
+M: float-rep copy-register* drop MOVAPS ;
+M: double-rep copy-register* drop MOVAPS ;
+
+M: float-rep copy-memory* drop MOVSS ;
+M: double-rep copy-memory* drop MOVSD ;
+
+M: x86 %add-float double-rep two-operand ADDSD ;
+M: x86 %sub-float double-rep two-operand SUBSD ;
+M: x86 %mul-float double-rep two-operand MULSD ;
+M: x86 %div-float double-rep two-operand DIVSD ;
+M: x86 %min-float double-rep two-operand MINSD ;
+M: x86 %max-float double-rep two-operand MAXSD ;
+M: x86 %sqrt SQRTSD ;
+
+: %clear-unless-in-place ( dst src -- )
+    over = [ drop ] [ dup XORPS ] if ;
+
+M: x86 %single>double-float [ %clear-unless-in-place ] [ CVTSS2SD ] 2bi ;
+M: x86 %double>single-float [ %clear-unless-in-place ] [ CVTSD2SS ] 2bi ;
+
+M: x86 integer-float-needs-stack-frame? f ;
+M: x86 %integer>float [ drop dup XORPS ] [ CVTSI2SD ] 2bi ;
+M: x86 %float>integer CVTTSD2SI ;
+
+M: x86 %compare-float-ordered ( dst src1 src2 cc temp -- )
+    [ COMISD ] (%compare-float) ;
+
+M: x86 %compare-float-unordered ( dst src1 src2 cc temp -- )
+    [ UCOMISD ] (%compare-float) ;
+
+M: x86 %compare-float-ordered-branch ( label src1 src2 cc -- )
+    [ COMISD ] (%compare-float-branch) ;
+
+M: x86 %compare-float-unordered-branch ( label src1 src2 cc -- )
+    [ UCOMISD ] (%compare-float-branch) ;
+
+! SIMD
+M: float-4-rep copy-register* drop MOVAPS ;
+M: double-2-rep copy-register* drop MOVAPS ;
+M: vector-rep copy-register* drop MOVDQA ;
+
+MACRO: available-reps ( alist -- )
+    ! Each SSE version adds new representations and supports
+    ! all old ones
+    unzip { } [ append ] accumulate rest swap suffix
+    [ [ 1quotation ] map ] bi@ zip
+    reverse [ { } ] suffix
+    '[ _ cond ] ;
+
+M: x86 %alien-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %zero-vector
+    {
+        { double-2-rep [ dup XORPS ] }
+        { float-4-rep [ dup XORPS ] }
+        [ drop dup PXOR ]
+    } case ;
+
+M: x86 %zero-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %fill-vector
+    {
+        { double-2-rep [ dup [ XORPS ] [ CMPEQPS ] 2bi ] }
+        { float-4-rep  [ dup [ XORPS ] [ CMPEQPS ] 2bi ] }
+        [ drop dup PCMPEQB ]
+    } case ;
+
+M: x86 %fill-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M:: x86 %gather-vector-4 ( dst src1 src2 src3 src4 rep -- )
+    rep signed-rep {
+        { float-4-rep [
+            dst src1 float-4-rep %copy
+            dst src2 UNPCKLPS
+            src3 src4 UNPCKLPS
+            dst src3 MOVLHPS
+        ] }
+        { int-4-rep [
+            dst src1 int-4-rep %copy
+            dst src2 PUNPCKLDQ
+            src3 src4 PUNPCKLDQ
+            dst src3 PUNPCKLQDQ
+        ] }
+    } case ;
+
+M: x86 %gather-vector-4-reps
+    {
+        ! Can't do this with sse1 since it will want to unbox
+        ! double-precision floats and convert to single precision
+        { sse2? { float-4-rep int-4-rep uint-4-rep } }
+    } available-reps ;
+
+M:: x86 %gather-int-vector-4 ( dst src1 src2 src3 src4 rep -- )
+    dst rep %zero-vector
+    dst src1 32-bit-version-of 0 PINSRD
+    dst src2 32-bit-version-of 1 PINSRD
+    dst src3 32-bit-version-of 2 PINSRD
+    dst src4 32-bit-version-of 3 PINSRD ;
+
+M: x86 %gather-int-vector-4-reps
+    {
+        { sse4.1? { int-4-rep uint-4-rep } }
+    } available-reps ;
+
+M:: x86 %gather-vector-2 ( dst src1 src2 rep -- )
+    rep signed-rep {
+        { double-2-rep [
+            dst src1 double-2-rep %copy
+            dst src2 MOVLHPS
+        ] }
+        { longlong-2-rep [
+            dst src1 longlong-2-rep %copy
+            dst src2 PUNPCKLQDQ
+        ] }
+    } case ;
+
+M: x86 %gather-vector-2-reps
+    {
+        { sse2? { double-2-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M:: x86.64 %gather-int-vector-2 ( dst src1 src2 rep -- )
+    dst rep %zero-vector
+    dst src1 0 PINSRQ
+    dst src2 1 PINSRQ ;
+
+M: x86.64 %gather-int-vector-2-reps
+    {
+        { sse4.1? { longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+:: %select-vector-32 ( dst src n rep -- )
+    rep {
+        { char-16-rep [
+            dst 32-bit-version-of src n PEXTRB
+            dst dst 8-bit-version-of MOVSX
+        ] }
+        { uchar-16-rep [
+            dst 32-bit-version-of src n PEXTRB
+        ] }
+        { short-8-rep [
+            dst 32-bit-version-of src n PEXTRW
+            dst dst 16-bit-version-of MOVSX
+        ] }
+        { ushort-8-rep [
+            dst 32-bit-version-of src n PEXTRW
+        ] }
+        { int-4-rep [
+            dst 32-bit-version-of src n PEXTRD
+            dst dst 32-bit-version-of 2dup = [ 2drop ] [ MOVSX ] if
+        ] }
+        { uint-4-rep [
+            dst 32-bit-version-of src n PEXTRD
+        ] }
+    } case ;
+
+M: x86.32 %select-vector
+    %select-vector-32 ;
+
+M: x86.32 %select-vector-reps
+    {
+        { sse4.1? { uchar-16-rep char-16-rep ushort-8-rep short-8-rep uint-4-rep int-4-rep } }
+    } available-reps ;
+
+M: x86.64 %select-vector
+    {
+        { longlong-2-rep  [ PEXTRQ ] }
+        { ulonglong-2-rep [ PEXTRQ ] }
+        [ %select-vector-32 ]
+    } case ;
+
+M: x86.64 %select-vector-reps
+    {
+        { sse4.1? { uchar-16-rep char-16-rep ushort-8-rep short-8-rep uint-4-rep int-4-rep ulonglong-2-rep longlong-2-rep } }
+    } available-reps ;
+
+: sse1-float-4-shuffle ( dst shuffle -- )
+    {
+        { { 0 1 2 3 } [ drop ] }
+        { { 0 1 0 1 } [ dup MOVLHPS ] }
+        { { 2 3 2 3 } [ dup MOVHLPS ] }
+        { { 0 0 1 1 } [ dup UNPCKLPS ] }
+        { { 2 2 3 3 } [ dup UNPCKHPS ] }
+        [ dupd SHUFPS ]
+    } case ;
+
+: float-4-shuffle ( dst shuffle -- )
+    sse3? [
+        {
+            { { 0 0 2 2 } [ dup MOVSLDUP ] }
+            { { 1 1 3 3 } [ dup MOVSHDUP ] }
+            [ sse1-float-4-shuffle ]
+        } case
+    ] [ sse1-float-4-shuffle ] if ;
+
+: int-4-shuffle ( dst shuffle -- )
+    {
+        { { 0 1 2 3 } [ drop ] }
+        { { 0 0 1 1 } [ dup PUNPCKLDQ ] }
+        { { 2 2 3 3 } [ dup PUNPCKHDQ ] }
+        { { 0 1 0 1 } [ dup PUNPCKLQDQ ] }
+        { { 2 3 2 3 } [ dup PUNPCKHQDQ ] }
+        [ dupd PSHUFD ]
+    } case ;
+
+: longlong-2-shuffle ( dst shuffle -- )
+    first2 [ 2 * dup 1 + ] bi@ 4array int-4-shuffle ;
+
+: >float-4-shuffle ( double-2-shuffle -- float-4-shuffle )
+    [ 2 * { 0 1 } n+v ] map concat ;
+
+M:: x86 %shuffle-vector-imm ( dst src shuffle rep -- )
+    dst src rep %copy
+    dst shuffle rep signed-rep {
+        { double-2-rep [ >float-4-shuffle float-4-shuffle ] }
+        { float-4-rep [ float-4-shuffle ] }
+        { int-4-rep [ int-4-shuffle ] }
+        { longlong-2-rep [ longlong-2-shuffle ] }
+    } case ;
+
+M: x86 %shuffle-vector-imm-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M:: x86 %shuffle-vector-halves-imm ( dst src1 src2 shuffle rep -- )
+    dst src1 src2 rep two-operand
+    shuffle rep {
+        { double-2-rep [ >float-4-shuffle SHUFPS ] }
+        { float-4-rep [ SHUFPS ] }
+    } case ;
+
+M: x86 %shuffle-vector-halves-imm-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep } }
+    } available-reps ;
+
+M: x86 %shuffle-vector ( dst src shuffle rep -- )
+    two-operand PSHUFB ;
+
+M: x86 %shuffle-vector-reps
+    {
+        { ssse3? { float-4-rep double-2-rep longlong-2-rep ulonglong-2-rep int-4-rep uint-4-rep short-8-rep ushort-8-rep char-16-rep uchar-16-rep } }
+    } available-reps ;
+
+M: x86 %merge-vector-head
+    [ two-operand ] keep
+    signed-rep {
+        { double-2-rep   [ MOVLHPS ] }
+        { float-4-rep    [ UNPCKLPS ] }
+        { longlong-2-rep [ PUNPCKLQDQ ] }
+        { int-4-rep      [ PUNPCKLDQ ] }
+        { short-8-rep    [ PUNPCKLWD ] }
+        { char-16-rep    [ PUNPCKLBW ] }
+    } case ;
+
+M: x86 %merge-vector-tail
+    [ two-operand ] keep
+    signed-rep {
+        { double-2-rep   [ UNPCKHPD ] }
+        { float-4-rep    [ UNPCKHPS ] }
+        { longlong-2-rep [ PUNPCKHQDQ ] }
+        { int-4-rep      [ PUNPCKHDQ ] }
+        { short-8-rep    [ PUNPCKHWD ] }
+        { char-16-rep    [ PUNPCKHBW ] }
+    } case ;
+
+M: x86 %merge-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %float-pack-vector
+    drop CVTPD2PS ;
+
+M: x86 %float-pack-vector-reps
+    {
+        { sse2? { double-2-rep } }
+    } available-reps ;
+
+M: x86 %signed-pack-vector
+    [ two-operand ] keep
+    {
+        { int-4-rep    [ PACKSSDW ] }
+        { short-8-rep  [ PACKSSWB ] }
+    } case ;
+
+M: x86 %signed-pack-vector-reps
+    {
+        { sse2? { short-8-rep int-4-rep } }
+    } available-reps ;
+
+M: x86 %unsigned-pack-vector
+    [ two-operand ] keep
+    signed-rep {
+        { int-4-rep   [ PACKUSDW ] }
+        { short-8-rep [ PACKUSWB ] }
+    } case ;
+
+M: x86 %unsigned-pack-vector-reps
+    {
+        { sse2? { short-8-rep } }
+        { sse4.1? { int-4-rep } }
+    } available-reps ;
+
+M: x86 %tail>head-vector ( dst src rep -- )
+    dup {
+        { float-4-rep [ drop UNPCKHPD ] }
+        { double-2-rep [ drop UNPCKHPD ] }
+        [ drop [ %copy ] [ drop PUNPCKHQDQ ] 3bi ]
+    } case ;
+
+M: x86 %unpack-vector-head ( dst src rep -- )
+    {
+        { char-16-rep  [ PMOVSXBW ] }
+        { uchar-16-rep [ PMOVZXBW ] }
+        { short-8-rep  [ PMOVSXWD ] }
+        { ushort-8-rep [ PMOVZXWD ] }
+        { int-4-rep    [ PMOVSXDQ ] }
+        { uint-4-rep   [ PMOVZXDQ ] }
+        { float-4-rep  [ CVTPS2PD ] }
+    } case ;
+
+M: x86 %unpack-vector-head-reps ( -- reps )
+    {
+        { sse2? { float-4-rep } }
+        { sse4.1? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep } }
+    } available-reps ;
+
+M: x86 %integer>float-vector ( dst src rep -- )
+    {
+        { int-4-rep [ CVTDQ2PS ] }
+    } case ;
+
+M: x86 %integer>float-vector-reps
+    {
+        { sse2? { int-4-rep } }
+    } available-reps ;
+
+M: x86 %float>integer-vector ( dst src rep -- )
+    {
+        { float-4-rep [ CVTTPS2DQ ] }
+    } case ;
+
+M: x86 %float>integer-vector-reps
+    {
+        { sse2? { float-4-rep } }
+    } available-reps ;
+
+: (%compare-float-vector) ( dst src rep double single -- )
+    [ double-2-rep eq? ] 2dip if ; inline
+
+: %compare-float-vector ( dst src rep cc -- )
+    {
+        { cc<    [ [ CMPLTPD    ] [ CMPLTPS    ] (%compare-float-vector) ] }
+        { cc<=   [ [ CMPLEPD    ] [ CMPLEPS    ] (%compare-float-vector) ] }
+        { cc=    [ [ CMPEQPD    ] [ CMPEQPS    ] (%compare-float-vector) ] }
+        { cc<>=  [ [ CMPORDPD   ] [ CMPORDPS   ] (%compare-float-vector) ] }
+        { cc/<   [ [ CMPNLTPD   ] [ CMPNLTPS   ] (%compare-float-vector) ] }
+        { cc/<=  [ [ CMPNLEPD   ] [ CMPNLEPS   ] (%compare-float-vector) ] }
+        { cc/=   [ [ CMPNEQPD   ] [ CMPNEQPS   ] (%compare-float-vector) ] }
+        { cc/<>= [ [ CMPUNORDPD ] [ CMPUNORDPS ] (%compare-float-vector) ] }
+    } case ;
+
+:: (%compare-int-vector) ( dst src rep int64 int32 int16 int8 -- )
+    rep signed-rep :> rep'
+    dst src rep' {
+        { longlong-2-rep [ int64 call ] }
+        { int-4-rep      [ int32 call ] }
+        { short-8-rep    [ int16 call ] }
+        { char-16-rep    [ int8  call ] }
+    } case ; inline
+
+: %compare-int-vector ( dst src rep cc -- )
+    {
+        { cc= [ [ PCMPEQQ ] [ PCMPEQD ] [ PCMPEQW ] [ PCMPEQB ] (%compare-int-vector) ] }
+        { cc> [ [ PCMPGTQ ] [ PCMPGTD ] [ PCMPGTW ] [ PCMPGTB ] (%compare-int-vector) ] }
+    } case ;
+
+M: x86 %compare-vector ( dst src1 src2 rep cc -- )
+    [ [ two-operand ] keep ] dip
+    over float-vector-rep?
+    [ %compare-float-vector ]
+    [ %compare-int-vector ] if ;
+
+: %compare-vector-eq-reps ( -- reps )
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep } }
+        { sse4.1? { longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+: %compare-vector-ord-reps ( -- reps )
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep short-8-rep int-4-rep } }
+        { sse4.2? { longlong-2-rep } }
+    } available-reps ;
+
+M: x86 %compare-vector-reps
+    {
+        { [ dup { cc= cc/= cc/<>= cc<>= } member-eq? ] [ drop %compare-vector-eq-reps ] }
+        [ drop %compare-vector-ord-reps ]
+    } cond ;
+
+: %compare-float-vector-ccs ( cc -- ccs not? )
+    {
+        { cc<    [ { { cc<  f   }              } f ] }
+        { cc<=   [ { { cc<= f   }              } f ] }
+        { cc>    [ { { cc<  t   }              } f ] }
+        { cc>=   [ { { cc<= t   }              } f ] }
+        { cc=    [ { { cc=  f   }              } f ] }
+        { cc<>   [ { { cc<  f   } { cc<    t } } f ] }
+        { cc<>=  [ { { cc<>= f  }              } f ] }
+        { cc/<   [ { { cc/<  f  }              } f ] }
+        { cc/<=  [ { { cc/<= f  }              } f ] }
+        { cc/>   [ { { cc/<  t  }              } f ] }
+        { cc/>=  [ { { cc/<= t  }              } f ] }
+        { cc/=   [ { { cc/=  f  }              } f ] }
+        { cc/<>  [ { { cc/=  f  } { cc/<>= f } } f ] }
+        { cc/<>= [ { { cc/<>= f }              } f ] }
+    } case ;
+
+: %compare-int-vector-ccs ( cc -- ccs not? )
+    order-cc {
+        { cc<    [ { { cc> t } } f ] }
+        { cc<=   [ { { cc> f } } t ] }
+        { cc>    [ { { cc> f } } f ] }
+        { cc>=   [ { { cc> t } } t ] }
+        { cc=    [ { { cc= f } } f ] }
+        { cc/=   [ { { cc= f } } t ] }
+        { t      [ {           } t ] }
+        { f      [ {           } f ] }
+    } case ;
+
+M: x86 %compare-vector-ccs
+    swap float-vector-rep?
+    [ %compare-float-vector-ccs ]
+    [ %compare-int-vector-ccs ] if ;
+
+:: %test-vector-mask ( dst temp mask vcc -- )
+    vcc {
+        { vcc-any    [ dst dst TEST dst temp \ CMOVNE (%boolean) ] }
+        { vcc-none   [ dst dst TEST dst temp \ CMOVE  (%boolean) ] }
+        { vcc-all    [ dst mask CMP dst temp \ CMOVE  (%boolean) ] }
+        { vcc-notall [ dst mask CMP dst temp \ CMOVNE (%boolean) ] }
+    } case ;
+
+: %move-vector-mask ( dst src rep -- mask )
+    {
+        { double-2-rep [ MOVMSKPS HEX: f ] }
+        { float-4-rep  [ MOVMSKPS HEX: f ] }
+        [ drop PMOVMSKB HEX: ffff ]
+    } case ;
+
+M:: x86 %test-vector ( dst src temp rep vcc -- )
+    dst src rep %move-vector-mask :> mask
+    dst temp mask vcc %test-vector-mask ;
+
+:: %test-vector-mask-branch ( label temp mask vcc -- )
+    vcc {
+        { vcc-any    [ temp temp TEST label JNE ] }
+        { vcc-none   [ temp temp TEST label JE ] }
+        { vcc-all    [ temp mask CMP label JE ] }
+        { vcc-notall [ temp mask CMP label JNE ] }
+    } case ;
+
+M:: x86 %test-vector-branch ( label src temp rep vcc -- )
+    temp src rep %move-vector-mask :> mask
+    label temp mask vcc %test-vector-mask-branch ;
+
+M: x86 %test-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %add-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ ADDPS ] }
+        { double-2-rep [ ADDPD ] }
+        { char-16-rep [ PADDB ] }
+        { uchar-16-rep [ PADDB ] }
+        { short-8-rep [ PADDW ] }
+        { ushort-8-rep [ PADDW ] }
+        { int-4-rep [ PADDD ] }
+        { uint-4-rep [ PADDD ] }
+        { longlong-2-rep [ PADDQ ] }
+        { ulonglong-2-rep [ PADDQ ] }
+    } case ;
+
+M: x86 %add-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %saturated-add-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { char-16-rep [ PADDSB ] }
+        { uchar-16-rep [ PADDUSB ] }
+        { short-8-rep [ PADDSW ] }
+        { ushort-8-rep [ PADDUSW ] }
+    } case ;
+
+M: x86 %saturated-add-vector-reps
+    {
+        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep } }
+    } available-reps ;
+
+M: x86 %add-sub-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ ADDSUBPS ] }
+        { double-2-rep [ ADDSUBPD ] }
+    } case ;
+
+M: x86 %add-sub-vector-reps
+    {
+        { sse3? { float-4-rep double-2-rep } }
+    } available-reps ;
+
+M: x86 %sub-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ SUBPS ] }
+        { double-2-rep [ SUBPD ] }
+        { char-16-rep [ PSUBB ] }
+        { uchar-16-rep [ PSUBB ] }
+        { short-8-rep [ PSUBW ] }
+        { ushort-8-rep [ PSUBW ] }
+        { int-4-rep [ PSUBD ] }
+        { uint-4-rep [ PSUBD ] }
+        { longlong-2-rep [ PSUBQ ] }
+        { ulonglong-2-rep [ PSUBQ ] }
+    } case ;
+
+M: x86 %sub-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %saturated-sub-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { char-16-rep [ PSUBSB ] }
+        { uchar-16-rep [ PSUBUSB ] }
+        { short-8-rep [ PSUBSW ] }
+        { ushort-8-rep [ PSUBUSW ] }
+    } case ;
+
+M: x86 %saturated-sub-vector-reps
+    {
+        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep } }
+    } available-reps ;
+
+M: x86 %mul-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ MULPS ] }
+        { double-2-rep [ MULPD ] }
+        { short-8-rep [ PMULLW ] }
+        { ushort-8-rep [ PMULLW ] }
+        { int-4-rep [ PMULLD ] }
+        { uint-4-rep [ PMULLD ] }
+    } case ;
+
+M: x86 %mul-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep short-8-rep ushort-8-rep } }
+        { sse4.1? { int-4-rep uint-4-rep } }
+    } available-reps ;
+
+M: x86 %mul-high-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { short-8-rep  [ PMULHW ] }
+        { ushort-8-rep [ PMULHUW ] }
+    } case ;
+
+M: x86 %mul-high-vector-reps
+    {
+        { sse2? { short-8-rep ushort-8-rep } }
+    } available-reps ;
+
+M: x86 %mul-horizontal-add-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { char-16-rep  [ PMADDUBSW ] }
+        { uchar-16-rep [ PMADDUBSW ] }
+        { short-8-rep  [ PMADDWD ] }
+    } case ;
+
+M: x86 %mul-horizontal-add-vector-reps
+    {
+        { sse2?  { short-8-rep } }
+        { ssse3? { char-16-rep uchar-16-rep } }
+    } available-reps ;
+
+M: x86 %div-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ DIVPS ] }
+        { double-2-rep [ DIVPD ] }
+    } case ;
+
+M: x86 %div-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep } }
+    } available-reps ;
+
+M: x86 %min-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { char-16-rep [ PMINSB ] }
+        { uchar-16-rep [ PMINUB ] }
+        { short-8-rep [ PMINSW ] }
+        { ushort-8-rep [ PMINUW ] }
+        { int-4-rep [ PMINSD ] }
+        { uint-4-rep [ PMINUD ] }
+        { float-4-rep [ MINPS ] }
+        { double-2-rep [ MINPD ] }
+    } case ;
+
+M: x86 %min-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { uchar-16-rep short-8-rep double-2-rep } }
+        { sse4.1? { char-16-rep ushort-8-rep int-4-rep uint-4-rep } }
+    } available-reps ;
+
+M: x86 %max-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { char-16-rep [ PMAXSB ] }
+        { uchar-16-rep [ PMAXUB ] }
+        { short-8-rep [ PMAXSW ] }
+        { ushort-8-rep [ PMAXUW ] }
+        { int-4-rep [ PMAXSD ] }
+        { uint-4-rep [ PMAXUD ] }
+        { float-4-rep [ MAXPS ] }
+        { double-2-rep [ MAXPD ] }
+    } case ;
+
+M: x86 %max-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { uchar-16-rep short-8-rep double-2-rep } }
+        { sse4.1? { char-16-rep ushort-8-rep int-4-rep uint-4-rep } }
+    } available-reps ;
+
+M: x86 %avg-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { uchar-16-rep [ PAVGB ] }
+        { ushort-8-rep [ PAVGW ] }
+    } case ;
+
+M: x86 %avg-vector-reps
+    {
+        { sse2? { uchar-16-rep ushort-8-rep } }
+    } available-reps ;
+
+M: x86 %dot-vector
+    [ two-operand ] keep
+    {
+        { float-4-rep [ HEX: ff DPPS ] }
+        { double-2-rep [ HEX: ff DPPD ] }
+    } case ;
+
+M: x86 %dot-vector-reps
+    {
+        { sse4.1? { float-4-rep double-2-rep } }
+    } available-reps ;
+
+M: x86 %sad-vector
+    [ two-operand ] keep
+    {
+        { uchar-16-rep [ PSADBW ] }
+    } case ;
+
+M: x86 %sad-vector-reps
+    {
+        { sse2? { uchar-16-rep } }
+    } available-reps ;
+
+M: x86 %horizontal-add-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    signed-rep {
+        { float-4-rep  [ HADDPS ] }
+        { double-2-rep [ HADDPD ] }
+        { int-4-rep    [ PHADDD ] }
+        { short-8-rep  [ PHADDW ] }
+    } case ;
+
+M: x86 %horizontal-add-vector-reps
+    {
+        { sse3? { float-4-rep double-2-rep } }
+        { ssse3? { int-4-rep uint-4-rep short-8-rep ushort-8-rep } }
+    } available-reps ;
+
+M: x86 %horizontal-shl-vector-imm ( dst src1 src2 rep -- )
+    two-operand PSLLDQ ;
+
+M: x86 %horizontal-shl-vector-imm-reps
+    {
+        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep float-4-rep double-2-rep } }
+    } available-reps ;
+
+M: x86 %horizontal-shr-vector-imm ( dst src1 src2 rep -- )
+    two-operand PSRLDQ ;
+
+M: x86 %horizontal-shr-vector-imm-reps
+    {
+        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep float-4-rep double-2-rep } }
+    } available-reps ;
+
+M: x86 %abs-vector ( dst src rep -- )
+    {
+        { char-16-rep [ PABSB ] }
+        { short-8-rep [ PABSW ] }
+        { int-4-rep [ PABSD ] }
+    } case ;
+
+M: x86 %abs-vector-reps
+    {
+        { ssse3? { char-16-rep short-8-rep int-4-rep } }
+    } available-reps ;
+
+M: x86 %sqrt-vector ( dst src rep -- )
+    {
+        { float-4-rep [ SQRTPS ] }
+        { double-2-rep [ SQRTPD ] }
+    } case ;
+
+M: x86 %sqrt-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep } }
+    } available-reps ;
+
+M: x86 %and-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ ANDPS ] }
+        { double-2-rep [ ANDPS ] }
+        [ drop PAND ]
+    } case ;
+
+M: x86 %and-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %andn-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ ANDNPS ] }
+        { double-2-rep [ ANDNPS ] }
+        [ drop PANDN ]
+    } case ;
+
+M: x86 %andn-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %or-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ ORPS ] }
+        { double-2-rep [ ORPS ] }
+        [ drop POR ]
+    } case ;
+
+M: x86 %or-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %xor-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { float-4-rep [ XORPS ] }
+        { double-2-rep [ XORPS ] }
+        [ drop PXOR ]
+    } case ;
+
+M: x86 %xor-vector-reps
+    {
+        { sse? { float-4-rep } }
+        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %shl-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { short-8-rep [ PSLLW ] }
+        { ushort-8-rep [ PSLLW ] }
+        { int-4-rep [ PSLLD ] }
+        { uint-4-rep [ PSLLD ] }
+        { longlong-2-rep [ PSLLQ ] }
+        { ulonglong-2-rep [ PSLLQ ] }
+    } case ;
+
+M: x86 %shl-vector-reps
+    {
+        { sse2? { short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %shr-vector ( dst src1 src2 rep -- )
+    [ two-operand ] keep
+    {
+        { short-8-rep [ PSRAW ] }
+        { ushort-8-rep [ PSRLW ] }
+        { int-4-rep [ PSRAD ] }
+        { uint-4-rep [ PSRLD ] }
+        { ulonglong-2-rep [ PSRLQ ] }
+    } case ;
+
+M: x86 %shr-vector-reps
+    {
+        { sse2? { short-8-rep ushort-8-rep int-4-rep uint-4-rep ulonglong-2-rep } }
+    } available-reps ;
+
+M: x86 %shl-vector-imm %shl-vector ;
+M: x86 %shl-vector-imm-reps %shl-vector-reps ;
+M: x86 %shr-vector-imm %shr-vector ;
+M: x86 %shr-vector-imm-reps %shr-vector-reps ;
+
+: scalar-sized-reg ( reg rep -- reg' )
+    rep-size 8 * n-bit-version-of ;
+
+M: x86 %integer>scalar drop MOVD ;
+
+:: %scalar>integer-32 ( dst src rep -- )
+    rep {
+        { int-scalar-rep [
+            dst 32-bit-version-of src MOVD
+            dst dst 32-bit-version-of
+            2dup eq? [ 2drop ] [ MOVSX ] if
+        ] }
+        { uint-scalar-rep [
+            dst 32-bit-version-of src MOVD
+        ] }
+        { short-scalar-rep [
+            dst 32-bit-version-of src MOVD
+            dst dst 16-bit-version-of MOVSX
+        ] }
+        { ushort-scalar-rep [
+            dst 32-bit-version-of src MOVD
+            dst dst 16-bit-version-of MOVZX
+        ] }
+        { char-scalar-rep [
+            dst 32-bit-version-of src MOVD
+            dst { } 8 [| tmp-dst |
+                tmp-dst dst int-rep %copy
+                tmp-dst tmp-dst 8-bit-version-of MOVSX
+                dst tmp-dst int-rep %copy
+            ] with-small-register
+        ] }
+        { uchar-scalar-rep [
+            dst 32-bit-version-of src MOVD
+            dst { } 8 [| tmp-dst |
+                tmp-dst dst int-rep %copy
+                tmp-dst tmp-dst 8-bit-version-of MOVZX
+                dst tmp-dst int-rep %copy
+            ] with-small-register
+        ] }
+    } case ;
+
+M: x86.32 %scalar>integer ( dst src rep -- ) %scalar>integer-32 ;
+
+M: x86.64 %scalar>integer ( dst src rep -- )
+    {
+        { longlong-scalar-rep  [ MOVD ] }
+        { ulonglong-scalar-rep [ MOVD ] }
+        [ %scalar>integer-32 ]
+    } case ;
+
+M: x86 %vector>scalar %copy ;
+
+M: x86 %scalar>vector %copy ;
+
+enable-float-intrinsics
+enable-float-functions
+enable-float-min/max
+enable-fsqrt
diff --git a/basis/cpu/x86/sse/tags.txt b/basis/cpu/x86/sse/tags.txt
new file mode 100644 (file)
index 0000000..ebb74b4
--- /dev/null
@@ -0,0 +1 @@
+not loaded
index f4738b990bf0318bcde20aa2896a30f80a94c62e..d3adcf3960c49f373d3303b00a2fab4872f406aa 100644 (file)
@@ -6,7 +6,7 @@ cpu.x86.features cpu.x86.features.private cpu.architecture kernel
 kernel.private math memory namespaces make sequences words system
 layouts combinators math.order math.vectors fry locals compiler.constants
 byte-arrays io macros quotations classes.algebra compiler
-compiler.units init vm
+compiler.units init vm vocabs.loader
 compiler.cfg.registers
 compiler.cfg.instructions
 compiler.cfg.intrinsics
@@ -26,26 +26,14 @@ M: x86 vector-regs float-regs ;
 
 HOOK: stack-reg cpu ( -- reg )
 
-HOOK: frame-reg cpu ( -- reg )
-
 HOOK: reserved-stack-space cpu ( -- n )
 
-HOOK: extra-stack-space cpu ( stack-frame -- n )
-
 : stack@ ( n -- op ) stack-reg swap [+] ;
 
 : special-offset ( m -- n )
-    stack-frame get extra-stack-space +
     reserved-stack-space + ;
 
-: special@ ( n -- op ) special-offset stack@ ;
-
-: spill@ ( n -- op ) spill-offset special@ ;
-
-: param@ ( n -- op ) reserved-stack-space + stack@ ;
-
-: gc-root-offsets ( seq -- seq' )
-    [ n>> spill-offset special-offset cell + ] map f like ;
+: spill@ ( n -- op ) spill-offset special-offset stack@ ;
 
 : decr-stack-reg ( n -- )
     dup 0 = [ drop ] [ stack-reg swap SUB ] if ;
@@ -56,16 +44,11 @@ HOOK: extra-stack-space cpu ( stack-frame -- n )
 : align-stack ( n -- n' ) 16 align ;
 
 M: x86 stack-frame-size ( stack-frame -- i )
-    [ (stack-frame-size) ]
-    [ extra-stack-space ] bi +
+    (stack-frame-size)
     reserved-stack-space +
     3 cells +
     align-stack ;
 
-! Must be a volatile register not used for parameter passing or
-! integer return
-HOOK: temp-reg cpu ( -- reg )
-
 HOOK: pic-tail-reg cpu ( -- reg )
 
 M: x86 complex-addressing? t ;
@@ -164,6 +147,7 @@ M: x86 %max     int-rep two-operand [ CMP ] [ CMOVL ] 2bi ;
 M: x86 %not     int-rep one-operand NOT ;
 M: x86 %neg     int-rep one-operand NEG ;
 M: x86 %log2    BSR ;
+M: x86 %bit-count POPCNT ;
 
 ! A bit of logic to avoid using MOVSS/MOVSD for reg-reg moves
 ! since this induces partial register stalls
@@ -172,15 +156,8 @@ GENERIC: copy-memory* ( dst src rep -- )
 
 M: int-rep copy-register* drop MOV ;
 M: tagged-rep copy-register* drop MOV ;
-M: float-rep copy-register* drop MOVAPS ;
-M: double-rep copy-register* drop MOVAPS ;
-M: float-4-rep copy-register* drop MOVAPS ;
-M: double-2-rep copy-register* drop MOVAPS ;
-M: vector-rep copy-register* drop MOVDQA ;
 
 M: object copy-memory* copy-register* ;
-M: float-rep copy-memory* drop MOVSS ;
-M: double-rep copy-memory* drop MOVSD ;
 
 : ?spill-slot ( obj -- obj ) dup spill-slot? [ n>> spill@ ] when ;
 
@@ -503,8 +480,15 @@ M:: x86 %check-nursery-branch ( label size cc temp1 temp2 -- )
         { cc/<= [ label JG ] }
     } case ;
 
+M: x86 gc-root-offsets
+    [ n>> spill-offset special-offset cell + cell /i ] map f like ;
+
+M: x86 %call-gc ( gc-map -- )
+    \ minor-gc %call
+    gc-map-here ;
+
 M: x86 %alien-global ( dst symbol library -- )
-    [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;    
+    [ 0 MOV ] 2dip rc-absolute-cell rel-dlsym ;
 
 M: x86 %epilogue ( n -- ) cell - incr-stack-reg ;
 
@@ -583,22 +567,78 @@ M:: x86 %compare-imm-branch ( label src1 src2 cc -- )
     src1 src2 (%compare-imm)
     label cc %branch ;
 
-M: x86 %add-float double-rep two-operand ADDSD ;
-M: x86 %sub-float double-rep two-operand SUBSD ;
-M: x86 %mul-float double-rep two-operand MULSD ;
-M: x86 %div-float double-rep two-operand DIVSD ;
-M: x86 %min-float double-rep two-operand MINSD ;
-M: x86 %max-float double-rep two-operand MAXSD ;
-M: x86 %sqrt SQRTSD ;
+M:: x86 %dispatch ( src temp -- )
+    ! Load jump table base.
+    temp HEX: ffffffff MOV
+    building get length :> start
+    0 rc-absolute-cell rel-here
+    ! Add jump table base
+    temp src HEX: 7f [++] JMP
+    building get length :> end
+    ! Fix up the displacement above
+    cell alignment
+    [ end start - + building get dup pop* push ]
+    [ (align-code) ]
+    bi ;
+
+M:: x86 %spill ( src rep dst -- )
+    dst src rep %copy ;
+
+M:: x86 %reload ( dst rep src -- )
+    dst src rep %copy ;
+
+M:: x86 %store-stack-param ( src n rep -- )
+    n reserved-stack-space + stack@ src rep %copy ;
+
+: %load-return ( dst rep -- )
+    [ reg-class-of return-regs at first ] keep %load-reg-param ;
+
+: %store-return ( dst rep -- )
+    [ reg-class-of return-regs at first ] keep %store-reg-param ;
+
+: next-stack@ ( n -- operand )
+    #! nth parameter from the next stack frame. Used to box
+    #! input values to callbacks; the callback has its own
+    #! stack frame set up, and we want to read the frame
+    #! set up by the caller.
+    [ frame-reg ] dip 2 cells + reserved-stack-space + [+] ;
+
+M:: x86 %load-stack-param ( dst n rep -- )
+    dst n next-stack@ rep %copy ;
 
-: %clear-unless-in-place ( dst src -- )
-    over = [ drop ] [ dup XORPS ] if ;
+M:: x86 %local-allot ( dst size align offset -- )
+    dst offset local-allot-offset special-offset stack@ LEA ;
 
-M: x86 %single>double-float [ %clear-unless-in-place ] [ CVTSS2SD ] 2bi ;
-M: x86 %double>single-float [ %clear-unless-in-place ] [ CVTSD2SS ] 2bi ;
+M: x86 %alien-indirect ( src gc-map -- )
+    [ ?spill-slot CALL ] [ gc-map-here ] bi* ;
 
-M: x86 %integer>float [ drop dup XORPS ] [ CVTSI2SD ] 2bi ;
-M: x86 %float>integer CVTTSD2SI ;
+M: x86 %loop-entry 16 alignment [ NOP ] times ;
+
+M:: x86 %restore-context ( temp1 temp2 -- )
+    #! Load Factor stack pointers on entry from C to Factor.
+    temp1 %context
+    temp2 stack-reg cell neg [+] LEA
+    temp1 "callstack-top" context-field-offset [+] temp2 MOV
+    ds-reg temp1 "datastack" context-field-offset [+] MOV
+    rs-reg temp1 "retainstack" context-field-offset [+] MOV ;
+
+M:: x86 %save-context ( temp1 temp2 -- )
+    #! Save Factor stack pointers in case the C code calls a
+    #! callback which does a GC, which must reliably trace
+    #! all roots.
+    temp1 %context
+    temp2 stack-reg cell neg [+] LEA
+    temp1 "callstack-top" context-field-offset [+] temp2 MOV
+    temp1 "datastack" context-field-offset [+] ds-reg MOV
+    temp1 "retainstack" context-field-offset [+] rs-reg MOV ;
+
+M: x86 value-struct? drop t ;
+
+M: x86 immediate-arithmetic? ( n -- ? )
+    HEX: -80000000 HEX: 7fffffff between? ;
+
+M: x86 immediate-bitwise? ( n -- ? )
+    HEX: -80000000 HEX: 7fffffff between? ;
 
 : %cmov-float= ( dst src -- )
     [
@@ -623,28 +663,22 @@ M: x86 %float>integer CVTTSD2SI ;
 
 :: (%compare-float) ( dst src1 src2 cc temp compare -- )
     cc {
-        { cc<    [ src2 src1 \ compare execute( a b -- ) dst temp \ CMOVA  (%boolean) ] }
-        { cc<=   [ src2 src1 \ compare execute( a b -- ) dst temp \ CMOVAE (%boolean) ] }
-        { cc>    [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVA  (%boolean) ] }
-        { cc>=   [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVAE (%boolean) ] }
-        { cc=    [ src1 src2 \ compare execute( a b -- ) dst temp \ %cmov-float= (%boolean) ] }
-        { cc<>   [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVNE (%boolean) ] }
-        { cc<>=  [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVNP (%boolean) ] }
-        { cc/<   [ src2 src1 \ compare execute( a b -- ) dst temp \ CMOVBE (%boolean) ] }
-        { cc/<=  [ src2 src1 \ compare execute( a b -- ) dst temp \ CMOVB  (%boolean) ] }
-        { cc/>   [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVBE (%boolean) ] }
-        { cc/>=  [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVB  (%boolean) ] }
-        { cc/=   [ src1 src2 \ compare execute( a b -- ) dst temp \ %cmov-float/= (%boolean) ] }
-        { cc/<>  [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVE  (%boolean) ] }
-        { cc/<>= [ src1 src2 \ compare execute( a b -- ) dst temp \ CMOVP  (%boolean) ] }
+        { cc<    [ src2 src1 \ compare call( a b -- ) dst temp \ CMOVA  (%boolean) ] }
+        { cc<=   [ src2 src1 \ compare call( a b -- ) dst temp \ CMOVAE (%boolean) ] }
+        { cc>    [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVA  (%boolean) ] }
+        { cc>=   [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVAE (%boolean) ] }
+        { cc=    [ src1 src2 \ compare call( a b -- ) dst temp \ %cmov-float= (%boolean) ] }
+        { cc<>   [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVNE (%boolean) ] }
+        { cc<>=  [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVNP (%boolean) ] }
+        { cc/<   [ src2 src1 \ compare call( a b -- ) dst temp \ CMOVBE (%boolean) ] }
+        { cc/<=  [ src2 src1 \ compare call( a b -- ) dst temp \ CMOVB  (%boolean) ] }
+        { cc/>   [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVBE (%boolean) ] }
+        { cc/>=  [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVB  (%boolean) ] }
+        { cc/=   [ src1 src2 \ compare call( a b -- ) dst temp \ %cmov-float/= (%boolean) ] }
+        { cc/<>  [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVE  (%boolean) ] }
+        { cc/<>= [ src1 src2 \ compare call( a b -- ) dst temp \ CMOVP  (%boolean) ] }
     } case ; inline
 
-M: x86 %compare-float-ordered ( dst src1 src2 cc temp -- )
-    \ COMISD (%compare-float) ;
-
-M: x86 %compare-float-unordered ( dst src1 src2 cc temp -- )
-    \ UCOMISD (%compare-float) ;
-
 : %jump-float= ( label -- )
     [
         "no-jump" define-label
@@ -658,884 +692,28 @@ M: x86 %compare-float-unordered ( dst src1 src2 cc temp -- )
 
 :: (%compare-float-branch) ( label src1 src2 cc compare -- )
     cc {
-        { cc<    [ src2 src1 \ compare execute( a b -- ) label JA  ] }
-        { cc<=   [ src2 src1 \ compare execute( a b -- ) label JAE ] }
-        { cc>    [ src1 src2 \ compare execute( a b -- ) label JA  ] }
-        { cc>=   [ src1 src2 \ compare execute( a b -- ) label JAE ] }
-        { cc=    [ src1 src2 \ compare execute( a b -- ) label %jump-float= ] }
-        { cc<>   [ src1 src2 \ compare execute( a b -- ) label JNE ] }
-        { cc<>=  [ src1 src2 \ compare execute( a b -- ) label JNP ] }
-        { cc/<   [ src2 src1 \ compare execute( a b -- ) label JBE ] }
-        { cc/<=  [ src2 src1 \ compare execute( a b -- ) label JB  ] }
-        { cc/>   [ src1 src2 \ compare execute( a b -- ) label JBE ] }
-        { cc/>=  [ src1 src2 \ compare execute( a b -- ) label JB  ] }
-        { cc/=   [ src1 src2 \ compare execute( a b -- ) label %jump-float/= ] }
-        { cc/<>  [ src1 src2 \ compare execute( a b -- ) label JE  ] }
-        { cc/<>= [ src1 src2 \ compare execute( a b -- ) label JP  ] }
-    } case ;
-
-M: x86 %compare-float-ordered-branch ( label src1 src2 cc -- )
-    \ COMISD (%compare-float-branch) ;
-
-M: x86 %compare-float-unordered-branch ( label src1 src2 cc -- )
-    \ UCOMISD (%compare-float-branch) ;
-
-MACRO: available-reps ( alist -- )
-    ! Each SSE version adds new representations and supports
-    ! all old ones
-    unzip { } [ append ] accumulate rest swap suffix
-    [ [ 1quotation ] map ] bi@ zip
-    reverse [ { } ] suffix
-    '[ _ cond ] ;
-
-M: x86 %alien-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %zero-vector
-    {
-        { double-2-rep [ dup XORPS ] }
-        { float-4-rep [ dup XORPS ] }
-        [ drop dup PXOR ]
-    } case ;
-
-M: x86 %zero-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %fill-vector
-    {
-        { double-2-rep [ dup [ XORPS ] [ CMPEQPS ] 2bi ] }
-        { float-4-rep  [ dup [ XORPS ] [ CMPEQPS ] 2bi ] }
-        [ drop dup PCMPEQB ]
-    } case ;
-
-M: x86 %fill-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M:: x86 %gather-vector-4 ( dst src1 src2 src3 src4 rep -- )
-    rep signed-rep {
-        { float-4-rep [
-            dst src1 float-4-rep %copy
-            dst src2 UNPCKLPS
-            src3 src4 UNPCKLPS
-            dst src3 MOVLHPS
-        ] }
-        { int-4-rep [
-            dst src1 int-4-rep %copy
-            dst src2 PUNPCKLDQ
-            src3 src4 PUNPCKLDQ
-            dst src3 PUNPCKLQDQ
-        ] }
-    } case ;
-
-M: x86 %gather-vector-4-reps
-    {
-        ! Can't do this with sse1 since it will want to unbox
-        ! double-precision floats and convert to single precision
-        { sse2? { float-4-rep int-4-rep uint-4-rep } }
-    } available-reps ;
-
-M:: x86 %gather-vector-2 ( dst src1 src2 rep -- )
-    rep signed-rep {
-        { double-2-rep [
-            dst src1 double-2-rep %copy
-            dst src2 MOVLHPS
-        ] }
-        { longlong-2-rep [
-            dst src1 longlong-2-rep %copy
-            dst src2 PUNPCKLQDQ
-        ] }
-    } case ;
-
-M: x86 %gather-vector-2-reps
-    {
-        { sse2? { double-2-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-: sse1-float-4-shuffle ( dst shuffle -- )
-    {
-        { { 0 1 2 3 } [ drop ] }
-        { { 0 1 0 1 } [ dup MOVLHPS ] }
-        { { 2 3 2 3 } [ dup MOVHLPS ] }
-        { { 0 0 1 1 } [ dup UNPCKLPS ] }
-        { { 2 2 3 3 } [ dup UNPCKHPS ] }
-        [ dupd SHUFPS ]
-    } case ;
-
-: float-4-shuffle ( dst shuffle -- )
-    sse3? [
-        {
-            { { 0 0 2 2 } [ dup MOVSLDUP ] }
-            { { 1 1 3 3 } [ dup MOVSHDUP ] }
-            [ sse1-float-4-shuffle ]
-        } case
-    ] [ sse1-float-4-shuffle ] if ;
-
-: int-4-shuffle ( dst shuffle -- )
-    {
-        { { 0 1 2 3 } [ drop ] }
-        { { 0 0 1 1 } [ dup PUNPCKLDQ ] }
-        { { 2 2 3 3 } [ dup PUNPCKHDQ ] }
-        { { 0 1 0 1 } [ dup PUNPCKLQDQ ] }
-        { { 2 3 2 3 } [ dup PUNPCKHQDQ ] }
-        [ dupd PSHUFD ]
-    } case ;
-
-: longlong-2-shuffle ( dst shuffle -- )
-    first2 [ 2 * dup 1 + ] bi@ 4array int-4-shuffle ;
-
-: >float-4-shuffle ( double-2-shuffle -- float-4-shuffle )
-    [ 2 * { 0 1 } n+v ] map concat ;
-
-M:: x86 %shuffle-vector-imm ( dst src shuffle rep -- )
-    dst src rep %copy
-    dst shuffle rep signed-rep {
-        { double-2-rep [ >float-4-shuffle float-4-shuffle ] }
-        { float-4-rep [ float-4-shuffle ] }
-        { int-4-rep [ int-4-shuffle ] }
-        { longlong-2-rep [ longlong-2-shuffle ] }
-    } case ;
-
-M: x86 %shuffle-vector-imm-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M:: x86 %shuffle-vector-halves-imm ( dst src1 src2 shuffle rep -- )
-    dst src1 src2 rep two-operand
-    shuffle rep {
-        { double-2-rep [ >float-4-shuffle SHUFPS ] }
-        { float-4-rep [ SHUFPS ] }
-    } case ;
-
-M: x86 %shuffle-vector-halves-imm-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep } }
-    } available-reps ;
-
-M: x86 %shuffle-vector ( dst src shuffle rep -- )
-    two-operand PSHUFB ;
-
-M: x86 %shuffle-vector-reps
-    {
-        { ssse3? { float-4-rep double-2-rep longlong-2-rep ulonglong-2-rep int-4-rep uint-4-rep short-8-rep ushort-8-rep char-16-rep uchar-16-rep } }
-    } available-reps ;
-
-M: x86 %merge-vector-head
-    [ two-operand ] keep
-    signed-rep {
-        { double-2-rep   [ MOVLHPS ] }
-        { float-4-rep    [ UNPCKLPS ] }
-        { longlong-2-rep [ PUNPCKLQDQ ] }
-        { int-4-rep      [ PUNPCKLDQ ] }
-        { short-8-rep    [ PUNPCKLWD ] }
-        { char-16-rep    [ PUNPCKLBW ] }
-    } case ;
-
-M: x86 %merge-vector-tail
-    [ two-operand ] keep
-    signed-rep {
-        { double-2-rep   [ UNPCKHPD ] }
-        { float-4-rep    [ UNPCKHPS ] }
-        { longlong-2-rep [ PUNPCKHQDQ ] }
-        { int-4-rep      [ PUNPCKHDQ ] }
-        { short-8-rep    [ PUNPCKHWD ] }
-        { char-16-rep    [ PUNPCKHBW ] }
-    } case ;
-
-M: x86 %merge-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %signed-pack-vector
-    [ two-operand ] keep
-    {
-        { int-4-rep    [ PACKSSDW ] }
-        { short-8-rep  [ PACKSSWB ] }
-    } case ;
-
-M: x86 %signed-pack-vector-reps
-    {
-        { sse2? { short-8-rep int-4-rep } }
-    } available-reps ;
-
-M: x86 %unsigned-pack-vector
-    [ two-operand ] keep
-    signed-rep {
-        { int-4-rep   [ PACKUSDW ] }
-        { short-8-rep [ PACKUSWB ] }
+        { cc<    [ src2 src1 \ compare call( a b -- ) label JA  ] }
+        { cc<=   [ src2 src1 \ compare call( a b -- ) label JAE ] }
+        { cc>    [ src1 src2 \ compare call( a b -- ) label JA  ] }
+        { cc>=   [ src1 src2 \ compare call( a b -- ) label JAE ] }
+        { cc=    [ src1 src2 \ compare call( a b -- ) label %jump-float= ] }
+        { cc<>   [ src1 src2 \ compare call( a b -- ) label JNE ] }
+        { cc<>=  [ src1 src2 \ compare call( a b -- ) label JNP ] }
+        { cc/<   [ src2 src1 \ compare call( a b -- ) label JBE ] }
+        { cc/<=  [ src2 src1 \ compare call( a b -- ) label JB  ] }
+        { cc/>   [ src1 src2 \ compare call( a b -- ) label JBE ] }
+        { cc/>=  [ src1 src2 \ compare call( a b -- ) label JB  ] }
+        { cc/=   [ src1 src2 \ compare call( a b -- ) label %jump-float/= ] }
+        { cc/<>  [ src1 src2 \ compare call( a b -- ) label JE  ] }
+        { cc/<>= [ src1 src2 \ compare call( a b -- ) label JP  ] }
     } case ;
 
-M: x86 %unsigned-pack-vector-reps
-    {
-        { sse2? { short-8-rep } }
-        { sse4.1? { int-4-rep } }
-    } available-reps ;
-
-M: x86 %tail>head-vector ( dst src rep -- )
-    dup {
-        { float-4-rep [ drop UNPCKHPD ] }
-        { double-2-rep [ drop UNPCKHPD ] }
-        [ drop [ %copy ] [ drop PUNPCKHQDQ ] 3bi ]
-    } case ;
-
-M: x86 %unpack-vector-head ( dst src rep -- )
-    {
-        { char-16-rep  [ PMOVSXBW ] }
-        { uchar-16-rep [ PMOVZXBW ] }
-        { short-8-rep  [ PMOVSXWD ] }
-        { ushort-8-rep [ PMOVZXWD ] }
-        { int-4-rep    [ PMOVSXDQ ] }
-        { uint-4-rep   [ PMOVZXDQ ] }
-        { float-4-rep  [ CVTPS2PD ] }
-    } case ;
-
-M: x86 %unpack-vector-head-reps ( -- reps )
-    {
-        { sse2? { float-4-rep } }
-        { sse4.1? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep } }
-    } available-reps ;
-
-M: x86 %integer>float-vector ( dst src rep -- )
-    {
-        { int-4-rep [ CVTDQ2PS ] }
-    } case ;
-
-M: x86 %integer>float-vector-reps
-    {
-        { sse2? { int-4-rep } }
-    } available-reps ;
-
-M: x86 %float>integer-vector ( dst src rep -- )
-    {
-        { float-4-rep [ CVTTPS2DQ ] }
-    } case ;
-
-M: x86 %float>integer-vector-reps
-    {
-        { sse2? { float-4-rep } }
-    } available-reps ;
-
-: (%compare-float-vector) ( dst src rep double single -- )
-    [ double-2-rep eq? ] 2dip if ; inline
-
-: %compare-float-vector ( dst src rep cc -- )
-    {
-        { cc<    [ [ CMPLTPD    ] [ CMPLTPS    ] (%compare-float-vector) ] }
-        { cc<=   [ [ CMPLEPD    ] [ CMPLEPS    ] (%compare-float-vector) ] }
-        { cc=    [ [ CMPEQPD    ] [ CMPEQPS    ] (%compare-float-vector) ] }
-        { cc<>=  [ [ CMPORDPD   ] [ CMPORDPS   ] (%compare-float-vector) ] }
-        { cc/<   [ [ CMPNLTPD   ] [ CMPNLTPS   ] (%compare-float-vector) ] }
-        { cc/<=  [ [ CMPNLEPD   ] [ CMPNLEPS   ] (%compare-float-vector) ] }
-        { cc/=   [ [ CMPNEQPD   ] [ CMPNEQPS   ] (%compare-float-vector) ] }
-        { cc/<>= [ [ CMPUNORDPD ] [ CMPUNORDPS ] (%compare-float-vector) ] }
-    } case ;
-
-:: (%compare-int-vector) ( dst src rep int64 int32 int16 int8 -- )
-    rep signed-rep :> rep'
-    dst src rep' {
-        { longlong-2-rep [ int64 call ] }
-        { int-4-rep      [ int32 call ] }
-        { short-8-rep    [ int16 call ] }
-        { char-16-rep    [ int8  call ] }
-    } case ; inline
-
-: %compare-int-vector ( dst src rep cc -- )
-    {
-        { cc= [ [ PCMPEQQ ] [ PCMPEQD ] [ PCMPEQW ] [ PCMPEQB ] (%compare-int-vector) ] }
-        { cc> [ [ PCMPGTQ ] [ PCMPGTD ] [ PCMPGTW ] [ PCMPGTB ] (%compare-int-vector) ] }
-    } case ;
-
-M: x86 %compare-vector ( dst src1 src2 rep cc -- )
-    [ [ two-operand ] keep ] dip
-    over float-vector-rep?
-    [ %compare-float-vector ]
-    [ %compare-int-vector ] if ;
-
-: %compare-vector-eq-reps ( -- reps )
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep } }
-        { sse4.1? { longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-: %compare-vector-ord-reps ( -- reps )
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep short-8-rep int-4-rep } }
-        { sse4.2? { longlong-2-rep } }
-    } available-reps ;
-
-M: x86 %compare-vector-reps
-    {
-        { [ dup { cc= cc/= cc/<>= cc<>= } member-eq? ] [ drop %compare-vector-eq-reps ] }
-        [ drop %compare-vector-ord-reps ]
-    } cond ;
-
-: %compare-float-vector-ccs ( cc -- ccs not? )
-    {
-        { cc<    [ { { cc<  f   }              } f ] }
-        { cc<=   [ { { cc<= f   }              } f ] }
-        { cc>    [ { { cc<  t   }              } f ] }
-        { cc>=   [ { { cc<= t   }              } f ] }
-        { cc=    [ { { cc=  f   }              } f ] }
-        { cc<>   [ { { cc<  f   } { cc<    t } } f ] }
-        { cc<>=  [ { { cc<>= f  }              } f ] }
-        { cc/<   [ { { cc/<  f  }              } f ] }
-        { cc/<=  [ { { cc/<= f  }              } f ] }
-        { cc/>   [ { { cc/<  t  }              } f ] }
-        { cc/>=  [ { { cc/<= t  }              } f ] }
-        { cc/=   [ { { cc/=  f  }              } f ] }
-        { cc/<>  [ { { cc/=  f  } { cc/<>= f } } f ] }
-        { cc/<>= [ { { cc/<>= f }              } f ] }
-    } case ;
-
-: %compare-int-vector-ccs ( cc -- ccs not? )
-    order-cc {
-        { cc<    [ { { cc> t } } f ] }
-        { cc<=   [ { { cc> f } } t ] }
-        { cc>    [ { { cc> f } } f ] }
-        { cc>=   [ { { cc> t } } t ] }
-        { cc=    [ { { cc= f } } f ] }
-        { cc/=   [ { { cc= f } } t ] }
-        { t      [ {           } t ] }
-        { f      [ {           } f ] }
-    } case ;
-
-M: x86 %compare-vector-ccs
-    swap float-vector-rep?
-    [ %compare-float-vector-ccs ]
-    [ %compare-int-vector-ccs ] if ;
-
-:: %test-vector-mask ( dst temp mask vcc -- )
-    vcc {
-        { vcc-any    [ dst dst TEST dst temp \ CMOVNE (%boolean) ] }
-        { vcc-none   [ dst dst TEST dst temp \ CMOVE  (%boolean) ] }
-        { vcc-all    [ dst mask CMP dst temp \ CMOVE  (%boolean) ] }
-        { vcc-notall [ dst mask CMP dst temp \ CMOVNE (%boolean) ] }
-    } case ;
-
-: %move-vector-mask ( dst src rep -- mask )
-    {
-        { double-2-rep [ MOVMSKPS HEX: f ] }
-        { float-4-rep  [ MOVMSKPS HEX: f ] }
-        [ drop PMOVMSKB HEX: ffff ]
-    } case ;
-
-M:: x86 %test-vector ( dst src temp rep vcc -- )
-    dst src rep %move-vector-mask :> mask
-    dst temp mask vcc %test-vector-mask ;
-
-:: %test-vector-mask-branch ( label temp mask vcc -- )
-    vcc {
-        { vcc-any    [ temp temp TEST label JNE ] }
-        { vcc-none   [ temp temp TEST label JE ] }
-        { vcc-all    [ temp mask CMP label JE ] }
-        { vcc-notall [ temp mask CMP label JNE ] }
-    } case ;
-
-M:: x86 %test-vector-branch ( label src temp rep vcc -- )
-    temp src rep %move-vector-mask :> mask
-    label temp mask vcc %test-vector-mask-branch ;
-
-M: x86 %test-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %add-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ ADDPS ] }
-        { double-2-rep [ ADDPD ] }
-        { char-16-rep [ PADDB ] }
-        { uchar-16-rep [ PADDB ] }
-        { short-8-rep [ PADDW ] }
-        { ushort-8-rep [ PADDW ] }
-        { int-4-rep [ PADDD ] }
-        { uint-4-rep [ PADDD ] }
-        { longlong-2-rep [ PADDQ ] }
-        { ulonglong-2-rep [ PADDQ ] }
-    } case ;
-
-M: x86 %add-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %saturated-add-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { char-16-rep [ PADDSB ] }
-        { uchar-16-rep [ PADDUSB ] }
-        { short-8-rep [ PADDSW ] }
-        { ushort-8-rep [ PADDUSW ] }
-    } case ;
-
-M: x86 %saturated-add-vector-reps
-    {
-        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep } }
-    } available-reps ;
-
-M: x86 %add-sub-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ ADDSUBPS ] }
-        { double-2-rep [ ADDSUBPD ] }
-    } case ;
-
-M: x86 %add-sub-vector-reps
-    {
-        { sse3? { float-4-rep double-2-rep } }
-    } available-reps ;
-
-M: x86 %sub-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ SUBPS ] }
-        { double-2-rep [ SUBPD ] }
-        { char-16-rep [ PSUBB ] }
-        { uchar-16-rep [ PSUBB ] }
-        { short-8-rep [ PSUBW ] }
-        { ushort-8-rep [ PSUBW ] }
-        { int-4-rep [ PSUBD ] }
-        { uint-4-rep [ PSUBD ] }
-        { longlong-2-rep [ PSUBQ ] }
-        { ulonglong-2-rep [ PSUBQ ] }
-    } case ;
-
-M: x86 %sub-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %saturated-sub-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { char-16-rep [ PSUBSB ] }
-        { uchar-16-rep [ PSUBUSB ] }
-        { short-8-rep [ PSUBSW ] }
-        { ushort-8-rep [ PSUBUSW ] }
-    } case ;
-
-M: x86 %saturated-sub-vector-reps
-    {
-        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep } }
-    } available-reps ;
-
-M: x86 %mul-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ MULPS ] }
-        { double-2-rep [ MULPD ] }
-        { short-8-rep [ PMULLW ] }
-        { ushort-8-rep [ PMULLW ] }
-        { int-4-rep [ PMULLD ] }
-        { uint-4-rep [ PMULLD ] }
-    } case ;
-
-M: x86 %mul-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep short-8-rep ushort-8-rep } }
-        { sse4.1? { int-4-rep uint-4-rep } }
-    } available-reps ;
-
-M: x86 %mul-high-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { short-8-rep  [ PMULHW ] }
-        { ushort-8-rep [ PMULHUW ] }
-    } case ;
-
-M: x86 %mul-high-vector-reps
-    {
-        { sse2? { short-8-rep ushort-8-rep } }
-    } available-reps ;
-
-M: x86 %mul-horizontal-add-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { char-16-rep  [ PMADDUBSW ] }
-        { uchar-16-rep [ PMADDUBSW ] }
-        { short-8-rep  [ PMADDWD ] }
-    } case ;
-
-M: x86 %mul-horizontal-add-vector-reps
-    {
-        { sse2?  { short-8-rep } }
-        { ssse3? { char-16-rep uchar-16-rep } }
-    } available-reps ;
-
-M: x86 %div-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ DIVPS ] }
-        { double-2-rep [ DIVPD ] }
-    } case ;
-
-M: x86 %div-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep } }
-    } available-reps ;
-
-M: x86 %min-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { char-16-rep [ PMINSB ] }
-        { uchar-16-rep [ PMINUB ] }
-        { short-8-rep [ PMINSW ] }
-        { ushort-8-rep [ PMINUW ] }
-        { int-4-rep [ PMINSD ] }
-        { uint-4-rep [ PMINUD ] }
-        { float-4-rep [ MINPS ] }
-        { double-2-rep [ MINPD ] }
-    } case ;
-
-M: x86 %min-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { uchar-16-rep short-8-rep double-2-rep } }
-        { sse4.1? { char-16-rep ushort-8-rep int-4-rep uint-4-rep } }
-    } available-reps ;
-
-M: x86 %max-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { char-16-rep [ PMAXSB ] }
-        { uchar-16-rep [ PMAXUB ] }
-        { short-8-rep [ PMAXSW ] }
-        { ushort-8-rep [ PMAXUW ] }
-        { int-4-rep [ PMAXSD ] }
-        { uint-4-rep [ PMAXUD ] }
-        { float-4-rep [ MAXPS ] }
-        { double-2-rep [ MAXPD ] }
-    } case ;
-
-M: x86 %max-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { uchar-16-rep short-8-rep double-2-rep } }
-        { sse4.1? { char-16-rep ushort-8-rep int-4-rep uint-4-rep } }
-    } available-reps ;
-
-M: x86 %avg-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { uchar-16-rep [ PAVGB ] }
-        { ushort-8-rep [ PAVGW ] }
-    } case ;
-
-M: x86 %avg-vector-reps
-    {
-        { sse2? { uchar-16-rep ushort-8-rep } }
-    } available-reps ;
-
-M: x86 %dot-vector
-    [ two-operand ] keep
-    {
-        { float-4-rep [ HEX: ff DPPS ] }
-        { double-2-rep [ HEX: ff DPPD ] }
-    } case ;
-
-M: x86 %dot-vector-reps
-    {
-        { sse4.1? { float-4-rep double-2-rep } }
-    } available-reps ;
-
-M: x86 %sad-vector
-    [ two-operand ] keep
-    {
-        { uchar-16-rep [ PSADBW ] }
-    } case ;
-
-M: x86 %sad-vector-reps
-    {
-        { sse2? { uchar-16-rep } }
-    } available-reps ;
-
-M: x86 %horizontal-add-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    signed-rep {
-        { float-4-rep  [ HADDPS ] }
-        { double-2-rep [ HADDPD ] }
-        { int-4-rep    [ PHADDD ] }
-        { short-8-rep  [ PHADDW ] }
-    } case ;
-
-M: x86 %horizontal-add-vector-reps
-    {
-        { sse3? { float-4-rep double-2-rep } }
-        { ssse3? { int-4-rep uint-4-rep short-8-rep ushort-8-rep } }
-    } available-reps ;
-
-M: x86 %horizontal-shl-vector-imm ( dst src1 src2 rep -- )
-    two-operand PSLLDQ ;
-
-M: x86 %horizontal-shl-vector-imm-reps
-    {
-        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep float-4-rep double-2-rep } }
-    } available-reps ;
-
-M: x86 %horizontal-shr-vector-imm ( dst src1 src2 rep -- )
-    two-operand PSRLDQ ;
-
-M: x86 %horizontal-shr-vector-imm-reps
-    {
-        { sse2? { char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep float-4-rep double-2-rep } }
-    } available-reps ;
-
-M: x86 %abs-vector ( dst src rep -- )
-    {
-        { char-16-rep [ PABSB ] }
-        { short-8-rep [ PABSW ] }
-        { int-4-rep [ PABSD ] }
-    } case ;
-
-M: x86 %abs-vector-reps
-    {
-        { ssse3? { char-16-rep short-8-rep int-4-rep } }
-    } available-reps ;
-
-M: x86 %sqrt-vector ( dst src rep -- )
-    {
-        { float-4-rep [ SQRTPS ] }
-        { double-2-rep [ SQRTPD ] }
-    } case ;
-
-M: x86 %sqrt-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep } }
-    } available-reps ;
-
-M: x86 %and-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ ANDPS ] }
-        { double-2-rep [ ANDPS ] }
-        [ drop PAND ]
-    } case ;
-
-M: x86 %and-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %andn-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ ANDNPS ] }
-        { double-2-rep [ ANDNPS ] }
-        [ drop PANDN ]
-    } case ;
-
-M: x86 %andn-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %or-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ ORPS ] }
-        { double-2-rep [ ORPS ] }
-        [ drop POR ]
-    } case ;
-
-M: x86 %or-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %xor-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { float-4-rep [ XORPS ] }
-        { double-2-rep [ XORPS ] }
-        [ drop PXOR ]
-    } case ;
-
-M: x86 %xor-vector-reps
-    {
-        { sse? { float-4-rep } }
-        { sse2? { double-2-rep char-16-rep uchar-16-rep short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %shl-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { short-8-rep [ PSLLW ] }
-        { ushort-8-rep [ PSLLW ] }
-        { int-4-rep [ PSLLD ] }
-        { uint-4-rep [ PSLLD ] }
-        { longlong-2-rep [ PSLLQ ] }
-        { ulonglong-2-rep [ PSLLQ ] }
-    } case ;
-
-M: x86 %shl-vector-reps
-    {
-        { sse2? { short-8-rep ushort-8-rep int-4-rep uint-4-rep longlong-2-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %shr-vector ( dst src1 src2 rep -- )
-    [ two-operand ] keep
-    {
-        { short-8-rep [ PSRAW ] }
-        { ushort-8-rep [ PSRLW ] }
-        { int-4-rep [ PSRAD ] }
-        { uint-4-rep [ PSRLD ] }
-        { ulonglong-2-rep [ PSRLQ ] }
-    } case ;
-
-M: x86 %shr-vector-reps
-    {
-        { sse2? { short-8-rep ushort-8-rep int-4-rep uint-4-rep ulonglong-2-rep } }
-    } available-reps ;
-
-M: x86 %shl-vector-imm %shl-vector ;
-M: x86 %shl-vector-imm-reps %shl-vector-reps ;
-M: x86 %shr-vector-imm %shr-vector ;
-M: x86 %shr-vector-imm-reps %shr-vector-reps ;
-
-: scalar-sized-reg ( reg rep -- reg' )
-    rep-size 8 * n-bit-version-of ;
-
-M: x86 %integer>scalar drop MOVD ;
-
-:: %scalar>integer-32 ( dst src rep -- )
-    rep {
-        { int-scalar-rep [
-            dst 32-bit-version-of src MOVD
-            dst dst 32-bit-version-of
-            2dup eq? [ 2drop ] [ MOVSX ] if
-        ] }
-        { uint-scalar-rep [
-            dst 32-bit-version-of src MOVD
-        ] }
-        { short-scalar-rep [
-            dst 32-bit-version-of src MOVD
-            dst dst 16-bit-version-of MOVSX
-        ] }
-        { ushort-scalar-rep [
-            dst 32-bit-version-of src MOVD
-            dst dst 16-bit-version-of MOVZX
-        ] }
-        { char-scalar-rep [
-            dst 32-bit-version-of src MOVD
-            dst { } 8 [| tmp-dst |
-                tmp-dst dst int-rep %copy
-                tmp-dst tmp-dst 8-bit-version-of MOVSX
-                dst tmp-dst int-rep %copy
-            ] with-small-register
-        ] }
-        { uchar-scalar-rep [
-            dst 32-bit-version-of src MOVD
-            dst { } 8 [| tmp-dst |
-                tmp-dst dst int-rep %copy
-                tmp-dst tmp-dst 8-bit-version-of MOVZX
-                dst tmp-dst int-rep %copy
-            ] with-small-register
-        ] }
-    } case ;
-
-M: x86.32 %scalar>integer ( dst src rep -- ) %scalar>integer-32 ;
-
-M: x86.64 %scalar>integer ( dst src rep -- )
-    {
-        { longlong-scalar-rep  [ MOVD ] }
-        { ulonglong-scalar-rep [ MOVD ] }
-        [ %scalar>integer-32 ]
-    } case ;
-
-M: x86 %vector>scalar %copy ;
-
-M: x86 %scalar>vector %copy ;
-
-M:: x86 %spill ( src rep dst -- )
-    dst src rep %copy ;
-
-M:: x86 %reload ( dst rep src -- )
-    dst src rep %copy ;
-
-M:: x86 %store-reg-param ( src reg rep -- )
-    reg src rep %copy ;
-
-M:: x86 %store-stack-param ( src n rep -- )
-    n param@ src rep %copy ;
-
-HOOK: struct-return@ cpu ( n -- operand )
-
-M: x86 %prepare-struct-area ( dst -- )
-    f struct-return@ LEA ;
-
-M: x86 %alien-indirect ( src -- )
-    ?spill-slot CALL ;
-
-M: x86 %loop-entry 16 alignment [ NOP ] times ;
-
-M:: x86 %restore-context ( temp1 temp2 -- )
-    #! Load Factor stack pointers on entry from C to Factor.
-    temp1 %context
-    ds-reg temp1 "datastack" context-field-offset [+] MOV
-    rs-reg temp1 "retainstack" context-field-offset [+] MOV ;
-
-M:: x86 %save-context ( temp1 temp2 -- )
-    #! Save Factor stack pointers in case the C code calls a
-    #! callback which does a GC, which must reliably trace
-    #! all roots.
-    temp1 %context
-    temp2 stack-reg cell neg [+] LEA
-    temp1 "callstack-top" context-field-offset [+] temp2 MOV
-    temp1 "datastack" context-field-offset [+] ds-reg MOV
-    temp1 "retainstack" context-field-offset [+] rs-reg MOV ;
-
-M: x86 value-struct? drop t ;
-
-M: x86 immediate-arithmetic? ( n -- ? )
-    HEX: -80000000 HEX: 7fffffff between? ;
-
-M: x86 immediate-bitwise? ( n -- ? )
-    HEX: -80000000 HEX: 7fffffff between? ;
-
-: next-stack@ ( n -- operand )
-    #! nth parameter from the next stack frame. Used to box
-    #! input values to callbacks; the callback has its own
-    #! stack frame set up, and we want to read the frame
-    #! set up by the caller.
-    frame-reg swap 2 cells + [+] ;
-
 enable-min/max
 enable-log2
 
-enable-float-intrinsics
-enable-float-functions
-enable-float-min/max
-enable-fsqrt
-
 : check-sse ( -- )
+    "Checking for multimedia extensions... " write flush
     [ { (sse-version) } compile ] with-optimizer
-    sse-version 20 < [
-        "Factor requires SSE2, which your CPU does not support." print
-        flush
-        1 exit
-    ] when ;
+    sse-version
+    [ sse-string " detected" append print ]
+    [ 20 < "cpu.x86.x87" "cpu.x86.sse" ? require ] bi ;
diff --git a/basis/cpu/x86/x87/authors.txt b/basis/cpu/x86/x87/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/basis/cpu/x86/x87/tags.txt b/basis/cpu/x86/x87/tags.txt
new file mode 100644 (file)
index 0000000..ebb74b4
--- /dev/null
@@ -0,0 +1 @@
+not loaded
diff --git a/basis/cpu/x86/x87/x87.factor b/basis/cpu/x86/x87/x87.factor
new file mode 100644 (file)
index 0000000..8f267b4
--- /dev/null
@@ -0,0 +1,103 @@
+! Copyright (C) 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types combinators kernel locals system namespaces
+compiler.codegen.fixup compiler.constants
+compiler.cfg.comparisons compiler.cfg.intrinsics
+cpu.architecture cpu.x86 cpu.x86.assembler
+cpu.x86.assembler.operands ;
+IN: cpu.x86.x87
+
+! x87 unit is only used if SSE2 is not available.
+
+: copy-register-x87 ( dst src -- )
+    2dup eq? [ 2drop ] [ FLD shuffle-down FSTP ] if ;
+
+M: float-rep copy-register* drop copy-register-x87 ;
+M: double-rep copy-register* drop copy-register-x87 ;
+
+: load-x87 ( dst src rep -- )
+    {
+        { float-rep [ FLDS shuffle-down FSTP ] }
+        { double-rep [ FLDL shuffle-down FSTP ] }
+    } case ;
+
+: store-x87 ( dst src rep -- )
+    {
+        { float-rep [ FLD FSTPS ] }
+        { double-rep [ FLD FSTPL ] }
+    } case ;
+
+: copy-memory-x87 ( dst src rep -- )
+    {
+        { [ pick register? ] [ load-x87 ] }
+        { [ over register? ] [ store-x87 ] }
+    } cond ;
+
+M: float-rep copy-memory* copy-memory-x87 ;
+M: double-rep copy-memory* copy-memory-x87 ;
+
+M: x86 %load-float
+    0 [] FLDS
+    <float> rc-absolute rel-binary-literal
+    shuffle-down FSTP ;
+
+M: x86 %load-double
+    0 [] FLDL
+    <double> rc-absolute rel-binary-literal
+    shuffle-down FSTP ;
+
+:: binary-op ( dst src1 src2 quot -- )
+    src1 FLD
+    ST0 src2 shuffle-down quot call
+    dst shuffle-down FSTP ; inline
+
+M: x86 %add-float [ FADD ] binary-op ;
+M: x86 %sub-float [ FSUB ] binary-op ;
+M: x86 %mul-float [ FMUL ] binary-op ;
+M: x86 %div-float [ FDIV ] binary-op ;
+
+M: x86 %sqrt FLD FSQRT shuffle-down FSTP ;
+
+M: x86 %single>double-float copy-register-x87 ;
+M: x86 %double>single-float copy-register-x87 ;
+
+M: x86 integer-float-needs-stack-frame? t ;
+
+M:: x86 %integer>float ( dst src -- )
+    4 stack@ src MOV
+    4 stack@ FILDD
+    dst shuffle-down FSTP ;
+
+M:: x86 %float>integer ( dst src -- )
+    src FLD
+    8 stack@ EAX MOV
+    0 stack@ FNSTCW
+    AX 0 stack@ MOV
+    AH 12 <byte> MOV
+    2 stack@ AX MOV
+    2 stack@ FLDCW
+    4 stack@ FISTPD
+    0 stack@ FLDCW
+    EAX 8 stack@ MOV
+    dst 4 stack@ MOV ;
+
+:: compare-op ( src1 src2 quot -- )
+    src1 FLD
+    src2 shuffle-down quot call
+    ST0 FSTP ; inline
+
+M: x86 %compare-float-ordered ( dst src1 src2 cc temp -- )
+    [ [ FCOMI ] compare-op ] (%compare-float) ;
+
+M: x86 %compare-float-unordered ( dst src1 src2 cc temp -- )
+    [ [ FUCOMI ] compare-op ] (%compare-float) ;
+
+M: x86 %compare-float-ordered-branch ( label src1 src2 cc -- )
+    [ [ FCOMI ] compare-op ] (%compare-float-branch) ;
+
+M: x86 %compare-float-unordered-branch ( label src1 src2 cc -- )
+    [ [ FUCOMI ] compare-op ] (%compare-float-branch) ;
+
+enable-float-intrinsics
+enable-float-functions
+enable-fsqrt
index 5398e669ed6af622ef341dbbf27164afbc52dc20..7fe40a73d6ce30eaf5af2628e7e3e072f1aafe97 100644 (file)
@@ -139,15 +139,14 @@ M: postgresql-malloc-destructor dispose ( obj -- )
         [ 3drop ] dip
         [
             memory>byte-array >string
-            0 <uint>
+            { uint }
             [
                 PQunescapeBytea dup zero? [
                     postgresql-result-error-message throw
                 ] [
                     &postgresql-free
                 ] if
-            ] keep
-            *uint memory>byte-array
+            ] [ ] with-out-parameters memory>byte-array
         ] with-destructors 
     ] [
         drop pq-get-is-null nip [ f ] [ B{ } clone ] if
index b8e56863c3d6ab25fd2e17c25dd7515bed163ee4..58033a281e8a5bb117eccee0c2371546e588df49 100644 (file)
@@ -27,16 +27,17 @@ ERROR: sqlite-sql-error < sql-error n string ;
 
 : sqlite-open ( path -- db )
     normalize-path
-    void* <c-object>
-    [ sqlite3_open sqlite-check-result ] keep *void* ;
+    { void* } [ sqlite3_open sqlite-check-result ] [ ]
+    with-out-parameters ;
 
 : sqlite-close ( db -- )
     sqlite3_close sqlite-check-result ;
 
 : sqlite-prepare ( db sql -- handle )
-    utf8 encode dup length void* <c-object> void* <c-object>
-    [ sqlite3_prepare_v2 sqlite-check-result ] 2keep
-    drop *void* ;
+    utf8 encode dup length
+    { void* void* }
+    [ sqlite3_prepare_v2 sqlite-check-result ] [ drop ]
+    with-out-parameters ;
 
 : sqlite-bind-parameter-index ( handle name -- index )
     sqlite3_bind_parameter_index ;
index d193b5921e6aa7ef0f4548eb6735411004f7e18b..19e7760c46c489e64b4ea299bffb0f1b2efe9def 100644 (file)
@@ -75,7 +75,7 @@ PRIVATE>
 ERROR: no-slots-named class seq ;
 : check-columns ( class columns -- )
     [ nip ] [
-        [ [ first ] map ]
+        [ keys ]
         [ all-slots [ name>> ] map ] bi* diff
     ] 2bi
     [ drop ] [ no-slots-named ] if-empty ;
index 5bbd62dfa8c9f0389586c8b52b4c2d11be7c3514..ebd6a05b482c30025bb246d3c4a17549f516c866 100644 (file)
@@ -22,14 +22,17 @@ GENERIC: group-words ( group -- words )
 M: standard-generic group-words
     dup "combination" word-prop #>> 2array 1array ;
 
-M: tuple-class group-words
-    all-slots [
+: slot-group-words ( slots -- words )
+    [
         name>>
         [ reader-word 0 2array ]
         [ writer-word 0 2array ] bi
         2array
     ] map concat ;
 
+M: tuple-class group-words
+    all-slots slot-group-words ;
+
 : check-broadcast-group ( group -- group )
     dup group-words [ first stack-effect out>> empty? ] all?
     [ broadcast-words-must-have-no-outputs ] unless ;
index 51de8c0be6852053c8af3ad55a7508ac90899508..676e41d3bcf5886579f27b148e067e7ce56761ee 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel accessors math.intervals
-system calendar alarms fry
+system calendar fry
 random db db.tuples db.types
 http.server.filters ;
 IN: furnace.cache
index 1e103ad0fa13e6c221d880f88f888efbd1dab26b..ecdbee8284880fffdfbc9fb5e3de749822e90638 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2010 Erik Charlebois, William Schlieper.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types arrays kernel game.input namespaces math
-classes bit-arrays system sequences vectors x11 x11.xlib ;
+USING: accessors alien.c-types alien.data arrays kernel game.input
+namespaces math classes bit-arrays system sequences vectors
+x11 x11.xlib assocs generalizations ;
 IN: game.input.x11
 
 SINGLETON: x11-game-input-backend
@@ -77,7 +78,7 @@ M: linux x>hid-bit-order
     } ; inline
      
 : x-bits>hid-bits ( bit-array -- bit-array )
-    256 iota [ 2array ] { } 2map-as [ first ] filter [ second ] map
+    256 iota [ 2array ] { } 2map-as [ first ] filter values
     x>hid-bit-order [ nth ] curry map
     256 <bit-array> swap [ t swap pick set-nth ] each ;
         
@@ -87,9 +88,9 @@ M: x11-game-input-backend read-keyboard
 
 : query-pointer ( -- x y buttons )
     dpy get dup XDefaultRootWindow
-    0 <int> 0 <int> 0 <int> 0 <int> 0 <int> 0 <int> 0 <int>
-    [ XQueryPointer drop ] 3keep
-    [ *int ] tri@ ;
+    { int int int int int int int }
+    [ XQueryPointer drop ] [ ] with-out-parameters
+    [ 4 ndrop ] 3dip ;
 
 SYMBOL: mouse-reset?
      
index d21b2b022c1fa2e4da22264e67c6cf16ac11ad6a..dee69e3cbd0a076ad5a6146b7054d98173634210 100644 (file)
@@ -2,59 +2,10 @@ USING: help.syntax help.markup kernel sequences quotations
 math arrays combinators ;\r
 IN: generalizations\r
 \r
-HELP: nsequence\r
-{ $values { "n" integer } { "seq" "an exemplar" } }\r
-{ $description "A generalization of " { $link 2sequence } ", "\r
-{ $link 3sequence } ", and " { $link 4sequence } " "\r
-"that constructs a sequence from the top " { $snippet "n" } " elements of the stack."\r
-}\r
-{ $examples\r
-    { $example "USING: generalizations prettyprint ;" "CHAR: f CHAR: i CHAR: s CHAR: h 4 \"\" nsequence ." "\"fish\"" }\r
-} ;\r
-\r
-HELP: narray\r
-{ $values { "n" integer } }\r
-{ $description "A generalization of " { $link 1array } ", "\r
-{ $link 2array } ", " { $link 3array } " and " { $link 4array } " "\r
-"that constructs an array from the top " { $snippet "n" } " elements of the stack."\r
-}\r
-{ $examples\r
-    "Some core words expressed in terms of " { $link narray } ":"\r
-    { $table\r
-        { { $link 1array } { $snippet "1 narray" } }\r
-        { { $link 2array } { $snippet "2 narray" } }\r
-        { { $link 3array } { $snippet "3 narray" } }\r
-        { { $link 4array } { $snippet "4 narray" } }\r
-    }\r
-} ;\r
-\r
-{ nsequence narray } related-words\r
-\r
 HELP: nsum\r
 { $values { "n" integer } }\r
 { $description "Adds the top " { $snippet "n" } " stack values." } ;\r
 \r
-HELP: firstn\r
-{ $values { "n" integer } }\r
-{ $description "A generalization of " { $link first } ", "\r
-{ $link first2 } ", " { $link first3 } " and " { $link first4 } " "\r
-"that pushes the first " { $snippet "n" } " elements of a sequence on the stack."\r
-}\r
-{ $examples\r
-    "Some core words expressed in terms of " { $link firstn } ":"\r
-    { $table\r
-        { { $link first } { $snippet "1 firstn" } }\r
-        { { $link first2 } { $snippet "2 firstn" } }\r
-        { { $link first3 } { $snippet "3 firstn" } }\r
-        { { $link first4 } { $snippet "4 firstn" } }\r
-    }\r
-} ;\r
-\r
-HELP: set-firstn\r
-{ $values { "n" integer } }\r
-{ $description "A generalization of " { $link set-first } " "\r
-"that sets the first " { $snippet "n" } " elements of a sequence from the top " { $snippet "n" } " elements of the stack." } ;\r
-\r
 HELP: npick\r
 { $values { "n" integer } }\r
 { $description "A generalization of " { $link dup } ", "\r
@@ -63,7 +14,13 @@ HELP: npick
 "placed on the top of the stack."\r
 }\r
 { $examples\r
-  { $example "USING: kernel prettyprint generalizations ;" "1 2 3 4 4 npick 5 narray ." "{ 1 2 3 4 1 }" }\r
+  { $example\r
+      "USING: kernel generalizations prettyprint"\r
+      "sequences.generalizations ;"\r
+      ""\r
+      "1 2 3 4 4 npick 5 narray ."\r
+      "{ 1 2 3 4 1 }"\r
+  }\r
   "Some core words expressed in terms of " { $link npick } ":"\r
     { $table\r
         { { $link dup } { $snippet "1 npick" } }\r
@@ -80,7 +37,13 @@ HELP: ndup
 "placed on the top of the stack."\r
 }\r
 { $examples\r
-  { $example "USING: prettyprint generalizations kernel ;" "1 2 3 4 4 ndup 8 narray ." "{ 1 2 3 4 1 2 3 4 }" }\r
+  { $example\r
+      "USING: prettyprint generalizations kernel"\r
+      "sequences.generalizations ;"\r
+      ""\r
+      "1 2 3 4 4 ndup 8 narray ."\r
+      "{ 1 2 3 4 1 2 3 4 }"\r
+  }\r
   "Some core words expressed in terms of " { $link ndup } ":"\r
     { $table\r
         { { $link dup } { $snippet "1 ndup" } }\r
@@ -178,7 +141,13 @@ HELP: nkeep
 "saved, the quotation called, and the items restored."\r
 } \r
 { $examples\r
-  { $example "USING: generalizations kernel prettyprint ;" "1 2 3 4 5 [ drop drop drop drop drop 99 ] 5 nkeep 6 narray ." "{ 99 1 2 3 4 5 }" }\r
+  { $example\r
+      "USING: generalizations kernel prettyprint"\r
+      "sequences.generalizations ;"\r
+      ""\r
+      "1 2 3 4 5 [ drop drop drop drop drop 99 ] 5 nkeep 6 narray ."\r
+      "{ 99 1 2 3 4 5 }"\r
+  }\r
   "Some core words expressed in terms of " { $link nkeep } ":"\r
     { $table\r
         { { $link keep } { $snippet "1 nkeep" } }\r
@@ -302,46 +271,6 @@ HELP: n*quot
 }\r
 { $description "Construct a quotation containing the contents of " { $snippet "seq" } " repeated " { $snippet "n"} " times." } ;\r
 \r
-HELP: nappend\r
-{ $values\r
-     { "n" integer }\r
-     { "seq" sequence }\r
-}\r
-{ $description "Outputs a new sequence consisting of the elements of the top " { $snippet "n" } " sequences from the datastack in turn." }\r
-{ $errors "Throws an error if any of the sequences contain elements that are not permitted in the sequence type of the first sequence." }\r
-{ $examples\r
-    { $example "USING: generalizations prettyprint math ;"\r
-               "{ 1 2 } { 3 4 } { 5 6 } { 7 8 } 4 nappend ."\r
-               "{ 1 2 3 4 5 6 7 8 }"\r
-    }\r
-} ;\r
-\r
-HELP: nappend-as\r
-{ $values\r
-     { "n" integer } { "exemplar" sequence }\r
-     { "seq" sequence }\r
-}\r
-{ $description "Outputs a new sequence of type " { $snippet "exemplar" } " consisting of the elements of the top " { $snippet "n" } " sequences from the datastack in turn." }\r
-{ $errors "Throws an error if any of the sequences contain elements that are not permitted in the sequence type of the first sequence." }\r
-{ $examples\r
-    { $example "USING: generalizations prettyprint math ;"\r
-               "{ 1 2 } { 3 4 } { 5 6 } { 7 8 } 4 V{ } nappend-as ."\r
-               "V{ 1 2 3 4 5 6 7 8 }"\r
-    }\r
-} ;\r
-\r
-{ nappend nappend-as } related-words\r
-\r
-ARTICLE: "sequence-generalizations" "Generalized sequence operations"\r
-{ $subsections\r
-    narray\r
-    nsequence\r
-    firstn\r
-    set-firstn\r
-    nappend\r
-    nappend-as\r
-} ;\r
-\r
 ARTICLE: "shuffle-generalizations" "Generalized shuffle words"\r
 { $subsections\r
     ndup\r
@@ -381,11 +310,10 @@ ARTICLE: "generalizations" "Generalized shuffle words and combinators"
 "macros where the arity of the input quotations depends on an "\r
 "input parameter."\r
 { $subsections\r
-    "sequence-generalizations"\r
     "shuffle-generalizations"\r
     "combinator-generalizations"\r
     "other-generalizations"\r
 }\r
-"Also see the " { $vocab-link "sequences.generalizations" } " vocabulary for generalized sequence iteration combinators." ;\r
+"Also see the " { $vocab-link "sequences.generalizations" } " vocabulary for generalized sequence operations." ;\r
 \r
 ABOUT: "generalizations"\r
index 477be4a20fd027c7b16330fd7cdbb44f86e4eb38..9b6374ca5f7c1f105bf35b006e638d8d14597bd5 100644 (file)
@@ -39,24 +39,10 @@ IN: generalizations.tests
 \r
 [ { "xyc" "xyd" } ] [ "x" "y" { "c" "d" } [ 3append ] 2 nwith map ] unit-test\r
 \r
-[ 1 2 3 4 ] [ { 1 2 3 4 } 4 firstn ] unit-test\r
-[ { 1 2 3 4 } ] [ 1 2 3 4 { f f f f } [ 4 set-firstn ] keep ] unit-test\r
-[ 1 2 3 4 { f f f } [ 4 set-firstn ] keep ] must-fail\r
-[ ] [ { } 0 firstn ] unit-test\r
-[ "a" ] [ { "a" } 1 firstn ] unit-test\r
-\r
-[ [ 1 2 ] ] [ 1 2 2 [ ] nsequence ] unit-test\r
-\r
 [ 4 5 1 2 3 ] [ 1 2 3 4 5 2 3 mnswap ] unit-test\r
 \r
 [ 1 2 3 4 5 6 ] [ 1 2 3 4 5 6 2 4 mnswap 4 2 mnswap ] unit-test\r
 \r
-[ { 1 2 3 4 } ] [ { 1 } { 2 } { 3 } { 4 } 4 nappend ] unit-test\r
-[ V{ 1 2 3 4 } ] [ { 1 } { 2 } { 3 } { 4 } 4 V{ } nappend-as ] unit-test\r
-\r
-[ 4 nappend ] must-infer\r
-[ 4 { } nappend-as ] must-infer\r
-\r
 [ 17 ] [ 3 1 3 3 7 5 nsum ] unit-test\r
 { 4 1 } [ 4 nsum ] must-infer-as\r
 \r
index ac5ff3dee073345f4983e180758dbb12e52e5909..2c6a9f1a21854e955b6f26d4b60c5da0d17b979c 100644 (file)
@@ -14,26 +14,9 @@ ALIAS: n*quot (n*quot)
 
 >>
 
-MACRO: nsequence ( n seq -- )
-    [ [nsequence] ] keep
-    '[ @ _ like ] ;
-
-MACRO: narray ( n -- )
-    '[ _ { } nsequence ] ;
-
 MACRO: nsum ( n -- )
     1 - [ + ] n*quot ;
 
-MACRO: firstn-unsafe ( n -- )
-    [firstn] ;
-
-MACRO: firstn ( n -- )
-    dup zero? [ drop [ drop ] ] [
-        [ 1 - swap bounds-check 2drop ]
-        [ firstn-unsafe ]
-        bi-curry '[ _ _ bi ]
-    ] if ;
-
 MACRO: npick ( n -- )
     1 - [ dup ] [ '[ _ dip swap ] ] repeat ;
 
@@ -53,18 +36,6 @@ MACRO: nrot ( n -- )
 MACRO: -nrot ( n -- )
     1 - [ ] [ '[ swap _ dip ] ] repeat ;
 
-MACRO: set-firstn-unsafe ( n -- )
-    [ 1 + ]
-    [ iota [ '[ _ rot [ set-nth-unsafe ] keep ] ] map ] bi
-    '[ _ -nrot _ spread drop ] ;
-
-MACRO: set-firstn ( n -- )
-    dup zero? [ drop [ drop ] ] [
-        [ 1 - swap bounds-check 2drop ]
-        [ set-firstn-unsafe ]
-        bi-curry '[ _ _ bi ]
-    ] if ;
-
 MACRO: ndrop ( n -- )
     [ drop ] n*quot ;
 
@@ -143,9 +114,3 @@ MACRO: nweave ( n -- )
 
 MACRO: nbi-curry ( n -- )
     [ bi-curry ] n*quot ;
-
-: nappend-as ( n exemplar -- seq )
-    [ narray concat ] dip like ; inline
-
-: nappend ( n -- seq ) narray concat ; inline
-
index 0c9db38f4bc8d29009d94fe08519af04d8736eb6..c91eb231ab6fee5f5d4e3235501ea3791e9bef8e 100644 (file)
@@ -32,8 +32,8 @@ ARTICLE: "grouping" "Groups and clumps"
             "{ 1 2 3 4 } 2 clump ." "{ { 1 2 } { 2 3 } { 3 4 } }"
         }
         { $unchecked-example
-            "USING: grouping ;"
-            "{ 1 2 3 4 } dup" "2 <clumps> unclip-last [ [ first ] map ] dip append sequence= ." "t"
+            "USING: grouping assocs sequences ;"
+            "{ 1 2 3 4 } dup" "2 <clumps> unclip-last [ keys ] dip append sequence= ." "t"
         }
     }
     { "With circular clumps, collecting the first element of each subsequence yields the original sequence. Collecting the " { $snippet "n" } "th element of each subsequence would rotate the original sequence " { $snippet "n" } " elements rightward:"
@@ -42,8 +42,8 @@ ARTICLE: "grouping" "Groups and clumps"
             "{ 1 2 3 4 } 2 circular-clump ." "{ { 1 2 } { 2 3 } { 3 4 } { 4 1 } }"
         }
         { $unchecked-example
-            "USING: grouping ;"
-            "{ 1 2 3 4 } dup" "2 <circular-clumps> [ first ] map sequence= ." "t"
+            "USING: grouping assocs sequences ;"
+            "{ 1 2 3 4 } dup" "2 <circular-clumps> keys sequence= ." "t"
         }
         { $unchecked-example
             "USING: grouping ;"
index 87b44595d27e9d10db7108a13153754f158ae2d2..cd389d6367de3e22db17a2fcd1a4e764f519cdc2 100644 (file)
@@ -34,7 +34,7 @@ SYMBOL: vocab-articles
 
 : extract-values ( element -- seq )
     \ $values swap elements dup empty? [
-        first rest [ first ] map
+        first rest keys
     ] unless ;
 
 : extract-value-effects ( element -- seq )
index aa500e53fbf53b70308b7dc957b0f098aca00ebc..424efb993afb464681d807540b103789b3c00512 100644 (file)
@@ -281,7 +281,7 @@ ERROR: bmp-not-supported n ;
         { 24 [ color-index>> ] }
         { 16 [
             [
-                ! byte-array>ushort-array
+                ! ushort-array-cast
                 2 group [ le> ] map
                 ! 5 6 5
                 ! { HEX: f800 HEX: 7e0 HEX: 1f } uncompress-bitfield
@@ -312,7 +312,7 @@ M: unsupported-bitfield-widths summary
     dup header>> bit-count>> {
         { 16 [
             dup bitfields>> '[
-                byte-array>ushort-array _ uncompress-bitfield
+                ushort-array-cast _ uncompress-bitfield
             ] change-color-index
         ] }
         { 32 [ ] }
index a73de4f7b8066822b99aadbffb62943cd73ac52b..aa85057ee9f70e4d214be5a242637791ca7a6df4 100644 (file)
@@ -47,13 +47,13 @@ GENERIC: normalize-component-type* ( image component-type -- image )
     [ 255.0 * >integer ] B{ } map-as ;
 
 M: float-components normalize-component-type*
-    drop byte-array>float-array normalize-floats ;
+    drop float-array-cast normalize-floats ;
 
 M: half-components normalize-component-type*
-    drop byte-array>half-array normalize-floats ;
+    drop half-array-cast normalize-floats ;
 
 : ushorts>ubytes ( bitmap -- bitmap' )
-    byte-array>ushort-array [ -8 shift ] B{ } map-as ; inline
+    ushort-array-cast [ -8 shift ] B{ } map-as ; inline
 
 M: ushort-components normalize-component-type*
     drop ushorts>ubytes ;
index d4a9c4ab563a57b37ce0c12242d0b5b3f755ea5e..0b46fdf653aaefbc3197ba45ecbbdc0297be57f4 100644 (file)
@@ -290,14 +290,6 @@ ERROR: invalid-color-type/bit-depth loading-png ;
 : validate-truecolor-alpha ( loading-png -- loading-png )
     { 8 16 } validate-bit-depth ;
 
-: pad-bitmap ( image -- image )
-    dup dim>> second 4 divisor? [
-        dup [ bytes-per-pixel ]
-        [ dim>> first * ]
-        [ dim>> first 4 mod ] tri
-        '[ _ group [ _ 0 <array> append ] map B{ } concat-as ] change-bitmap
-    ] unless ;
-
 : loading-png>bitmap ( loading-png -- bytes component-order )
     dup color-type>> {
         { greyscale [
@@ -323,7 +315,7 @@ ERROR: invalid-color-type/bit-depth loading-png ;
         [ loading-png>bitmap [ >>bitmap ] [ >>component-order ] bi* ]
         [ [ width>> ] [ height>> ] bi 2array >>dim ]
         [ png-component >>component-type ]
-    } cleave pad-bitmap ;
+    } cleave ;
 
 : load-png ( stream -- loading-png )
     [
index 3485b3efa709c75927485470ce37f66842fb6f0c..b4a3b72b3c8d89232f4b1001ca016b4092e69d8c 100644 (file)
@@ -6,7 +6,7 @@ classes.tuple namespaces make vectors bit-arrays byte-arrays
 strings sbufs math.functions macros sequences.private
 combinators mirrors splitting combinators.smart
 combinators.short-circuit fry words.symbol generalizations
-classes ;
+sequences.generalizations classes ;
 IN: inverse
 
 ERROR: fail ;
index 0e84f1b65e522ff478cb779d93ff288bc60d6bb7..972b2a5b0743c953ebaab2ebea66a2b5806296e7 100644 (file)
@@ -144,7 +144,7 @@ M: stdin dispose*
         tri
     ] with-destructors ;
 
-: wait-for-stdin ( stdin -- n )
+: wait-for-stdin ( stdin -- size )
     [ control>> CHAR: X over io:stream-write1 io:stream-flush ]
     [ size>> ssize_t heap-size swap io:stream-read *int ]
     bi ;
@@ -160,7 +160,12 @@ M: stdin dispose*
     ] if ;
 
 M: stdin refill
-    [ buffer>> ] [ dup wait-for-stdin ] bi* refill-stdin f ;
+    '[
+        buffer>> _ dup wait-for-stdin refill-stdin f
+    ] with-timeout ;
+
+M: stdin cancel-operation
+    [ size>> ] [ control>> ] bi [ cancel-operation ] bi@ ;
 
 : control-write-fd ( -- fd ) &: control_write *uint ;
 
old mode 100644 (file)
new mode 100755 (executable)
index bd59afc..c0a6ee8
@@ -1,9 +1,11 @@
-USING: alien alien.c-types arrays assocs combinators continuations
-destructors io io.backend io.ports io.timeouts io.backend.windows
-io.files.windows io.files.windows.nt io.files io.pathnames io.buffers
-io.streams.c io.streams.null libc kernel math namespaces sequences
-threads windows windows.errors windows.kernel32 strings splitting
-ascii system accessors locals classes.struct combinators.short-circuit ;
+USING: alien alien.c-types alien.data alien.syntax arrays assocs
+combinators continuations destructors io io.backend io.ports
+io.timeouts io.backend.windows io.files.windows
+io.files.windows.nt io.files io.pathnames io.buffers
+io.streams.c io.streams.null libc kernel math namespaces
+sequences threads windows windows.errors windows.kernel32
+strings splitting ascii system accessors locals classes.struct
+combinators.short-circuit ;
 IN: io.backend.windows.nt
 
 ! Global variable with assoc mapping overlapped to threads
@@ -51,16 +53,12 @@ M: winnt add-completion ( win32-handle -- )
     ] with-timeout ;
 
 :: wait-for-overlapped ( nanos -- bytes-transferred overlapped error? )
-    master-completion-port get-global
-    0 <int> :> bytes
-    f <void*> :> key
-    f <void*> :> overlapped
     nanos [ 1,000,000 /i ] [ INFINITE ] if* :> timeout
-    bytes key overlapped timeout GetQueuedCompletionStatus zero? :> error?
-
-    bytes *int
-    overlapped *void* dup [ OVERLAPPED memory>struct ] when
-    error? ;
+    master-completion-port get-global
+    { int void* pointer: OVERLAPPED }
+    [ timeout GetQueuedCompletionStatus zero? ] [ ] with-out-parameters
+    :> ( error? bytes key overlapped )
+    bytes overlapped error? ;
 
 : resume-callback ( result overlapped -- )
     >c-ptr pending-overlapped get-global delete-at* drop resume-with ;
index 6c63d3eda0a234f5deeac8aaf536b6549caa9d7a..27687df9d5fd7d7975466cfa16286a810d492831 100644 (file)
@@ -13,8 +13,10 @@ TYPEDEF: TOKEN_PRIVILEGES* PTOKEN_PRIVILEGES
 !  http://msdn.microsoft.com/msdnmag/issues/05/03/TokenPrivileges/
 
 : (open-process-token) ( handle -- handle )
-    flags{ TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY } PHANDLE <c-object>
-    [ OpenProcessToken win32-error=0/f ] keep *void* ;
+    flags{ TOKEN_ADJUST_PRIVILEGES TOKEN_QUERY }
+    { PHANDLE }
+    [ OpenProcessToken win32-error=0/f ] [ ]
+    with-out-parameters ;
 
 : open-process-token ( -- handle )
     #! remember to CloseHandle
index a2a919da0db276e1eeb473b6420dc253ed0f3c36..544a6a8072258f16165f5b6ed758d4f891d6eddb 100644 (file)
@@ -22,7 +22,7 @@ PRIVATE>
     utf8 file-lines { "" } split [
         [ " " split ] map
         [ first { "Name:" "Alias:" } member? ] filter
-        [ second ] map { "None" } diff
+        values { "None" } diff
     ] map harvest ;
 
 : make-aliases ( file -- n>e )
old mode 100644 (file)
new mode 100755 (executable)
index 799b6dc..96e3028
@@ -6,7 +6,7 @@ windows.time windows.types windows accessors alien.c-types
 combinators generalizations system alien.strings
 io.encodings.utf16n sequences splitting windows.errors fry
 continuations destructors calendar ascii
-combinators.short-circuit locals classes.struct
+combinators.short-circuit literals locals classes.struct
 specialized-arrays alien.data ;
 SPECIALIZED-ARRAY: ushort
 IN: io.files.info.windows
@@ -21,12 +21,8 @@ IN: io.files.info.windows
 TUPLE: windows-file-info < file-info attributes ;
 
 : get-compressed-file-size ( path -- n )
-    DWORD <c-object> [ GetCompressedFileSize ] keep
-    over INVALID_FILE_SIZE = [
-        win32-error-string throw
-    ] [
-        *uint >64bit
-    ] if ;
+    { DWORD } [ GetCompressedFileSize ] [ ] with-out-parameters
+    over INVALID_FILE_SIZE = [ win32-error-string throw ] [ >64bit ] if ;
 
 : set-windows-size-on-disk ( file-info path -- file-info )
     over attributes>> +compressed+ swap member? [
@@ -99,22 +95,18 @@ M: windows file-info ( path -- info )
 M: windows link-info ( path -- info )
     file-info ;
 
+CONSTANT: path-length $[ MAX_PATH 1 + ]
+
 : volume-information ( normalized-path -- volume-name volume-serial max-component flags type )
-    MAX_PATH 1 + [ <ushort-array> ] keep
-    DWORD <c-object>
-    DWORD <c-object>
-    DWORD <c-object>
-    MAX_PATH 1 + [ <ushort-array> ] keep
-    [ GetVolumeInformation win32-error=0/f ] 7 nkeep
-    drop 5 nrot drop
-    [ utf16n alien>string ] 4 ndip
-    utf16n alien>string ;
+    { { ushort path-length } DWORD DWORD DWORD { ushort path-length } }
+    [ [ path-length ] 4dip path-length GetVolumeInformation win32-error=0/f ]
+    [ [ utf16n alien>string ] 4dip utf16n alien>string ]
+    with-out-parameters ;
 
 : file-system-space ( normalized-path -- available-space total-space free-space )
-    ULARGE_INTEGER <c-object>
-    ULARGE_INTEGER <c-object>
-    ULARGE_INTEGER <c-object>
-    [ GetDiskFreeSpaceEx win32-error=0/f ] 3keep ;
+    { ULARGE_INTEGER ULARGE_INTEGER ULARGE_INTEGER }
+    [ GetDiskFreeSpaceEx win32-error=0/f ] [ ]
+    with-out-parameters ;
 
 : calculate-file-system-info ( file-system-info -- file-system-info' )
     [ dup [ total-space>> ] [ free-space>> ] bi - >>used-space drop ] keep ;
@@ -136,13 +128,13 @@ ERROR: not-absolute-path ;
 : (file-system-info) ( path -- file-system-info )
     dup [ volume-information ] [ file-system-space ] bi
     \ win32-file-system-info new
-        swap *ulonglong >>free-space
-        swap *ulonglong >>total-space
-        swap *ulonglong >>available-space
+        swap >>free-space
+        swap >>total-space
+        swap >>available-space
         swap >>type
-        swap *uint >>flags
-        swap *uint >>max-component
-        swap *uint >>device-serial
+        swap >>flags
+        swap >>max-component
+        swap >>device-serial
         swap >>device-name
         swap >>mount-point
     calculate-file-system-info ;
@@ -152,36 +144,29 @@ PRIVATE>
 M: winnt file-system-info ( path -- file-system-info )
     normalize-path root-directory (file-system-info) ;
 
-:: volume>paths ( string -- array )
-    16384 :> names-buf-length
-    names-buf-length <ushort-array> :> names
-    0 <uint> :> names-length
+CONSTANT: names-buf-length 16384
 
-    string names names-buf-length names-length GetVolumePathNamesForVolumeName :> ret
-    ret 0 = [
-        ret win32-error-string throw
-    ] [
-        names names-length *uint ushort heap-size * head
-        utf16n alien>string { CHAR: \0 } split
-    ] if ;
+: volume>paths ( string -- array )
+    { { ushort names-buf-length } uint }
+    [ [ names-buf-length ] dip GetVolumePathNamesForVolumeName win32-error=0/f ]
+    [ head utf16n alien>string { CHAR: \0 } split ]
+    with-out-parameters ;
 
 : find-first-volume ( -- string handle )
-    MAX_PATH 1 + [ <ushort-array> ] keep
-    dupd
-    FindFirstVolume dup win32-error=0/f
-    [ utf16n alien>string ] dip ;
-
-:: find-next-volume ( handle -- string/f )
-    MAX_PATH 1 + :> buf-length
-    buf-length <ushort-array> :> buf
-
-    handle buf buf-length FindNextVolume :> ret
-    ret 0 = [
-        GetLastError ERROR_NO_MORE_FILES =
-        [ f ] [ win32-error-string throw ] if
-    ] [
-        buf utf16n alien>string
-    ] if ;
+    { { ushort path-length } }
+    [ path-length FindFirstVolume dup win32-error=0/f ]
+    [ utf16n alien>string ]
+    with-out-parameters swap ;
+
+: find-next-volume ( handle -- string/f )
+    { { ushort path-length } }
+    [ path-length FindNextVolume ]
+    [
+        swap 0 = [
+            GetLastError ERROR_NO_MORE_FILES =
+            [ drop f ] [ win32-error-string throw ] if
+        ] [ utf16n alien>string ] if
+    ] with-out-parameters ;
 
 : find-volumes ( -- array )
     find-first-volume
@@ -202,11 +187,10 @@ M: winnt file-systems ( -- array )
 : file-times ( path -- timestamp timestamp timestamp )
     [
         normalize-path open-read &dispose handle>>
-        FILETIME <struct>
-        FILETIME <struct>
-        FILETIME <struct>
-        [ GetFileTime win32-error=0/f ] 3keep
-        [ FILETIME>timestamp >local-time ] tri@
+        { FILETIME FILETIME FILETIME }
+        [ GetFileTime win32-error=0/f ]
+        [ [ FILETIME>timestamp >local-time ] tri@ ]
+        with-out-parameters
     ] with-destructors ;
 
 : set-file-times ( path timestamp/f timestamp/f timestamp/f -- )
index 87af808df2470331594171b0b25ca8b5d731cf7c..e036f34cc600bb1bde297bb206259867791b92d5 100644 (file)
@@ -1,10 +1,11 @@
 ! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types arrays assocs combinators
-continuations environment io io.backend io.backend.unix
-io.files io.files.private io.files.unix io.launcher io.pathnames
-io.ports kernel math namespaces sequences strings system threads
-unix unix.process unix.ffi simple-tokenizer ;
+USING: accessors alien.c-types alien.data arrays assocs
+combinators continuations environment io io.backend
+io.backend.unix io.files io.files.private io.files.unix
+io.launcher io.pathnames io.ports kernel math namespaces
+sequences strings system threads unix unix.process unix.ffi
+simple-tokenizer ;
 IN: io.launcher.unix
 
 : get-arguments ( process -- seq )
@@ -94,10 +95,10 @@ TUPLE: signal n ;
     dup WIFSIGNALED [ WTERMSIG signal boa ] [ WEXITSTATUS ] if ;
 
 M: unix wait-for-processes ( -- ? )
-    0 <int> -1 over WNOHANG waitpid
-    dup 0 <= [
+    { int } [ -1 swap WNOHANG waitpid ] [ ] with-out-parameters
+    swap dup 0 <= [
         2drop t
     ] [
         find-process dup
-        [ swap *int code>status notify-exit f ] [ 2drop f ] if
+        [ swap code>status notify-exit f ] [ 2drop f ] if
     ] if ;
index b279b1e964ec0f62d1ce26d1641cf55830673981..cc9e52a1898214ad213e702eb9dc46f16e631a24 100755 (executable)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2007, 2010 Doug Coleman, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.c-types arrays continuations io
+USING: alien alien.c-types alien.data arrays continuations io
 io.backend.windows io.pipes.windows.nt io.pathnames libc
 io.ports windows.types math windows.kernel32 namespaces make
 io.launcher kernel sequences windows.errors splitting system
@@ -159,7 +159,7 @@ M: windows kill-process* ( handle -- )
 
 : exit-code ( process -- n )
     hProcess>>
-    0 <ulong> [ GetExitCodeProcess ] keep *ulong
+    { DWORD } [ GetExitCodeProcess ] [ ] with-out-parameters
     swap win32-error=0/f ;
 
 : process-exited ( process -- )
index c7af6909e16dd7fbe187129a73315ba0fae37aa0..d2fb5764ff6ac67ea42f3fe31fad7cdb504d3818 100644 (file)
@@ -18,7 +18,7 @@ IN: io.ports.tests
 
 [ t ] [
     "test.txt" temp-file binary [
-        100,000 4 * read byte-array>int-array 100,000 iota sequence=
+        100,000 4 * read int-array-cast 100,000 iota sequence=
     ] with-file-reader
 ] unit-test
 
index 7a961518a0463506366880ac4db4c912b1ef582d..17e92b9b9fd91b0d0c0cfa10bedfc850b8936af4 100644 (file)
@@ -17,7 +17,7 @@ M: winnt WSASocket-flags ( -- DWORD )
     SIO_GET_EXTENSION_FUNCTION_POINTER
     WSAID_CONNECTEX
     GUID heap-size
-    void* <c-object>
+    { void* }
     [
         void* heap-size
         DWORD <c-object>
@@ -26,7 +26,7 @@ M: winnt WSASocket-flags ( -- DWORD )
         WSAIoctl SOCKET_ERROR = [
             winsock-error-string throw
         ] when
-    ] keep *void* ;
+    ] [ ] with-out-parameters ;
 
 TUPLE: ConnectEx-args port
     s name namelen lpSendBuffer dwSendDataLength
index 994dcd9c501f81d07dfe571f8a4b0f6f29432936..519dec3567715f92588c4a9267bd1c48abb4c736 100644 (file)
@@ -14,6 +14,9 @@ SYMBOL: io-thread-running?
     [ [ io-thread-running? get-global ] [ io-thread ] while ]\r
     "I/O wait" spawn drop ;\r
 \r
+: stop-io-thread ( -- )\r
+    f io-thread-running? set-global ;\r
+\r
 [\r
     t io-thread-running? set-global\r
     start-io-thread\r
index 8e69983e9c8d5e2983fb2b07da4dd9f33bf65f79..957ba301938033cfd9d8ac2f71257fede331dec0 100644 (file)
@@ -17,7 +17,7 @@ GENERIC: cancel-operation ( obj -- )
     [ '[ _ cancel-operation ] ] dip later ;\r
 \r
 : with-timeout* ( obj timeout quot -- )\r
-    3dup drop queue-timeout [ nip call ] dip cancel-alarm ;\r
+    3dup drop queue-timeout [ nip call ] dip stop-alarm ;\r
     inline\r
 \r
 : with-timeout ( obj quot -- )\r
index 577c9e127300f9f124143a93e2375572d587987c..5720fc5997896a1ed9066686d8fa0e5979da9611 100644 (file)
@@ -1,4 +1,4 @@
-USING: alien.syntax alien.c-types core-foundation
+USING: alien.syntax alien.c-types alien.data core-foundation
 core-foundation.bundles core-foundation.dictionaries system
 combinators kernel sequences io accessors unix.types ;
 IN: iokit
@@ -131,12 +131,11 @@ TUPLE: mach-error error-code error-string ;
     dup KERN_SUCCESS = [ drop ] [ <mach-error> throw ] if ;
 
 : master-port ( -- port )
-    MACH_PORT_NULL 0 <uint> [ IOMasterPort mach-error ] keep *uint ;
+    MACH_PORT_NULL { uint } [ IOMasterPort mach-error ] [ ] with-out-parameters ;
 
 : io-services-matching-dictionary ( nsdictionary -- iterator )
-    master-port swap 0 <uint>
-    [ IOServiceGetMatchingServices mach-error ] keep
-    *uint ;
+    master-port swap
+    { uint } [ IOServiceGetMatchingServices mach-error ] [ ] with-out-parameters ;
 
 : io-services-matching-service ( service -- iterator )
     IOServiceMatching io-services-matching-dictionary ;
index 2ffe24247de4a80b4123e0bbd476a5045cc22412..488a7c6f8b4e6fb11dd93dd04f6985773c1de73b 100644 (file)
@@ -1,14 +1,18 @@
 ! Copyright (C) 2006 Chris Double.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: help.markup help.syntax ;
+USING: help.markup help.syntax kernel ;
 IN: json.reader
 
 HELP: json>
 { $values { "string" "a string in JSON format" } { "object" "a deserialized object" } }
 { $description "Deserializes the JSON formatted string into a Factor object. JSON objects are converted to Factor hashtables. All other JSON objects convert to their obvious Factor equivalents." } ;
 
+HELP: read-jsons
+{ $values { "objects" "a vector of deserialized objects" } }
+{ $description "Reads JSON formatted strings into a vector of Factor object until the end of the stream is reached. JSON objects are converted to Factor hashtables. All other JSON objects convert to their obvious Factor equivalents." } ;
+
 ARTICLE: "json.reader" "JSON reader"
 "The " { $vocab-link "json.reader" } " vocabulary defines a word for parsing strings in JSON format."
-{ $subsections json> } ;
+{ $subsections json> read-jsons } ;
 
 ABOUT: "json.reader"
index 390fce1f949e77a93e0ce6e5389f4bab6cb5a833..bac8c96e1affe3f46f1097a3d65219c54d4a3ac9 100644 (file)
@@ -1,5 +1,5 @@
 USING: assocs arrays json.reader kernel strings tools.test
-hashtables json ;
+hashtables json io.streams.string ;
 IN: json.reader.tests
 
 { f } [ "false" json> ] unit-test
@@ -59,5 +59,8 @@ IN: json.reader.tests
 { 0 } [ "0      " json> ] unit-test
 { 0 } [ "   0   " json> ] unit-test
 
+{ V{ H{ { "a" "b" } } H{ { "c" "d" } } } }
+[ """{"a": "b"} {"c": "d"}""" [ read-jsons ] with-string-reader ] unit-test
+
 ! empty objects are allowed as values in objects
 { H{ { "foo" H{ } } } } [ "{ \"foo\" : {}}" json> ] unit-test
index 8eca1995a2551b1bf3441c98e5d23a23f4a95a05..f684321846fd28b989a98bdfcdb21cad90a7d69a 100644 (file)
@@ -78,7 +78,7 @@ DEFER: j-string
             { CHAR: {  [ 2 [ V{ } clone over push ] times ] }
             { CHAR: :  [ v-pick-push ] }
             { CHAR: }  [ (close-hash) ] }
-            { CHAR: \u000020 [ ] }
+            { CHAR: \s [ ] }
             { CHAR: \t [ ] }
             { CHAR: \r [ ] }
             { CHAR: \n [ ] }
@@ -89,10 +89,10 @@ DEFER: j-string
         } case
     ] when* ;
 
-: (json-parser>) ( string -- object )
-    [ V{ } clone [ read1 dup ] [ scan ] while drop first ] with-string-reader ;
-
 PRIVATE>
 
+: read-jsons ( -- objects )
+    V{ } clone [ read1 dup ] [ scan ] while drop ;
+
 : json> ( string -- object )
-    (json-parser>) ;
+    [ read-jsons first ] with-string-reader ;
index 5495ec27051ba7fd8b4265c7201756e4c5e039ce..68d041ac8faa482a2b1990a9d973706afdec7ffe 100644 (file)
@@ -24,16 +24,16 @@ FUNCTION-ALIAS: set-errno
 LIBRARY: libc
 
 FUNCTION-ALIAS: (malloc)
-    void* malloc ( ulong size ) ;
+    void* malloc ( size_t size ) ;
 
 FUNCTION-ALIAS: (calloc)
-    void* calloc ( ulong count,  ulong size ) ;
+    void* calloc ( size_t count,  size_t size ) ;
 
 FUNCTION-ALIAS: (free)
     void free ( void* alien ) ;
 
 FUNCTION-ALIAS: (realloc)
-    void* realloc ( void* alien, ulong size ) ;
+    void* realloc ( void* alien, size_t size ) ;
 
 <PRIVATE
 
@@ -100,5 +100,7 @@ FUNCTION: int memcmp ( void* a, void* b, ulong size ) ;
 
 FUNCTION: size_t strlen ( c-string alien ) ;
 
+FUNCTION: int system ( c-string command ) ;
+
 DESTRUCTOR: free
 DESTRUCTOR: (free)
index 9dfc733fffc0380cbbc1ac89a1cbba81204e7890..110cc6ad81db7249dba9ccb2b2aacd274b2b456a 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2007, 2008 Slava Pestov, Eduardo Cavazos.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs classes classes.tuple fry
-generalizations hashtables kernel locals locals.backend
+sequences.generalizations hashtables kernel locals locals.backend
 locals.errors locals.types make quotations sequences vectors
 words ;
 IN: locals.rewrite.sugar
index 91baae631f507dfdeea5f92fac3c954e3d1762cd..72e37ef8af458561841b97b43b23d73227d107d7 100644 (file)
@@ -34,4 +34,4 @@ SYMBOL: insomniac-recipients
 \r
 : schedule-insomniac ( service word-names -- )\r
     [ [ email-log-report ] assoc-each rotate-logs ] 2curry\r
-    1 days every drop ;\r
+    1 days delayed-every drop ;\r
index c8179108ef12d359c2958bd413c5b68c164b09ff..7542c269bdff9be2b5779b093645cdccabe71ef7 100644 (file)
@@ -4,7 +4,8 @@ USING: logging.server sequences namespaces concurrency.messaging
 words kernel arrays shuffle tools.annotations\r
 prettyprint.config prettyprint debugger io.streams.string\r
 splitting continuations effects generalizations parser strings\r
-quotations fry accessors math assocs math.order ;\r
+quotations fry accessors math assocs math.order\r
+sequences.generalizations ;\r
 IN: logging\r
 \r
 SYMBOLS: DEBUG NOTICE WARNING ERROR CRITICAL ;\r
index cd38c8513c9a0ebefe8159e1f75f72793dbbb407..563cbecd6c65cc4ceb090f6b9376982b5c1052ed 100644 (file)
@@ -84,7 +84,7 @@ DEFER: byte-bit-count
 
 GENERIC: (bit-count) ( x -- n )
 
-M: fixnum (bit-count)
+: fixnum-bit-count ( x -- n )
     0 swap [
         dup 0 >
     ] [
@@ -92,6 +92,9 @@ M: fixnum (bit-count)
         [ + ] dip
     ] while drop ;
 
+M: fixnum (bit-count)
+    fixnum-bit-count ; inline
+
 M: bignum (bit-count)
     dup 0 = [ drop 0 ] [
         [ byte-bit-count ] [ -8 shift (bit-count) ] bi +
index 93cb11104f9af8945f0e4cc654a008fa26969603..7013b8e52d9bfcc8905332dd9697439949c7994b 100644 (file)
@@ -1,25 +1,25 @@
-USING: alien alien.c-types cpu.architecture cpu.x86.assembler
+USING: alien alien.c-types cpu.x86.64 cpu.x86.assembler
 cpu.x86.assembler.operands math.floats.env.x86 sequences system ;
 IN: math.floats.env.x86.64
 
 M: x86.64 get-sse-env
     void { void* } cdecl [
-        int-regs cdecl param-regs first [] STMXCSR
+        param-reg-0 [] STMXCSR
     ] alien-assembly ;
 
 M: x86.64 set-sse-env
     void { void* } cdecl [
-        int-regs cdecl param-regs first [] LDMXCSR
+        param-reg-0 [] LDMXCSR
     ] alien-assembly ;
 
 M: x86.64 get-x87-env
     void { void* } cdecl [
-        int-regs cdecl param-regs first [] FNSTSW
-        int-regs cdecl param-regs first 2 [+] FNSTCW
+        param-reg-0 [] FNSTSW
+        param-reg-0 2 [+] FNSTCW
     ] alien-assembly ;
 
 M: x86.64 set-x87-env
     void { void* } cdecl [
         FNCLEX
-        int-regs cdecl param-regs first 2 [+] FLDCW
+        param-reg-0 2 [+] FLDCW
     ] alien-assembly ;
index 7cdfd552a1ab5c07de2824e5935f647b5976680c..dd73b0a073e1257b108e37fb14a59e7c639b8133 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2007-2009 Samuel Tardieu.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays combinators kernel make math math.functions
+USING: arrays assocs combinators kernel make math math.functions
 math.primes math.ranges sequences sequences.product sorting
 io math.parser ;
 IN: math.primes.factors
@@ -32,7 +32,7 @@ PRIVATE>
 : group-factors ( n -- seq )
     dup prime? [ 1 2array 1array ] [ (group-factors) ] if ; flushable
 
-: unique-factors ( n -- seq ) group-factors [ first ] map ; flushable
+: unique-factors ( n -- seq ) group-factors keys ; flushable
 
 : factors ( n -- seq )
     group-factors [ first2 swap <array> ] map concat ; flushable
index 3d21a3e7d60602864c8c69103b3f7929835df436..a2e9f4fa4813ea2b1900866bd68fa9ff7c38d8dd 100644 (file)
@@ -5,6 +5,8 @@ IN: math.primes.tests
 { 1237 } [ 1234 next-prime ] unit-test
 { f t } [ 1234 prime? 1237 prime? ] unit-test
 { { 2 3 5 7 } } [ 10 primes-upto >array ] unit-test
+{ { 2 } } [ 2 primes-upto >array ] unit-test
+{ { } } [ 1 primes-upto >array ] unit-test
 { { 999983 1000003 } } [ 999982 1000010 primes-between >array ] unit-test
 
 { { 4999963 4999999 5000011 5000077 5000081 } }
@@ -13,6 +15,12 @@ IN: math.primes.tests
 { { 8999981 8999993 9000011 9000041 } }
 [ 8999980 9000045 primes-between >array ] unit-test
 
+{ { } } [ 5 4 primes-between >array ] unit-test
+
+{ { 2 } } [ 2 2 primes-between >array ] unit-test
+
+{ { 2 } } [ 1.5 2.5 primes-between >array ] unit-test
+
 [ 2 ] [ 1 next-prime ] unit-test
 [ 3 ] [ 2 next-prime ] unit-test
 [ 5 ] [ 3 next-prime ] unit-test
index 81193af400bfa749003a2b01b831b5e9dfb059c3..7611e22b70cf60591e8a38d6af5ffd0a15062270 100644 (file)
@@ -46,11 +46,24 @@ PRIVATE>
         next-odd [ dup prime? ] [ 2 + ] until
     ] if ; foldable
 
-: primes-between ( low high -- seq )
+<PRIVATE
+
+: (primes-between) ( low high -- seq )
     [ [ 3 max dup even? [ 1 + ] when ] dip 2 <range> ]
     [ <primes-vector> ] 2bi
     [ '[ [ prime? ] _ push-if ] each ] keep clone ;
 
+PRIVATE>
+
+: primes-between ( low high -- seq )
+    [ ceiling >integer ] [ floor >integer ] bi*
+    {
+        { [ 2dup > ] [ 2drop V{ } clone ] }
+        { [ dup 2 = ] [ 2drop V{ 2 } clone ] }
+        { [ dup 2 < ] [ 2drop V{ } clone ] }
+        [ (primes-between) ]
+    } cond ;
+
 : primes-upto ( n -- seq ) 2 swap primes-between ;
 
 : coprime? ( a b -- ? ) gcd nip 1 = ; foldable
index d46f062d9cdce38a9a55bfd5c52098776d8f84a1..c9ff2cb10257d502c44cd10f34890dce7cc30e5a 100644 (file)
@@ -1,7 +1,7 @@
 ! (c)Joe Groff bsd license
 USING: accessors arrays compiler.test continuations generalizations
 kernel kernel.private locals math.vectors.conversion math.vectors.simd
-sequences stack-checker tools.test ;
+sequences stack-checker tools.test sequences.generalizations ;
 FROM: alien.c-types => char uchar short ushort int uint longlong ulonglong float double ;
 IN: math.vectors.conversion.tests
 
index 021ffc5a0c2c7ab6f46faab4192bebc252222eb8..2fe4cc922b8b2aeb5cddd4e483af1b94fb7b7810 100644 (file)
@@ -1,9 +1,10 @@
 ! (c)2009 Slava Pestov, Joe Groff bsd license
-USING: accessors alien alien.c-types alien.data combinators
+USING: accessors alien alien.data combinators
 sequences.cords cpu.architecture fry generalizations grouping
-kernel libc locals math math.libm math.order math.ranges
-math.vectors sequences sequences.private specialized-arrays
-vocabs.loader ;
+kernel libc locals macros math math.libm math.order
+math.ranges math.vectors sequences sequences.generalizations
+sequences.private sequences.unrolled sequences.unrolled.private
+specialized-arrays vocabs.loader words effects.parser locals.parser ;
 QUALIFIED-WITH: alien.c-types c
 SPECIALIZED-ARRAYS:
     c:char c:short c:int c:longlong
@@ -11,6 +12,20 @@ SPECIALIZED-ARRAYS:
     c:float c:double ;
 IN: math.vectors.simd.intrinsics
 
+<<
+: simd-intrinsic-body ( def effect -- def' )
+    '[ _ _ call-effect ] ;
+
+: define-simd-intrinsic ( word def effect -- )
+    [ simd-intrinsic-body ] keep define-declared ;
+
+SYNTAX: SIMD-INTRINSIC:
+    (:) define-declared ;
+SYNTAX: SIMD-INTRINSIC::
+    (::) define-declared ;
+
+>>
+
 : assert-positive ( x -- y ) ;
 
 <PRIVATE
@@ -45,16 +60,16 @@ IN: math.vectors.simd.intrinsics
 
 : [byte>rep-array] ( rep -- class )
     {
-        { char-16-rep      [ [ byte-array>char-array      ] ] }
-        { uchar-16-rep     [ [ byte-array>uchar-array     ] ] }
-        { short-8-rep      [ [ byte-array>short-array     ] ] }
-        { ushort-8-rep     [ [ byte-array>ushort-array    ] ] }
-        { int-4-rep        [ [ byte-array>int-array       ] ] }
-        { uint-4-rep       [ [ byte-array>uint-array      ] ] }
-        { longlong-2-rep   [ [ byte-array>longlong-array  ] ] }
-        { ulonglong-2-rep  [ [ byte-array>ulonglong-array ] ] }
-        { float-4-rep      [ [ byte-array>float-array     ] ] }
-        { double-2-rep     [ [ byte-array>double-array    ] ] }
+        { char-16-rep      [ [ 16 <direct-char-array>      ] ] }
+        { uchar-16-rep     [ [ 16 <direct-uchar-array>     ] ] }
+        { short-8-rep      [ [  8 <direct-short-array>     ] ] }
+        { ushort-8-rep     [ [  8 <direct-ushort-array>    ] ] }
+        { int-4-rep        [ [  4 <direct-int-array>       ] ] }
+        { uint-4-rep       [ [  4 <direct-uint-array>      ] ] }
+        { longlong-2-rep   [ [  2 <direct-longlong-array>  ] ] }
+        { ulonglong-2-rep  [ [  2 <direct-ulonglong-array> ] ] }
+        { float-4-rep      [ [  4 <direct-float-array>     ] ] }
+        { double-2-rep     [ [  2 <direct-double-array>    ] ] }
     } case ; foldable
 
 : [>rep-array] ( rep -- class )
@@ -96,27 +111,31 @@ IN: math.vectors.simd.intrinsics
     [<rep-array>] call( -- a' ) ; inline
 
 : components-map ( a rep quot -- c )
-    [ >rep-array ] dip map underlying>> ; inline
+    [ [ >rep-array ] [ rep-length ] bi ] dip unrolled-map-unsafe underlying>> ; inline
 : components-2map ( a b rep quot -- c )
-    [ 2>rep-array ] dip 2map underlying>> ; inline
+    [ [ 2>rep-array ] [ rep-length ] bi ] dip unrolled-2map-unsafe underlying>> ; inline
+! XXX
 : components-reduce ( a rep quot -- x )
     [ >rep-array [ ] ] dip map-reduce ; inline
 
 : bitwise-components-map ( a rep quot -- c )
-    [ >bitwise-vector-rep >rep-array ] dip map underlying>> ; inline
+    [ >bitwise-vector-rep [ >rep-array ] [ rep-length ] bi ] dip
+    unrolled-map-unsafe underlying>> ; inline
 : bitwise-components-2map ( a b rep quot -- c )
-    [ >bitwise-vector-rep 2>rep-array ] dip 2map underlying>> ; inline
+    [ >bitwise-vector-rep [ 2>rep-array ] [ rep-length ] bi ] dip
+    unrolled-2map-unsafe underlying>> ; inline
+! XXX
 : bitwise-components-reduce ( a rep quot -- x )
     [ >bitwise-vector-rep >rep-array [ ] ] dip map-reduce ; inline
 
 :: (vshuffle) ( a elts rep -- c )
     a rep >rep-array :> a'
     rep <rep-array> :> c'
-    elts [| from to |
+    elts rep rep-length [| from to |
         from rep rep-length 1 - bitand
            a' nth-unsafe
         to c' set-nth-unsafe
-    ] each-index
+    ] unrolled-each-index-unsafe
     c' underlying>> ; inline
 
 :: (vshuffle2) ( a b elts rep -- c )
@@ -124,39 +143,44 @@ IN: math.vectors.simd.intrinsics
     b rep >rep-array :> b'
     a' b' cord-append :> ab'
     rep <rep-array> :> c'
-    elts [| from to |
+    elts rep rep-length [| from to |
         from rep rep-length dup + 1 - bitand
            ab' nth-unsafe
         to c' set-nth-unsafe
-    ] each-index
+    ] unrolled-each-index-unsafe
     c' underlying>> ; inline
 
+GENERIC: native/ ( x y -- x/y )
+
+M: integer native/ /i ; inline
+M: float native/ /f ; inline
+
 PRIVATE>
 
-: (simd-v+)                ( a b rep -- c ) [ + ] components-2map ;
-: (simd-v-)                ( a b rep -- c ) [ - ] components-2map ;
-: (simd-vneg)              ( a   rep -- c ) [ neg ] components-map ;
-:: (simd-v+-)              ( a b rep -- c ) 
+SIMD-INTRINSIC: (simd-v+)                ( a b rep -- c ) [ + ] components-2map ;
+SIMD-INTRINSIC: (simd-v-)                ( a b rep -- c ) [ - ] components-2map ;
+SIMD-INTRINSIC: (simd-vneg)              ( a   rep -- c ) [ neg ] components-map ;
+SIMD-INTRINSIC:: (simd-v+-)              ( a b rep -- c ) 
     a b rep 2>rep-array :> ( a' b' )
     rep <rep-array> :> c'
-    0  rep rep-length 1 -  2 <range> [| n |
+    0  rep rep-length [ 1 -  2 <range> ] [ 2 /i ] bi [| n |
         n     a' nth-unsafe n     b' nth-unsafe -
         n     c' set-nth-unsafe
 
         n 1 + a' nth-unsafe n 1 + b' nth-unsafe +
         n 1 + c' set-nth-unsafe
-    ] each
+    ] unrolled-each-unsafe
     c' underlying>> ;
-: (simd-vs+)               ( a b rep -- c )
-    dup rep-component-type '[ + _ c-type-clamp ] components-2map ;
-: (simd-vs-)               ( a b rep -- c )
-    dup rep-component-type '[ - _ c-type-clamp ] components-2map ;
-: (simd-vs*)               ( a b rep -- c )
-    dup rep-component-type '[ * _ c-type-clamp ] components-2map ;
-: (simd-v*)                ( a b rep -- c ) [ * ] components-2map ;
-: (simd-v*high)            ( a b rep -- c )
-    dup rep-component-type heap-size -8 * '[ * _ shift ] components-2map ;
-:: (simd-v*hs+)            ( a b rep -- c )
+SIMD-INTRINSIC: (simd-vs+)               ( a b rep -- c )
+    dup rep-component-type '[ + _ c:c-type-clamp ] components-2map ;
+SIMD-INTRINSIC: (simd-vs-)               ( a b rep -- c )
+    dup rep-component-type '[ - _ c:c-type-clamp ] components-2map ;
+SIMD-INTRINSIC: (simd-vs*)               ( a b rep -- c )
+    dup rep-component-type '[ * _ c:c-type-clamp ] components-2map ;
+SIMD-INTRINSIC: (simd-v*)                ( a b rep -- c ) [ * ] components-2map ;
+SIMD-INTRINSIC: (simd-v*high)            ( a b rep -- c )
+    dup rep-component-type c:heap-size -8 * '[ * _ shift ] components-2map ;
+SIMD-INTRINSIC:: (simd-v*hs+)            ( a b rep -- c )
     rep { char-16-rep uchar-16-rep } member-eq?
     [ uchar-16-rep char-16-rep ]
     [ rep rep ] if :> ( a-rep b-rep )
@@ -164,102 +188,110 @@ PRIVATE>
     wide-rep rep-component-type :> wide-type
     a a-rep >rep-array 2 <groups> :> a'
     b b-rep >rep-array 2 <groups> :> b'
-    a' b' [
+    a' b' rep rep-length 2 /i [
         [ [ first  ] bi@ * ]
         [ [ second ] bi@ * ] 2bi +
-        wide-type c-type-clamp
-    ] wide-rep <rep-array> 2map-as underlying>> ;
-: (simd-v/)                ( a b rep -- c ) [ / ] components-2map ;
-: (simd-vavg)              ( a b rep -- c )
+        wide-type c:c-type-clamp
+    ] wide-rep <rep-array> unrolled-2map-as-unsafe underlying>> ;
+SIMD-INTRINSIC: (simd-v/)                ( a b rep -- c ) [ native/ ] components-2map ;
+SIMD-INTRINSIC: (simd-vavg)              ( a b rep -- c )
     [ + dup integer? [ 1 + -1 shift ] [ 0.5 * ] if ] components-2map ;
-: (simd-vmin)              ( a b rep -- c ) [ min ] components-2map ;
-: (simd-vmax)              ( a b rep -- c ) [ max ] components-2map ;
-: (simd-v.)                ( a b rep -- n )
+SIMD-INTRINSIC: (simd-vmin)              ( a b rep -- c ) [ min ] components-2map ;
+SIMD-INTRINSIC: (simd-vmax)              ( a b rep -- c ) [ max ] components-2map ;
+! XXX
+SIMD-INTRINSIC: (simd-v.)                ( a b rep -- n )
     [ 2>rep-array [ [ first ] bi@ * ] 2keep ] keep
     1 swap rep-length [a,b) [ '[ _ swap nth-unsafe ] bi@ * + ] with with each ;
-: (simd-vsqrt)             ( a   rep -- c ) [ fsqrt ] components-map ;
-: (simd-vsad)              ( a b rep -- c ) 2>rep-array [ - abs ] [ + ] 2map-reduce ;
-: (simd-sum)               ( a   rep -- n ) [ + ] components-reduce ;
-: (simd-vabs)              ( a   rep -- c ) [ abs ] components-map ;
-: (simd-vbitand)           ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
-: (simd-vbitandn)          ( a b rep -- c ) [ [ bitnot ] dip bitand ] bitwise-components-2map ;
-: (simd-vbitor)            ( a b rep -- c ) [ bitor ] bitwise-components-2map ;
-: (simd-vbitxor)           ( a b rep -- c ) [ bitxor ] bitwise-components-2map ;
-: (simd-vbitnot)           ( a   rep -- c ) [ bitnot ] bitwise-components-map ;
-: (simd-vand)              ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
-: (simd-vandn)             ( a b rep -- c ) [ [ bitnot ] dip bitand ] bitwise-components-2map ;
-: (simd-vor)               ( a b rep -- c ) [ bitor ] bitwise-components-2map ;
-: (simd-vxor)              ( a b rep -- c ) [ bitxor ] bitwise-components-2map ;
-: (simd-vnot)              ( a   rep -- c ) [ bitnot ] bitwise-components-map ;
-: (simd-vlshift)           ( a n rep -- c ) swap '[ _ shift ] bitwise-components-map ;
-: (simd-vrshift)           ( a n rep -- c ) swap '[ _ neg shift ] bitwise-components-map ;
-: (simd-hlshift)           ( a n rep -- c )
+SIMD-INTRINSIC: (simd-vsqrt)             ( a   rep -- c ) [ fsqrt ] components-map ;
+SIMD-INTRINSIC: (simd-vsad)              ( a b rep -- c ) 2>rep-array [ - abs ] [ + ] 2map-reduce ;
+SIMD-INTRINSIC: (simd-sum)               ( a   rep -- n ) [ + ] components-reduce ;
+SIMD-INTRINSIC: (simd-vabs)              ( a   rep -- c ) [ abs ] components-map ;
+SIMD-INTRINSIC: (simd-vbitand)           ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vbitandn)          ( a b rep -- c ) [ [ bitnot ] dip bitand ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vbitor)            ( a b rep -- c ) [ bitor ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vbitxor)           ( a b rep -- c ) [ bitxor ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vbitnot)           ( a   rep -- c ) [ bitnot ] bitwise-components-map ;
+SIMD-INTRINSIC: (simd-vand)              ( a b rep -- c ) [ bitand ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vandn)             ( a b rep -- c ) [ [ bitnot ] dip bitand ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vor)               ( a b rep -- c ) [ bitor ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vxor)              ( a b rep -- c ) [ bitxor ] bitwise-components-2map ;
+SIMD-INTRINSIC: (simd-vnot)              ( a   rep -- c ) [ bitnot ] bitwise-components-map ;
+SIMD-INTRINSIC: (simd-vlshift)           ( a n rep -- c ) swap '[ _ shift ] bitwise-components-map ;
+SIMD-INTRINSIC: (simd-vrshift)           ( a n rep -- c ) swap '[ _ neg shift ] bitwise-components-map ;
+! XXX
+SIMD-INTRINSIC: (simd-hlshift)           ( a n rep -- c )
     drop head-slice* 16 0 pad-head ;
-: (simd-hrshift)           ( a n rep -- c )
+! XXX
+SIMD-INTRINSIC: (simd-hrshift)           ( a n rep -- c )
     drop tail-slice 16 0 pad-tail ;
-: (simd-vshuffle-elements) ( a n rep -- c ) [ rep-length 0 pad-tail ] keep (vshuffle) ;
-: (simd-vshuffle2-elements) ( a b n rep -- c ) [ rep-length 0 pad-tail ] keep (vshuffle2) ;
-: (simd-vshuffle-bytes)    ( a b rep -- c ) drop uchar-16-rep (vshuffle) ;
-:: (simd-vmerge-head)      ( a b rep -- c )
+SIMD-INTRINSIC: (simd-vshuffle-elements) ( a n rep -- c ) [ rep-length 0 pad-tail ] keep (vshuffle) ;
+SIMD-INTRINSIC: (simd-vshuffle2-elements) ( a b n rep -- c ) [ rep-length 0 pad-tail ] keep (vshuffle2) ;
+SIMD-INTRINSIC: (simd-vshuffle-bytes)    ( a b rep -- c ) drop uchar-16-rep (vshuffle) ;
+SIMD-INTRINSIC:: (simd-vmerge-head)      ( a b rep -- c )
     a b rep 2>rep-array :> ( a' b' )
     rep <rep-array> :> c'
-    rep rep-length 2 /i iota [| n |
+    rep rep-length 2 /i [| n |
         n a' nth-unsafe n 2 *     c' set-nth-unsafe
         n b' nth-unsafe n 2 * 1 + c' set-nth-unsafe
-    ] each
+    ] unrolled-each-integer
     c' underlying>> ;
-:: (simd-vmerge-tail)      ( a b rep -- c )
+SIMD-INTRINSIC:: (simd-vmerge-tail)      ( a b rep -- c )
     a b rep 2>rep-array :> ( a' b' )
     rep <rep-array> :> c'
     rep rep-length 2 /i :> len
-    len iota [| n |
+    len [| n |
         n len + a' nth-unsafe n 2 *     c' set-nth-unsafe
         n len + b' nth-unsafe n 2 * 1 + c' set-nth-unsafe
-    ] each
+    ] unrolled-each-integer
     c' underlying>> ;
-: (simd-v<=)               ( a b rep -- c )
+SIMD-INTRINSIC: (simd-v<=)               ( a b rep -- c )
     dup rep-tf-values '[ <= _ _ ? ] components-2map ; 
-: (simd-v<)                ( a b rep -- c )
+SIMD-INTRINSIC: (simd-v<)                ( a b rep -- c )
     dup rep-tf-values '[ <  _ _ ? ] components-2map ;
-: (simd-v=)                ( a b rep -- c )
+SIMD-INTRINSIC: (simd-v=)                ( a b rep -- c )
     dup rep-tf-values '[ =  _ _ ? ] components-2map ;
-: (simd-v>)                ( a b rep -- c )
+SIMD-INTRINSIC: (simd-v>)                ( a b rep -- c )
     dup rep-tf-values '[ >  _ _ ? ] components-2map ;
-: (simd-v>=)               ( a b rep -- c )
+SIMD-INTRINSIC: (simd-v>=)               ( a b rep -- c )
     dup rep-tf-values '[ >= _ _ ? ] components-2map ;
-: (simd-vunordered?)       ( a b rep -- c )
+SIMD-INTRINSIC: (simd-vunordered?)       ( a b rep -- c )
     dup rep-tf-values '[ unordered? _ _ ? ] components-2map ;
-: (simd-vany?)             ( a   rep -- ? ) [ bitor  ] bitwise-components-reduce zero? not ;
-: (simd-vall?)             ( a   rep -- ? ) [ bitand ] bitwise-components-reduce zero? not ;
-: (simd-vnone?)            ( a   rep -- ? ) [ bitor  ] bitwise-components-reduce zero?     ;
-: (simd-v>float)           ( a   rep -- c )
-    [ >rep-array [ >float ] ] [ >float-vector-rep <rep-array> ] bi map-as underlying>> ;
-: (simd-v>integer)         ( a   rep -- c )
-    [ >rep-array [ >integer ] ] [ >int-vector-rep <rep-array> ] bi map-as underlying>> ;
-: (simd-vpack-signed)      ( a b rep -- c )
-    [ 2>rep-array cord-append ]
+SIMD-INTRINSIC: (simd-vany?)             ( a   rep -- ? ) [ bitor  ] bitwise-components-reduce zero? not ;
+SIMD-INTRINSIC: (simd-vall?)             ( a   rep -- ? ) [ bitand ] bitwise-components-reduce zero? not ;
+SIMD-INTRINSIC: (simd-vnone?)            ( a   rep -- ? ) [ bitor  ] bitwise-components-reduce zero?     ;
+SIMD-INTRINSIC: (simd-v>float)           ( a   rep -- c )
+    [ [ >rep-array ] [ rep-length ] bi [ >float ] ]
+    [ >float-vector-rep <rep-array> ] bi unrolled-map-as-unsafe underlying>> ;
+SIMD-INTRINSIC: (simd-v>integer)         ( a   rep -- c )
+    [ [ >rep-array ] [ rep-length ] bi [ >integer ] ]
+    [ >int-vector-rep <rep-array> ] bi unrolled-map-as-unsafe underlying>> ;
+SIMD-INTRINSIC: (simd-vpack-signed)      ( a b rep -- c )
+    [ [ 2>rep-array cord-append ] [ rep-length 2 * ] bi ]
     [ narrow-vector-rep [ <rep-array> ] [ rep-component-type ] bi ] bi
-    '[ _ c-type-clamp ] swap map-as underlying>> ;
-: (simd-vpack-unsigned)    ( a b rep -- c )
-    [ 2>rep-array cord-append ]
+    '[ _ c:c-type-clamp ] swap unrolled-map-as-unsafe underlying>> ;
+SIMD-INTRINSIC: (simd-vpack-unsigned)    ( a b rep -- c )
+    [ [ 2>rep-array cord-append ] [ rep-length 2 * ] bi ]
     [ narrow-vector-rep >uint-vector-rep [ <rep-array> ] [ rep-component-type ] bi ] bi
-    '[ _ c-type-clamp ] swap map-as underlying>> ;
-: (simd-vunpack-head)      ( a   rep -- c ) 
+    '[ _ c:c-type-clamp ] swap unrolled-map-as-unsafe underlying>> ;
+! XXX
+SIMD-INTRINSIC: (simd-vunpack-head)      ( a   rep -- c ) 
     [ >rep-array ] [ widen-vector-rep [ rep-length ] [ [>rep-array] ] bi ] bi
     [ head-slice ] dip call( a' -- c' ) underlying>> ;
-: (simd-vunpack-tail)      ( a   rep -- c )
+! XXX
+SIMD-INTRINSIC: (simd-vunpack-tail)      ( a   rep -- c )
     [ >rep-array ] [ widen-vector-rep [ rep-length ] [ [>rep-array] ] bi ] bi
     [ tail-slice ] dip call( a' -- c' ) underlying>> ;
-: (simd-with)              (   n rep -- v )
+! XXX
+SIMD-INTRINSIC: (simd-with)              (   n rep -- v )
     [ rep-length swap '[ _ ] ] [ <rep-array> ] bi replicate-as 
     underlying>> ;
-: (simd-gather-2)          ( m n rep -- v ) <rep-array> [ 2 set-firstn ] keep underlying>> ;
-: (simd-gather-4)          ( m n o p rep -- v ) <rep-array> [ 4 set-firstn ] keep underlying>> ;
-: (simd-select)            ( a n rep -- x ) [ swap ] dip >rep-array nth-unsafe ;
+SIMD-INTRINSIC: (simd-gather-2)          ( m n rep -- v ) <rep-array> [ 2 set-firstn-unsafe ] keep underlying>> ;
+SIMD-INTRINSIC: (simd-gather-4)          ( m n o p rep -- v ) <rep-array> [ 4 set-firstn-unsafe ] keep underlying>> ;
+SIMD-INTRINSIC: (simd-select)            ( a n rep -- x ) [ swap ] dip >rep-array nth-unsafe ;
 
-: alien-vector     (       c-ptr n rep -- value )
+SIMD-INTRINSIC: alien-vector     (       c-ptr n rep -- value )
     [ swap <displaced-alien> ] dip rep-size memory>byte-array ;
-: set-alien-vector ( value c-ptr n rep --       )
+SIMD-INTRINSIC: set-alien-vector ( value c-ptr n rep --       )
     [ swap <displaced-alien> swap ] dip rep-size memcpy ;
 
 "compiler.cfg.intrinsics.simd" require
index e8a103d449941500612fb8029eeacad57d678018..df67703d5cf2aeba7e4892d79b5e89226d58c917 100644 (file)
@@ -1,3 +1,3 @@
 USING: math.vectors.simd mirrors ;
 IN: math.vectors.simd.mirrors
-INSTANCE: simd-128          enumerated-sequence
+INSTANCE: simd-128          inspected-sequence
index 2a8298b989895744f2eb9d4a7acecd31969b3a0f..9bc90cbf7e41b9357dfaeb293e29862647748cd8 100644 (file)
@@ -6,7 +6,7 @@ tools.test vocabs assocs compiler.cfg.debugger words
 locals combinators cpu.architecture namespaces byte-arrays alien
 specialized-arrays classes.struct eval classes.algebra sets
 quotations math.constants compiler.units splitting math.matrices
-math.vectors.simd.cords ;
+math.vectors.simd.cords alien.data ;
 FROM: math.vectors.simd.intrinsics => alien-vector set-alien-vector ;
 QUALIFIED-WITH: alien.c-types c
 SPECIALIZED-ARRAY: c:float
@@ -610,6 +610,17 @@ STRUCT: simd-struct
 
 [ ] [ char-16 new 1array stack. ] unit-test
 
+! Test some sequence protocol stuff
+[ t ] [ 4 double-4{ 1 2 3 4 } new-sequence double-4? ] unit-test
+[ double-4{ 2 3 4 5 } ] [ double-4{ 1 2 3 4 } [ 1 + ] map ] unit-test
+
+! Test cross product
+[ float-4{ 0.0 0.0 1.0 0.0 } ] [ float-4{ 1.0 0.0 0.0 0.0 } float-4{ 0.0 1.0 0.0 0.0 } cross ] unit-test
+[ float-4{ 0.0 -1.0 0.0 0.0 } ] [ float-4{ 1.0 0.0 0.0 0.0 } float-4{ 0.0 0.0 1.0 0.0 } cross ] unit-test
+
+[ double-4{ 0.0 0.0 1.0 0.0 } ] [ double-4{ 1.0 0.0 0.0 0.0 } double-4{ 0.0 1.0 0.0 0.0 } cross ] unit-test
+[ double-4{ 0.0 -1.0 0.0 0.0 } ] [ double-4{ 1.0 0.0 0.0 0.0 } double-4{ 0.0 0.0 1.0 0.0 } cross ] unit-test
+
 ! CSSA bug
 [ 4000000 ] [
     int-4{ 1000 1000 1000 1000 }
@@ -650,13 +661,46 @@ STRUCT: simd-struct
 [ float-4{ 0 0 0 0 } ]
 [ 5.0 float-4{ 1 2 3 4 } float-4{ 4 5 6 7 } 0.0 simd-spill-test-2 ] unit-test
 
-! Test some sequence protocol stuff
-[ t ] [ 4 double-4{ 1 2 3 4 } new-sequence double-4? ] unit-test
-[ double-4{ 2 3 4 5 } ] [ double-4{ 1 2 3 4 } [ 1 + ] map ] unit-test
+USE: alien
 
-! Test cross product
-[ float-4{ 0.0 0.0 1.0 0.0 } ] [ float-4{ 1.0 0.0 0.0 0.0 } float-4{ 0.0 1.0 0.0 0.0 } cross ] unit-test
-[ float-4{ 0.0 -1.0 0.0 0.0 } ] [ float-4{ 1.0 0.0 0.0 0.0 } float-4{ 0.0 0.0 1.0 0.0 } cross ] unit-test
+: callback-1 ( -- c )
+    c:int { c:int c:int c:int c:int c:int } cdecl [ + + + + ] alien-callback ;
 
-[ double-4{ 0.0 0.0 1.0 0.0 } ] [ double-4{ 1.0 0.0 0.0 0.0 } double-4{ 0.0 1.0 0.0 0.0 } cross ] unit-test
-[ double-4{ 0.0 -1.0 0.0 0.0 } ] [ double-4{ 1.0 0.0 0.0 0.0 } double-4{ 0.0 0.0 1.0 0.0 } cross ] unit-test
+: indirect-1 ( x x x x x c -- y )
+    c:int { c:int c:int c:int c:int c:int } cdecl alien-indirect ; inline
+
+: simd-spill-test-3 ( a b d c -- v )
+    { float float-4 float-4 float } declare
+    [ [ 3.0 + ] 2dip v+ ] dip sin v*n n*v
+    10 5 100 50 500 callback-1 indirect-1 665 assert= ;
+
+[ float-4{ 0 0 0 0 } ]
+[ 5.0 float-4{ 1 2 3 4 } float-4{ 4 5 6 7 } 0.0 simd-spill-test-3 ] unit-test
+
+! Stack allocation of SIMD values -- make sure that everything is
+! aligned right
+
+: simd-stack-test ( -- b c )
+    { c:int float-4 } [
+        [ 123 swap 0 c:int c:set-alien-value ]
+        [ float-4{ 1 2 3 4 } swap 0 float-4 c:set-alien-value ] bi*
+    ] [ ] with-out-parameters ;
+
+[ 123 float-4{ 1 2 3 4 } ] [ simd-stack-test ] unit-test
+
+! Stack allocation + spilling
+
+: (simd-stack-spill-test) ( -- n ) 17 ;
+
+: simd-stack-spill-test ( x -- b c )
+    { c:int } [
+        123 swap 0 c:int c:set-alien-value
+        >float (simd-stack-spill-test) float-4-with swap cos v*n
+    ] [ ] with-out-parameters ;
+
+[ ] [
+    1.047197551196598 simd-stack-spill-test
+    [ float-4{ 8.5 8.5 8.5 8.5 } approx= t assert= ]
+    [ 123 assert= ]
+    bi*
+] unit-test
index 73a6faeee8768b50274d030e639833f731298c7e..1c2f61c7c620f7ccda91ae1d7da3de429d82ec53 100644 (file)
@@ -3,7 +3,8 @@ cpu.architecture effects fry functors generalizations generic
 generic.parser kernel lexer literals locals macros math math.functions
 math.vectors math.vectors.private math.vectors.simd.intrinsics
 namespaces parser prettyprint.custom quotations sequences
-sequences.private vocabs vocabs.loader words ;
+sequences.generalizations sequences.private vocabs vocabs.loader
+words ;
 QUALIFIED-WITH: alien.c-types c
 IN: math.vectors.simd
 
@@ -253,8 +254,6 @@ ELT     [ A-rep rep-component-type ]
 N       [ A-rep rep-length ]
 COERCER [ ELT c:c-type-class "coercer" word-prop [ ] or ]
 
-SET-NTH [ ELT dup c:c-setter c:array-accessor ]
-
 BOA-EFFECT [ N "n" <array> { "v" } <effect> ]
 
 WHERE
@@ -270,7 +269,7 @@ M: A nth-unsafe
     swap \ A-rep [ (simd-select) ] [ call-next-method ] vn->n-op ; inline
 M: A set-nth-unsafe
     [ ELT boolean>element ] 2dip
-    underlying>> SET-NTH call ; inline
+    underlying>> ELT c:set-alien-element ; inline
 
 : >A ( seq -- simd ) \ A new clone-like ; inline
 
index f12d34e1701bfb3005bc8d4f79bfa974d61ee0bf..819c3aa087f680fba1469434e12ca6dc701851d1 100644 (file)
@@ -48,14 +48,14 @@ M: mirror assoc-size object>> layout-of second ;
 
 INSTANCE: mirror assoc
 
-MIXIN: enumerated-sequence
-INSTANCE: array             enumerated-sequence
-INSTANCE: vector            enumerated-sequence
-INSTANCE: callable          enumerated-sequence
-INSTANCE: byte-array        enumerated-sequence
+MIXIN: inspected-sequence
+INSTANCE: array             inspected-sequence
+INSTANCE: vector            inspected-sequence
+INSTANCE: callable          inspected-sequence
+INSTANCE: byte-array        inspected-sequence
 
 GENERIC: make-mirror ( obj -- assoc )
 M: hashtable make-mirror ;
 M: integer make-mirror drop f ;
-M: enumerated-sequence make-mirror <enum> ;
+M: inspected-sequence make-mirror <enum> ;
 M: object make-mirror <mirror> ;
index 7c29310a97716c9764422170e19e8f58cd37aac2..3398183edb3e6e4731208d0135869fb7c2c61e88 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: models.arrow models.product stack-checker accessors fry
-generalizations combinators.smart macros kernel ;
+generalizations sequences.generalizations combinators.smart
+macros kernel ;
 IN: models.arrow.smart
 
 MACRO: <smart-arrow> ( quot -- quot' )
index a1d4ee9907fa435929ac287bb45b5037d590aa1f..8292bb9c04fb9ba0e852cc18300eb46c4731eca3 100644 (file)
@@ -1,6 +1,6 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
-USING: accessors kernel models alarms ;\r
+USING: accessors alarms fry kernel models ;\r
 IN: models.delay\r
 \r
 TUPLE: delay < model model timeout alarm ;\r
@@ -14,14 +14,15 @@ TUPLE: delay < model model timeout alarm ;
         over >>model\r
         [ add-dependency ] keep ;\r
 \r
-: cancel-delay ( delay -- )\r
-    alarm>> [ cancel-alarm ] when* ;\r
+: stop-delay ( delay -- )\r
+    alarm>> [ stop-alarm ] when* ;\r
 \r
 : start-delay ( delay -- )\r
     dup\r
-    [ [ f >>alarm update-delay-model ] curry ] [ timeout>> ] bi later\r
+    [ '[ _ f >>alarm update-delay-model ] ] [ timeout>> ] bi\r
+    later\r
     >>alarm drop ;\r
 \r
-M: delay model-changed nip dup cancel-delay start-delay ;\r
+M: delay model-changed nip dup stop-delay start-delay ;\r
 \r
 M: delay model-activated update-delay-model ;\r
index 1b6f0f30c270f97f03743076c6a7deb329e043fe..efe9bac88d0297c31c5db1cb21292c65fbb2ed37 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2006, 2008 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors generic kernel math sequences arrays assocs
-alarms calendar math.order continuations fry ;
+calendar math.order continuations fry ;
 IN: models
 
 TUPLE: model < identity-tuple
index c39c80c7d15dc63de3e9cc70e01dca338e84c55a..9a4584a9a290bad9df5c5d0ddc4f25f776485d0c 100644 (file)
@@ -1,7 +1,8 @@
 ! Copyright (C) 2008 Slava Pestov.\r
 ! See http://factorcode.org/license.txt for BSD license.\r
 USING: accessors kernel models arrays sequences math math.order\r
-models.product generalizations math.functions ;\r
+models.product generalizations sequences.generalizations\r
+math.functions ;\r
 FROM: models.product => product ;\r
 IN: models.range\r
 \r
index 865491ed21345c9e471f96e06c123704bb7f1b32..712b62f20b0bd248e1847c94b39fd69840aee9ee 100644 (file)
@@ -1,7 +1,7 @@
-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: math kernel sequences sequences.private byte-arrays
-alien prettyprint.custom parser accessors ;
+alien prettyprint.custom parser accessors locals ;
 IN: nibble-arrays
 
 TUPLE: nibble-array
@@ -20,8 +20,10 @@ CONSTANT: nibble BIN: 1111
 : get-nibble ( n byte -- nibble )
     swap neg shift nibble bitand ; inline
 
-: set-nibble ( value n byte -- byte' )
-    nibble pick shift bitnot bitand -rot shift bitor ; inline
+:: set-nibble ( value n byte -- byte' )
+    byte nibble n shift bitnot bitand
+    value n shift
+    bitor ; inline
 
 : nibble@ ( n nibble-array -- shift n' byte-array )
     [ >fixnum byte/nibble ] [ underlying>> ] bi* ; inline
index 61a0950ce4a5d8523df2cd9d35de6ed8fa7419d4..912bb17218b9c5ee23f2cf2bde6f79719577ca6f 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: namespaces sequences math.parser kernel macros
-generalizations locals ;
+generalizations sequences.generalizations locals ;
 IN: nmake
 
 SYMBOL: building-seq 
index d3e6d7e25a809b7797ee49ec75b65d09199f212c..ce19a2ec89852388c950afe3d63887cfe526fbfc 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008 Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: opengl opengl.gl combinators continuations kernel
-alien.c-types ;
+alien.c-types alien.data ;
 IN: opengl.framebuffers
 
 : gen-framebuffer ( -- id )
@@ -51,4 +51,4 @@ IN: opengl.framebuffers
 
 : framebuffer-attachment ( attachment -- id )
     GL_FRAMEBUFFER swap GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME
-    0 <uint> [ glGetFramebufferAttachmentParameteriv ] keep *uint ;
+    { uint } [ glGetFramebufferAttachmentParameteriv ] [ ] with-out-parameters ;
index 530f3ada6cec54c7c82278af9d296f525d8f8562..1c6cd3d9edf9287c6a4f51258b9f4de13c225d85 100644 (file)
@@ -7,7 +7,7 @@ ERROR: unknown-gl-platform ;
 << {
     { [ os windows? ] [ "opengl.gl.windows" ] }
     { [ os macosx? ]  [ "opengl.gl.macosx" ] }
-    { [ os unix? ] [ "opengl.gl.unix" ] }
+    { [ os unix? ] [ "opengl.gl.x11" ] }
     [ unknown-gl-platform ]
 } cond use-vocab >>
 
diff --git a/basis/opengl/gl/unix/authors.txt b/basis/opengl/gl/unix/authors.txt
deleted file mode 100755 (executable)
index f13c9c1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Joe Groff
diff --git a/basis/opengl/gl/unix/platforms.txt b/basis/opengl/gl/unix/platforms.txt
deleted file mode 100644 (file)
index 509143d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-unix
diff --git a/basis/opengl/gl/unix/unix.factor b/basis/opengl/gl/unix/unix.factor
deleted file mode 100644 (file)
index c0a0218..0000000
+++ /dev/null
@@ -1,6 +0,0 @@
-USING: alien kernel x11.glx ;
-IN: opengl.gl.unix
-
-: gl-function-context ( -- context ) glXGetCurrentContext ; inline
-: gl-function-address ( name -- address ) glXGetProcAddressARB ; inline
-: gl-function-calling-convention ( -- str ) cdecl ; inline
diff --git a/basis/opengl/gl/x11/authors.txt b/basis/opengl/gl/x11/authors.txt
new file mode 100755 (executable)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/basis/opengl/gl/x11/platforms.txt b/basis/opengl/gl/x11/platforms.txt
new file mode 100644 (file)
index 0000000..509143d
--- /dev/null
@@ -0,0 +1 @@
+unix
diff --git a/basis/opengl/gl/x11/x11.factor b/basis/opengl/gl/x11/x11.factor
new file mode 100644 (file)
index 0000000..2d75275
--- /dev/null
@@ -0,0 +1,6 @@
+USING: alien kernel x11.glx ;
+IN: opengl.gl.x11
+
+: gl-function-context ( -- context ) glXGetCurrentContext ; inline
+: gl-function-address ( name -- address ) glXGetProcAddressARB ; inline
+: gl-function-calling-convention ( -- str ) cdecl ; inline
index 1f6205e64fda4575661a31fa8b12096593611d24..893a8dfbd69f2cfd3ba580f9fa1464d0ecf33585 100644 (file)
@@ -2,12 +2,12 @@
 ! Portions copyright (C) 2007 Eduardo Cavazos.
 ! Portions copyright (C) 2008 Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien alien.c-types ascii calendar combinators.short-circuit
-continuations kernel libc math macros namespaces math.vectors
-math.parser opengl.gl combinators combinators.smart arrays
-sequences splitting words byte-arrays assocs vocabs
-colors colors.constants accessors generalizations locals fry
-specialized-arrays ;
+USING: alien alien.c-types alien.data ascii calendar
+combinators.short-circuit continuations kernel libc math macros
+namespaces math.vectors math.parser opengl.gl combinators
+combinators.smart arrays sequences splitting words byte-arrays
+assocs vocabs colors colors.constants accessors generalizations
+sequences.generalizations locals fry specialized-arrays ;
 FROM: alien.c-types => float ;
 SPECIALIZED-ARRAY: float
 SPECIALIZED-ARRAY: uint
@@ -139,7 +139,7 @@ MACRO: all-enabled-client-state ( seq quot -- )
     swap glPushAttrib call glPopAttrib ; inline
 
 : (gen-gl-object) ( quot -- id )
-    [ 1 0 <uint> ] dip keep *uint ; inline
+    [ 1 { uint } ] dip [ ] with-out-parameters ; inline
 
 : (delete-gl-object) ( id quot -- )
     [ 1 swap <uint> ] dip call ; inline
index 562cbc91cec9ef23230a55c15418f499923aebcc..4e17a016243098aea654e1a953c33fdf8f2ddf8f 100644 (file)
@@ -20,7 +20,7 @@ IN: opengl.shaders
     dup integer? [ glIsShader c-bool> ] [ drop f ] if ;
 
 : gl-shader-get-int ( shader enum -- value )
-    0 <int> [ glGetShaderiv ] keep *int ;
+    { int } [ glGetShaderiv ] [ ] with-out-parameters ;
 
 : gl-shader-ok? ( shader -- ? )
     GL_COMPILE_STATUS gl-shader-get-int c-bool> ;
@@ -79,7 +79,7 @@ PREDICATE: fragment-shader < gl-shader (fragment-shader?) ;
     dup integer? [ glIsProgram c-bool> ] [ drop f ] if ;
 
 : gl-program-get-int ( program enum -- value )
-    0 <int> [ glGetProgramiv ] keep *int ;
+    { int } [ glGetProgramiv ] [ ] with-out-parameters ;
 
 : gl-program-ok? ( program -- ? )
     GL_LINK_STATUS gl-program-get-int c-bool> ;
index 9284a151f5bb24b6f06d751070d063995c54eee7..dacea0888a277fb484d352632e9a85fe1670b8e4 100644 (file)
@@ -1,11 +1,11 @@
 ! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs cache colors.constants destructors
-kernel opengl opengl.gl opengl.capabilities combinators images
-images.tesselation grouping sequences math math.vectors
-generalizations fry arrays namespaces system
-locals literals specialized-arrays ;
-FROM: alien.c-types => float ;
+USING: accessors alien.data assocs cache colors.constants
+destructors kernel opengl opengl.gl opengl.capabilities
+combinators images images.tesselation grouping sequences math
+math.vectors generalizations fry arrays namespaces system locals
+literals specialized-arrays ;
+FROM: alien.c-types => int float ;
 SPECIALIZED-ARRAY: float
 IN: opengl.textures
 
@@ -404,3 +404,9 @@ PRIVATE>
     over dim>> max-texture-size [ <= ] 2all?
     [ <single-texture> ]
     [ [ max-texture-size tesselate ] dip <multi-texture> ] if ;
+
+: get-texture-float ( target level enum -- value )
+    { float } [ glGetTexLevelParameterfv ] [ ] with-out-parameters ; inline
+
+: get-texture-int ( target level enum -- value )
+    { int } [ glGetTexLevelParameteriv ] [ ] with-out-parameters ; inline
index 85d4cef4241ac77d9f9dff47c339e41fee374f2f..68a9f2f6df70b0d11ef5679deb79793bfc961733 100644 (file)
@@ -3,12 +3,13 @@
 ! See http://factorcode.org/license.txt for BSD license.
 !
 ! pangocairo bindings, from pango/pangocairo.h
-USING: arrays sequences alien alien.c-types alien.destructors
-alien.libraries alien.syntax math math.functions math.vectors
-destructors combinators colors fonts accessors assocs namespaces
-kernel pango pango.fonts pango.layouts glib unicode.data images
-cache init system math.rectangles fry memoize io.encodings.utf8
-classes.struct cairo cairo.ffi ;
+USING: arrays sequences alien alien.c-types alien.data
+alien.destructors alien.libraries alien.syntax math
+math.functions math.vectors destructors combinators colors fonts
+accessors assocs namespaces kernel pango pango.fonts
+pango.layouts glib unicode.data images cache init system
+math.rectangles fry memoize io.encodings.utf8 classes.struct
+cairo cairo.ffi ;
 IN: pango.cairo
 
 << {
@@ -136,16 +137,17 @@ SYMBOL: dpi
 : line-offset>x ( layout n -- x )
     #! n is an index into the UTF8 encoding of the text
     [ drop first-line ] [ swap string>> >utf8-index ] 2bi
-    0 0 <int> [ pango_layout_line_index_to_x ] keep
-    *int pango>float ;
+    0 { int } [ pango_layout_line_index_to_x ] [ ] with-out-parameters
+    pango>float ;
 
 : x>line-offset ( layout x -- n )
     #! n is an index into the UTF8 encoding of the text
     [
         [ first-line ] dip
-        float>pango 0 <int> 0 <int>
-        [ pango_layout_line_x_to_index drop ] 2keep
-        [ *int ] bi@ swap
+        float>pango
+        { int int }
+        [ pango_layout_line_x_to_index drop ] [ ] with-out-parameters
+        swap
     ] [ drop string>> ] 2bi utf8-index> + ;
 
 : selection-start/end ( selection -- start end )
index 7d0cb4057673bb8346b33c7f7819c38a9ac3649a..201a1c28d23650f36530152143ca22817d67e4f3 100644 (file)
@@ -226,7 +226,9 @@ M: object pprint-object ( obj -- )
 M: object pprint* pprint-object ;
 M: vector pprint* pprint-object ;
 M: byte-vector pprint* pprint-object ;
-M: hashtable pprint* pprint-object ;
+M: hashtable pprint*
+    nesting-limit inc
+    [ pprint-object ] [ nesting-limit dec ] [ ] cleanup ;
 M: curry pprint* pprint-object ;
 M: compose pprint* pprint-object ;
 M: hash-set pprint* pprint-object ;
index 7a80cda062eb6b56434ef27ad9417aeb7c77d5c0..ccccaac7eaf53eef675dcbd18327da8cf2f9ba6e 100644 (file)
@@ -118,7 +118,7 @@ M:: sfmt generate ( sfmt -- )
             state-multiplier * 32 bits
         ] dip + 32 bits
     ] uint-array{ } accumulate-as nip
-    dup underlying>> byte-array>uint-4-array ;
+    dup uint-4-array-cast ;
 
 : <sfmt-state> ( seed n m mask parity -- sfmt )
     sfmt-state <struct>
old mode 100644 (file)
new mode 100755 (executable)
index 72b908a..0629481
@@ -16,24 +16,22 @@ M: windows-crypto-context dispose ( tuple -- )
 
 CONSTANT: factor-crypto-container "FactorCryptoContainer"
 
-:: (acquire-crypto-context) ( provider type flags -- handle ret )
-    HCRYPTPROV <c-object> :> handle
-    handle
-    factor-crypto-container
-    provider
-    type
-    flags
-    CryptAcquireContextW handle swap ;
+:: (acquire-crypto-context) ( provider type flags -- ret handle )
+    { HCRYPTPROV } [
+        factor-crypto-container
+        provider
+        type
+        flags
+        CryptAcquireContextW
+    ] [ ] with-out-parameters ;
 
 : acquire-crypto-context ( provider type -- handle )
     CRYPT_MACHINE_KEYSET
     (acquire-crypto-context)
-    0 = [
+    swap 0 = [
         GetLastError NTE_BAD_KEYSET =
         [ drop f ] [ win32-error-string throw ] if
-    ] [
-        *void*
-    ] if ;
+    ] when ;
 
 : create-crypto-context ( provider type -- handle )
     flags{ CRYPT_MACHINE_KEYSET CRYPT_NEWKEYSET }
index 5be500abd4c1d4d7ece566a3dc730b269522bce7..766fbe87c0b0cf75a1c2143b8a48c8954420844f 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2008, 2010 Slava Pestov, Joe Groff.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors assocs sequences sorting binary-search fry math
-math.order arrays classes combinators kernel functors math.functions
-math.vectors ;
+math.order arrays classes combinators kernel functors locals
+math.functions math.vectors ;
 IN: sequences.cords
 
 MIXIN: cord
@@ -47,57 +47,62 @@ M: T cord-append
     [ [ head>> ] dip call ]
     [ [ tail>> ] dip call ] 2bi cord-append ; inline
 
-: cord-2map ( cord cord quot -- cord' )
-    [ [ [ head>> ] bi@ ] dip call ]
-    [ [ [ tail>> ] bi@ ] dip call ] 3bi cord-append ; inline
+:: cord-2map ( cord-a cord-b quot fallback -- cord' )
+    cord-a cord-b 2dup [ cord? ] both? [
+        [ [ head>> ] bi@ quot call ]
+        [ [ tail>> ] bi@ quot call ] 2bi cord-append
+    ] [ fallback call ] if ; inline
 
 : cord-both ( cord quot -- h t )
     [ [ head>> ] [ tail>> ] bi ] dip bi@ ; inline
 
-: cord-2both ( cord cord quot -- h t )
-    [ [ [ head>> ] bi@ ] dip call ]
-    [ [ [ tail>> ] bi@ ] dip call ] 3bi ; inline
+:: cord-2both ( cord-a cord-b quot combine fallback -- result )
+    cord-a cord-b 2dup [ cord? ] both? [
+        [ [ head>> ] bi@ quot call ]
+        [ [ tail>> ] bi@ quot call ] 2bi combine call
+    ] [ fallback call ] if ; inline
 
 <PRIVATE
 : split-shuffle ( shuf -- sh uf )
     dup length 2 /i cut* ; foldable
 PRIVATE>
 
-M: cord v+                [ v+                ] cord-2map ; inline
-M: cord v-                [ v-                ] cord-2map ; inline
+M: cord v+                [ v+                ] [ call-next-method ] cord-2map ; inline
+M: cord v-                [ v-                ] [ call-next-method ] cord-2map ; inline
 M: cord vneg              [ vneg              ] cord-map  ; inline
-M: cord v+-               [ v+-               ] cord-2map ; inline
-M: cord vs+               [ vs+               ] cord-2map ; inline
-M: cord vs-               [ vs-               ] cord-2map ; inline
-M: cord vs*               [ vs*               ] cord-2map ; inline
-M: cord v*                [ v*                ] cord-2map ; inline
-M: cord v/                [ v/                ] cord-2map ; inline
-M: cord vmin              [ vmin              ] cord-2map ; inline
-M: cord vmax              [ vmax              ] cord-2map ; inline
-M: cord v.                [ v.                ] cord-2both + ; inline
+M: cord v+-               [ v+-               ] [ call-next-method ] cord-2map ; inline
+M: cord vs+               [ vs+               ] [ call-next-method ] cord-2map ; inline
+M: cord vs-               [ vs-               ] [ call-next-method ] cord-2map ; inline
+M: cord vs*               [ vs*               ] [ call-next-method ] cord-2map ; inline
+M: cord v*                [ v*                ] [ call-next-method ] cord-2map ; inline
+M: cord v/                [ v/                ] [ call-next-method ] cord-2map ; inline
+M: cord vmin              [ vmin              ] [ call-next-method ] cord-2map ; inline
+M: cord vmax              [ vmax              ] [ call-next-method ] cord-2map ; inline
+M: cord v.
+    [ v.                ] [ + ] [ call-next-method ] cord-2both ; inline
 M: cord vsqrt             [ vsqrt             ] cord-map  ; inline
 M: cord sum               [ sum               ] cord-both + ; inline
 M: cord vabs              [ vabs              ] cord-map  ; inline
-M: cord vbitand           [ vbitand           ] cord-2map ; inline
-M: cord vbitandn          [ vbitandn          ] cord-2map ; inline
-M: cord vbitor            [ vbitor            ] cord-2map ; inline
-M: cord vbitxor           [ vbitxor           ] cord-2map ; inline
+M: cord vbitand           [ vbitand           ] [ call-next-method ] cord-2map ; inline
+M: cord vbitandn          [ vbitandn          ] [ call-next-method ] cord-2map ; inline
+M: cord vbitor            [ vbitor            ] [ call-next-method ] cord-2map ; inline
+M: cord vbitxor           [ vbitxor           ] [ call-next-method ] cord-2map ; inline
 M: cord vbitnot           [ vbitnot           ] cord-map  ; inline
-M: cord vand              [ vand              ] cord-2map ; inline
-M: cord vandn             [ vandn             ] cord-2map ; inline
-M: cord vor               [ vor               ] cord-2map ; inline
-M: cord vxor              [ vxor              ] cord-2map ; inline
+M: cord vand              [ vand              ] [ call-next-method ] cord-2map ; inline
+M: cord vandn             [ vandn             ] [ call-next-method ] cord-2map ; inline
+M: cord vor               [ vor               ] [ call-next-method ] cord-2map ; inline
+M: cord vxor              [ vxor              ] [ call-next-method ] cord-2map ; inline
 M: cord vnot              [ vnot              ] cord-map  ; inline
 M: cord vlshift           '[ _ vlshift        ] cord-map  ; inline
 M: cord vrshift           '[ _ vrshift        ] cord-map  ; inline
 M: cord (vmerge-head)     [ head>> ] bi@ (vmerge) cord-append ; inline
 M: cord (vmerge-tail)     [ tail>> ] bi@ (vmerge) cord-append ; inline
-M: cord v<=               [ v<=               ] cord-2map ; inline
-M: cord v<                [ v<                ] cord-2map ; inline
-M: cord v=                [ v=                ] cord-2map ; inline
-M: cord v>                [ v>                ] cord-2map ; inline
-M: cord v>=               [ v>=               ] cord-2map ; inline
-M: cord vunordered?       [ vunordered?       ] cord-2map ; inline
+M: cord v<=               [ v<=               ] [ call-next-method ] cord-2map ; inline
+M: cord v<                [ v<                ] [ call-next-method ] cord-2map ; inline
+M: cord v=                [ v=                ] [ call-next-method ] cord-2map ; inline
+M: cord v>                [ v>                ] [ call-next-method ] cord-2map ; inline
+M: cord v>=               [ v>=               ] [ call-next-method ] cord-2map ; inline
+M: cord vunordered?       [ vunordered?       ] [ call-next-method ] cord-2map ; inline
 M: cord vany?             [ vany?             ] cord-both or  ; inline
 M: cord vall?             [ vall?             ] cord-both and ; inline
 M: cord vnone?            [ vnone?            ] cord-both and ; inline
index 30ad1ea6280b2320d9c9512011858b1cf0378d9c..acc9705f10f7fe2720b7b2c25ffd9531ac95afda 100644 (file)
@@ -3,6 +3,85 @@ USING: help.syntax help.markup kernel sequences quotations
 math arrays combinators ;
 IN: sequences.generalizations
 
+HELP: nsequence
+{ $values { "n" integer } { "seq" "an exemplar" } }
+{ $description "A generalization of " { $link 2sequence } ", "
+{ $link 3sequence } ", and " { $link 4sequence } " "
+"that constructs a sequence from the top " { $snippet "n" } " elements of the stack."
+}
+{ $examples
+    { $example "USING: prettyprint sequences.generalizations ;" "CHAR: f CHAR: i CHAR: s CHAR: h 4 \"\" nsequence ." "\"fish\"" }
+} ;
+
+HELP: narray
+{ $values { "n" integer } }
+{ $description "A generalization of " { $link 1array } ", "
+{ $link 2array } ", " { $link 3array } " and " { $link 4array } " "
+"that constructs an array from the top " { $snippet "n" } " elements of the stack."
+}
+{ $examples
+    "Some core words expressed in terms of " { $link narray } ":"
+    { $table
+        { { $link 1array } { $snippet "1 narray" } }
+        { { $link 2array } { $snippet "2 narray" } }
+        { { $link 3array } { $snippet "3 narray" } }
+        { { $link 4array } { $snippet "4 narray" } }
+    }
+} ;
+
+{ nsequence narray } related-words
+
+HELP: firstn
+{ $values { "n" integer } }
+{ $description "A generalization of " { $link first } ", "
+{ $link first2 } ", " { $link first3 } " and " { $link first4 } " "
+"that pushes the first " { $snippet "n" } " elements of a sequence on the stack."
+}
+{ $examples
+    "Some core words expressed in terms of " { $link firstn } ":"
+    { $table
+        { { $link first } { $snippet "1 firstn" } }
+        { { $link first2 } { $snippet "2 firstn" } }
+        { { $link first3 } { $snippet "3 firstn" } }
+        { { $link first4 } { $snippet "4 firstn" } }
+    }
+} ;
+
+HELP: set-firstn
+{ $values { "n" integer } }
+{ $description "A generalization of " { $link set-first } " "
+"that sets the first " { $snippet "n" } " elements of a sequence from the top " { $snippet "n" } " elements of the stack." } ;
+
+HELP: nappend
+{ $values
+     { "n" integer }
+     { "seq" sequence }
+}
+{ $description "Outputs a new sequence consisting of the elements of the top " { $snippet "n" } " sequences from the datastack in turn." }
+{ $errors "Throws an error if any of the sequences contain elements that are not permitted in the sequence type of the first sequence." }
+{ $examples
+    { $example "USING: math prettyprint sequences.generalizations ;"
+               "{ 1 2 } { 3 4 } { 5 6 } { 7 8 } 4 nappend ."
+               "{ 1 2 3 4 5 6 7 8 }"
+    }
+} ;
+
+HELP: nappend-as
+{ $values
+     { "n" integer } { "exemplar" sequence }
+     { "seq" sequence }
+}
+{ $description "Outputs a new sequence of type " { $snippet "exemplar" } " consisting of the elements of the top " { $snippet "n" } " sequences from the datastack in turn." }
+{ $errors "Throws an error if any of the sequences contain elements that are not permitted in the sequence type of the first sequence." }
+{ $examples
+    { $example "USING: math prettyprint sequences.generalizations ;"
+               "{ 1 2 } { 3 4 } { 5 6 } { 7 8 } 4 V{ } nappend-as ."
+               "V{ 1 2 3 4 5 6 7 8 }"
+    }
+} ;
+
+{ nappend nappend-as } related-words
+
 HELP: neach
 { $values { "seq..." { $snippet "n" } " sequences on the datastack" } { "quot" "a quotation with stack effect " { $snippet "( element... -- )" } } { "n" integer } }
 { $description "A generalization of " { $link each } ", " { $link 2each } ", and " { $link 3each } " that can iterate over any number of sequences in parallel." } ;
@@ -31,8 +110,17 @@ HELP: nproduce-as
 { $values { "pred" { $quotation "( -- ? )" } } { "quot" { $quotation "( -- obj1 obj2 ... objn )" } } { "exemplar..." { $snippet "n" } " sequences on the datastack" } { "n" integer } { "seq..." { $snippet "n" } " sequences on the datastack of the same types as the " { $snippet "exemplar" } "s" } }
 { $description "A generalization of " { $link produce-as } " that generates " { $snippet "n" } " sequences in parallel by calling " { $snippet "quot" } " repeatedly until " { $snippet "pred" } " outputs false." } ;
 
-ARTICLE: "sequences.generalizations" "Generalized sequence iteration combinators"
-"The " { $vocab-link "sequences.generalizations" } " vocabulary defines generalized versions of the iteration " { $link "sequences-combinators" } "."
+ARTICLE: "sequences.generalizations" "Generalized sequence words"
+"The " { $vocab-link "sequences.generalizations" } " vocabulary defines generalized versions of various sequence operations."
+{ $subsections
+    narray
+    nsequence
+    firstn
+    set-firstn
+    nappend
+    nappend-as
+}
+"Generalized " { $link "sequences-combinators" } ":"
 { $subsections
     neach
     nmap
index d1861b8f9dcbc6cb931d94d8f47818f04a3183a4..ff2b7059300b510879be54c6996de5a719f91755 100644 (file)
@@ -3,6 +3,20 @@ USING: tools.test generalizations kernel math arrays sequences
 sequences.generalizations ascii fry math.parser io io.streams.string ;
 IN: sequences.generalizations.tests
 
+[ 1 2 3 4 ] [ { 1 2 3 4 } 4 firstn ] unit-test
+[ { 1 2 3 4 } ] [ 1 2 3 4 { f f f f } [ 4 set-firstn ] keep ] unit-test
+[ 1 2 3 4 { f f f } [ 4 set-firstn ] keep ] must-fail
+[ ] [ { } 0 firstn ] unit-test
+[ "a" ] [ { "a" } 1 firstn ] unit-test
+
+[ [ 1 2 ] ] [ 1 2 2 [ ] nsequence ] unit-test
+
+[ { 1 2 3 4 } ] [ { 1 } { 2 } { 3 } { 4 } 4 nappend ] unit-test
+[ V{ 1 2 3 4 } ] [ { 1 } { 2 } { 3 } { 4 } 4 V{ } nappend-as ] unit-test
+
+[ 4 nappend ] must-infer
+[ 4 { } nappend-as ] must-infer
+
 : neach-test ( a b c d -- )
     [ 4 nappend print ] 4 neach ;
 : nmap-test ( a b c d -- e )
index 60b1a8a0119898e7b2387332a84b8d87c0c5a0a5..8401930db398ce4d683e7b4923c0a949900a9dfb 100644 (file)
@@ -4,12 +4,47 @@ combinators macros math.order math.ranges quotations fry effects
 memoize.private generalizations ;
 IN: sequences.generalizations
 
+MACRO: nsequence ( n seq -- )
+    [ [nsequence] ] keep
+    '[ @ _ like ] ;
+
+MACRO: narray ( n -- )
+    '[ _ { } nsequence ] ;
+
+MACRO: firstn-unsafe ( n -- )
+    [firstn] ;
+
+MACRO: firstn ( n -- )
+    dup zero? [ drop [ drop ] ] [
+        [ 1 - swap bounds-check 2drop ]
+        [ firstn-unsafe ]
+        bi-curry '[ _ _ bi ]
+    ] if ;
+
+MACRO: set-firstn-unsafe ( n -- )
+    [ 1 + ]
+    [ iota [ '[ _ rot [ set-nth-unsafe ] keep ] ] map ] bi
+    '[ _ -nrot _ spread drop ] ;
+
+MACRO: set-firstn ( n -- )
+    dup zero? [ drop [ drop ] ] [
+        [ 1 - swap bounds-check 2drop ]
+        [ set-firstn-unsafe ]
+        bi-curry '[ _ _ bi ]
+    ] if ;
+
+: nappend-as ( n exemplar -- seq )
+    [ narray concat ] dip like ; inline
+
+: nappend ( n -- seq ) narray concat ; inline
+
 MACRO: nmin-length ( n -- )
     dup 1 - [ min ] n*quot
     '[ [ length ] _ napply @ ] ;
 
 : nnth-unsafe ( n seq... n -- )
     [ nth-unsafe ] swap [ apply-curry ] [ cleave* ] bi ; inline
+
 MACRO: nset-nth-unsafe ( n -- )
     [ [ drop ] ]
     [ '[ [ set-nth-unsafe ] _ [ apply-curry ] [ cleave-curry ] [ spread* ] tri ] ]
diff --git a/basis/sequences/unrolled/authors.txt b/basis/sequences/unrolled/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/basis/sequences/unrolled/summary.txt b/basis/sequences/unrolled/summary.txt
new file mode 100644 (file)
index 0000000..1c9ba01
--- /dev/null
@@ -0,0 +1 @@
+Unrolled fixed-length sequence iteration
diff --git a/basis/sequences/unrolled/unrolled-docs.factor b/basis/sequences/unrolled/unrolled-docs.factor
new file mode 100644 (file)
index 0000000..1e6ba39
--- /dev/null
@@ -0,0 +1,96 @@
+! (c)2010 Joe Groff bsd license
+USING: help.markup help.syntax kernel math quotations sequences
+sequences.private ;
+IN: sequences.unrolled
+
+HELP: unrolled-collect
+{ $values
+    { "n" integer } { "quot" { $quotation "( n -- value )" } } { "into" sequence }
+}
+{ $description "Unrolled version of " { $link collect } ". " { $snippet "n" } " must be a compile-time constant." } ;
+
+HELP: unrolled-each
+{ $values
+    { "seq" sequence } { "len" integer } { "quot" { $quotation "( x -- )" } }
+}
+{ $description "Unrolled version of " { $link each } " that iterates over the first " { $snippet "len" } " elements of " { $snippet "seq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-2each
+{ $values
+    { "xseq" sequence } { "yseq" sequence } { "len" integer } { "quot" { $quotation "( x y -- )" } }
+}
+{ $description "Unrolled version of " { $link 2each } " that iterates over the first " { $snippet "len" } " elements of " { $snippet "xseq" } " and " { $snippet "yseq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-each-index
+{ $values
+    { "seq" sequence } { "len" integer } { "quot" { $quotation "( x i -- )" } }
+}
+{ $description "Unrolled version of " { $link each-index } " that iterates over the first " { $snippet "len" } " elements of " { $snippet "seq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-each-integer
+{ $values
+    { "n" integer } { "quot" { $quotation "( i -- )" } }
+}
+{ $description "Unrolled version of " { $link each-integer } ". " { $snippet "n" } " must be a compile-time constant." } ;
+
+HELP: unrolled-map
+{ $values
+    { "seq" sequence } { "len" integer } { "quot" { $quotation "( x -- newx )" } }
+    { "newseq" sequence }
+}
+{ $description "Unrolled version of " { $link map } " that maps over the first " { $snippet "len" } " elements of " { $snippet "seq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-map-as
+{ $values
+    { "seq" sequence } { "len" integer } { "quot" { $quotation "( x -- newx )" } } { "exemplar" sequence }
+    { "newseq" sequence }
+}
+{ $description "Unrolled version of " { $link map-as } " that maps over the first " { $snippet "len" } " elements of " { $snippet "seq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-2map
+{ $values
+    { "xseq" sequence } { "yseq" sequence } { "len" integer } { "quot" { $quotation "( x y -- newx )" } } { "newseq" sequence }
+}
+{ $description "Unrolled version of " { $link 2map } " that iterates over the first " { $snippet "len" } " elements of " { $snippet "xseq" } " and " { $snippet "yseq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-2map-as
+{ $values
+    { "xseq" sequence } { "yseq" sequence } { "len" integer } { "quot" { $quotation "( x y -- newx )" } } { "exemplar" sequence } { "newseq" sequence }
+}
+{ $description "Unrolled version of " { $link 2map-as } " that iterates over the first " { $snippet "len" } " elements of " { $snippet "xseq" } " and " { $snippet "yseq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-map-index
+{ $values
+    { "seq" sequence } { "len" integer } { "quot" { $quotation "( x i -- newx )" } }
+    { "newseq" sequence }
+}
+{ $description "Unrolled version of " { $link map-index } " that maps over the first " { $snippet "len" } " elements of " { $snippet "seq" } ". " { $snippet "len" } " must be a compile-time constant. If " { $snippet "seq" } " has fewer than " { $snippet "len" } " elements, raises an " { $link unrolled-bounds-error } "." } ;
+
+HELP: unrolled-map-integers
+{ $values
+    { "n" integer } { "quot" { $quotation "( n -- value )" } } { "exemplar" sequence } { "newseq" sequence }
+}
+{ $description "Unrolled version of " { $link map-integers } ". " { $snippet "n" } " must be a compile-time constant." } ;
+
+ARTICLE: "sequences.unrolled" "Unrolled sequence iteration combinators"
+"The " { $vocab-link "sequences.unrolled" } " vocabulary provides versions of some of the " { $link "sequences-combinators" } " that unroll their loops, that is, expand to a constant number of repetitions of a quotation rather than an explicit loop. These unrolled combinators all require a constant integer value to indicate the number of unrolled iterations to perform."
+$nl
+"Unrolled versions of high-level iteration combinators:"
+{ $subsections
+    unrolled-each
+    unrolled-each-index
+    unrolled-2each
+    unrolled-map
+    unrolled-map-index
+    unrolled-map-as
+    unrolled-2map
+    unrolled-2map-as
+}
+"Unrolled versions of low-level iteration combinators:"
+{ $subsections
+    unrolled-each-integer
+    unrolled-map-integers
+    unrolled-collect
+} ;
+
+ABOUT: "sequences.unrolled"
diff --git a/basis/sequences/unrolled/unrolled-tests.factor b/basis/sequences/unrolled/unrolled-tests.factor
new file mode 100644 (file)
index 0000000..e0d70b4
--- /dev/null
@@ -0,0 +1,52 @@
+! (c)2010 Joe Groff bsd license
+USING: compiler.test compiler.tree.debugger kernel make math.parser sequences
+sequences.unrolled tools.test ;
+IN: sequences.unrolled.tests
+
+[ { "0" "1" "2" } ] [ { 0 1 2 } 3 [ number>string ] unrolled-map ] unit-test
+[ { "0" "1" "2" } ] [ { 0 1 2 } [ 3 [ number>string ] unrolled-map ] compile-call ] unit-test
+
+[ { "0" "1" "2" } ] [ [ { 0 1 2 } 3 [ number>string , ] unrolled-each ] { } make ] unit-test
+[ { "0" "1" "2" } ] [ [ { 0 1 2 } [ 3 [ number>string , ] unrolled-each ] compile-call ] { } make ] unit-test
+
+[ { "a0" "b1" "c2" } ]
+[ [ { "a" "b" "c" } 3 [ number>string append , ] unrolled-each-index ] { } make ] unit-test
+
+[ { "a0" "b1" "c2" } ]
+[ [ { "a" "b" "c" } [ 3 [ number>string append , ] unrolled-each-index ] compile-call ] { } make ] unit-test
+
+[ { "aI" "bII" "cIII" } ]
+[ [ { "a" "b" "c" } { "I" "II" "III" } [ 3 [ append , ] unrolled-2each ] compile-call ] { } make ] unit-test
+
+[ { "aI" "bII" "cIII" } ]
+[ { "a" "b" "c" } { "I" "II" "III" } 3 [ append ] unrolled-2map ] unit-test
+
+[ { "aI" "bII" "cIII" } ]
+[ { "a" "b" "c" } { "I" "II" "III" } [ 3 [ append ] unrolled-2map ] compile-call ] unit-test
+
+[ { "a0" "b1" "c2" } ]
+[ { "a" "b" "c" } 3 [ number>string append ] unrolled-map-index ] unit-test
+
+[ { "a0" "b1" "c2" } ]
+[ { "a" "b" "c" } [ 3 [ number>string append ] unrolled-map-index ] compile-call ] unit-test
+
+[ { 0 1 2 } 4 [ number>string ] unrolled-map ] [ unrolled-bounds-error? ] must-fail-with
+[ { 0 1 2 3 } { 0 1 2 } 4 [ number>string append ] unrolled-2map ] [ unrolled-2bounds-error? ] must-fail-with
+
+[ t ]
+[ [ 3 [ number>string ] unrolled-map ] { call } inlined? ] unit-test
+
+[ t ]
+[ [ 3 [ number>string , ] unrolled-each ] { call } inlined? ] unit-test
+
+[ t ]
+[ [ 3 [ number>string append , ] unrolled-each-index ] { call } inlined? ] unit-test
+
+[ t ]
+[ [ 3 [ append , ] unrolled-2each ] { call } inlined? ] unit-test
+
+[ t ]
+[ [ 3 [ append ] unrolled-2map ] { call } inlined? ] unit-test
+
+[ t ]
+[ [ 3 [ number>string append ] unrolled-map-index ] { call } inlined? ] unit-test
diff --git a/basis/sequences/unrolled/unrolled.factor b/basis/sequences/unrolled/unrolled.factor
new file mode 100644 (file)
index 0000000..83da65e
--- /dev/null
@@ -0,0 +1,99 @@
+! (c)2010 Joe Groff bsd license
+USING: combinators combinators.short-circuit fry generalizations kernel
+locals macros math quotations sequences compiler.tree.propagation.transforms ;
+FROM: sequences.private => (each) (each-index) (2each) nth-unsafe set-nth-unsafe ;
+IN: sequences.unrolled
+
+<PRIVATE
+: (unrolled-each-integer) ( quot n -- )
+    swap '[ _ call( i -- ) ] each-integer ;
+
+<< \ (unrolled-each-integer) [
+    iota [ '[ _ swap call( i -- ) ] ] [ ] map-as '[ _ cleave ]
+] 1 define-partial-eval >>
+
+: (unrolled-collect) ( quot into -- quot' )
+    '[ dup @ swap _ set-nth-unsafe ] ; inline
+
+PRIVATE>
+
+: unrolled-each-integer ( n quot: ( i -- ) -- )
+    swap (unrolled-each-integer) ; inline
+
+: unrolled-collect ( n quot: ( n -- value ) into -- )
+    (unrolled-collect) unrolled-each-integer ; inline
+
+: unrolled-map-integers ( n quot: ( n -- value ) exemplar -- newseq )
+    [ over ] dip [ [ unrolled-collect ] keep ] new-like ; inline
+
+ERROR: unrolled-bounds-error
+    seq unroll-length ;
+
+ERROR: unrolled-2bounds-error
+    xseq yseq unroll-length ;
+
+<PRIVATE
+: unrolled-bounds-check ( seq len quot -- seq len quot )
+    2over swap length > [ 2over unrolled-bounds-error ] when ; inline
+
+:: unrolled-2bounds-check ( xseq yseq len quot -- xseq yseq len quot )
+    { [ len xseq length > ] [ len yseq length > ] } 0||
+    [ xseq yseq len unrolled-2bounds-error ]
+    [ xseq yseq len quot ] if ; inline
+
+: (unrolled-each) ( seq len quot -- len quot )
+    swapd '[ _ nth-unsafe @ ] ; inline
+
+: (unrolled-each-index) ( seq len quot -- len quot )
+    swapd '[ dup _ nth-unsafe swap @ ] ; inline
+
+: (unrolled-2each) ( xseq yseq len quot -- len quot )
+    [ '[ _ ] 2dip ] dip (2each) nip ; inline
+
+: unrolled-each-unsafe ( seq len quot: ( x -- ) -- )
+    (unrolled-each) unrolled-each-integer ; inline
+
+: unrolled-2each-unsafe ( xseq yseq len quot: ( x y -- ) -- )
+    (unrolled-2each) unrolled-each-integer ; inline
+
+: unrolled-each-index-unsafe ( seq len quot: ( x -- ) -- )
+    (unrolled-each-index) unrolled-each-integer ; inline
+
+: unrolled-map-as-unsafe ( seq len quot: ( x -- newx ) exemplar -- newseq )
+    [ (unrolled-each) ] dip unrolled-map-integers ; inline
+
+: unrolled-2map-as-unsafe ( xseq yseq len quot: ( x y -- newx ) exemplar -- newseq )
+    [ (unrolled-2each) ] dip unrolled-map-integers ; inline
+
+: unrolled-map-unsafe ( seq len quot: ( x -- newx ) -- newseq )
+    pick unrolled-map-as-unsafe ; inline
+
+: unrolled-2map-unsafe ( xseq yseq len quot: ( x y -- newx ) -- newseq )
+    4 npick unrolled-2map-as-unsafe ; inline
+
+PRIVATE>
+
+: unrolled-each ( seq len quot: ( x -- ) -- )
+    unrolled-bounds-check unrolled-each-unsafe ; inline
+
+: unrolled-2each ( xseq yseq len quot: ( x y -- ) -- )
+    unrolled-2bounds-check unrolled-2each-unsafe ; inline
+
+: unrolled-each-index ( seq len quot: ( x i -- ) -- )
+    unrolled-bounds-check unrolled-each-index-unsafe ; inline
+
+: unrolled-map-as ( seq len quot: ( x -- newx ) exemplar -- newseq )
+    [ unrolled-bounds-check ] dip unrolled-map-as-unsafe ; inline
+
+: unrolled-2map-as ( xseq yseq len quot: ( x y -- newx ) exemplar -- newseq )
+    [ unrolled-2bounds-check ] dip unrolled-2map-as-unsafe ; inline
+
+: unrolled-map ( seq len quot: ( x -- newx ) -- newseq )
+    pick unrolled-map-as ; inline
+
+: unrolled-2map ( xseq yseq len quot: ( x y -- newx ) -- newseq )
+    4 npick unrolled-2map-as ; inline
+
+: unrolled-map-index ( seq len quot: ( x i -- newx ) -- newseq )
+    [ dup length iota ] 2dip unrolled-2map ; inline
+
index b826606df51f85070e4d9ddb17270b3a1e9625a4..2659ed3280ddf9e7549a1e034cb3634b41237bfa 100644 (file)
@@ -1,8 +1,8 @@
 ! Copyright (C) 2007 Chris Double, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs combinators effects.parser generalizations
-hashtables kernel locals locals.backend macros make math
-parser sequences ;
+USING: accessors assocs combinators effects.parser
+generalizations sequences.generalizations hashtables kernel
+locals locals.backend macros make math parser sequences ;
 IN: shuffle
 
 <PRIVATE
index eea9e83b5832ab27fe0e11a38b68091baec5712b..17bed718fb8f0c99de33f9486a0eb9f444fe1f42 100644 (file)
@@ -3,4 +3,4 @@
 USING: mirrors specialized-arrays math.vectors ;
 IN: specialized-arrays.mirrors
 
-INSTANCE: specialized-array enumerated-sequence
+INSTANCE: specialized-array inspected-sequence
index 68ce02e71e7f345b91fc5265bb3d7e42ba812ba2..b476a4707251c5c6f50821831f1782b41b2b02b1 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax byte-arrays alien ;
+USING: help.markup help.syntax byte-arrays alien math sequences ;
 IN: specialized-arrays
 
 HELP: SPECIALIZED-ARRAY:
@@ -13,6 +13,28 @@ HELP: SPECIALIZED-ARRAYS:
 
 { POSTPONE: SPECIALIZED-ARRAY: POSTPONE: SPECIALIZED-ARRAYS: } related-words
 
+HELP: direct-slice
+{ $values { "from" integer } { "to" integer } { "seq" "a specialized array" } { "seq'" "a new specialized array" } }
+{ $description "Constructs a new specialized array of the same type as " { $snippet "seq" } " sharing the same underlying memory as the subsequence of " { $snippet "seq" } " from elements " { $snippet "from" } " up to but not including " { $snippet "to" } ". Like " { $link slice } ", raises an error if " { $snippet "from" } " or " { $snippet "to" } " is out of bounds." } ;
+
+HELP: direct-head
+{ $values { "seq" "a specialized array" } { "n" integer } { "seq'" "a new specialized array" } }
+{ $description "Constructs a new specialized array of the same type as " { $snippet "seq" } " sharing the same underlying memory as the first " { $snippet "n" } " elements of " { $snippet "seq" } ". Like " { $link head } ", raises an error if " { $snippet "n" } " is out of bounds." } ;
+
+HELP: direct-tail
+{ $values { "seq" "a specialized array" } { "n" integer } { "seq'" "a new specialized array" } }
+{ $description "Constructs a new specialized array of the same type as " { $snippet "seq" } " sharing the same underlying memory as " { $snippet "seq" } " without the first " { $snippet "n" } " elements. Like " { $link tail } ", raises an error if " { $snippet "n" } " is out of bounds." } ;
+
+HELP: direct-head*
+{ $values { "seq" "a specialized array" } { "n" integer } { "seq'" "a new specialized array" } }
+{ $description "Constructs a new specialized array of the same type as " { $snippet "seq" } " sharing the same underlying memory as " { $snippet "seq" } " without the last " { $snippet "n" } " elements. Like " { $link head* } ", raises an error if " { $snippet "n" } " is out of bounds." } ;
+
+HELP: direct-tail*
+{ $values { "seq" "a specialized array" } { "n" integer } { "seq'" "a new specialized array" } }
+{ $description "Constructs a new specialized array of the same type as " { $snippet "seq" } " sharing the same underlying memory as the last " { $snippet "n" } " elements of " { $snippet "seq" } ". Like " { $link tail* } ", raises an error if " { $snippet "n" } " is out of bounds." } ;
+
+{ direct-slice direct-head direct-tail direct-head* direct-tail* } related-words
+
 ARTICLE: "specialized-array-words" "Specialized array words"
 "The " { $link POSTPONE: SPECIALIZED-ARRAY: } " and " { $link POSTPONE: SPECIALIZED-ARRAYS: } " parsing words generate specialized array types if they haven't been generated already and add the following words to the vocabulary search path, where " { $snippet "T" } " is the C type in question:"
 { $table
@@ -21,11 +43,20 @@ ARTICLE: "specialized-array-words" "Specialized array words"
     { { $snippet "(T-array)" } { "Constructor for arrays with elements of type " { $snippet "T" } ", where the initial contents are uninitialized; stack effect " { $snippet "( len -- array )" } } }
     { { $snippet "malloc-T-array" } { "Constructor for arrays with elements of type " { $snippet "T" } " backed by newly-allocated unmanaged memory; stack effect " { $snippet "( alien len -- array )" } } }
     { { $snippet "<direct-T-array>" } { "Constructor for arrays with elements of type " { $snippet "T" } " backed by raw memory; stack effect " { $snippet "( alien len -- array )" } } }
-    { { $snippet "byte-array>T-array" } { "Converts a byte array into a specialized array by interpreting the bytes in as machine-specific values. Code which uses this word is unportable" } }
+    { { $snippet "T-array-cast" } { "Converts a byte array into a specialized array by interpreting the bytes in as machine-specific values. Code which uses this word is unportable" } }
     { { $snippet ">T-array" } { "Converts a sequence into a specialized array of type " { $snippet "T" } "; stack effect " { $snippet "( seq -- array )" } } }
     { { $snippet "T-array{" } { "Literal syntax, consists of a series of values terminated by " { $snippet "}" } } }
 }
-"Behind the scenes, these words are placed in a vocabulary named " { $snippet "specialized-arrays.instances.T" } ", however this vocabulary should not be placed in a " { $link POSTPONE: USING: } " form directly. Instead, always use " { $link POSTPONE: SPECIALIZED-ARRAY: } " or " { $link POSTPONE: SPECIALIZED-ARRAYS: } ". This ensures that the vocabulary can get generated the first time it is needed." ;
+"Behind the scenes, these words are placed in a vocabulary named " { $snippet "specialized-arrays.instances.T" } ", however this vocabulary should not be placed in a " { $link POSTPONE: USING: } " form directly. Instead, always use " { $link POSTPONE: SPECIALIZED-ARRAY: } " or " { $link POSTPONE: SPECIALIZED-ARRAYS: } ". This ensures that the vocabulary can get generated the first time it is needed."
+$nl
+"Additionally, special versions of the standard " { $link <slice> } ", " { $link head } ", and " { $link tail } " sequence operations are provided for specialized arrays to create a new specialized array object sharing storage with a subsequence of an existing array:"
+{ $subsections
+    direct-slice
+    direct-head
+    direct-tail
+    direct-head*
+    direct-tail*
+} ;
 
 ARTICLE: "specialized-array-c" "Passing specialized arrays to C functions"
 "If a C function is declared as taking a parameter with a pointer or an array type (for example, " { $snippet "float*" } " or " { $snippet "int[3]" } "), instances of the relevant specialized array can be passed in."
index ad1b4ad2b713ece63d6bc44a03b351ca1d22a3d9..02424a22fdc68cc9cd9c7b1a4ec521fa8c353177 100644 (file)
@@ -27,10 +27,10 @@ SPECIALIZED-ARRAYS: bool ushort char uint float ulonglong ;
 ] unit-test
 
 [ ushort-array{ 1234 } ] [
-    little-endian? B{ 210 4 } B{ 4 210 } ? byte-array>ushort-array
+    little-endian? B{ 210 4 } B{ 4 210 } ? ushort-array-cast
 ] unit-test
 
-[ B{ 210 4 1 } byte-array>ushort-array ] must-fail
+[ B{ 210 4 1 } ushort-array-cast ] must-fail
 
 [ { 3 1 3 3 7 } ] [
     int-array{ 3 1 3 3 7 } malloc-byte-array 5 <direct-int-array> >array
@@ -191,3 +191,16 @@ SPECIALIZED-ARRAY: struct-resize-test
         \ struct-resize-test-usage forget
     ] with-compilation-unit
 ] unit-test
+
+[ int-array{ 4 5 6 } ] [ 3 6 int-array{ 1 2 3 4 5 6 7 8 } direct-slice ] unit-test
+[ int-array{ 1 2 3 } ] [ int-array{ 1 2 3 4 5 6 7 8 } 3 direct-head ] unit-test
+[ int-array{ 1 2 3 4 5 } ] [ int-array{ 1 2 3 4 5 6 7 8 } 3 direct-head* ] unit-test
+[ int-array{ 4 5 6 7 8 } ] [ int-array{ 1 2 3 4 5 6 7 8 } 3 direct-tail ] unit-test
+[ int-array{ 6 7 8 } ] [ int-array{ 1 2 3 4 5 6 7 8 } 3 direct-tail* ] unit-test
+
+
+[ int-array{ 1 2 3 4 55555 6 7 8 } ] [
+    int-array{ 1 2 3 4 5 6 7 8 }
+    3 6 pick direct-slice [ 55555 1 ] dip set-nth
+] unit-test
+
index 35448a501c5694365b0aec9f5ffd35eb3108fee8..9754fd2abcbab5dcb32a0440c31392ac68dff64f 100644 (file)
@@ -32,21 +32,20 @@ M: not-a-byte-array summary
 
 <PRIVATE
 
-FUNCTOR: define-array ( T -- )
-
-A            DEFINES-CLASS ${T}-array
-<A>          DEFINES <${A}>
-(A)          DEFINES (${A})
-<direct-A>   DEFINES <direct-${A}>
-malloc-A     DEFINES malloc-${A}
->A           DEFINES >${A}
-byte-array>A DEFINES byte-array>${A}
+GENERIC: nth-c-ptr ( n seq -- displaced-alien )
+GENERIC: direct-like ( alien len exemplar -- seq )
 
-A{           DEFINES ${A}{
-A@           DEFINES ${A}@
+FUNCTOR: define-array ( T -- )
 
-NTH          [ T dup c-getter array-accessor ]
-SET-NTH      [ T dup c-setter array-accessor ]
+A          DEFINES-CLASS ${T}-array
+<A>        DEFINES <${A}>
+(A)        DEFINES (${A})
+<direct-A> DEFINES <direct-${A}>
+malloc-A   DEFINES malloc-${A}
+>A         DEFINES >${A}
+A-cast     DEFINES ${A}-cast
+A{         DEFINES ${A}{
+A@         DEFINES ${A}@
 
 WHERE
 
@@ -56,6 +55,8 @@ TUPLE: A
 
 : <direct-A> ( alien len -- specialized-array ) A boa ; inline
 
+M: A direct-like drop <direct-A> ; inline
+
 : <A> ( n -- specialized-array )
     [ \ T <underlying> ] keep <direct-A> ; inline
 
@@ -65,20 +66,19 @@ TUPLE: A
 : malloc-A ( len -- specialized-array )
     [ \ T heap-size calloc ] keep <direct-A> ; inline
 
-: byte-array>A ( byte-array -- specialized-array )
-    >c-ptr dup byte-array? [
-        dup length \ T heap-size /mod 0 =
-        [ <direct-A> ]
-        [ drop \ T bad-byte-array-length ] if
-    ] [ not-a-byte-array ] if ; inline
+: A-cast ( byte-array -- specialized-array )
+    binary-object \ T heap-size /mod 0 =
+    [ <direct-A> ] [ drop \ T bad-byte-array-length ] if ; inline
 
 M: A clone [ underlying>> clone ] [ length>> ] bi <direct-A> ; inline
 
 M: A length length>> ; inline
 
-M: A nth-unsafe underlying>> NTH call ; inline
+M: A nth-unsafe underlying>> \ T alien-element ; inline
 
-M: A set-nth-unsafe underlying>> SET-NTH call ; inline
+M: A nth-c-ptr underlying>> \ T array-accessor drop swap <displaced-alien> ; inline
+
+M: A set-nth-unsafe underlying>> \ T set-alien-element ; inline
 
 : >A ( seq -- specialized-array ) A new clone-like ;
 
@@ -137,8 +137,21 @@ M: pointer underlying-type
         bi
     ] "" make ;
 
+: direct-slice-unsafe ( from to seq -- seq' )
+    [ nip nth-c-ptr ]
+    [ drop swap - ]
+    [ 2nip ] 3tri direct-like ; inline
+
 PRIVATE>
 
+: direct-slice ( from to seq -- seq' )
+    check-slice direct-slice-unsafe ; inline
+
+: direct-head ( seq n -- seq' ) (head) direct-slice ; inline
+: direct-tail ( seq n -- seq' ) (tail) direct-slice ; inline
+: direct-head* ( seq n -- seq' ) from-end direct-head ; inline
+: direct-tail* ( seq n -- seq' ) from-end direct-tail ; inline
+
 : define-array-vocab ( type -- vocab )
     underlying-type
     [ specialized-array-vocab ] [ '[ _ define-array ] ] bi
diff --git a/basis/specialized-vectors/mirrors/authors.txt b/basis/specialized-vectors/mirrors/authors.txt
new file mode 100644 (file)
index 0000000..1901f27
--- /dev/null
@@ -0,0 +1 @@
+Slava Pestov
diff --git a/basis/specialized-vectors/mirrors/mirrors.factor b/basis/specialized-vectors/mirrors/mirrors.factor
new file mode 100644 (file)
index 0000000..bb559a0
--- /dev/null
@@ -0,0 +1,6 @@
+! Copyright (C) 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: specialized-vectors mirrors ;
+IN: specialized-vectors.mirrors
+
+INSTANCE: specialized-vector inspected-sequence
index e54f26ac57de6fd3d342fade449ecb7dd74f972c..bd68a3b5335106171dcf151504e30d7e9922ac6b 100644 (file)
@@ -1,4 +1,4 @@
-USING: help.markup help.syntax byte-vectors alien byte-arrays ;
+USING: help.markup help.syntax byte-vectors alien byte-arrays classes.struct ;
 IN: specialized-vectors
 
 HELP: SPECIALIZED-VECTOR:
@@ -23,6 +23,20 @@ ARTICLE: "specialized-vector-words" "Specialized vector words"
 }
 "Behind the scenes, these words are placed in a vocabulary named " { $snippet "specialized-vectors.instances.T" } ", however this vocabulary should not be placed in a " { $link POSTPONE: USING: } " form directly. Instead, always use " { $link POSTPONE: SPECIALIZED-VECTOR: } ". This ensures that the vocabulary can get generated the first time it is needed." ;
 
+HELP: push-new
+{ $values { "vector" "a specialized vector of structs" } { "new" "a new value of the specialized vector's type" } }
+{ $description "Grows " { $snippet "vector" } ", increasing its length by one, and outputs a " { $link struct } " object wrapping the newly allocated storage." }
+{ $notes "This word allows struct objects to be streamed into a struct vector efficiently without excessive copying. The typical Factor idiom for pushing a new object onto a vector, when used with struct vectors, will allocate and copy a temporary struct object:"
+{ $code """foo <struct>
+    5 >>a
+    6 >>b
+foo-vector{ } clone push""" } 
+"By using " { $snippet "push-new" } ", the new struct can be allocated directly from the vector and the intermediate copy can be avoided:"
+{ $code """foo-vector{ } clone push-new
+    5 >>a
+    6 >>b
+    drop""" } } ;
+
 ARTICLE: "specialized-vector-c" "Passing specialized vectors to C functions"
 "Each specialized vector has a " { $slot "underlying" } " slot holding a specialized array, which in turn has an " { $slot "underlying" } " slot holding a " { $link byte-array } " with the raw data. Passing a specialized vector as a parameter to a C function call will automatically extract the underlying data. To get at the underlying data directly, call the " { $link >c-ptr } " word on a specialized vector." ;
 
@@ -38,6 +52,10 @@ $nl
     "specialized-vector-words"
     "specialized-vector-c"
 }
+"This vocabulary also contains special vector operations for making efficient use of specialized vector types:"
+{ $subsections
+    push-new
+}
 "The " { $vocab-link "specialized-arrays" } " vocabulary provides a fixed-length version of this abstraction." ;
 
 ABOUT: "specialized-vectors"
index 3352c226d8b67c0a471e279823fcd5f8bfb81885..2b5b2f3f92e2827dbdc7cf2090abd211484a045a 100644 (file)
@@ -1,24 +1,30 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.c-types alien.parser assocs
-compiler.units functors growable kernel lexer math namespaces
-parser prettyprint.custom sequences specialized-arrays
-specialized-arrays.private strings vocabs vocabs.parser
-vocabs.generated fry make ;
+classes compiler.units functors growable kernel lexer math
+namespaces parser prettyprint.custom sequences
+specialized-arrays specialized-arrays.private strings
+vocabs vocabs.loader vocabs.parser vocabs.generated fry make ;
+FROM: sequences.private => nth-unsafe ;
+FROM: specialized-arrays.private => nth-c-ptr direct-like ;
 QUALIFIED: vectors.functor
 IN: specialized-vectors
 
+MIXIN: specialized-vector
+
 <PRIVATE
 
 FUNCTOR: define-vector ( T -- )
 
-V   DEFINES-CLASS ${T}-vector
+V DEFINES-CLASS ${T}-vector
 
-A   IS      ${T}-array
-<A> IS      <${A}>
+A          IS ${T}-array
+>A         IS >${A}
+<A>        IS <${A}>
+<direct-A> IS <direct-${A}>
 
->V  DEFERS >${V}
-V{  DEFINES ${V}{
+>V DEFERS >${V}
+V{ DEFINES ${V}{
 
 WHERE
 
@@ -34,8 +40,20 @@ M: V >pprint-sequence ;
 
 M: V pprint* pprint-object ;
 
+M: V >c-ptr underlying>> underlying>> ; inline
+M: V byte-length [ length ] [ element-size ] bi * ; inline
+
+M: V direct-like drop <direct-A> ; inline
+M: V nth-c-ptr underlying>> nth-c-ptr ; inline
+
+M: A like
+    drop dup A instance? [
+        dup V instance? [ [ >c-ptr ] [ length>> ] bi <direct-A> ] [ >A ] if
+    ] unless ; inline
+
 SYNTAX: V{ \ } [ >V ] parse-literal ;
 
+INSTANCE: V specialized-vector
 INSTANCE: V growable
 
 ;FUNCTOR
@@ -50,6 +68,9 @@ INSTANCE: V growable
 
 PRIVATE>
 
+: push-new ( vector -- new )
+    [ length ] keep ensure nth-unsafe ; inline
+
 : define-vector-vocab ( type -- vocab )
     underlying-type
     [ specialized-vector-vocab ] [ '[ _ define-vector ] ] bi
@@ -66,3 +87,5 @@ SYNTAX: SPECIALIZED-VECTOR:
     scan-c-type
     [ define-array-vocab use-vocab ]
     [ define-vector-vocab use-vocab ] bi ;
+
+{ "specialized-vectors" "mirrors" } "specialized-vectors.mirrors" require-when
index 62dd65c5e0690dc732dbd193ddac44fe85491247..42c87f05b9519a8c27e76877acce8f21928ad70f 100644 (file)
@@ -1,21 +1,25 @@
 ! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: kernel sequences accessors combinators math namespaces
-init sets words assocs alien.libraries alien alien.private
-alien.c-types fry stack-checker.backend
-stack-checker.errors stack-checker.visitor
-stack-checker.dependencies ;
+USING: kernel arrays sequences accessors combinators math
+namespaces init sets words assocs alien.libraries alien
+alien.private alien.c-types fry quotations strings
+stack-checker.backend stack-checker.errors stack-checker.visitor
+stack-checker.dependencies compiler.utilities ;
 IN: stack-checker.alien
 
-TUPLE: alien-node-params return parameters abi in-d out-d ;
+TUPLE: alien-node-params
+return parameters
+{ abi abi initial: cdecl }
+in-d
+out-d ;
 
-TUPLE: alien-invoke-params < alien-node-params library function ;
+TUPLE: alien-invoke-params < alien-node-params library { function string } ;
 
 TUPLE: alien-indirect-params < alien-node-params ;
 
-TUPLE: alien-assembly-params < alien-node-params quot ;
+TUPLE: alien-assembly-params < alien-node-params { quot callable } ;
 
-TUPLE: alien-callback-params < alien-node-params quot xt ;
+TUPLE: alien-callback-params < alien-node-params { quot callable } xt ;
 
 : param-prep-quot ( params -- quot )
     parameters>> [ c-type c-type-unboxer-quot ] map spread>quot ;
@@ -104,6 +108,18 @@ TUPLE: alien-callback-params < alien-node-params quot xt ;
 : callback-bottom ( params -- )
     xt>> '[ _ callback-xt ] infer-quot-here ;
 
+: callback-return-quot ( ctype -- quot )
+    return>> [ [ ] ] [ c-type c-type-unboxer-quot ] if-void ;
+
+: callback-prep-quot ( params -- quot )
+    parameters>> [ c-type c-type-boxer-quot ] map spread>quot ;
+
+: wrap-callback-quot ( params -- quot )
+    [ callback-prep-quot ] [ quot>> ] [ callback-return-quot ] tri 3append
+     yield-hook get
+     '[ _ _ do-callback ]
+     >quotation ;
+
 : infer-alien-callback ( -- )
     alien-callback-params new
     pop-quot
@@ -111,5 +127,6 @@ TUPLE: alien-callback-params < alien-node-params quot xt ;
     pop-params
     pop-return
     "( callback )" <uninterned-word> >>xt
+    dup wrap-callback-quot >>quot
     dup callback-bottom
     #alien-callback, ;
diff --git a/basis/system-info/windows/nt/nt-tests.factor b/basis/system-info/windows/nt/nt-tests.factor
new file mode 100755 (executable)
index 0000000..dfbd8b3
--- /dev/null
@@ -0,0 +1,7 @@
+USING: math.order strings system-info.backend
+system-info.windows system-info.windows.nt
+tools.test ;
+IN: system-info.windows.nt.tests
+
+[ t ] [ cpus 0 1024 between? ] unit-test
+[ t ] [ username string? ] unit-test
index 2c13c8d5d2593e693ccc0395b74cb7018db8c3a9..804eb25def68191d641bbd403c7d1008c0da4a4c 100644 (file)
@@ -11,8 +11,8 @@ M: winnt cpus ( -- n )
     system-info dwNumberOfProcessors>> ;
 
 : memory-status ( -- MEMORYSTATUSEX )
-    "MEMORYSTATUSEX" <struct>
-    dup class heap-size >>dwLength
+    MEMORYSTATUSEX <struct>
+    MEMORYSTATUSEX heap-size >>dwLength
     dup GlobalMemoryStatusEx win32-error=0/f ;
 
 M: winnt memory-load ( -- n )
index c9dfc4a5625163b6586c5c45239e2eb89312f6ea..5c9210e44a6e39d0d8837a1c6903e0f73fb757b2 100644 (file)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2005, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel math sorting words parser io summary
-quotations sequences prettyprint continuations effects
-definitions compiler.units namespaces assocs tools.time generic
-inspector fry locals generalizations macros ;
+quotations sequences sequences.generalizations prettyprint
+continuations effects definitions compiler.units namespaces
+assocs tools.time generic inspector fry locals generalizations
+macros ;
 IN: tools.annotations
 
 <PRIVATE
index 7b9c8b43bc167bdcbc8a099934e12035d384ebd7..d62c192ac1768d42fab6149fff960e71299c08d9 100644 (file)
@@ -54,7 +54,7 @@ IN: tools.completion
     sort-keys <reversed>
     [ 0 [ first max ] reduce 3 /f ] keep
     [ first < ] with filter
-    [ second ] map ;
+    values ;
 
 : complete ( full short -- score )
     [ dupd fuzzy score ] 2keep
index 446f453709090bb0161053e55afaac037145f8d3..ecfe52928651092121c935ba08afd16965a1d264 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2007, 2009 Slava Pestov.
+! Copyright (C) 2007, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: io io.files io.files.info.unix io.pathnames
 io.directories io.directories.hierarchy kernel namespaces make
@@ -10,7 +10,10 @@ combinators vocabs.metadata vocabs.loader ;
 IN: tools.deploy.macosx
 
 : bundle-dir ( -- dir )
-    vm parent-directory parent-directory ;
+    running.app?
+    [ vm parent-directory parent-directory ]
+    [ "resource:Factor.app" ]
+    if ;
 
 : copy-bundle-dir ( bundle-name dir -- )
     [ bundle-dir prepend-path swap ] keep
@@ -70,7 +73,6 @@ IN: tools.deploy.macosx
     -> selectFile:inFileViewerRootedAtPath: drop ;
 
 M: macosx deploy* ( vocab -- )
-    ".app deploy tool" assert.app
     "resource:" [
         dup deploy-config [
             bundle-name dup exists? [ delete-tree ] [ drop ] if
index b41d236fd7b89a36e0bf5bf2640f82cb43250776..09748ccbefc3494cf440b24b367932264d9dd758 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2009 Slava Pestov.
+! Copyright (C) 2009, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: models source-files.errors namespaces models.delay init
 kernel calendar ;
@@ -6,13 +6,14 @@ IN: tools.errors.model
 
 SYMBOLS: (error-list-model) error-list-model ;
 
-(error-list-model) [ f <model> ] initialize
-
-error-list-model [ (error-list-model) get-global 100 milliseconds <delay> ] initialize
-
 SINGLETON: updater
 
-M: updater errors-changed drop f (error-list-model) get-global set-model ;
+M: updater errors-changed
+    drop f (error-list-model) get-global set-model ;
 
-[ updater add-error-observer ] "ui.tools.error-list" add-startup-hook
+[
+    f <model> (error-list-model) set-global
+    (error-list-model) get-global 100 milliseconds <delay> error-list-model set-global
+    updater add-error-observer
+] "ui.tools.error-list" add-startup-hook
 
index 1c999d979a58566a364ab031ea4adc4d2a1a54c4..1f1a9876b5d870c26e8c4e34da216185a0d7ffe8 100644 (file)
@@ -4,8 +4,9 @@ USING: accessors arrays assocs binary-search classes
 classes.struct combinators combinators.smart continuations fry
 generalizations generic grouping io io.styles kernel make math
 math.order math.parser math.statistics memory memory.private
-layouts namespaces parser prettyprint sequences sorting
-splitting strings system vm words hints hashtables ;
+layouts namespaces parser prettyprint sequences
+sequences.generalizations sorting splitting strings system vm
+words hints hashtables ;
 IN: tools.memory
 
 <PRIVATE
index 95f1ad8e2c086eca1b2e9ac7a722f356182506df..b789fa853785de6455618564f7b41885e73b2950 100644 (file)
@@ -1,13 +1,13 @@
 ! Copyright (C) 2003, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs combinators compiler.units
-continuations debugger effects fry generalizations io io.files
-io.styles kernel lexer locals macros math.parser namespaces
-parser vocabs.parser prettyprint quotations sequences
-source-files splitting stack-checker summary unicode.case
-vectors vocabs vocabs.loader vocabs.files vocabs.metadata words
-tools.errors source-files.errors io.streams.string make
-compiler.errors ;
+continuations debugger effects fry generalizations
+sequences.generalizations io io.files io.styles kernel lexer
+locals macros math.parser namespaces parser vocabs.parser
+prettyprint quotations sequences source-files splitting
+stack-checker summary unicode.case vectors vocabs vocabs.loader
+vocabs.files vocabs.metadata words tools.errors
+source-files.errors io.streams.string make compiler.errors ;
 IN: tools.test
 
 TUPLE: test-failure < source-file-error continuation ;
index 8a7ff5b7b2455594dad04de5a71ee78e50c2d45f..4bb8814e4cad00f26462966da331dc166d620108 100644 (file)
@@ -1,4 +1,5 @@
-USING: definitions kernel locals.definitions see see.private typed words ;
+USING: definitions kernel locals.definitions see see.private typed words
+summary make accessors classes ;
 IN: typed.prettyprint
 
 PREDICATE: typed-lambda-word < lambda-word "typed-word" word-prop ;
@@ -9,3 +10,24 @@ M: typed-lambda-word definer drop \ TYPED:: \ ; ;
 M: typed-word definition "typed-def" word-prop ;
 M: typed-word declarations. "typed-word" word-prop declarations. ;
 
+M: input-mismatch-error summary
+    [
+        "Typed word “" %
+        dup word>> name>> %
+        "” expected input value of type " %
+        dup expected-type>> name>> %
+        " but got " %
+        dup value>> class name>> %
+        drop
+    ] "" make ;
+
+M: output-mismatch-error summary
+    [
+        "Typed word “" %
+        dup word>> name>> %
+        "” expected to output value of type " %
+        dup expected-type>> name>> %
+        " but gave " %
+        dup value>> class name>> %
+        drop
+    ] "" make ;
index bca1136ee6bb57f44eefd378931a4d3526e5772e..70edcf2334c383fde7c868419b09f731312573d3 100644 (file)
@@ -1,6 +1,6 @@
 USING: accessors effects eval kernel layouts math namespaces
-quotations tools.test typed words words.symbol
-compiler.tree.debugger prettyprint definitions compiler.units ;
+quotations tools.test typed words words.symbol combinators.short-circuit
+compiler.tree.debugger prettyprint definitions compiler.units sequences ;
 IN: typed.tests
 
 TYPED: f+ ( a: float b: float -- c: float )
@@ -24,14 +24,17 @@ TYPED: dee ( x: tweedle-dee -- y )
 TYPED: dum ( x: tweedle-dum -- y )
     drop \ tweedle-dum ;
 
-[ \ tweedle-dum new dee ] [ input-mismatch-error? ] must-fail-with
-[ \ tweedle-dee new dum ] [ input-mismatch-error? ] must-fail-with
+[ \ tweedle-dum new dee ]
+[ { [ input-mismatch-error? ] [ expected-type>> tweedle-dee = ] [ value>> tweedle-dum? ] } 1&& ] must-fail-with
 
+[ \ tweedle-dee new dum ]
+[ { [ input-mismatch-error? ] [ expected-type>> tweedle-dum = ] [ value>> tweedle-dee? ] } 1&& ] must-fail-with
 
 TYPED: dumdum ( x -- y: tweedle-dum )
     drop \ tweedle-dee new ;
 
-[ f dumdum ] [ output-mismatch-error? ] must-fail-with
+[ f dumdum ]
+[ { [ output-mismatch-error? ] [ expected-type>> tweedle-dum = ] [ value>> tweedle-dee? ] } 1&& ] must-fail-with
 
 TYPED:: f+locals ( a: float b: float -- c: float )
     a b + ;
index 50da7b1bad5e1386c45c563058ad97cb44837662..fe2ba417220650e9179f494e64005a6a8073092b 100644 (file)
@@ -7,7 +7,7 @@ locals.parser macros stack-checker.dependencies ;
 FROM: classes.tuple.private => tuple-layout ;
 IN: typed
 
-ERROR: type-mismatch-error word expected-types ;
+ERROR: type-mismatch-error value expected-type word expected-types ;
 ERROR: input-mismatch-error < type-mismatch-error ;
 ERROR: output-mismatch-error < type-mismatch-error ;
 
@@ -28,9 +28,6 @@ PREDICATE: typed-word < word "typed-word" word-prop >boolean ;
 : typed-stack-effect? ( effect -- ? )
     [ object = ] all? not ;
 
-: input-mismatch-quot ( word types -- quot )
-    [ input-mismatch-error ] 2curry ;
-
 : depends-on-unboxing ( class -- )
     [ dup tuple-layout depends-on-tuple-layout ]
     [ depends-on-final ]
@@ -47,7 +44,7 @@ PREDICATE: typed-word < word "typed-word" word-prop >boolean ;
 
 :: unboxer ( error-quot word types type -- quot )
     type "coercer" word-prop [ ] or
-    [ dup type instance? [ word types error-quot call ] unless ]
+    type type word types error-quot '[ dup _ instance? [ _ _ _ @ ] unless ]
     type (unboxer)
     compose compose ;
 
index 0ce6a8cb085fd918536c1efcb5410e5e0c6fcb0d..7982458bb420b28970a60385087003a8115d6f58 100644 (file)
@@ -1,14 +1,14 @@
 ! Copyright (C) 2006, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types arrays assocs classes cocoa
-cocoa.application cocoa.classes cocoa.messages cocoa.nibs
+USING: accessors alien.c-types alien.data arrays assocs classes
+cocoa cocoa.application cocoa.classes cocoa.messages cocoa.nibs
 cocoa.pasteboard cocoa.runtime cocoa.subclassing cocoa.types
 cocoa.views cocoa.windows combinators command-line
 core-foundation core-foundation.run-loop core-graphics
 core-graphics.types destructors fry generalizations io.thread
-kernel libc literals locals math math.bitwise math.rectangles memory
-namespaces sequences threads ui colors
-ui.backend ui.backend.cocoa.views ui.clipboards ui.gadgets
+kernel libc literals locals math math.bitwise math.rectangles
+memory namespaces sequences threads ui colors ui.backend
+ui.backend.cocoa.views ui.clipboards ui.gadgets
 ui.gadgets.worlds ui.pixel-formats ui.pixel-formats.private
 ui.private words.symbol ;
 IN: ui.backend.cocoa
@@ -55,8 +55,11 @@ M: cocoa-ui-backend (free-pixel-format)
 M: cocoa-ui-backend (pixel-format-attribute)
     [ handle>> ] [ >NSOpenGLPFA ] bi*
     [ drop f ]
-    [ first 0 <int> [ swap 0 -> getValues:forAttribute:forVirtualScreen: ] keep *int ]
-    if-empty ;
+    [
+        first
+        { int } [ swap 0 -> getValues:forAttribute:forVirtualScreen: ] [ ]
+        with-out-parameters
+    ] if-empty ;
 
 TUPLE: pasteboard handle ;
 
@@ -249,7 +252,7 @@ M: cocoa-ui-backend (with-ui)
             init-clipboard
             cocoa-startup-hook get call( -- )
             start-ui
-            f io-thread-running? set-global
+            stop-io-thread
             init-thread-timer
             reset-run-loop
             NSApp -> run
index 8dae849a1fa0bed133cf271d04eb9f087a131fa3..0e0de674404dc4b353b64c77d3a3bf5eb512e4b4 100755 (executable)
@@ -59,16 +59,16 @@ PIXEL-FORMAT-ATTRIBUTE-TABLE: WGL_ARB { $ WGL_SUPPORT_OPENGL_ARB 1 } H{
     drop f ;
 
 : arb-make-pixel-format ( world attributes -- pf )
-    [ handle>> hDC>> ] dip >WGL_ARB-int-array f 1 0 <int> 0 <int>
-    [ wglChoosePixelFormatARB win32-error=0/f ] 2keep drop *int ;
+    [ handle>> hDC>> ] dip >WGL_ARB-int-array f 1 { int int }
+    [ wglChoosePixelFormatARB win32-error=0/f ] [ ] with-out-parameters drop ;
 
 : arb-pixel-format-attribute ( pixel-format attribute -- value )
     >WGL_ARB
     [ drop f ] [
         [ [ world>> handle>> hDC>> ] [ handle>> ] bi 0 1 ] dip
-        first <int> 0 <int>
-        [ wglGetPixelFormatAttribivARB win32-error=0/f ]
-        keep *int
+        first <int> { int }
+        [ wglGetPixelFormatAttribivARB win32-error=0/f ] [ ]
+        with-out-parameters
     ] if-empty ;
 
 CONSTANT: pfd-flag-map H{
@@ -248,7 +248,7 @@ CONSTANT: window-control>ex-style
         { minimize-button 0 }
         { maximize-button 0 }
         { resize-handles $ WS_EX_WINDOWEDGE }
-        { small-title-bar $ WS_EX_TOOLWINDOW }
+        { small-title-bar $[ WS_EX_TOOLWINDOW WS_EX_TOPMOST bitor ] }
         { normal-title-bar $ WS_EX_APPWINDOW }
     }
 
@@ -797,7 +797,7 @@ M: windows-ui-backend system-alert
 : client-area>RECT ( hwnd -- RECT )
     RECT <struct>
     [ GetClientRect win32-error=0/f ]
-    [ >c-ptr byte-array>POINT-array [ ClientToScreen drop ] with each ]
+    [ >c-ptr POINT-array-cast [ ClientToScreen drop ] with each ]
     [ nip ] 2tri ;
 
 : hwnd>RECT ( hwnd -- RECT )
@@ -832,24 +832,25 @@ CONSTANT: fullscreen-flags flags{ WS_CAPTION WS_BORDER WS_THICKFRAME }
     } cleave ;
 
 : exit-fullscreen ( world -- )
-    dup handle>> hWnd>>
+    [ handle>> hWnd>> ] [ world>style ] bi
     {
-        [ GWL_STYLE rot world>style SetWindowLong win32-error=0/f ]
+        [ [ GWL_STYLE ] dip SetWindowLong win32-error=0/f ]
         [
+            drop
             f
             over hwnd>RECT get-RECT-dimensions
             flags{ SWP_NOMOVE SWP_NOSIZE SWP_NOZORDER SWP_FRAMECHANGED }
             SetWindowPos win32-error=0/f
         ]
-        [ SW_RESTORE ShowWindow win32-error=0/f ]
-    } cleave ;
+        [ drop SW_RESTORE ShowWindow win32-error=0/f ]
+    } 2cleave ;
 
 M: windows-ui-backend (set-fullscreen) ( ? world -- )
     [ enter-fullscreen ] [ exit-fullscreen ] if ;
 
 M: windows-ui-backend (fullscreen?) ( world -- ? )
-    [ handle>> hWnd>> hwnd>RECT ]
-    [ handle>> hWnd>> fullscreen-RECT ] bi
+    handle>> hWnd>>
+    [ hwnd>RECT ] [ fullscreen-RECT ] bi
     [ get-RECT-dimensions 2array 2nip ] bi@ = ;
 
 windows-ui-backend ui-backend set-global
index 2f979ee4f134969aa25aed616258093711e09621..f3d603ddd8fe920a33eb64f8a4878bcd89ca42f4 100644 (file)
@@ -1,19 +1,52 @@
-! Copyright (C) 2005, 2010 Eduardo Cavazos and Slava Pestov
+! Copyright (C) 2005, 2010 Eduardo Cavazos, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types ascii assocs classes.struct combinators
-combinators.short-circuit command-line environment io.encodings.ascii
-io.encodings.string io.encodings.utf8 kernel literals locals math
-namespaces sequences specialized-arrays.instances.alien.c-types.uchar
-strings ui ui.backend ui.clipboards ui.event-loop ui.gadgets
-ui.gadgets.private ui.gadgets.worlds ui.gestures ui.pixel-formats
-ui.pixel-formats.private ui.private x11 x11.clipboard x11.constants
-x11.events x11.glx x11.io x11.windows x11.xim x11.xlib ;
-FROM: unix.ffi => system ;
+USING: accessors arrays alien.c-types alien.data alien.syntax ascii
+assocs classes.struct combinators combinators.short-circuit
+command-line environment io.encodings.ascii io.encodings.string
+io.encodings.utf8 kernel literals locals math namespaces
+sequences specialized-arrays strings ui ui.backend ui.clipboards
+ui.event-loop ui.gadgets ui.gadgets.private ui.gadgets.worlds
+ui.gestures ui.pixel-formats ui.pixel-formats.private ui.private
+x11 x11.clipboard x11.constants x11.events x11.glx x11.io
+x11.windows x11.xim x11.xlib ;
+FROM: libc => system ;
+SPECIALIZED-ARRAYS: uchar ulong ;
 IN: ui.backend.x11
 
 SINGLETON: x11-ui-backend
 
+: XA_NET_SUPPORTED ( -- atom ) "_NET_SUPPORTED" x-atom ;
 : XA_NET_WM_NAME ( -- atom ) "_NET_WM_NAME" x-atom ;
+: XA_NET_WM_STATE ( -- atom ) "_NET_WM_STATE" x-atom ;
+: XA_NET_WM_STATE_FULLSCREEN ( -- atom ) "_NET_WM_STATE_FULLSCREEN" x-atom ;
+: XA_NET_ACTIVE_WINDOW ( -- atom ) "_NET_ACTIVE_WINDOW" x-atom ;
+
+: supported-net-wm-hints ( -- seq )
+    { Atom int ulong ulong pointer: Atom }
+    [| type format n-atoms bytes-after atoms |
+        dpy get
+        root get
+        XA_NET_SUPPORTED
+        0
+        ulong c-type-interval nip
+        0
+        XA_ATOM
+        type
+        format
+        n-atoms
+        bytes-after
+        atoms
+        XGetWindowProperty
+        Success assert=
+    ]
+    [| type format n-atoms bytes-after atoms |
+        atoms n-atoms <direct-ulong-array> >array
+        atoms XFree
+    ]
+    with-out-parameters ;
+
+: net-wm-hint-supported? ( atom -- ? )
+    supported-net-wm-hints member? ;
 
 TUPLE: x11-handle-base glx ;
 TUPLE: x11-handle < x11-handle-base window xic ;
@@ -29,7 +62,7 @@ M: world configure-event
     ! In case dimensions didn't change
     relayout-1 ;
 
-PIXEL-FORMAT-ATTRIBUTE-TABLE: glx-visual { $ GLX_USE_GL $ GLX_RGBA } H{
+PIXEL-FORMAT-ATTRIBUTE-TABLE: glx-visual { $ GLX_RGBA } H{
     { double-buffered { $ GLX_DOUBLEBUFFER } }
     { stereo { $ GLX_STEREO } }
     { color-bits { $ GLX_BUFFER_SIZE } }
@@ -60,7 +93,7 @@ M: x11-ui-backend (pixel-format-attribute)
     [ handle>> ] [ >glx-visual ] bi*
     [ 2drop f ] [
         first
-        0 <int> [ glXGetConfig drop ] keep *int
+        { int } [ glXGetConfig drop ] [ ] with-out-parameters
     ] if-empty ;
 
 CONSTANT: modifiers
@@ -171,8 +204,7 @@ M: world selection-notify-event
     user-input ;
 
 : supported-type? ( atom -- ? )
-    { "UTF8_STRING" "STRING" "TEXT" }
-    [ x-atom = ] with any? ;
+    XA_UTF8_STRING XA_STRING XA_TEXT 3array member? ;
 
 : clipboard-for-atom ( atom -- clipboard )
     {
@@ -195,8 +227,8 @@ M: world selection-notify-event
 M: world selection-request-event
     drop dup target>> {
         { [ dup supported-type? ] [ drop dup set-selection-prop send-notify-success ] }
-        { [ dup "TARGETS" x-atom = ] [ drop dup set-targets-prop send-notify-success ] }
-        { [ dup "TIMESTAMP" x-atom = ] [ drop dup set-timestamp-prop send-notify-success ] }
+        { [ dup XA_TARGETS = ] [ drop dup set-targets-prop send-notify-success ] }
+        { [ dup XA_TIMESTAMP = ] [ drop dup set-timestamp-prop send-notify-success ] }
         [ drop send-notify-failure ]
     } cond ;
 
@@ -257,31 +289,57 @@ M: x11-ui-backend set-title ( string world -- )
     handle>> window>> swap
     [ dpy get ] 2dip [ set-title-old ] [ set-title-new ] 3bi ;
 
-: make-fullscreen-msg ( world ? -- msg )
+: make-fullscreen-msg ( window ? -- msg )
     XClientMessageEvent <struct>
-    ClientMessage >>type
-    dpy get >>display
-    "_NET_WM_STATE" x-atom >>message_type
-    swap _NET_WM_STATE_ADD _NET_WM_STATE_REMOVE ? >>data0
-    swap handle>> window>> >>window
-    32 >>format
-    "_NET_WM_STATE_FULLSCREEN" x-atom >>data1 ;
+        ClientMessage >>type
+        dpy get >>display
+        XA_NET_WM_STATE >>message_type
+        swap _NET_WM_STATE_ADD _NET_WM_STATE_REMOVE ? >>data0
+        swap >>window
+        32 >>format
+        XA_NET_WM_STATE_FULLSCREEN >>data1 ;
+
+: send-event ( event -- )
+    [
+        dpy get
+        root get
+        0
+        SubstructureNotifyMask SubstructureRedirectMask bitor
+    ] dip XSendEvent drop ;
 
 M: x11-ui-backend (set-fullscreen) ( world ? -- )
-    [ dpy get root get 0 SubstructureNotifyMask ] 2dip
-    make-fullscreen-msg XSendEvent drop ;
+    [ handle>> window>> ] dip make-fullscreen-msg send-event ;
 
 M: x11-ui-backend (open-window) ( world -- )
-    dup gadget-window
-    handle>> window>>
-    [ set-closable ] [ dpy get swap set-class ] [ map-window ] tri ;
+    dup gadget-window handle>> window>>
+    [ set-closable ]
+    [ [ dpy get ] dip set-class ]
+    [ map-window ]
+    tri ;
+
+: make-raise-window-msg ( window -- msg )
+    XClientMessageEvent <struct>
+        ClientMessage >>type
+        1 >>send_event
+        dpy get >>display
+        swap >>window
+        XA_NET_ACTIVE_WINDOW >>message_type
+        32 >>format ;
+
+: raise-window-new ( window -- )
+    make-raise-window-msg send-event ;
+
+: raise-window-old ( window -- )
+    [ dpy get ] dip
+    [ RevertToPointerRoot CurrentTime XSetInputFocus drop ]
+    [ XRaiseWindow drop ]
+    2bi ;
 
 M: x11-ui-backend raise-window* ( world -- )
     handle>> [
-        dpy get swap window>>
-        [ RevertToPointerRoot CurrentTime XSetInputFocus drop ]
-        [ XRaiseWindow drop ]
-        2bi
+        window>>
+        XA_NET_ACTIVE_WINDOW net-wm-hint-supported?
+        [ raise-window-new ] [ raise-window-old ] if
     ] when* ;
 
 M: x11-handle select-gl-context ( handle -- )
index da60d66afff72794d83ee90b6919bf2b23fc036a..4777e42abcaa28e65dbd98482f604be67d302e4d 100644 (file)
@@ -60,14 +60,11 @@ SYMBOL: blink-interval
 750 milliseconds blink-interval set-global
 
 : stop-blinking ( editor -- )
-    [ [ cancel-alarm ] when* f ] change-blink-alarm drop ;
+    blink-alarm>> [ stop-alarm ] when* ;
 
 : start-blinking ( editor -- )
-    [ stop-blinking ] [
-        t >>blink
-        dup '[ _ blink-caret ] blink-interval get every
-        >>blink-alarm drop
-    ] bi ;
+    t >>blink
+    blink-alarm>> [ restart-alarm ] when* ;
 
 : restart-blinking ( editor -- )
     dup focused?>> [
@@ -80,10 +77,15 @@ PRIVATE>
 
 M: editor graft*
     [ dup caret>> activate-editor-model ]
-    [ dup mark>> activate-editor-model ] bi ;
+    [ dup mark>> activate-editor-model ]
+    [
+        [
+            '[ _ blink-caret ] blink-interval get dup <alarm>
+        ] keep blink-alarm<<
+    ] tri ;
 
 M: editor ungraft*
-    [ stop-blinking ]
+    [ [ stop-blinking ] [ f >>blink-alarm drop ] bi ]
     [ dup caret>> deactivate-editor-model ]
     [ dup mark>> deactivate-editor-model ] tri ;
 
index cdee1ab02d46de7acec810951d7f142739a19606..a63d64312be1663e3db01017319b50ae7e4115dc 100644 (file)
@@ -20,7 +20,6 @@ CONSTANT: default-world-pixel-format-attributes
     {
         windowed
         double-buffered
-        T{ depth-bits { value 16 } }
     }
 
 CONSTANT: default-world-window-controls
index a45c325cc6c114c18b6f135704230a90bcdcbbf6..41b7f69cbe31b1b8a1c5060a3b14c8d8924d943d 100644 (file)
@@ -188,13 +188,15 @@ SYMBOL: drag-timer
         [ drag-gesture ]
         300 milliseconds
         100 milliseconds
-        add-alarm drag-timer get-global >box
+        <alarm>
+        [ drag-timer get-global >box ]
+        [ start-alarm ] bi
     ] when ;
 
 : stop-drag-timer ( -- )
     hand-buttons get-global empty? [
         drag-timer get-global ?box
-        [ cancel-alarm ] [ drop ] if
+        [ stop-alarm ] [ drop ] if
     ] when ;
 
 : fire-motion ( -- )
index 8ce90742258768bab3a321969611561cab977b36..84edbc35c36426bdb34f63be5ef5c9fd6fb0b1d1 100644 (file)
@@ -35,6 +35,8 @@ SLOT: background-color
     GL_BLEND glEnable
     GL_SRC_ALPHA GL_ONE_MINUS_SRC_ALPHA glBlendFunc
     GL_VERTEX_ARRAY glEnableClientState
+    GL_PACK_ALIGNMENT 1 glPixelStorei
+    GL_UNPACK_ALIGNMENT 1 glPixelStorei
     init-matrices
     [ init-clip ]
     [
index ffd0c4cd0ed16d774931ad8157d6fa7feb233624..bd877e66e45d059947f7033f27acef1a8ae18afb 100644 (file)
@@ -195,6 +195,7 @@ TUPLE: listener-gadget < tool error-summary output scroller input ;
         H{ { table-gap { 3 3 } } } [
             [ [ [ icon>> write-image ] with-cell ] each ] with-row
         ] tabular-output
+        last-element off
         { "Press " { $command tool "common" show-error-list } " to view errors." }
         print-element
     ] unless-empty ;
index 42bc0ef1f22d7b58a023badf037ce67418b7f96c..1b5fcb50c43a9f86ac3f1f0526d7d911ffcddea7 100644 (file)
@@ -5,10 +5,7 @@ ui.tools.listener ui.tools.browser ui.tools.common ui.tools.error-list
 ui.tools.walker ui.commands ui.gestures ui ui.private ;
 IN: ui.tools
 
-: main ( -- )
-    restore-windows? [ restore-windows ] [ listener-window ] if ;
-
-MAIN: main
+MAIN: listener-window
 
 \ refresh-all H{ { +nullary+ t } { +listener+ t } } define-command
 
index b2f97857f636dba93075c3c2cb19145426332ef6..64eb5db07ef113a882fe9eddd7f21fc99205ab4f 100644 (file)
@@ -73,10 +73,10 @@ HELP: raise-window
 { $description "Makes the native window containing the given gadget the front-most window." } ;
 
 HELP: with-ui
-{ $values { "quot" quotation } }
-{ $description "Calls the quotation, starting the UI first if necessary." }
-{ $notes "This combinator should be used in the " { $link POSTPONE: MAIN: } " word of a vocabulary, in order for the vocabulary to work when run from the UI listener (" { $snippet "\"my-app\" run" } " and the command line (" { $snippet "./factor -run=my-app" } ")." }
-{ $examples "The " { $vocab-link "hello-ui" } " vocabulary implements a simple UI application which uses this combinator." } ;
+{ $values { "quot" { $quotation "( -- )" } } }
+{ $description "Calls the quotation, starting the UI first if necessary. If the UI is started, this word does not return." }
+{ $notes "This word should be used in the " { $link POSTPONE: MAIN: } " word of an application that uses the UI in order for the vocabulary to work when run from either the UI listener (" { $snippet "\"my-app\" run" } " and the command line (" { $snippet "./factor -run=my-app" } ")." }
+{ $examples "The " { $vocab-link "hello-ui" } " vocabulary implements a simple UI application which uses this word." } ;
 
 HELP: beep
 { $description "Plays the system beep sound." } ;
index bf186ee9a81b19f0a2e7d5046879cbadbf96e997..1e5af88ac85fae96a994a4ba0adbfc52523c04ee 100644 (file)
@@ -1,11 +1,12 @@
-! Copyright (C) 2006, 2009 Slava Pestov.
+! Copyright (C) 2006, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: arrays assocs io kernel math models namespaces make dlists
-deques sequences threads words continuations init
-combinators combinators.short-circuit hashtables concurrency.flags
-sets accessors calendar fry destructors ui.gadgets ui.gadgets.private
-ui.gadgets.worlds ui.gadgets.tracks ui.gestures ui.backend ui.render
-strings classes.tuple classes.tuple.parser lexer vocabs.parser parser ;
+USING: arrays assocs boxes io kernel math models namespaces make
+dlists deques sequences threads words continuations init
+combinators combinators.short-circuit hashtables
+concurrency.flags sets accessors calendar fry destructors
+ui.gadgets ui.gadgets.private ui.gadgets.worlds
+ui.gadgets.tracks ui.gestures ui.backend ui.render strings
+classes.tuple classes.tuple.parser lexer vocabs.parser parser ;
 IN: ui
 
 <PRIVATE
@@ -82,12 +83,7 @@ M: world graft*
         [ [ clean-up-broken-window ] [ ui-error ] bi* ] recover
     ] bi ;
 
-: reset-world ( world -- )
-    #! This is used when a window is being closed, but also
-    #! when restoring saved worlds on image startup.
-    f >>handle unfocus-world ;
-
-: (ungraft-world) ( world -- )
+M: world ungraft*
     {
         [ set-gl-context ]
         [ text-handle>> [ dispose ] when* ]
@@ -96,38 +92,21 @@ M: world graft*
         [ hand-gadget close-global ]
         [ end-world ]
         [ [ <reversed> [ [ dispose ] when* ] each V{ } clone ] change-window-resources drop ]
+        [ [ (close-window) f ] change-handle drop ]
+        [ unfocus-world ]
     } cleave ;
 
-M: world ungraft*
-    [ (ungraft-world) ]
-    [ handle>> (close-window) ]
-    [ reset-world ] tri ;
-
 : init-ui ( -- )
+    <box> drag-timer set-global
+    f hand-gadget set-global
+    f hand-clicked set-global
+    f hand-world set-global
+    f world set-global
     <dlist> \ graft-queue set-global
     <dlist> \ layout-queue set-global
     <dlist> \ gesture-queue set-global
     V{ } clone windows set-global ;
 
-: restore-gadget-later ( gadget -- )
-    dup graft-state>> {
-        { { f f } [ ] }
-        { { f t } [ ] }
-        { { t t } [ { f f } >>graft-state ] }
-        { { t f } [ dup unqueue-graft { f f } >>graft-state ] }
-    } case graft-later ;
-
-: restore-gadget ( gadget -- )
-    dup restore-gadget-later
-    children>> [ restore-gadget ] each ;
-
-: restore-world ( world -- )
-    {
-        [ reset-world ]
-        [ f >>text-handle f >>images drop ]
-        [ restore-gadget ]
-    } cleave ;
-
 : update-hand ( world -- )
     dup hand-world get-global eq?
     [ hand-loc get-global swap move-hand ] [ drop ] if ;
@@ -188,16 +167,6 @@ PRIVATE>
 : start-ui ( quot -- )
     call( -- ) notify-ui-thread start-ui-thread ;
 
-: restore-windows ( -- )
-    [
-        windows get [ values ] [ delete-all ] bi
-        [ restore-world ] each
-        forget-rollover
-    ] (with-ui) ;
-
-: restore-windows? ( -- ? )
-    windows get empty? not ;
-
 : ?attributes ( gadget title/attributes -- attributes )
     dup string? [ world-attributes new swap >>title ] [ clone ] if
     swap [ [ [ 1array ] [ f ] if* ] curry unless* ] curry change-gadgets ;
@@ -238,7 +207,7 @@ M: object close-window
     <flag> ui-notify-flag set-global
 ] "ui" add-startup-hook
 
-: with-ui ( quot -- )
+: with-ui ( quot: ( -- ) -- )
     ui-running? [ call( -- ) ] [ '[ init-ui @ ] (with-ui) ] if ;
 
 HOOK: beep ui-backend ( -- )
index ff4e64df295eccea8b43febcb10e484e8fd3a547..b2cb4d205d380f9d0ef64a1f92a413bfaa813e25 100644 (file)
@@ -209,7 +209,7 @@ load-data {
 } cleave
 
 : postprocess-class ( -- )
-    combine-map [ [ second ] map ] map concat
+    combine-map [ values ] map concat
     [ combining-class not ] filter
     [ 0 swap class-map set-at ] each ;
 
index 1809ee4b687bc09b7b51ab1326f22d4af2e67e8b..26cdc22bc17b1d1fe28d530a8cd4b6221422a00c 100644 (file)
@@ -151,7 +151,6 @@ FUNCTION: int setuid ( uid_t uid ) ;
 FUNCTION: int socket ( int domain, int type, int protocol ) ;
 FUNCTION: int symlink ( c-string path1, c-string path2 ) ;
 FUNCTION: int link ( c-string path1, c-string path2 ) ;
-FUNCTION: int system ( c-string command ) ;
 FUNCTION: int unlink ( c-string path ) ;
 FUNCTION: int utimes ( c-string path, timeval[2] times ) ;
 FUNCTION: ssize_t write ( int fd, void* buf, size_t nbytes ) ;
index 1e9129af58aefc224671fba0994f5ff33aaa8acf..a112b9829a6ab9ca52d420990772b3ffe3add138 100644 (file)
@@ -95,6 +95,3 @@ CONSTANT: WNOWAIT    HEX: 1000000
 
 FUNCTION: pid_t wait ( int* status ) ;
 FUNCTION: pid_t waitpid ( pid_t wpid, int* status, int options ) ;
-
-: wait-for-pid ( pid -- status )
-    0 <int> [ 0 waitpid drop ] keep *int WEXITSTATUS ;
index d860bf490ea403edc6095d15dfc3c9acf5bfaba9..101736ea1f76681775989406def1f41ef4d500b4 100644 (file)
@@ -5,8 +5,8 @@ USING: accessors alien alien.c-types alien.libraries
 alien.syntax byte-arrays classes.struct combinators
 combinators.short-circuit combinators.smart continuations
 generalizations io kernel libc locals macros math namespaces
-sequences stack-checker strings system unix.time unix.types
-vocabs vocabs.loader unix.ffi ;
+sequences sequences.generalizations stack-checker strings system
+unix.time unix.types vocabs vocabs.loader unix.ffi ;
 IN: unix
 
 ERROR: unix-error errno message ;
index 6274921bdb51f2462b8151ae501a650aba9c2c8b..c9b664dc91fda9927e3edd2a03f9eb6f3cc7a9eb 100644 (file)
@@ -1,59 +1,58 @@
-! Copyright (C) 2008, 2009 Slava Pestov.\r
-! See http://factorcode.org/license.txt for BSD license.\r
-USING: accessors assocs command-line concurrency.messaging\r
-continuations init io.backend io.files io.monitors io.pathnames\r
-kernel namespaces sequences sets splitting threads\r
-tr vocabs vocabs.loader vocabs.refresh vocabs.cache ;\r
-IN: vocabs.refresh.monitor\r
-\r
-TR: convert-separators "/\\" ".." ;\r
-\r
-: vocab-dir>vocab-name ( path -- vocab )\r
-    trim-head-separators\r
-    trim-tail-separators\r
-    convert-separators ;\r
-\r
-: path>vocab-name ( path -- vocab )\r
-    dup ".factor" tail? [ parent-directory ] when ;\r
-\r
-: chop-vocab-root ( path -- path' )\r
-    "resource:" prepend-path normalize-path\r
-    dup vocab-roots get\r
-    [ normalize-path ] map\r
-    [ head? ] with find nip\r
-    ?head drop ;\r
-\r
-: path>vocab ( path -- vocab )\r
-    chop-vocab-root path>vocab-name vocab-dir>vocab-name ;\r
-\r
-: monitor-loop ( -- )\r
-    #! On OS X, monitors give us the full path, so we chop it\r
-    #! off if its there.\r
-    receive path>> path>vocab changed-vocab\r
-    reset-cache\r
-    monitor-loop ;\r
-\r
-: add-monitor-for-path ( path -- )\r
-    dup exists? [ t my-mailbox (monitor) ] when drop ;\r
-\r
-: monitor-thread ( -- )\r
-    [\r
-        [\r
-            vocab-roots get [ add-monitor-for-path ] each\r
-\r
-            H{ } clone changed-vocabs set-global\r
-            vocabs [ changed-vocab ] each\r
-\r
-            monitor-loop\r
-        ] with-monitors\r
-    ] ignore-errors ;\r
-\r
-: start-monitor-thread ( -- )\r
-    #! Silently ignore errors during monitor creation since\r
-    #! monitors are not supported on all platforms.\r
-    [ monitor-thread ] "Vocabulary monitor" spawn drop ;\r
-\r
-[\r
-    "-no-monitors" (command-line) member?\r
-    [ start-monitor-thread ] unless\r
-] "vocabs.refresh.monitor" add-startup-hook\r
+! Copyright (C) 2008, 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs command-line concurrency.messaging
+continuations init io.backend io.files io.monitors io.pathnames
+kernel namespaces sequences sets splitting threads fry
+tr vocabs vocabs.loader vocabs.refresh vocabs.cache ;
+IN: vocabs.refresh.monitor
+
+TR: convert-separators "/\\" ".." ;
+
+: vocab-dir>vocab-name ( path -- vocab )
+    trim-head-separators
+    trim-tail-separators
+    convert-separators ;
+
+: path>vocab-name ( path -- vocab )
+    dup ".factor" tail? [ parent-directory ] when ;
+
+: chop-vocab-root ( path -- path' )
+    "resource:" prepend-path normalize-path
+    dup vocab-roots get
+    [ normalize-path ] map
+    [ head? ] with find nip
+    ?head drop ;
+
+: path>vocab ( path -- vocab )
+    chop-vocab-root path>vocab-name vocab-dir>vocab-name ;
+
+: monitor-loop ( monitor -- )
+    #! On OS X, monitors give us the full path, so we chop it
+    #! off if its there.
+    [ next-change path>> path>vocab changed-vocab reset-cache ]
+    [ monitor-loop ]
+    bi ;
+
+: (start-vocab-monitor) ( vocab-root -- )
+    dup exists?
+    [ [ t <monitor> monitor-loop ] with-monitors ] [ drop ] if ;
+
+: start-vocab-monitor ( vocab-root -- )
+    [ '[ [ _ (start-vocab-monitor) ] ignore-errors ] ]
+    [ "Root monitor: " prepend ]
+    bi spawn drop ;
+
+: init-vocab-monitor ( -- )
+    H{ } clone changed-vocabs set-global
+    vocabs [ changed-vocab ] each ;
+
+[
+    "-no-monitors" (command-line) member? [
+        [ drop ] add-vocab-root-hook set-global
+        f changed-vocabs set-global
+    ] [
+        init-vocab-monitor
+        vocab-roots get [ start-vocab-monitor ] each
+        [ start-vocab-monitor ] add-vocab-root-hook set-global
+    ] if
+] "vocabs.refresh.monitor" add-startup-hook
index 6f92c8b860cfd8f97f0481b4f7f6e7feef210110..20de2a9e4e3d9149060b1e037caf4a6414217340 100644 (file)
@@ -118,7 +118,7 @@ unless
     ] 2map ;
 
 : (make-callbacks) ( implementations -- sequence )
-    dup [ first ] map (make-iunknown-methods)
+    dup keys (make-iunknown-methods)
     [ [ first2 ] 2dip swap (make-interface-callbacks) ]
     curry map-index ;
 
index 60fa5b4d83e8fc8e1e06c24273dfaace5efe9513..b9830a5347eb549a3be748c52c982410452de931 100755 (executable)
@@ -34,5 +34,5 @@ CONSTANT: WM_DWMCOMPOSITIONCHANGED HEX: 31E
 
 : composition-enabled? ( -- ? )
     windows-major 6 >=
-    [ 0 <int> [ DwmIsCompositionEnabled drop ] keep *int c-bool> ]
+    [ { bool } [ DwmIsCompositionEnabled drop ] [ ] with-out-parameters ]
     [ f ] if ;
index 4b4847f964c8011cf8f6f6fba512ef90bc5f8862..c2587698d0f53e5d97394d36e7e5247dcfb6537e 100644 (file)
@@ -26,8 +26,8 @@ IN: windows.offscreen
 : make-bitmap ( dim dc -- hBitmap bits )
     [ nip ]
     [
-        swap (bitmap-info) DIB_RGB_COLORS f <void*>
-        [ f 0 CreateDIBSection ] keep *void*
+        swap (bitmap-info) DIB_RGB_COLORS { void* }
+        [ f 0 CreateDIBSection ] [ ] with-out-parameters
     ] 2bi
     [ [ SelectObject drop ] keep ] dip ;
 
old mode 100644 (file)
new mode 100755 (executable)
index 2783840..92fec0a
@@ -2,10 +2,10 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel assocs math sequences fry io.encodings.string
 io.encodings.utf16n accessors arrays combinators destructors
-cache namespaces init fonts alien.c-types windows.usp10
-windows.offscreen windows.gdi32 windows.ole32 windows.types
-windows.fonts opengl.textures locals windows.errors
-classes.struct ;
+cache namespaces init fonts alien.c-types alien.data
+windows.usp10 windows.offscreen windows.gdi32 windows.ole32
+windows.types windows.fonts opengl.textures locals
+windows.errors classes.struct ;
 IN: windows.uniscribe
 
 TUPLE: script-string < disposable font string metrics ssa size image ;
@@ -20,14 +20,12 @@ TUPLE: script-string < disposable font string metrics ssa size image ;
         swap ! icp
         FALSE ! fTrailing
     ] if
-    0 <int> [ ScriptStringCPtoX ole32-error ] keep *int ;
+    { int } [ ScriptStringCPtoX ole32-error ] [ ] with-out-parameters ;
 
 : x>line-offset ( x script-string -- n trailing )
     ssa>> ! ssa
     swap ! iX
-    0 <int> ! pCh
-    0 <int> ! piTrailing
-    [ ScriptStringXtoCP ole32-error ] 2keep [ *int ] bi@ ;
+    { int int } [ ScriptStringXtoCP ole32-error ] [ ] with-out-parameters ;
 
 <PRIVATE
 
index c08ff1d1768989bc4436f7967001d0338ce07d0f..496b9d688c3ea9ee381e4f6bcf836a59d1d2b69f 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2006, 2007 Slava Pestov
+! Copyright (C) 2006, 2010 Slava Pestov
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien.c-types alien.strings classes.struct
 io.encodings.utf8 kernel namespaces sequences
@@ -10,8 +10,10 @@ IN: x11.clipboard
 ! and http://common-lisp.net/~crhodes/clx/demo/clipboard.lisp.
 
 : XA_CLIPBOARD ( -- atom ) "CLIPBOARD" x-atom ;
-
 : XA_UTF8_STRING ( -- atom ) "UTF8_STRING" x-atom ;
+: XA_TARGETS ( -- atom ) "TARGETS" x-atom ;
+: XA_TIMESTAMP ( -- atom ) "TIMESTAMP" x-atom ;
+: XA_TEXT ( -- atom ) "TEXT" x-atom ;
 
 TUPLE: x-clipboard atom contents ;
 
@@ -43,16 +45,14 @@ TUPLE: x-clipboard atom contents ;
 
 : set-targets-prop ( evt -- )
     [ dpy get ] dip [ requestor>> ] [ property>> ] bi
-    "TARGETS" x-atom 32 PropModeReplace
-    {
-        "UTF8_STRING" "STRING" "TARGETS" "TIMESTAMP"
-    } [ x-atom ] int-array{ } map-as
+    XA_TARGETS 32 PropModeReplace
+    XA_UTF8_STRING XA_STRING XA_TARGETS XA_TIMESTAMP int-array{ } 4sequence
     4 XChangeProperty drop ;
 
 : set-timestamp-prop ( evt -- )
     [ dpy get ] dip
     [ requestor>> ]
-    [ property>> "TIMESTAMP" x-atom 32 PropModeReplace ]
+    [ property>> XA_TIMESTAMP 32 PropModeReplace ]
     [ time>> <int> ] tri
     1 XChangeProperty drop ;
 
index 1a5b94c241670062c607468e2f29c37e92cb2c0a..949c751de5ab30f5ae37602eba270a22c8c5bca7 100644 (file)
@@ -1,7 +1,8 @@
-! Copyright (C) 2005, 2006 Eduardo Cavazos and Slava Pestov
+! Copyright (C) 2005, 2010 Eduardo Cavazos, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors arrays classes.struct combinators kernel
-math.order namespaces x11 x11.xlib ;
+USING: accessors arrays classes.struct combinators
+combinators.short-circuit kernel math.order namespaces
+x11 x11.xlib ;
 IN: x11.events
 
 GENERIC: expose-event ( event window -- )
@@ -75,7 +76,11 @@ GENERIC: client-event ( event window -- )
 : event-dim ( event -- dim )
     [ width>> ] [ height>> ] bi 2array ;
 
+: XA_WM_PROTOCOLS ( -- atom ) "WM_PROTOCOLS" x-atom ;
+: XA_WM_DELETE_WINDOW ( -- atom ) "WM_DELETE_WINDOW" x-atom ;
+
 : close-box? ( event -- ? )
-    [ message_type>> "WM_PROTOCOLS" x-atom = ]
-    [ data0>> "WM_DELETE_WINDOW" x-atom = ]
-    bi and ;
+    {
+        [ message_type>> XA_WM_PROTOCOLS = ]
+        [ data0>> XA_WM_DELETE_WINDOW = ]
+    } 1&& ;
diff --git a/basis/x11/windows/platforms.txt b/basis/x11/windows/platforms.txt
deleted file mode 100644 (file)
index 509143d..0000000
+++ /dev/null
@@ -1 +0,0 @@
-unix
index fb267ef4bbe128f8aeb104d3c64ca8fb440e23ef..1becb30f45f352bee99b62a50b2511729226d3bb 100644 (file)
@@ -1,8 +1,9 @@
-! Copyright (C) 2005, 2006 Eduardo Cavazos and Slava Pestov
+! Copyright (C) 2005, 2010 Eduardo Cavazos, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors kernel math math.bitwise math.vectors
-namespaces sequences x11 x11.xlib x11.constants x11.glx arrays
-fry classes.struct literals ;
+namespaces sequences arrays fry classes.struct literals
+x11 x11.xlib x11.constants x11.events
+x11.glx ;
 IN: x11.windows
 
 CONSTANT: create-window-mask
@@ -78,7 +79,7 @@ CONSTANT: event-mask
     dpy get swap XDestroyWindow drop ;
 
 : set-closable ( win -- )
-    dpy get swap "WM_DELETE_WINDOW" x-atom <Atom> 1
+    dpy get swap XA_WM_DELETE_WINDOW <Atom> 1
     XSetWMProtocols drop ;
 
 : map-window ( win -- ) dpy get swap XMapWindow drop ;
diff --git a/basis/x11/xinput2/authors.txt b/basis/x11/xinput2/authors.txt
new file mode 100644 (file)
index 0000000..8e15658
--- /dev/null
@@ -0,0 +1 @@
+Niklas Waern
diff --git a/basis/x11/xinput2/constants/authors.txt b/basis/x11/xinput2/constants/authors.txt
new file mode 100644 (file)
index 0000000..8e15658
--- /dev/null
@@ -0,0 +1 @@
+Niklas Waern
diff --git a/basis/x11/xinput2/constants/constants.factor b/basis/x11/xinput2/constants/constants.factor
new file mode 100644 (file)
index 0000000..e58928f
--- /dev/null
@@ -0,0 +1,141 @@
+! Copyright (C) 2010 Niklas Waern.
+! See http://factorcode.org/license.txt for BSD license.
+USING: math ;
+IN: x11.xinput2.constants
+
+! From XI2.h
+
+CONSTANT: XInput_2_0               7
+
+CONSTANT: XI_2_Major               2
+CONSTANT: XI_2_Minor               0
+
+! Property event flags
+CONSTANT: XIPropertyDeleted        0
+CONSTANT: XIPropertyCreated        1
+CONSTANT: XIPropertyModified       2
+
+! Enter/Leave and Focus In/Out modes
+CONSTANT: XINotifyNormal           0
+CONSTANT: XINotifyGrab             1
+CONSTANT: XINotifyUngrab           2
+CONSTANT: XINotifyWhileGrabbed     3
+CONSTANT: XINotifyPassiveGrab      4
+CONSTANT: XINotifyPassiveUngrab    5
+
+! Enter/Leave and Focus In/Out detail
+CONSTANT: XINotifyAncestor         0
+CONSTANT: XINotifyVirtual          1
+CONSTANT: XINotifyInferior         2
+CONSTANT: XINotifyNonlinear        3
+CONSTANT: XINotifyNonlinearVirtual 4
+CONSTANT: XINotifyPointer          5
+CONSTANT: XINotifyPointerRoot      6
+CONSTANT: XINotifyDetailNone       7
+
+! Passive grab types
+CONSTANT: XIGrabtypeButton         0
+CONSTANT: XIGrabtypeKeycode        1
+CONSTANT: XIGrabtypeEnter          2
+CONSTANT: XIGrabtypeFocusIn        3
+
+! Passive grab modifier
+: XIAnyModifier ( -- n )           31 2^ ; inline
+: XIAnyButton   ( -- n )           0     ; inline
+: XIAnyKeycode  ( -- n )           0     ; inline
+
+! XIAllowEvents event-modes
+CONSTANT: XIAsyncDevice            0
+CONSTANT: XISyncDevice             1
+CONSTANT: XIReplayDevice           2
+CONSTANT: XIAsyncPairedDevice      3
+CONSTANT: XIAsyncPair              4
+CONSTANT: XISyncPair               5
+
+! DeviceChangedEvent change reasons
+CONSTANT: XISlaveSwitch            1
+CONSTANT: XIDeviceChange           2
+
+! Hierarchy flags
+: XIMasterAdded    ( -- n )        0 2^ ; inline
+: XIMasterRemoved  ( -- n )        1 2^ ; inline
+: XISlaveAdded     ( -- n )        2 2^ ; inline
+: XISlaveRemoved   ( -- n )        3 2^ ; inline
+: XISlaveAttached  ( -- n )        4 2^ ; inline
+: XISlaveDetached  ( -- n )        5 2^ ; inline
+: XIDeviceEnabled  ( -- n )        6 2^ ; inline
+: XIDeviceDisabled ( -- n )        7 2^ ; inline
+
+! ChangeHierarchy constants
+CONSTANT: XIAddMaster              1
+CONSTANT: XIRemoveMaster           2
+CONSTANT: XIAttachSlave            3
+CONSTANT: XIDetachSlave            4
+
+CONSTANT: XIAttachToMaster         1
+CONSTANT: XIFloating               2
+
+! Valuator modes
+CONSTANT: XIModeRelative           0
+CONSTANT: XIModeAbsolute           1
+
+! Device types
+CONSTANT: XIMasterPointer          1
+CONSTANT: XIMasterKeyboard         2
+CONSTANT: XISlavePointer           3
+CONSTANT: XISlaveKeyboard          4
+CONSTANT: XIFloatingSlave          5
+
+! Device classes
+CONSTANT: XIKeyClass               0
+CONSTANT: XIButtonClass            1
+CONSTANT: XIValuatorClass          2
+
+! Device event flags (common)
+! Device event flags (key events only)
+: XIKeyRepeat ( -- n )             16 2^ ; inline
+! Device event flags (pointer events only)
+
+! Fake device ID's for event selection
+CONSTANT: XIAllDevices             0
+CONSTANT: XIAllMasterDevices       1
+
+! Event types
+CONSTANT: XI_DeviceChanged         1
+CONSTANT: XI_KeyPress              2
+CONSTANT: XI_KeyRelease            3
+CONSTANT: XI_ButtonPress           4
+CONSTANT: XI_ButtonRelease         5
+CONSTANT: XI_Motion                6
+CONSTANT: XI_Enter                 7
+CONSTANT: XI_Leave                 8
+CONSTANT: XI_FocusIn               9
+CONSTANT: XI_FocusOut              10
+CONSTANT: XI_HierarchyChanged      11
+CONSTANT: XI_PropertyEvent         12
+CONSTANT: XI_RawKeyPress           13
+CONSTANT: XI_RawKeyRelease         14
+CONSTANT: XI_RawButtonPress        15
+CONSTANT: XI_RawButtonRelease      16
+CONSTANT: XI_RawMotion             17
+: XI_LASTEVENT ( -- n )            XI_RawMotion ; inline
+
+! Event masks
+: XI_DeviceChangedMask    ( -- n ) XI_DeviceChanged    2^ ; inline
+: XI_KeyPressMask         ( -- n ) XI_KeyPress         2^ ; inline
+: XI_KeyReleaseMask       ( -- n ) XI_KeyRelease       2^ ; inline
+: XI_ButtonPressMask      ( -- n ) XI_ButtonPress      2^ ; inline
+: XI_ButtonReleaseMask    ( -- n ) XI_ButtonRelease    2^ ; inline
+: XI_MotionMask           ( -- n ) XI_Motion           2^ ; inline
+: XI_EnterMask            ( -- n ) XI_Enter            2^ ; inline
+: XI_LeaveMask            ( -- n ) XI_Leave            2^ ; inline
+: XI_FocusInMask          ( -- n ) XI_FocusIn          2^ ; inline
+: XI_FocusOutMask         ( -- n ) XI_FocusOut         2^ ; inline
+: XI_HierarchyChangedMask ( -- n ) XI_HierarchyChanged 2^ ; inline
+: XI_PropertyEventMask    ( -- n ) XI_PropertyEvent    2^ ; inline
+: XI_RawKeyPressMask      ( -- n ) XI_RawKeyPress      2^ ; inline
+: XI_RawKeyReleaseMask    ( -- n ) XI_RawKeyRelease    2^ ; inline
+: XI_RawButtonPressMask   ( -- n ) XI_RawButtonPress   2^ ; inline
+: XI_RawButtonReleaseMask ( -- n ) XI_RawButtonRelease 2^ ; inline
+: XI_RawMotionMask        ( -- n ) XI_RawMotion        2^ ; inline
+
diff --git a/basis/x11/xinput2/ffi/authors.txt b/basis/x11/xinput2/ffi/authors.txt
new file mode 100644 (file)
index 0000000..8e15658
--- /dev/null
@@ -0,0 +1 @@
+Niklas Waern
diff --git a/basis/x11/xinput2/ffi/ffi.factor b/basis/x11/xinput2/ffi/ffi.factor
new file mode 100644 (file)
index 0000000..c2a03b6
--- /dev/null
@@ -0,0 +1,484 @@
+! Copyright (C) 2010 Niklas Waern.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien alien.c-types alien.libraries alien.syntax
+classes.struct locals sequences x11.syntax x11.xlib ;
+EXCLUDE: math => float ;
+IN: x11.xinput2.ffi
+
+<< "xinput2" "libXi.so" cdecl add-library >>
+
+LIBRARY: xinput2
+
+
+! *********
+! * XI2.h *
+! *********
+<PRIVATE
+: mask-index   ( event -- n ) -3 shift ;
+: bitmask ( event -- n ) 7 bitand 2^ ;
+PRIVATE>
+
+:: XISetMask ( mask event -- )
+    event mask-index :> index
+    event bitmask index mask nth bitor
+    index mask set-nth ; inline
+
+:: XIClearMask ( mask event -- )
+    event mask-index :> index
+    event bitmask bitnot index mask nth bitand
+    index mask set-nth ; inline
+
+:: XIMaskIsSet ( mask event -- n )
+    event mask-index :> index
+    event bitmask index mask nth bitand ;
+
+: XIMaskLen ( event -- n ) 7 + -3 shift ;
+
+
+! *************
+! * XInput2.h *
+! *************
+STRUCT: XIAddMasterInfo
+    { type      int }
+    { name      c-string }
+    { send_core Bool }
+    { enable    Bool } ;
+
+STRUCT: XIRemoveMasterInfo
+    { type            int }
+    { deviceid        int }
+    { return_mode     int }
+    { return_pointer  int }
+    { return_keyboard int } ;
+
+STRUCT: XIAttachSlaveInfo
+    { type       int }
+    { deviceid   int }
+    { new_master int } ;
+
+STRUCT: XIDetachSlaveInfo
+    { type     int }
+    { deviceid int } ;
+
+UNION-STRUCT: XIAnyHierarchyChangeInfo
+    { type   int }
+    { add    XIAddMasterInfo }
+    { remove XIRemoveMasterInfo }
+    { attach XIAttachSlaveInfo }
+    { detach XIDetachSlaveInfo } ;
+
+STRUCT: XIModifierState
+    { base      int }
+    { latched   int }
+    { locked    int }
+    { effective int } ;
+
+TYPEDEF: XIModifierState XIGroupState
+
+STRUCT: XIButtonState
+    { mask_len int }
+    { mask     uchar* } ;
+
+STRUCT: XIValuatorState
+    { mask_len int }
+    { mask     uchar* }
+    { values   double* } ;
+
+STRUCT: XIEventMask
+    { deviceid int }
+    { mask_len int }
+    { mask     uchar* } ;
+
+STRUCT: XIAnyClassInfo
+    { type     int }
+    { sourceid int } ;
+
+STRUCT: XIButtonClassInfo
+    { type        int }
+    { sourceid    int }
+    { num_buttons int }
+    { labels      Atom* }
+    { state       XIButtonState } ;
+
+STRUCT: XIKeyClassInfo
+    { type         int }
+    { sourceid     int }
+    { num_keycodes int }
+    { keycodes     int* } ;
+
+STRUCT: XIValuatorClassInfo
+    { type       int }
+    { sourceid   int }
+    { number     int }
+    { label      Atom }
+    { min        double }
+    { max        double }
+    { value      double }
+    { resolution int }
+    { mode       int } ;
+
+STRUCT: XIDeviceInfo
+    { deviceid    int }
+    { name        c-string }
+    { use         int }
+    { attachment  int }
+    { enabled     Bool }
+    { num_classes int }
+    { classes     XIAnyClassInfo** } ;
+
+STRUCT: XIGrabModifiers
+    { modifiers int }
+    { status    int } ;
+
+
+! Generic XI2 event. All XI2 events have the same header.
+STRUCT: XIEvent
+    { type       int }
+    { serial     ulong }
+    { send_event Bool }
+    { display    Display* }
+    { extension  int }
+    { evtype     int }
+    { time       Time } ;
+
+STRUCT: XIHierarchyInfo
+    { deviceid   int }
+    { attachment int }
+    { use        int }
+    { enabled    Bool }
+    { flags      int } ;
+
+! Notifies the client that the device hierarcy has been changed
+! The client is expected to re-query the server for the device
+! hierarchy.
+STRUCT: XIHierarchyEvent
+    { type       int }
+    { serial     ulong }
+    { send_event Bool }
+    { display    Display }
+    { extension  int }
+    { evtype     int }
+    { time       Time }
+    { flags      int }
+    { num_info   int }
+    { info       XIHierarchyInfo* } ;
+
+! Notifies the client that the classes have been changed.
+! This happens when the slave device that sends through the
+! master changes.
+STRUCT: XIDeviceChangedEvent
+    { type        int }
+    { serial      ulong }
+    { send_event  Bool }
+    { display     Display* }
+    { extension   int }
+    { evtype      int }
+    { time        Time }
+    { deviceid    int }
+    { sourceid    int }
+    { reason      int }
+    { num_classes int }
+    { classes     XIAnyClassInfo** } ;
+
+STRUCT: XIDeviceEvent
+    { type       int }
+    { serial     ulong }
+    { send_event Bool }
+    { display    Display* }
+    { extension  int }
+    { evtype     int }
+    { time       Time }
+    { deviceid   int }
+    { sourceid   int }
+    { detail     int }
+    { root       Window }
+    { event      Window }
+    { child      Window }
+    { root_x     double }
+    { root_y     double }
+    { event_x    double }
+    { event_y    double }
+    { flags      int }
+    { buttons    XIButtonState }
+    { valuators  XIValuatorState }
+    { mods       XIModifierState }
+    { group      XIGroupState } ;
+
+STRUCT: XIRawEvent
+    { type       int }
+    { serial     ulong }
+    { send_event Bool }
+    { display    Display* }
+    { extension  int }
+    { evtype     int }
+    { time       Time }
+    { deviceid   int }
+    { sourceid   int }
+    { detail     int }
+    { flags      int }
+    { valuators  XIValuatorState }
+    { raw_values double* } ;
+
+STRUCT: XIEnterEvent
+    { type        int }
+    { serial      ulong }
+    { send_event  Bool }
+    { display     Display* }
+    { extension   int }
+    { evtype      int }
+    { time        Time }
+    { deviceid    int }
+    { sourceid    int }
+    { detail      int }
+    { root        Window }
+    { event       Window }
+    { child       Window }
+    { root_x      double }
+    { root_y      double }
+    { event_x     double }
+    { event_y     double }
+    { mode        int }
+    { focus       Bool }
+    { same_screen Bool }
+    { buttons     XIButtonState }
+    { mods        XIModifierState }
+    { group       XIGroupState } ;
+
+TYPEDEF: XIEnterEvent XILeaveEvent
+TYPEDEF: XIEnterEvent XIFocusInEvent
+TYPEDEF: XIEnterEvent XIFocusOutEvent
+
+STRUCT: XIPropertyEvent
+    { type       int }
+    { serial     ulong }
+    { send_event Bool }
+    { display    Display* }
+    { extension  int }
+    { evtype     int }
+    { time       Time }
+    { deviceid   int }
+    { property   Atom }
+    { what       int } ;
+
+
+
+X-FUNCTION: Bool XIQueryPointer (
+    Display*         display,
+    int              deviceid,
+    Window           win,
+    Window*          root,
+    Window*          child,
+    double*          root_x,
+    double*          root_y,
+    double*          win_x,
+    double*          win_y,
+    XIButtonState*   buttons,
+    XIModifierState* mods,
+    XIGroupState*    group ) ;
+
+X-FUNCTION: Bool XIWarpPointer (
+    Display* display,
+    int      deviceid,
+    Window   src_win,
+    Window   dst_win,
+    double   src_x,
+    double   src_y,
+    uint     src_width,
+    uint     src_height,
+    double   dst_x,
+    double   dst_y ) ;
+
+X-FUNCTION: Status XIDefineCursor (
+    Display* display,
+    int      deviceid,
+    Window   win,
+    Cursor   cursor ) ;
+
+X-FUNCTION: Status XIUndefineCursor (
+    Display* display,
+    int      deviceid,
+    Window   win ) ;
+
+X-FUNCTION: Status XIChangeHierarchy (
+    Display*                  display,
+    XIAnyHierarchyChangeInfo* changes,
+    int                       num_changes ) ;
+
+X-FUNCTION: Status XISetClientPointer (
+    Display* dpy,
+    Window   win,
+    int      deviceid ) ;
+
+X-FUNCTION: Bool XIGetClientPointer (
+    Display* dpy,
+    Window   win,
+    int*     deviceid ) ;
+
+X-FUNCTION: int XISelectEvents (
+    Display*     dpy,
+    Window       win,
+    XIEventMask* masks,
+    int          num_masks ) ;
+
+X-FUNCTION: XIEventMask* XIGetSelectedEvents (
+    Display* dpy,
+    Window   win,
+    int*     num_masks_return ) ;
+
+X-FUNCTION: Status XIQueryVersion (
+    Display* display,
+    int*     major_version_inout,
+    int*     minor_version_inout ) ;
+
+X-FUNCTION: XIDeviceInfo* XIQueryDevice (
+    Display* dpy,
+    int      deviceid,
+    int*     ndevices_return ) ;
+
+X-FUNCTION: Status XISetFocus (
+    Display* dpy,
+    int      deviceid,
+    Window   focus,
+    Time     time ) ;
+
+X-FUNCTION: Status XIGetFocus (
+    Display* dpy,
+    int      deviceid,
+    Window*  focus_return ) ;
+
+X-FUNCTION: Status XIGrabDevice (
+    Display*     dpy,
+    int          deviceid,
+    Window       grab_window,
+    Time         time,
+    Cursor       cursor,
+    int          grab_mode,
+    int          paired_device_mode,
+    Bool         owner_events,
+    XIEventMask* mask ) ;
+
+X-FUNCTION: Status XIUngrabDevice (
+    Display* dpy,
+    int      deviceid,
+    Time     time ) ;
+
+X-FUNCTION: Status XIAllowEvents (
+    Display* display,
+    int      deviceid,
+    int      event_mode,
+    Time     time ) ;
+
+X-FUNCTION: int XIGrabButton (
+    Display*         display,
+    int              deviceid,
+    int              button,
+    Window           grab_window,
+    Cursor           cursor,
+    int              grab_mode,
+    int              paired_device_mode,
+    int              owner_events,
+    XIEventMask*     mask,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: int XIGrabKeycode (
+    Display*         display,
+    int              deviceid,
+    int              keycode,
+    Window           grab_window,
+    int              grab_mode,
+    int              paired_device_mode,
+    int              owner_events,
+    XIEventMask*     mask,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: int XIGrabEnter (
+    Display*         display,
+    int              deviceid,
+    Window           grab_window,
+    Cursor           cursor,
+    int              grab_mode,
+    int              paired_device_mode,
+    int              owner_events,
+    XIEventMask*     mask,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: int XIGrabFocusIn (
+    Display*         display,
+    int              deviceid,
+    Window           grab_window,
+    int              grab_mode,
+    int              paired_device_mode,
+    int              owner_events,
+    XIEventMask*     mask,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers_inout ) ;
+
+X-FUNCTION: Status XIUngrabButton (
+    Display*         display,
+    int              deviceid,
+    int              button,
+    Window           grab_window,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Status XIUngrabKeycode (
+    Display*         display,
+    int              deviceid,
+    int              keycode,
+    Window           grab_window,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Status XIUngrabEnter (
+    Display*         display,
+    int              deviceid,
+    Window           grab_window,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Status XIUngrabFocusIn (
+    Display*         display,
+    int              deviceid,
+    Window           grab_window,
+    int              num_modifiers,
+    XIGrabModifiers* modifiers ) ;
+
+X-FUNCTION: Atom* XIListProperties (
+    Display* display,
+    int      deviceid,
+    int*     num_props_return ) ;
+
+X-FUNCTION: void XIChangeProperty (
+    Display* display,
+    int      deviceid,
+    Atom     property,
+    Atom     type,
+    int      format,
+    int      mode,
+    uchar*   data,
+    int      num_items ) ;
+
+X-FUNCTION: void XIDeleteProperty (
+    Display* display,
+    int      deviceid,
+    Atom     property ) ;
+
+X-FUNCTION: Status XIGetProperty (
+    Display* display,
+    int      deviceid,
+    Atom     property,
+    long     offset,
+    long     length,
+    Bool     delete_property,
+    Atom     type,
+    Atom*    type_return,
+    int*     format_return,
+    ulong*   num_items_return,
+    ulong*   bytes_after_return,
+    uchar**  data ) ;
+
+X-FUNCTION: void XIFreeDeviceInfo ( XIDeviceInfo* info ) ;
+
diff --git a/basis/x11/xinput2/xinput2.factor b/basis/x11/xinput2/xinput2.factor
new file mode 100644 (file)
index 0000000..80aaf95
--- /dev/null
@@ -0,0 +1,17 @@
+! Copyright (C) 2010 Niklas Waern.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types combinators kernel namespaces x11
+x11.constants x11.xinput2.ffi ;
+IN: x11.xinput2
+
+: (xi2-available?) ( display -- ? )
+    2 0 [ <int> ] bi@
+    XIQueryVersion
+    {
+        { BadRequest [ f ] }
+        { Success    [ t ] }
+        [ "Internal Xlib error." throw ]
+    } case ;
+
+: xi2-available? ( -- ? ) dpy get (xi2-available?) ; inline
+
index ac9e5591dc30544d2e9bbdf3287bc1c920ec8f1d..e20314bf11ac7b9c8a78d37bfeb79e5e14747b24 100644 (file)
@@ -565,7 +565,8 @@ CONSTANT: SelectionNotify       31
 CONSTANT: ColormapNotify        32
 CONSTANT: ClientMessage         33
 CONSTANT: MappingNotify         34
-CONSTANT: LASTEvent             35
+CONSTANT: GenericEvent          35
+CONSTANT: LASTEvent             36
 
 STRUCT: XAnyEvent
 { type int }
@@ -1013,6 +1014,34 @@ STRUCT: XKeymapEvent
 { window Window }
 { pad int[8] } ;
 
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
+! Newer things, needed for XInput2 support. Not in the book.
+
+! GenericEvent is the standard event for all newer extensions.
+STRUCT: XGenericEvent
+{ type int }
+{ serial ulong }
+{ send_event Bool }
+{ display Display* }
+{ extension int }
+{ evtype int } ;
+
+STRUCT: XGenericEventCookie
+{ type int }
+{ serial ulong }
+{ send_event Bool }
+{ display Display* }
+{ extension int }
+{ evtype int }
+{ cookie uint }
+{ data void* } ;
+
+X-FUNCTION: Bool XGetEventData ( Display* dpy, XGenericEventCookie* cookie ) ;
+X-FUNCTION: void XFreeEventData ( Display* dpy, XGenericEventCookie* cookie ) ;
+
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+
 UNION-STRUCT: XEvent
 { int int }
 { XAnyEvent XAnyEvent }
@@ -1046,6 +1075,8 @@ UNION-STRUCT: XEvent
 { XMappingEvent XMappingEvent }
 { XErrorEvent XErrorEvent }
 { XKeymapEvent XKeymapEvent }
+{ XGenericEvent XGenericEvent }
+{ XGenericEventCookie XGenericEventCookie }
 { padding long[24] } ;
 
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
@@ -1218,6 +1249,16 @@ X-FUNCTION: Pixmap XCreateBitmapFromData (
     uint width,
     uint height ) ;
 
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+! Appendix C - Extensions
+! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
+X-FUNCTION: Bool XQueryExtension (
+        Display* display,
+        c-string name,
+        int* major_opcode_return,
+        int* first_event_return,
+        int* first_error_return ) ;
+
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
 ! Appendix D - Compatibility Functions
 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
index 002f60aa238c66508091257c71193522875dcafc..1d37a8dedbabc01383885a63f8fae8440724efad 100644 (file)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs combinators
 combinators.short-circuit fry generalizations inverse kernel
-namespaces sequences sorting strings unicode.categories
-xml.data xml.syntax xml.syntax.private ;
+namespaces sequences sequences.generalizations sorting strings
+unicode.categories xml.data xml.syntax xml.syntax.private ;
 IN: xml.syntax.inverse
 
 : remove-blanks ( seq -- newseq )
index e7e8714b294a050e6f7374b21eecac95c3bd2f65..6455d7ba0bd79dad758ab68b5b75fe5ce92a60d9 100644 (file)
@@ -1,11 +1,11 @@
 ! Copyright (C) 2005, 2009 Daniel Ehrenberg
 ! See http://factorcode.org/license.txt for BSD license.
-USING: words assocs kernel accessors parser vocabs.parser effects.parser
-sequences summary lexer splitting combinators locals
-memoize sequences.deep xml.data xml.state xml namespaces present
-arrays generalizations strings make math macros multiline
-combinators.short-circuit sorting fry unicode.categories
-effects ;
+USING: words assocs kernel accessors parser vocabs.parser
+effects.parser sequences summary lexer splitting combinators
+locals memoize sequences.deep xml.data xml.state xml namespaces
+present arrays generalizations sequences.generalizations strings
+make math macros multiline combinators.short-circuit sorting fry
+unicode.categories effects ;
 IN: xml.syntax
 
 <PRIVATE
@@ -145,7 +145,7 @@ MACRO: interpolate-xml ( xml -- quot )
     ] each-interpolated drop ;
 
 : >search-hash ( seq -- hash )
-    [ dup search ] H{ } map>assoc ;
+    [ dup parse-word ] H{ } map>assoc ;
 
 : extract-variables ( xml -- seq )
     [ [ var>> , ] each-interpolated ] { } make ;
index e576a672c2f35d4ac8296543d044e5fca61cbe91..9ec8b65abae3926e25a28a816f80fbf93a0b8173 100644 (file)
@@ -1,7 +1,8 @@
 USING: xmode.loader xmode.utilities xmode.rules namespaces
 strings splitting assocs sequences kernel io.files xml memoize
-words globs combinators io.encodings.utf8 sorting accessors xml.data
-xml.traversal xml.syntax ;
+words globs combinators io.encodings.utf8 io.pathnames sorting
+accessors regexp unicode.case xml.data xml.traversal
+xml.syntax ;
 IN: xmode.catalog
 
 TUPLE: mode file file-name-glob first-line-glob ;
@@ -15,6 +16,8 @@ TAG: MODE parse-mode-tag
             { "FILE_NAME_GLOB" f file-name-glob<< }
             { "FIRST_LINE_GLOB" f first-line-glob<< }
         } init-from-tag
+        [ [ >case-fold <glob> ] [ f ] if* ] change-file-name-glob
+        [ [ >case-fold <glob> ] [ f ] if* ] change-first-line-glob
     ] dip
     rot set-at ;
 
@@ -106,14 +109,18 @@ ERROR: mutually-recursive-rulesets ruleset ;
 : reset-modes ( -- )
     \ (load-mode) reset-memoized ;
 
-: ?glob-matches ( string glob/f -- ? )
-    dup [ glob-matches? ] [ 2drop f ] if ;
+: ?matches ( string glob/f -- ? )
+    [ >case-fold ] dip dup [ matches? ] [ 2drop f ] if ;
 
 : suitable-mode? ( file-name first-line mode -- ? )
-    [ nip ] 2keep first-line-glob>> ?glob-matches
-    [ 2drop t ] [ file-name-glob>> ?glob-matches ] if ;
+    [ nip ] 2keep first-line-glob>> ?matches
+    [ 2drop t ] [ file-name-glob>> ?matches ] if ;
 
-: find-mode ( file-name first-line -- mode )
+: ?find-mode ( file-name first-line -- mode/f )
+    [ file-name ] dip
     modes
     [ nip [ 2dup ] dip suitable-mode? ] assoc-find
-    2drop [ 2drop ] dip [ "text" ] unless* ;
+    2drop [ 2drop ] dip ;
+
+: find-mode ( file-name first-line -- mode )
+    ?find-mode "text" or ; inline
index f4300b456bbed8fd605b0d4118451ffdd9d54867..390e5279a5f55c6cc8afa9b0ded1f6666d125dae 100644 (file)
                                FILE_NAME_GLOB="*.{cfm,dbm,cfc}" />\r
 \r
 <MODE NAME="c++"               FILE="cplusplus.xml"\r
-                               FILE_NAME_GLOB="*.{cc,cpp,hh,hpp,cxx}" />\r
+                               FILE_NAME_GLOB="*.{cc,cpp,hh,hpp,cxx,inl,mm}" />\r
+\r
+<MODE NAME="cuda"              FILE="cuda.xml"\r
+                               FILE_NAME_GLOB="*.{cu,gpu,cuh}" />\r
 \r
 <MODE NAME="c#"                        FILE="csharp.xml"\r
                                FILE_NAME_GLOB="*.cs" />\r
diff --git a/basis/xmode/modes/cuda.xml b/basis/xmode/modes/cuda.xml
new file mode 100644 (file)
index 0000000..865ac89
--- /dev/null
@@ -0,0 +1,162 @@
+<?xml version="1.0"?>\r
+\r
+<!DOCTYPE MODE SYSTEM "xmode.dtd">\r
+\r
+<!-- Extension of cplusplus.xml to add CUDA specific syntax. -->\r
+<MODE>\r
+    <PROPS>\r
+        <PROPERTY NAME="commentStart" VALUE="/*" />\r
+        <PROPERTY NAME="commentEnd" VALUE="*/" />\r
+        <PROPERTY NAME="lineComment" VALUE="//" />\r
+        <PROPERTY NAME="wordBreakChars" VALUE=",+-=&lt;&gt;/?^&amp;*" />\r
+\r
+\r
+        <!-- Auto indent -->\r
+        <PROPERTY NAME="indentOpenBrackets" VALUE="{" />\r
+        <PROPERTY NAME="indentCloseBrackets" VALUE="}" />\r
+        <PROPERTY NAME="unalignedOpenBrackets" VALUE="(" />\r
+        <PROPERTY NAME="unalignedCloseBrackets" VALUE=")" />\r
+        <PROPERTY NAME="indentNextLine"\r
+            VALUE="(?!^\s*(#|//)).*(\b(if|while|for)\s*\(.*\)|\b(else|do)\b)[^{;]*$" />\r
+        <PROPERTY NAME="unindentThisLine"\r
+            VALUE="^\s*((case\b.*|[\p{Alpha}_][\p{Alnum}_]*)\s*:(?!:)).*$" />\r
+        <PROPERTY NAME="electricKeys" VALUE=":" />\r
+    </PROPS>\r
+\r
+    <RULES\r
+        ESCAPE="\" IGNORE_CASE="FALSE"\r
+        HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">\r
+        <EOL_SPAN TYPE="KEYWORD2" AT_WHITESPACE_END="TRUE" DELEGATE="CPP">#</EOL_SPAN>\r
+\r
+        <IMPORT DELEGATE="LEX"/>\r
+        <IMPORT DELEGATE="CORE"/>\r
+    </RULES>\r
+\r
+    <!-- Core C++ language -->\r
+    <RULES SET="LEX"\r
+        ESCAPE="\" IGNORE_CASE="FALSE"\r
+        HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">\r
+\r
+        <IMPORT DELEGATE="c::LEX"/>\r
+        <IMPORT DELEGATE="c++::LEX"/>\r
+\r
+        <SEQ TYPE="OPERATOR">&lt;&lt;&lt;</SEQ>\r
+        <SEQ TYPE="OPERATOR">&gt;&gt;&gt;</SEQ>\r
+    </RULES>\r
+\r
+    <!-- Extra CUDA keywords -->\r
+    <RULES SET="CORE"\r
+        ESCAPE="\" IGNORE_CASE="FALSE"\r
+        HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">\r
+\r
+        <IMPORT DELEGATE="c::CORE"/>\r
+        <IMPORT DELEGATE="c++::CORE"/>\r
+\r
+        <KEYWORDS>\r
+            <KEYWORD1>__device__</KEYWORD1>\r
+            <KEYWORD2>__host__</KEYWORD2>\r
+            <KEYWORD2>__global__</KEYWORD2>\r
+            <KEYWORD2>__local__</KEYWORD2>\r
+            <KEYWORD2>__constant__</KEYWORD2>\r
+            <KEYWORD2>__shared__</KEYWORD2>\r
+            <KEYWORD1>__inline__</KEYWORD1>\r
+            <KEYWORD1>__restrict__</KEYWORD1>\r
+            <KEYWORD4>blockIdx</KEYWORD4>\r
+            <KEYWORD4>threadIdx</KEYWORD4>\r
+            <KEYWORD4>gridDim</KEYWORD4>\r
+            <KEYWORD4>blockDim</KEYWORD4>\r
+            <KEYWORD3>char1</KEYWORD3>\r
+            <KEYWORD3>char2</KEYWORD3>\r
+            <KEYWORD3>char3</KEYWORD3>\r
+            <KEYWORD3>char4</KEYWORD3>\r
+            <KEYWORD3>uchar1</KEYWORD3>\r
+            <KEYWORD3>uchar2</KEYWORD3>\r
+            <KEYWORD3>uchar3</KEYWORD3>\r
+            <KEYWORD3>uchar4</KEYWORD3>\r
+            <KEYWORD3>short1</KEYWORD3>\r
+            <KEYWORD3>short2</KEYWORD3>\r
+            <KEYWORD3>short3</KEYWORD3>\r
+            <KEYWORD3>short4</KEYWORD3>\r
+            <KEYWORD3>ushort1</KEYWORD3>\r
+            <KEYWORD3>ushort2</KEYWORD3>\r
+            <KEYWORD3>ushort3</KEYWORD3>\r
+            <KEYWORD3>ushort4</KEYWORD3>\r
+            <KEYWORD3>int1</KEYWORD3>\r
+            <KEYWORD3>int2</KEYWORD3>\r
+            <KEYWORD3>int3</KEYWORD3>\r
+            <KEYWORD3>int4</KEYWORD3>\r
+            <KEYWORD3>uint1</KEYWORD3>\r
+            <KEYWORD3>uint2</KEYWORD3>\r
+            <KEYWORD3>uint3</KEYWORD3>\r
+            <KEYWORD3>uint4</KEYWORD3>\r
+            <KEYWORD3>long1</KEYWORD3>\r
+            <KEYWORD3>long2</KEYWORD3>\r
+            <KEYWORD3>long3</KEYWORD3>\r
+            <KEYWORD3>long4</KEYWORD3>\r
+            <KEYWORD3>ulong1</KEYWORD3>\r
+            <KEYWORD3>ulong2</KEYWORD3>\r
+            <KEYWORD3>ulong3</KEYWORD3>\r
+            <KEYWORD3>ulong4</KEYWORD3>\r
+            <KEYWORD3>longlong1</KEYWORD3>\r
+            <KEYWORD3>longlong2</KEYWORD3>\r
+            <KEYWORD3>longlong3</KEYWORD3>\r
+            <KEYWORD3>longlong4</KEYWORD3>\r
+            <KEYWORD3>ulonglong1</KEYWORD3>\r
+            <KEYWORD3>ulonglong2</KEYWORD3>\r
+            <KEYWORD3>ulonglong3</KEYWORD3>\r
+            <KEYWORD3>ulonglong4</KEYWORD3>\r
+            <KEYWORD3>float1</KEYWORD3>\r
+            <KEYWORD3>float2</KEYWORD3>\r
+            <KEYWORD3>float3</KEYWORD3>\r
+            <KEYWORD3>float4</KEYWORD3>\r
+            <KEYWORD3>double1</KEYWORD3>\r
+            <KEYWORD3>double2</KEYWORD3>\r
+            <KEYWORD3>double3</KEYWORD3>\r
+            <KEYWORD3>double4</KEYWORD3>\r
+            <KEYWORD3>dim1</KEYWORD3>\r
+            <KEYWORD3>dim2</KEYWORD3>\r
+            <KEYWORD3>dim3</KEYWORD3>\r
+            <KEYWORD3>dim4</KEYWORD3>\r
+            <KEYWORD3>texture</KEYWORD3>\r
+        </KEYWORDS>\r
+    </RULES>\r
+\r
+    <!-- Preprocessor specific rules -->\r
+    <RULES SET="CPP"\r
+        ESCAPE="\" IGNORE_CASE="FALSE"\r
+        HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">\r
+\r
+        <EOL_SPAN_REGEXP HASH_CHAR="include" TYPE="MARKUP" DELEGATE="c::INCLUDE">include\b</EOL_SPAN_REGEXP>\r
+        <EOL_SPAN_REGEXP HASH_CHAR="define" TYPE="MARKUP" DELEGATE="DEFINE">define\b</EOL_SPAN_REGEXP>\r
+        <EOL_SPAN_REGEXP HASH_CHAR="endif" TYPE="MARKUP" DELEGATE="c::LEX">endif\b</EOL_SPAN_REGEXP>\r
+        <EOL_SPAN_REGEXP HASH_CHAR="elif" TYPE="MARKUP" DELEGATE="c::CONDITION">elif\b</EOL_SPAN_REGEXP>\r
+        <EOL_SPAN_REGEXP HASH_CHAR="if" TYPE="MARKUP" DELEGATE="c::CONDITION">if\b</EOL_SPAN_REGEXP>\r
+\r
+        <IMPORT DELEGATE="LEX"/>\r
+\r
+        <!-- Directives -->\r
+        <KEYWORDS>\r
+            <MARKUP>ifdef</MARKUP>\r
+            <MARKUP>ifndef</MARKUP>\r
+            <MARKUP>else</MARKUP>\r
+            <MARKUP>error</MARKUP>\r
+            <MARKUP>line</MARKUP>\r
+            <MARKUP>pragma</MARKUP>\r
+            <MARKUP>undef</MARKUP>\r
+            <MARKUP>warning</MARKUP>\r
+        </KEYWORDS>\r
+    </RULES>\r
+\r
+    <!-- After #define directive -->\r
+    <!-- Almost same as the normal code,\r
+        except two additional operators # and ##. -->\r
+    <RULES SET="DEFINE"\r
+        ESCAPE="\" IGNORE_CASE="FALSE"\r
+        HIGHLIGHT_DIGITS="TRUE" DIGIT_RE="[0-9][0-9a-zA-Z]*">\r
+        <SEQ TYPE="OPERATOR">#</SEQ>\r
+        <IMPORT DELEGATE="LEX"/>\r
+        <IMPORT DELEGATE="CORE"/>\r
+    </RULES>\r
+\r
+</MODE>\r
+\r
diff --git a/build-support/factor.cmd b/build-support/factor.cmd
new file mode 100644 (file)
index 0000000..57a41f2
--- /dev/null
@@ -0,0 +1,87 @@
+@echo off\r
+setlocal\r
+\r
+if "%1"=="/?" (\r
+    goto usage\r
+) else if "%1"=="" (\r
+    set _bootimage_version=latest\r
+) else if "%1"=="latest" (\r
+    set _bootimage_version=latest\r
+) else if "%1"=="clean" (\r
+    set _bootimage_version=clean\r
+) else goto usage\r
+\r
+if not exist Nmakefile goto wrongdir\r
+\r
+call cl 2>&1 | find "x86" >nul\r
+if not errorlevel 1 (\r
+    echo x86-32 cl.exe detected.\r
+    set _target=x86-32\r
+    set _bootimage=boot.winnt-x86.32.image\r
+) else (\r
+    call cl 2>&1 | find "x64" >nul\r
+    if not errorlevel 1 (\r
+        echo x86-64 cl.exe detected.\r
+        set _target=x86-64\r
+        set _bootimage=boot.winnt-x86.64.image\r
+    ) else goto nocl\r
+)\r
+\r
+if %_bootimage_version%==clean (\r
+    set _git_branch=clean-winnt-%_target%\r
+    set _bootimage_path=clean/winnt-%_target%\r
+) else (\r
+    set _git_branch=master\r
+    set _bootimage_path=latest\r
+)\r
+\r
+echo Updating working copy from %_git_branch%...\r
+call git pull http://factorcode.org/git/factor.git %_git_branch%\r
+if errorlevel 1 goto fail\r
+\r
+echo Building vm...\r
+nmake /nologo /f Nmakefile clean\r
+if errorlevel 1 goto fail\r
+nmake /nologo /f Nmakefile %_target%\r
+if errorlevel 1 goto fail\r
+\r
+echo Fetching %_bootimage_version% boot image...\r
+cscript /nologo build-support\http-get.vbs http://factorcode.org/images/%_bootimage_path%/%_bootimage% %_bootimage%\r
+if errorlevel 1 goto fail\r
+\r
+echo Bootstrapping...\r
+.\factor.com -i=%_bootimage%\r
+if errorlevel 1 goto fail\r
+\r
+echo Copying fresh factor.image to factor.image.fresh.\r
+copy factor.image factor.image.fresh\r
+if errorlevel 1 goto fail\r
+\r
+echo Build complete.\r
+goto :EOF\r
+\r
+:fail\r
+echo Build failed.\r
+goto :EOF\r
+\r
+:wrongdir\r
+echo build-support\factor.cmd must be run from the root of the Factor source tree.\r
+goto :EOF\r
+\r
+:nocl\r
+echo Unable to detect cl.exe target platform.\r
+echo Make sure you're running within the Visual Studio or Windows SDK environment.\r
+goto :EOF\r
+\r
+:usage\r
+echo Usage: build-support\factor.cmd [latest/clean]\r
+echo     Updates the working copy, cleans and builds the vm using nmake,\r
+echo     fetches a boot image, and bootstraps factor.\r
+echo     If latest is specified, then the working copy is updated to the\r
+echo     upstream "master" branch and the boot image corresponding to the\r
+echo     most recent factor build is downloaded. This is the default.\r
+echo     If clean is specified, then the working copy is updated to the\r
+echo     upstream "clean-winnt-*" branch corresponding to the current\r
+echo     platform and the corresponding boot image is downloaded.\r
+goto :EOF\r
+\r
diff --git a/build-support/http-get.vbs b/build-support/http-get.vbs
new file mode 100644 (file)
index 0000000..4bb95e2
--- /dev/null
@@ -0,0 +1,42 @@
+on error resume next\r
+\r
+if WScript.Arguments.Count < 2 then\r
+    WScript.Echo "usage: http-get.vbs source-url dest-file"\r
+    WScript.Quit 1\r
+else\r
+    source_url = WScript.Arguments.Item(0)\r
+    dest_filename = WScript.Arguments.Item(1)\r
+\r
+    dim http, source_data\r
+    set http = CreateObject("WinHttp.WinHttpRequest.5.1")\r
+\r
+    Err.Clear\r
+    http.Open "GET", source_url, false\r
+    http.Send\r
+\r
+    if Err.Number = 0 then\r
+        if http.Status = 200 then\r
+            dim dest_stream\r
+            odd = "DOD"\r
+            set dest_stream = CreateObject("A"+odd+"B"+".Stream")\r
+\r
+            Err.Clear\r
+            dest_stream.Type = 1 ' adTypeBinary\r
+            dest_stream.Open\r
+            dest_stream.Write http.ResponseBody\r
+            dest_stream.SaveToFile dest_filename, 2 ' adSaveCreateOverWrite\r
+            if Err.Number <> 0 then\r
+                WScript.Echo "Error " + CStr(Err.Number) + " when writing " + dest_filename + ":"\r
+                WScript.Echo Err.Description\r
+                WScript.Quit 1\r
+            end if\r
+        else\r
+            WScript.Echo CStr(http.Status) + " " + http.StatusText + " when fetching " + source_url\r
+            WScript.Quit 1\r
+        end if\r
+    else\r
+        WScript.Echo "Error " + CStr(Err.Number) + " when fetching " + source_url + ":"\r
+        WScript.Echo Err.Description\r
+        WScript.Quit 1\r
+    end if\r
+end if\r
index 5b1ce8e80cd1828728f729bd4b948c6f48633429..67bf6da23c97806f300061c2ae0a7df9246fc5ee 100644 (file)
@@ -65,9 +65,9 @@ ARTICLE: "apply-combinators" "Apply combinators"
 "All of the apply combinators are equivalent to using the corresponding " { $link "spread-combinators" } " with the same quotation supplied for every value." ;
 
 ARTICLE: "dip-keep-combinators" "Preserving combinators"
-"Sometimes it is necessary to temporarily hide values on the datastack. The " { $snippet "dip" } " combinators invoke the quotation at the top of the stack, hiding some number of values underneath:"
+"Sometimes it is necessary to temporarily hide values on the datastack. The " { $snippet "dip" } " combinators invoke the quotation at the top of the stack, hiding some number of values:"
 { $subsections dip 2dip 3dip 4dip }
-"The " { $snippet "keep" } " combinators invoke a quotation and restore some number of values to the top of the stack when it completes:"
+"The " { $snippet "keep" } " combinators invoke a quotation and restore some number of values to the top of the stack:"
 { $subsections keep 2keep 3keep } ;
 
 ARTICLE: "curried-dataflow" "Curried dataflow combinators"
index fd77cfab31634b75ea92da6bf82c9b949b181f2c..db33aaa2440491aa513c864194f8a00ee6690721 100644 (file)
@@ -99,7 +99,7 @@ f { "a" "b" } f { "c" } <variable-effect> .""" """(( a b -- c ))""" }
 { <effect> <terminated-effect> <variable-effect> } related-words
 
 ARTICLE: "effects-variables" "Stack effect row variables"
-"The stack of effect of many " { $link POSTPONE: inline } " combinators can have variable stack effects, depending on the effect of the quotation they call. For example, the quotation parameter to " { $link each } " receives an element from the input sequence each time it is called, but it can also manipulate values on the stack below the element as long as it leaves the same number of elements on the stack. (This is how " { $link reduce } " is implemented in terms of " { $snippet "each" } ".) The stack effect of an " { $snippet "each" } " expression thus depends on the stack effect of its input quotation:"
+"The stack effect of many " { $link POSTPONE: inline } " combinators can have variable stack effects, depending on the effect of the quotation they call. For example, the quotation parameter to " { $link each } " receives an element from the input sequence each time it is called, but it can also manipulate values on the stack below the element as long as it leaves the same number of elements on the stack. (This is how " { $link reduce } " is implemented in terms of " { $snippet "each" } ".) The stack effect of an " { $snippet "each" } " expression thus depends on the stack effect of its input quotation:"
 { $example
  """USING: io sequences stack-checker ;
 [ [ write ] each ] infer."""
index a308b9f0c307b0ec5bf2d0e6199eb40e6849f4d0..ff6eed451423125d0cb2dae93f035072edeb4900 100644 (file)
@@ -80,7 +80,7 @@ IN: io.files.tests
     "test.txt" temp-file binary [
         3 4 * read
     ] with-file-reader
-    byte-array>int-array
+    int-array-cast
 ] unit-test
 
 [ ] [
@@ -117,7 +117,7 @@ CONSTANT: pt-array-1
 
 [ t ] [
     "test.txt" temp-file binary file-contents
-    byte-array>pt-array
+    pt-array-cast
     pt-array-1 rest-slice sequence=
 ] unit-test
 
index 46e015e57666cc373fcf52b448c032c7a19305dc..9772de6262b5d998e285943775352c946bc2ff26 100644 (file)
@@ -45,5 +45,5 @@ IN: io.streams.byte-array.tests
 ! Writing specialized arrays to byte writers
 [ int-array{ 1 2 3 } ] [
     binary [ int-array{ 1 2 3 } write ] with-byte-writer
-    byte-array>int-array
+    int-array-cast
 ] unit-test
index d05daf3662bdd0e7f79aabccf10ff0a645d87276..63a56b4af116f880e1caf3dcd3c1fd605754f2cf 100644 (file)
@@ -31,7 +31,7 @@ IN: io.streams.c.tests
     "test.txt" temp-file "rb" fopen <c-reader> [
         3 4 * read
     ] with-input-stream
-    byte-array>int-array
+    int-array-cast
 ] unit-test
 
 ! Writing strings to binary streams should fail
index 5ae96417349cea718d5660ad704efa89e6eba197..bf2b6904c3dba4c5ffb2e9a51df33a2557148772 100644 (file)
@@ -15,7 +15,7 @@ ABOUT: "sets"
 
 ARTICLE: "set-operations" "Operations on sets"
 "To test if an object is a member of a set:"
-{ $subsections member? }
+{ $subsections in? }
 "All sets can be represented as a sequence, without duplicates, of their members:"
 { $subsections members }
 "Sets can have members added or removed destructively:"
index 035ac1454b04994923cc0aa6afe62519cbc9bf6a..512e2de61a896500faba02096b13a82639262422 100644 (file)
@@ -54,15 +54,15 @@ ARTICLE: "syntax-integers" "Integer syntax"
 "More information on integers can be found in " { $link "integers" } "." ;
 
 ARTICLE: "syntax-ratios" "Ratio syntax"
-"The printed representation of a ratio is a pair of integers separated by a slash (/), prefixed by an optional whole number part followed by a plus (+). No intermediate whitespace is permitted. Here are some examples:"
+"The printed representation of a ratio is a pair of integers separated by a slash (" { $snippet "/" } "). A ratio can also be written as a proper fraction by following an integer part with " { $snippet "+" } " or " { $snippet "-" } " (matching the sign of the integer) and a ratio. No intermediate whitespace is permitted within a ratio literal. Here are some examples:"
 { $code
     "75/33"
     "1/10"
     "-5/-6"
     "1+1/3"
-    "-10+1/7"
+    "-10-1/7"
 }
-"More information on ratios can be found in " { $link "rationals" } ;
+"More information on ratios can be found in " { $link "rationals" } "." ;
 
 ARTICLE: "syntax-floats" "Float syntax"
 "Floating point literals are specified when a literal number contains a decimal point or exponent. Exponents are marked by an " { $snippet "e" } " or " { $snippet "E" } ":"
index 423abbc277b4d6159497fdea711aba54f888eaaa..d3736db9bfce8c85b143df07f67bdbecb35de5a5 100755 (executable)
@@ -11,7 +11,7 @@ $nl
 $nl
 "The second way is to create a configuration file. You can list additional vocabulary roots in a file that Factor reads at startup:"
 { $subsections "factor-roots" }
-"Finally, you can add vocabulary roots dynamically using a word:"
+"Finally, you can add vocabulary roots by calling a word from your " { $snippet "factor-rc" } " file (see " { $link "factor-rc" } "):"
 { $subsections add-vocab-root } ;
 
 ARTICLE: "vocabs.roots" "Vocabulary roots"
index 535932fdc7afc8df170a8493d11fbb46bf809a1e..9c1dcaef182065b7d192ec3c81111458329cb337 100644 (file)
@@ -8,15 +8,22 @@ IN: vocabs.loader
 
 SYMBOL: vocab-roots
 
-V{
-    "resource:core"
-    "resource:basis"
-    "resource:extra"
-    "resource:work"
-} clone vocab-roots set-global
+SYMBOL: add-vocab-root-hook
+
+[
+    V{
+        "resource:core"
+        "resource:basis"
+        "resource:extra"
+        "resource:work"
+    } clone vocab-roots set-global
+
+    [ drop ] add-vocab-root-hook set-global
+] "vocabs.loader" add-startup-hook
 
 : add-vocab-root ( root -- )
-    vocab-roots get adjoin ;
+    [ vocab-roots get adjoin ]
+    [ add-vocab-root-hook get-global call( root -- ) ] bi ;
 
 SYMBOL: root-cache
 
index 305ae6bdf236f4b7b2d07d23bd1e58218968abad..67e7b5f22e72265e3ed8985ccc7c6d4b9bdb16a7 100644 (file)
@@ -9,7 +9,7 @@ IN: alien.data.map.tests
 [ float-array{ 1.0 1.0 3.0 3.0 5.0 5.0 } ]
 [
     int-array{ 1 3 5 } [ dup ] data-map( int -- float[2] )
-    byte-array>float-array
+    float-array-cast
 ] unit-test
 
 [
@@ -20,7 +20,7 @@ IN: alien.data.map.tests
     }
 ] [
     3 iota [ float-4-with ] data-map( object -- float-4 )
-    byte-array>float-4-array
+    float-4-array-cast
 ] unit-test
 
 [
@@ -31,7 +31,7 @@ IN: alien.data.map.tests
     }
 ] [
     12 iota [ float-4-boa ] data-map( object[4] -- float-4 )
-    byte-array>float-4-array
+    float-4-array-cast
 ] unit-test
 
 [ float-array{ 1.0 1.0 3.0 3.0 5.0 5.0 0.0 0.0 } ]
@@ -151,5 +151,5 @@ CONSTANT: plane-count 4
     [ ] data-map( object -- float ) ;
 
 [ float-array{ 0.0 0.5 1.0 } ]
-[ 2 data-map-compiler-bug-test byte-array>float-array ]
+[ 2 data-map-compiler-bug-test float-array-cast ]
 unit-test
index ae94f5bb42f798f1383a7e2d43d99ebb69dfea43..a188df853b5a16c54328f4b036be153ce344e130 100644 (file)
@@ -1,7 +1,8 @@
 ! (c)2009 Joe Groff bsd license
 USING: accessors alien audio classes.struct fry calendar alarms
 combinators combinators.short-circuit destructors generalizations
-kernel literals locals math openal sequences specialized-arrays strings ;
+kernel literals locals math openal sequences
+sequences.generalizations specialized-arrays strings ;
 QUALIFIED-WITH: alien.c-types c
 SPECIALIZED-ARRAYS: c:float c:uchar c:uint ;
 IN: audio.engine
@@ -232,7 +233,7 @@ DEFER: update-audio
     dup al-sources>> [
         {
             [ make-engine-current ]
-            [ update-alarm>> [ cancel-alarm ] when* ]
+            [ update-alarm>> [ stop-alarm ] when* ]
             [ clips>> clone [ dispose ] each ]
             [ al-sources>> free-sources ]
             [
index bbc6c339e9f6b5359735d83d3fb256a676d9bb3a..0791a226d465edc06770b301308c2c0b575b8269 100644 (file)
@@ -44,7 +44,7 @@ M: noise-generator dispose
     ] 20 milliseconds every :> alarm
     "Press Enter to stop the test." print
     readln drop
-    alarm cancel-alarm
+    alarm stop-alarm
     engine dispose ;
 
 MAIN: audio-engine-test
index 21ff7fbbef048c2da6bce9988ade3b8806e49405..b109e169da62bbfd4d5bdc5b07631ca387061f14 100644 (file)
@@ -1,5 +1,7 @@
-USING: kernel math accessors prettyprint io locals sequences
-math.ranges math.order ;
+! Copyright (C) 2008, 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors kernel math math.ranges math.order math.parser
+io locals sequences ;
 IN: benchmark.binary-trees
 
 TUPLE: tree-node item left right ;
@@ -27,8 +29,8 @@ CONSTANT: min-depth 4
 
 : stretch-tree ( max-depth -- )
     1 + 0 over bottom-up-tree item-check
-    [ "stretch tree of depth " write pprint ]
-    [ "\t check: " write . ] bi* ; inline
+    [ "stretch tree of depth " write number>string write ]
+    [ "\t check: " write number>string print ] bi* ; inline
 
 :: long-lived-tree ( max-depth -- )
     0 max-depth bottom-up-tree
@@ -40,13 +42,13 @@ CONSTANT: min-depth 4
                 [ depth bottom-up-tree item-check + ] bi@
             ] reduce
         ]
-        [ 2 * ] bi
-        pprint "\t trees of depth " write depth pprint
-        "\t check: " write .
+        [ 2 * number>string write ] bi
+        "\t trees of depth " write depth number>string write
+        "\t check: " write number>string print
     ] each
 
-    "long lived tree of depth " write max-depth pprint
-    "\t check: " write item-check . ; inline
+    "long lived tree of depth " write max-depth number>string write
+    "\t check: " write item-check number>string print ; inline
 
 : binary-trees ( n -- )
     min-depth 2 + max [ stretch-tree ] [ long-lived-tree ] bi ; inline
diff --git a/extra/benchmark/binary-trees/deploy.factor b/extra/benchmark/binary-trees/deploy.factor
new file mode 100644 (file)
index 0000000..0618530
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-ui? f }
+    { deploy-word-defs? f }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { deploy-io 2 }
+    { deploy-reflection 1 }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-console? t }
+    { deploy-word-props? f }
+    { deploy-c-types? f }
+    { deploy-name "benchmark.binary-trees" }
+}
diff --git a/extra/benchmark/fasta/deploy.factor b/extra/benchmark/fasta/deploy.factor
new file mode 100644 (file)
index 0000000..ff90c8f
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-name "benchmark.fasta" }
+    { deploy-ui? f }
+    { deploy-c-types? f }
+    { deploy-console? t }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-io 3 }
+    { deploy-reflection 1 }
+    { deploy-word-props? f }
+    { deploy-math? t }
+    { deploy-threads? t }
+    { deploy-word-defs? f }
+}
diff --git a/extra/benchmark/knucleotide/deploy.factor b/extra/benchmark/knucleotide/deploy.factor
new file mode 100644 (file)
index 0000000..85fc9c0
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-ui? f }
+    { deploy-word-defs? f }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { deploy-io 2 }
+    { deploy-reflection 1 }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-console? t }
+    { deploy-word-props? f }
+    { deploy-c-types? f }
+    { deploy-name "benchmark.knucleotide" }
+}
index fb23263397d9e965fafc88e94dd7c57e074e2d07..46e42cfc0543986b62d3e60f34851eee1f37cad1 100644 (file)
@@ -332,7 +332,3007 @@ GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
 AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
 GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
 ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
-GAGGCTGAGGCAGGAGAATC
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAG
+GCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGAT
+CACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTA
+AAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGG
+CTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGC
+CACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTG
+GCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAG
+GAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAAT
+TAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGA
+ATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAG
+CCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTA
+ATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCA
+GCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGG
+TGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCC
+GGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGA
+GCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTT
+GGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACAT
+GGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG
+TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGT
+TGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTC
+TCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGC
+GGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGT
+CTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTAC
+TCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGA
+GATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGG
+GCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCT
+GAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAAT
+ACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAG
+GCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTG
+CACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCA
+CGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTT
+CGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCC
+GGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGC
+TTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGG
+GCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCC
+AGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTG
+GCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCG
+CGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAG
+GCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAG
+ACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAG
+GCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGA
+AACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATC
+CCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAG
+TGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAA
+AAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCG
+GATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTA
+CTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGG
+AGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCG
+CGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCG
+GTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGT
+CAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAA
+AATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGG
+AGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTC
+CAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCT
+GTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGA
+CCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCG
+TGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAA
+CCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGAC
+AGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCAC
+TTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAA
+CATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGC
+CTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGA
+GGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCC
+GTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGA
+GGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCC
+CGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGC
+TACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGC
+CGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGC
+CGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCA
+CCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAA
+AATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCT
+GAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCA
+CTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGC
+TCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGA
+GTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTA
+GCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAAT
+CGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCC
+TGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAAT
+CCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGC
+CTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTG
+GCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGG
+GAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGC
+GAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGG
+GAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGG
+TGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTA
+ATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTG
+CAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTC
+AAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGG
+GCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCT
+CTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTC
+GGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGA
+TCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGC
+GCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGA
+GGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATAC
+AAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGC
+AGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCA
+CTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACG
+CCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCG
+AGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGG
+GCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTT
+GAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGC
+GACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAG
+CACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGC
+CAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCG
+CGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGC
+GGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGAC
+TCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGC
+CGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAA
+CCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCC
+AGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTG
+AGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA
+GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGA
+TCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACT
+AAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAG
+GCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG
+CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGT
+GGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCA
+GGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAA
+TTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAG
+AATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCA
+GCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGT
+AATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACC
+AGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTG
+GTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACC
+CGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAG
+AGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTT
+TGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACA
+TGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCT
+GTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGG
+TTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGT
+CTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGG
+CGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCG
+TCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTA
+CTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCG
+AGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCG
+GGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACC
+TGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAA
+TACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGA
+GGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACT
+GCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTC
+ACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGT
+TCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGC
+CGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCG
+CTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTG
+GGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCC
+CAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCT
+GGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGC
+GCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGA
+GGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGA
+GACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGA
+GGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTG
+AAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAAT
+CCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCA
+GTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAA
+AAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGC
+GGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCT
+ACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGG
+GAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATC
+GCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGC
+GGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGG
+TCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAA
+AAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAG
+GAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACT
+CCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCC
+TGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAG
+ACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGC
+GTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGA
+ACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGA
+CAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCA
+CTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCA
+ACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCG
+CCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGG
+AGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTC
+CGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCG
+AGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACC
+CCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAG
+CTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAG
+CCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGG
+CCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATC
+ACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAA
+AAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGC
+TGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCC
+ACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGG
+CTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGG
+AGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATT
+AGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAA
+TCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGC
+CTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAA
+TCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAG
+CCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGT
+GGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCG
+GGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAG
+CGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTG
+GGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATG
+GTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGT
+AATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTT
+GCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCT
+CAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCG
+GGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTC
+TCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACT
+CGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAG
+ATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGG
+CGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTG
+AGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATA
+CAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGG
+CAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGC
+ACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCAC
+GCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC
+GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCG
+GGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCT
+TGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGG
+CGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCA
+GCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGG
+CCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGC
+GCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGG
+CGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGA
+CTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGG
+CCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAA
+ACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCC
+CAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGT
+GAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAA
+AGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGG
+ATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTAC
+TAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGA
+GGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGC
+GCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGG
+TGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTC
+AGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAA
+ATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGA
+GAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCC
+AGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTG
+TAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGAC
+CAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGT
+GGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAAC
+CCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACA
+GAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACT
+TTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAAC
+ATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCC
+TGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAG
+GTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCG
+TCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAG
+GCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCC
+GTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCT
+ACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCC
+GAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCC
+GGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCAC
+CTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAA
+ATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTG
+AGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCAC
+TGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCT
+CACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAG
+TTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAG
+CCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATC
+GCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCT
+GGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATC
+CCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCC
+TGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGG
+CGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGG
+AGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCG
+AGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGG
+AGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGT
+GAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAA
+TCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGC
+AGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCA
+AAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGG
+CGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTC
+TACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCG
+GGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGAT
+CGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCG
+CGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAG
+GTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACA
+AAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCA
+GGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCAC
+TCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGC
+CTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGA
+GACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGG
+CGTGGTGGCGCGCGCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTG
+AACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCG
+ACAGAGCGAGACTCCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGC
+ACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCC
+AACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGC
+GCCTGTAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCG
+GAGGTTGCAGTGAGCCGAGATCGCGCCACTGCACTCCAGCCTGGGCGACAGAGCGAGACT
+CCGTCTCAAAAAGGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCC
+GAGGCGGGCGGATCACCTGAGGTCAGGAGTTCGAGACCAGCCTGGCCAACATGGTGAAAC
+CCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTGTAATCCCA
+GCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGA
+GCCGAGATCGCGCCACTGCA
 >TWO IUB ambiguity codes
 cttBtatcatatgctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcg
 tactDtDagcctatttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaa
@@ -834,7 +3834,11671 @@ aatWRgatataRgttRacaaNKttNtKagaaYaStaactScattattaacgatttaaatg
 DtaattagatHgaYataaactatggggatVHtgccgtNgatNYcaStRtagaccacWcaM
 tatRagHgVactYtWHtcttcatgatWgagaKggagtatgaWtDtVtNaNtcgYYgtaaa
 ctttaDtBactagtaDctatagtaatatttatatataacgHaaaRagKattSagttYtSt
+atatatagtcttaaaaMtcatgttcaaDactgRttctaagagDtatttttagcgacttgt
+gRtgNctgSgRaaaaatgcaMtYtDcatcaaYKttHcatSWgaaaatDataggttatgBD
+MtgttataacaaYSgagttacgttatgtDStttaaatctcgWKtcSacgagagaSgttat
+BMDgtcggtgtgcgaNtaSHBatBtttVMgVcagaNatcaDDaKMtMYtatagaBccctc
+tDtgtatttatatKNtgggtatgtRaacttgaWaaYgcaHatccctggtttStatMtcgc
+MtaaaWKttMVtWctVtgttaKDWctgWaVttaDVatgKtagagtcatctaKWgtaaMtt
+SacBaMattaKaaHDataattgWtgttttgtcatBacacgtStacaaagtNctNtgtgat
+cHtWttcKaagagttttaaaaWacgRacatctNatVStgaatDHgttWcgtRKcatatat
+ctcaNttaaBDcctgaaaaaDtaYaHaKttNtaYVaVtttaDtctacttctWttaactaa
+ttttMagWcaatcccNKYtBaacatgttgaKgKcgcBHaatDMttatatcSWacatDatR
+cWaMtDgatBctHgScttaaaHtSgKtDtttattgtRStWgttccatatttcacWttcat
+attgtaHVgaBtacaMtgMaaagDaataactDatattagMaNBagcttcattcgtaaKtg
+tatttcacMtgBaVtaattStcttagtYgtgtcgccttKatgggtgaWaataggaatacM
+MagaSKRttBgatgacRtgMtagaSRataggtatcaccgaNaaaWSWacDgatacttgat
+tagcttgtgVMttatYctaRgHVcDtVRRtSaMtcaVtVtatcaYaHatattaaVaatct
+aBtgtacRatNtatttgaYatSaHctaNgNtYtYaYagattVgatcRtaacgYggtgtat
+KttaatMagatgRtatatgHaKccHaaaaYtgaacgaWaNgtYHgacagaYtctaVtacc
+cgatttttaaagcDttatNRgattKaaattttcatctaatgccgcaataataattgttat
+YtagtRNtaagttggtHaKttWMtDKgatSagBYcgRggtWaVaattHtatgtaaaMgSa
+aagataaKaaKgttDttttRaagaacaWRcaacDgtgttaatattaKtatcaWacacatt
+tVtctgatHRcagtttNcaaatcNctNttttataactWacBBttgBttaaaRaWtBKaaa
+cgtatcRcaMaatgYacaaaagtgBataStWYtggtatgacaKWtctSgcKHgtcNaMNc
+ataSatattgactacMcataattNVtDaRccaaatcagttttYttagYaacgtaatMtMV
+atNgKaaMaaBgattaKttatDaBcttKtccttttacDagaYtacHgttggacaaaVaat
+agtYatcataSgatcaaWVttcgaatgaccctccttNtaSBWaatttDttttcaatatYg
+gctatDcttatNctttagDcMttcaacWaaNattSYgctttcaHcRaattaataaaatcV
+ccRaattactctaMaVRattacagtgRcDtcgtgctcttNtWVtacagtHtatHaBDtcW
+ggtgctcaaRHtatgtDgacStgcaaaVKtagttataatactaatatgtagScaatRSac
+aattgtattgcagatHHtgBcaatKKtaaMMcaRcgactatKBaMaYatgKatttDaaNt
+RatattgtatWttagcaaaaacaWgcacaaHcataYtDaHgttataaSacgcagggggtY
+atgcKctaaaHgcVgctBDaVttccStagNgcSgtatgVYaMatcaWRBtVtgYttgtgR
+cYttcgctgaacNttgtgtctattWttttcctagMtagaWtaKgatStScatMaBtaSta
+SactattYNatctgtacRatYDaatgatgatatgaatYaaaaSHttaaYMaWtDcaNHaB
+caYtgVgcatVaacattMRatBtaatttaDacRtagtaaaNYVSMtcagaaDtttDHtRc
+YatacSNKaaMcHgatBaaVttactggBYgaYatttttgcDacHctWatcgtagagtact
+cattDggtcatKaSgctttatttagtDtRBacttaWYaaaattttgaccttaaWtaatgc
+RgccacttMtaggKtcBtgacgaHctttatcgtcStatMHDNagattatNagVaaaWcgg
+aaaYcaVactDYactaStattgBHtcYctgggtacatataaYcgaYagaggaggacaVat
+acHRtYtctgtaVgaYcNgaaaNatacVgcNgtaatttDcatttttcaacttSNcaaDat
+VYctSgcaccttagMgacgcttgaSttaaaatagttaggRHttaaacMatagcaWgMgag
+tcgctagtgtKgactaaHttattaWgcaaaaaaSatatgcgttaBNggttaYVatgaact
+ttttgccatataaataRatSaBctagttataBccgaaacaagatacttaattttgaHgHM
+gtaaKctttaYtaaRacBMtBaYgaBaaacaYtVtagcRgWatHaWagattWSacStMHa
+tttaDagacaatcgtgtKtttggaMtgtWtgtgcaaNaaaaWtKaaBcMWtcttctatga
+cVgagcgaggHaYYtttWgSaaYYaWtRYHHaMDtctttacaatggaaMctataagcttB
+cgHcNWaatttgtatatYtStatctagcactgtVttccagaaattaDtttaRtVataBtt
+WagcatDMVactYtgcatWtttgaaMggKaatgaaaaHtataDtgYcMggVaaatSMHtt
+tgVttaYaWaataRttgttaYttattttRtWtataaBgtDtttatatcVgaaBcaDtatg
+tcaDagaWtgaYtWctcVagctcagctatatagcRVtcaKtaataatHgNaccgaaaatV
+HBaatattcgttaVYttatttctBYaatKaagaccVStttcattgaMagSaaaaccccWK
+caaNtMYacctaDStagaaatttatcatVgtcaatacccKattgtaaagtggWgtatatV
+tagBcttDaBacaattWtDYKtatRKggStRtaaaWatBtaagtaattDaaaaBRacWta
+agtacaSttaaatccgctaaccKaattgVWttDattatttattKaMtcYtMRWagMtcgK
+gBagacgggVaaNaaatgctKcgtaataaKtaaagtccWcttHMatSYgataaatDttBa
+HccattgBttSgaaHYtaataaaMtgaagatgtttBgRcattaRaDHcttBgaMaWaaVM
+MattaatttgtgBRctattgKMagNcMtatttaaaWttgaaacatWgcScgYYDYgttYt
+VtattgcKcWtagcggtgBaSctaKatacaaVtcaRDccccgtgttBgKgggtHagcgaa
+ttaaagMMttScggtDttttaHcSaagaacactcacactBcVgaKNaDHacacttatSag
+aattSKHtcagtataaatKaaHtgaaRagaaVcBtaHtaaatcgatcWcaRtaaaattta
+WttaagtcaggRctgaWcttDttgactttaVSaaaatggtaWDaRMtBtaaaaaKatBga
+tMtctatatcaVaMgatttgNagtDRttDatcttttaMtYaaatcggagttctctaYatN
+tagaNcgMMactacHcaagtaaaatStaSaacaHcacSgggtNKatggaaagcggaaKgg
+gtaYtacSgccgBaggcRacgtVgDtggaMcYaaaMatggacgYStKKatgaBcaaRtSt
+ccSagcRccgccgcSDtgcggBDgaDtBtSSggacMttttaWcatcMatgtNMBWgataa
+tcaaVtgaataataaNatgcaaNttNctgacDMcaHccgatgKgWVttccaStggattct
+cDacttttttctttaaNcWaMWccWKWttgaaaMctDaaBactRtVattttBtcMaNttW
+cKacagttKSttaYaWSactHSaBtHgatgttacatgcatatMtttgtaacScWHBatHa
+ctggatatatctgagMgRSatctaaSttaVagcaRcttggaYaatKHtagBBactattcg
+taaagaagttgtVcgatgaVatHMtcaggtcgKSgWattgaaaVctccVgtDcaaatgaa
+HgMYactcaMatatatattNVttWtWaatttacRagKataaaNtttacaaWgMVactatt
+aSgaggVaaagVtaccDRHaaataRaHaRgcattMttcaatcaKaaataDcaDKtctcga
+ggBggacctDtttatHacWVaWgatDctaNaNcgKatcMtcMaatBtttggacgtgataa
+tagaaacRactcBtattttaKtgSaaggKtaggRaVtatagcccaNRttaccttSMaaga
+tcggDacNBatWcgaactacactaactNBtaStgVtNagcatctaVtaKatKgaBtcgtt
+tWaagWMgagRaNatHaaaaDtacagacaBagtgcaHaNatctcBccNttaagttDgaat
+aaNtcgctaacRBgtaatSttaatatgcataacccaSattKcccttDttggtcaatgggt
+tWaacgatacattBtgMaYgaRttatgatKaKgtattDtKWgataacgNBtaccgaKWat
+cttcttKtgtcttagcattcctWcaaHgagtatDMSgKtcagcttgVHaKcttDaataaa
+VaatttDgtgaaataaRgtcaVaatacttagtVatatgggcatgtDDtMtgtatBggatt
+HtgcVtgtgatcaaSattatKYVaacSNNttNWcgaHttKDaaMYHatcgttaattaStt
+gctWaacHtaKBtaaaaKHttcRWgaaWcRtBtttggBcDtgtacNttaagcKtaHgtag
+aaaaRttgaaacatagtWRaacYggtaaatcgctYaBtWDRtgttgSctaaKatNcattg
+tgtMttatccatatagctSacgccSNaaactacgNtgtgcttMatSKtcaaBaNaaacat
+aacagaaatagtagctcNcatcVgaagStaataVcDKKttcagDHDtattctaatgaggg
+RgBMctatacaagYactctMaaagtcgctttctcgtgaattatNcgatMtttaggcBaaa
+tctNtactaaRKtgKactattgtcatatgtacgagttMaaHSSgHgBatatcgcaSaata
+aaWgaagtatagaHgcttctttatgaccWaatttaRtaDaatttaatcgaaattgattMc
+atcaWaMtaWaKactttctBacactatNgtccttaWgtctgaccKatStaKtgagtacgg
+gcgcgtYNtatttagacctctKcatgatKWStcaataactaWgMSgHtgatctttttgtc
+gacgtSacttaYgcctWctcctctacaagVtttMaBactWVaccaYtgtSgcgttattcK
+tatStgaaKaccgNaataaHtatWtYtRacggcaDaScagcagHaYWRtRNcDtHtcVWt
+ggaataaaYttgVaNtgttagtYttgtagSaaatDgaggccDcgBRYStattatttaagg
+ccgHgggYRaaccMaagttatSttctttagcMtgcgMtgaSagaNaDagttSatgattWa
+tttagtDgcttgagtgMKaYWaYccagcaHatKctaKaDgctagacttattgattaaYtt
+atcttattattStaattWaRaYBWagYaatatgttRgScttgBagDaWgcgtgcVDaggc
+ttgtctaDRKacttgcaKBWRtaaVaSctKtacttMaaSVaWWcgSaNtttSWgtcggtc
+acttggVVtgagaataaataaDttgaaccaaaaMttaaaagaaaaaaaatcNBtatMgcc
+WagcaNgaVaNaaaaaaYaMgttaWtatHaagtNtacgacaBtMMattttWNaRtaaata
+gYaScKattacagctVKBtWNSKgYtYgtWatHaVatDaaatWgDatcctggSRagagta
+aaaMgatttRtaHacatggtaKagVcctgatgaMtaaYgatgtattattttHggBaccaD
+ctctggNNtYaatctVttgVtRtVcRacttNctttataggHSRtaRacaaattaacHaHg
+tgttgtttcBtBtatWtgtattttgcKagMcaaagaMtattagtStagcBacYaaHcagV
+gWtgtttcgtgDHaVtagDatcRaRtggtWtaactgcacgaggaaaRttSDaaVaSttaa
+aaacSMttactaNtcaacaattDtacttttYatVSacYtWtMttaattatcKtcttctat
+caKDtctStSaaacggtYccatgtgagagtWtagWKgcaBaaaaKttgNactaatcgagg
+cWtcDDaaaaaacactHattaattcactatYttaagacactaKaagRtRataaattttca
+tHggtaataaatgataHtggctaacBacDgtaatattRtYgtDNDBgKtcaggcHatttt
+gHNgWtaatttccgactactgacatVNttYYgactcgctctatttagaMcgggatHcgtt
+tatBaDSagBaaaagRttBggttaaBactVHgatgaatttattcaaaattgcacttcDga
+cttYcVttactVtttatBaKHagaWgtgaatggBtaaSggcagacNcttaDttVgMtWag
+attggVatttacHtctNcMatacttSatMagcttgtNcYaaScaYactcKctKtagScSt
+cagtttcatWaatggtgagaggHaggggcaacgcRKtaRcMaNtHaatRaRaaactVtBt
+gttaatRtWWcaaagKttccaaKaaatacgVttcacaaacgcggtgagaRaatggtgDMW
+atcWVScacaaaDaggaaHtgttSMaaaaaccYccDBtatYgtMagcSagaccaVcctcg
+gtVWaaagttatcNaagataataSaataaaKccgtaDtYttatYcttHttaagKcMctaa
+atggaatRgaaaVaaVtcKYaggatWcaBtDaggDatccttcYNtgcSMRgaRtNgaatc
+gttRttatDVMtagctttacatDVtatatatcagctaDagMtataccYgaggYaaatgDa
+aaatSgctctgatgtttVaaBcctgataKtagaaaccaKatatgttaDtgaDtatagata
+atacagtaDtatcNtgtDMtYcattRVtctataNtWttggNaSgtMgaaYctctDggHtg
+gHDccaccacKKaaacaaaatRatttccctttaagcRattMHctattHaRtataVattgg
+atcSttaaHaHgaaHNDtacattSaaggDatttcaaaYgctBcatattaaaKagtgccca
+tSctcgatRtaaaMtgWactttNMaWctYgRatDggaactcDcaattaKaactgagtatc
+tataagYaaaSRctggtacWtttccWtaYRtKHattatagWtKttaNgcDtatHacccat
+taatttataacgctMgaagtaacaacagMgtaYHYVtKMHtacMgKcaaatctgRYataN
+tcgttcaatacggWtMcaatYcBWaagYtVaDNagtatagDaaNtaaaYtttcYWttttS
+tgggataaMgatattagaaYtNctcttcBagactaYDcgtacHDWccKaHgttcttHgVg
+gVDttatcatKaMttttacWaaSattctatagaHaggKaDagBtaaagtcYccattgtYc
+atctaNgRgVtgaagtDKttatBKcggDtattRYgHccgtgcgBNMtttVRgacaYctSc
+taRacgtagagccgtacRaagtaHKagStSttttgYSatattaaaWHaaWagttDKaaNa
+NHaaHttaYcttMtcaaatgKttBtSgtccaaVaattSaacgttgNattgatatNctaWt
+VcagtactKcWacgVagggHaaRgaDaatcMttattaataacaBMaaVtgYtKgRgHact
+gtactatcBaMtVggtagKcYtHtBSaattagtaatgMcaVVagYYgWtactttccaaSt
+tDgaaMaMttcacttYtRgacttcagcttWtttagtgataMaattaagVtagaatatKat
+aagtagttaagHMRaDattaHaaVcctDtagtcVYcaataaYcNttNaaaHctcaRaatt
+tcaNRgatSHgVatagctRtcatgaBttMaaagRtcgHVtgRgStgatttgtagaKagaR
+WRctgNaHYgaaatBctgtttRttNWagaccgagKgtgcggHKVttaatattaatataat
+aDtaNcctacaaRgcaNMctctgaaSHWWHcttagtNagtWgWaaKtYaNgcBattatcc
+aaaSctRRHKaNtKcBgtgagaDRWBttactaaattSMctatatagaaYacDgatttccV
+taagRtgRataatatagtctttttatgtMgtcaacaaNtaaaaactctWtagaVaaaDta
+attatagtBStcgaatDtgattVaatMtcaDattVKWaagatagggttgtMRSgtcYgWM
+aatgNtagtcBttagtttctctWaaMtVgctWgSgtHagaSagactagKtagWggcattt
+HgttgacaaactcggggHggcWBgVgtatgggagVgagtcVcBtDctttagtctaagVWt
+HtgtttaScatacMBtKgattatRtgtttgtctttDggcHaBtRtgtaataNataattta
+taWctgaYWataStcHaatcRtaaVagDWaSatagtaccNDgaagtatacgttttacgac
+gKRtattgDctatRRattVtStaaactagatgVatttagaMaSaaaattVtatYtgttgt
+RMagtHaatttSttaaYNaggWagtgcacgaMcactgHgtgtgggHMgtKacttaaYgtc
+gcatcSatattgBaagtttacMtYagSatttatttaVtaaDtaWaHcgNatactgactHt
+ggWtataDcDScatactcStcDtgtcgtgtatgaggtHaaNKgDattgcBccaagKgtat
+gacKSMtttttgttcaaatcaaYtagtaSatgDaaaMccKNaMaatagaataagcaatta
+ttataaMgagtgaSgtctNYttattHaNaYYtcDDtaatNRgtatttaaYtaaatcactH
+VaHcStccttcccaaVatcVggatKtatgRaaDBgaYtttacttYggactSDtaBcaaNg
+gggtattatattBDcttagagYNMatBgttYaagactMatgttRgatacccgtaacacBH
+tatKacWgatRcHttaattYtKtStccaaatVDcaNKHHaaataatagtagtatcttgct
+NDggVaVVtaVaRaaagSaccgttctcMtVtgNBgtDtttctYgttactBctcRtStWtW
+DScMtcWSaRatgaataRHctaNtcStctYtWacagatgtatYBtHaHWBtacggtDcaa
+BtatcaggtcaVattaNctactgaaaatWaDgactNWtMtggagaattBaataYcMWYcg
+atMYatWtgattSatgaRtDaRgccagtSttatatRaBtattRcWtagtVgaagttMcta
+ttatatDttaggtctKtgtgtBagacgttatRKtgatctatttBtataactgataacKcg
+gagtgHgtVttcttgtKDgcDtaYatBDatcaatattgttNtaBacatcgcNcaKcaWcR
+ataWcVgtacgScaWgttcggHcMttcRccatgaRStYgNacagatacYacWWtggNaDc
+WagttHatMaNaatNtcDMDcMaKgHNatScVgatKWatatgNRgtccgYgaagattDHg
+tMtcHaSNaaattBatRagtaaatttacaagHWtKatcaagtccHtYcctgttKDMSgta
+ctactVctgacaaaaHgatatacataatKtStHgctScSatNatacaYttaaWHtctgaa
+tYtagtHtKaggccWBaStaDctaagagNtaatcaatcgttNgaYDaagtaaaaHataga
+atcgcgBaYaBgaacSaaWaaaaactccgcMttHttYgtaagaMctKBtacSagattcBa
+aWtaattttacRttatcgaRtacaRHgtgRagaaBcttaVgacVDgggaatVatagaact
+RRtacgYttNattVHgaHttacaaaaaaaYtcRWtgtgattatgccaSDtttatKWgaat
+atSNDgattttaacgtcSRtatggttcttcBtWtttMtBtMScttaHatBattHacYtaY
+acattcgttKgtcStSctcKtatatttcaKSgagcttccaacaccRDtttDaccattata
+tSgtcWtVaaagttgtagccattDtYaatattDaccatcVDaaRccagttttgtcHacMa
+ttcHgaNcatgttKcVttcctgtgcSataaatattgaKtctaWctMRaKggtaYcaagtt
+DttcgttacRtatgatggHNaWMtKttcatattaaDaSaBaaaMtMatBgKtttgHtHac
+taatcatcgtWaatKaaWcaWtcctVttaaNaggaaaagtaaagaDctNttaDBaBgata
+gMgaataacRcYggatcRaaaHaagatRDtVRactaYagttcaccaaWtctcSSaaatcS
+KattctggDgaacagDtaDagacagtgtaattcaStYttNaStgtaHgccttaScatMRc
+accWtcatttatRtaagatWtNataaWtMNtDVgWttgcWgtgaRttttRgWcttMtcta
+HacaaYtKctgaBagtRagacttDatNttaaaDgRtatNcHatcSDgtBatcttacVcYa
+cNgaattaacgagttgYgacttDattatacBattMgctagcctagatVcaactNttccta
+atgtDaacgYaNatagMatSWtYBaaaRtgMtatSRgaataYaScaVgtaScMagatNNt
+ttacaaHBaWtNtRtctaaacDaaaaWMcaNtcVaDNcagaDtgcWKYgagttaHtgcDY
+ataaacataBaWWtcggtatgtgaaScaacctttRNatcgttaaagcaDctaatgcBatt
+tacaattVaMgSMMtccYaaaBYtggattttcataWttgBtatDtBgactaatgtccWaa
+HataaScHttWttDtcgtcaagMctMDtaaaatRtBaaaacaatgtcagcatBgNNBVtt
+ttttcBacWtttWtSWWtgaaaaSacgBtaaataaagtcDStaagaactgttaatYatgD
+ctattactgaHtaaatStHaagacaKtagDtaaHaDgttccaaDtaaggacactctDggc
+gtDagtcWaHgRcHgDgaSctttattgtcttttccttRYaDgNactaaatcaWggcNSBa
+gttttatatStKgtcRtgattaaggtcaSBttaacaaKatgggatcaaattgRgcBagtN
+tcgDcatttWcctttgtNagDgctgcatttactttgtgtcaBgSatttNHaMcggcagSc
+tcKDtWBaagSagWatggYtVatSRgKagattgaVatKttcgatYatKYSgDaacNtcVg
+tttaWataWtgVctgcgSggMgatccatgagttgtWcatYWWcctVcNHagtNtgtKttt
+gatcaacttaSttattgatNcatWaVgNHcagStVHcggHacaaDttgDttWcaaRaKga
+aatKaattagtaWacattgaaatgtgaatgacagtgaRVtaaYagYtcggcatMttgaag
+gDgagDRcaKgHtacacaaaMcaBtagHactgKaatRtNttcttcatcatNgYgStggac
+tatgSMttgKtDaDgacRRgtWaVattgatttaagYctatatagactaagaggtatWtat
+aaactaYaHRctStgKWcgtRtKtYtYtagacgattRaaYBtaStcttaWataatcHtta
+taRcactgagtgggagccaattctcDtgDaggHcDRVaVVggaaBtRttaataaRRttgt
+aagKNcaVWWgtatacctgatcttBtcttRgaWcaVRKcagttSacttagcgtKtgtYWa
+tatcgNttcKaccacacVKctgattBtggacgtctgacaDtWKttattttgMBgKaacaD
+ataattWtBtBRtVtacataaatatttgtWtttatagtDtgcctagctHYaatgcaNaaR
+caatVtacctgggggKtagBgagaBgRaaNttttMtMagMtgtgattNctcNaKggWtMa
+tcttagWgtaatatatNctaYBggKaataBattYtaattataVtggNtcgtgtctaatta
+aacctHtacaaactDctDtctgatatgMtgataacWctgtgYSaaNScgDYaWtatDatM
+KgcaatttctgNcgtHtaWtagatatcYBttaattactcaaaVattYRWtatttDtaNMY
+MttgattataatgcgNggWaatYagttgBagNcaagaaaDtRgtaaaagctgcatctagc
+ttaVgtBttatagcKMSaattYtHcMaBttcagtcttgKatgVSVttKgttttttagtgt
+DHgNggtcaVtatttaacNtgaatatgctatMcatgaaaBtgBSaWctaataaattatYt
+tagtaDtaccggaatgagtaattggatttaacBtctSMgWYtgKgattacgRctctccaa
+tgtaggcctgaNaatScgYataaBBacaKtHtttcatgaaHtgBtagaKHVtacctVtca
+accaDaaWNHNaatgataattgatgWcagggtcMBtgSgRataHctMctgMHHtKaBtaa
+MtMgataaRWtagYtgaaMaSgctYtgcgaaHatDtatgtcWRatKatatYDcBgNtRaR
+acattMcagaHgaaagRccgcgWttggSatBagagcHgYtatctVtcatYaaVRtcaSac
+aMYDcgRtcaaWgaRgataMtaaaacaggtgtaaYcattgWgDHcWgttaVatttgcatc
+taatccacaaagaagSatgcgtagRgagtHDgaVcgtgcttatggMttttcatKSctNac
+HcctMaKRatttgatctaaatgHaaScataataatgtttgtgtHaVcaaaaNHaaaatcg
+ctgSVtattVttagaaNWcacagtgKtatgattHcYcttgDaWVataBatBttttWtaac
+tNaattttctttaaYHaMtttaaaccgStcHaVBaatcRacaaWactgtagVKtNRtcct
+agcWaatNgctKccttctcDaBDcatYHatatgcaataaBaagaatgDMttaHcaaYYtc
+actgttRtgacRaacctaWtBtBMagBctaaBaWtgatgVtttattataggttaattgta
+atYcaRtVctcttgcacSaaMaatactRSgcataKcagcaVNKttcgSatcaaactaatt
+DtaHtNaVtgttttttaWVtatNccagWttcgtatBcgttVctcBttaaaaMSaDattKR
+cctttcataHaattaatWaaataKcaHVaggaatataBYKHVtgVcVgtcHcttccgcct
+attDtMMgWaacttgWttYtttcMcgtcctaaVHtgWtggtgacKtcaWaYMttacttag
+VWtacgSatatcgWcKaaatHKaaaYttgtagtcaacWtttggtcaagttgaaBBaSHac
+VcgYgttWBSRWggtattttaYDtHatattcgatNttacaaaaVacaMccaaYStaataR
+ttVtcttagaVKaacaWcgccgtRatcatctaaatccMcctttaMggccHgYcDgaKcta
+tgMRYBagcaNDtgMtcRttgtgHaRttacatgaWcDtgctgtataggNggtgaatagBg
+agYNtatcagKtHcatBatgVKgaHWagattRDatatcgYcHagRtaatgWtcStagcVa
+tNaaaaKttgRaRBYNgtaaDtStaVRgcMccatMWaaattBDatttaatttataaHtag
+tVVaDRMKBtaacaatttttttDaRSgaaKDtVaBatcagtaaMttaagcctRgaNVggg
+ttcataatagNatcctacactacgcatgtcggaYgtaKcatggattgactttHtaattWN
+RaaWYggttcaaaggaaNtaatgcHcaaaattBtagcttattcaagVtatttWgcctaKt
+atBttDYcattagDacKVaYNccgYaYRaaMaattRaagaHtatgcttgcRagcgctSaa
+tagaaRacaRacSccagcacVMataatHgRtagcgaKgYRaDcVWSDVgRaMgcDgtaat
+tttaYttggtaaWcttKDaaYtatMRcgKccYcagtYcBgRccattcaKtgaSSRtactg
+acgHtgtaaaaBatWgcaMcBcYcgccagactcttcSatYattgatgaNccaaaaWaKat
+VgcaggtWtBcgttaRMagcaaagtgttcacatataaagaHWtKatctacttatatcacY
+RaaVagataagtaattttgatgtBctaataggtaRtaaHaattgtaRcStYSYaWRgMta
+caHcNSttVNScattNKaaKgBtagtgatYcaaaStactggttggggaBggtNtgtcaaW
+BaYVSNgtaataBNtagtatatcacMcScccVcgtVRRtttNcKaSRNaNtHRttattta
+ttgacaatggSaBagataaccgttcctaDNaattgctVtatNtHtatagSccaagctKtt
+aaacaaattattgtSHgMWgStttNaccattBMYatRtccStNgttgaaBcctVagcaaa
+atgatattcRaBccMWaagKtttttcMtgaRYNaataDttgttWRttattggHtNtataa
+tggttgtStYgaMcYVtcattaggtaatVcaNggaRtNataMWcctcYgcgagagRgcHM
+gcWtgaYtVSttgDaacgaaaatMttYWtWttcctgaKNttatttattRaattaagaccM
+KtttcWgtcaBagKSaWaaacaNtaYaDtBNaaagWtHgacaaagtgVtcatKcgcaatV
+aactatgcgaaactccNctatatMgactatttatSaaVttNttRttagHtccKtHtaaaN
+atttYVctaatttaaaatHWaNtSacgaaaHggaaatcacagVYcctaattcMNtgtYtg
+agttatttaBtcRgBHNacBtactctagaacgcKaaDWYYgcattactVagaYtgaVVcg
+caNctttBagKRcSgaaatttgtatccattgtggHcaatRtaVtaSaBtcYYcatcgtgt
+cHaVttaHattctgtcaBSNYaKBBattaatggctgtHatattgtBacDcBgatttaaaN
+tggaaaaYtNcaKagRRtRgttRtMtWgggatcNtacacctgtWKagatataaYVMtaaD
+taaacctctgtgtgccttScacWaggaYacttttKacgtttgtgataKYagaYaVatcWc
+SattaMcatBYttYaaatgStKagWattKtttaWgtagaaSgtRattcSaDagVaMatta
+ttYaagccSgcNaaDgaaSaggtaNgtWactaWcgHctgaNatttttcaatgtaMHSWaR
+tggtaNtaHBtttWWaaatattcVtBtctStWtaWMaBcatttcDagttDtttatatgtt
+WBtNaYatcccSgtgagcgaRYtBtagaDacBtaagaataWactaaaagKtaKaWaataa
+cKcccgDtagccaaagcggaatcgctSRtacKgcactacccHaactMgtgccaBaRaaaB
+VtcgSacRKtttStgatcaaHgKtaaKaccHaccacccKttgagcttcSttttKKcgacB
+gggtYMaatcBStcgDBtMcataWtaWaMtgaataagaaDatccSYDtgBatgactBaVt
+aagatctcNMgtcaWKtgcWggcgatacgtgtttatttWaDaNWBNaaNtNttcaaatag
+taatScgHtMWttgttgaBaDtgNatSaagtttHttaNaNKaattKatttgatcgtVcat
+gaatatBtttctaacKaNttVttSagccatRtatatcactcHHatctWSKttaMacaaDa
+ttccaRaYttttagttaatattcctYaacVactgctMcgagcaMYtttgaagctagtKgN
+WttgaaaMatcaMcttcSVatcaatgtNactaaBagatagagtDMgtNtNWatttSaHac
+tagaaaDggtaaaaNctMaatagtaHgacgMaaacMtacatHtaSagaHatYDccagtBt
+gaWatcYtVaagataattgatcgacctgcaacgttttattacNMWNcattataDVDacta
+tattatYattttgcgaagtgagYVtagYaWaHaatctgWttttatgcHaacgttaccDaK
+tatagaccaDDttaacgtHBaacatccgtYaBtVtNccaaataaaatVactDttSKtcMt
+DSgaagctaMtatattgattactgtNaagNBcagHaDattaaaWttacacaaatactcaa
+tSDatagctcaDttWactttgaStaaDtagatSaaDtgtaatKtgVataggaagWSaaaa
+KatttaaagtttgcgtaaagcccggNWaacatacatgttctaRcaHttVtcattatctag
+ttttNcataaacDttWaagVtNYtaggctttggtatgagaWgtactNaVatcactVttBK
+cttaaccttcMtatcggtaataYaMaYggttgtcaaagSWHctaRMSatVcggactMata
+tccgaatcttttttcgagtccagtttgaMtcgcatcaaKagtattRMaaaKDBttDNcca
+tttttaaBNtVtccgtaatgaKgtcagMVSattatttaWaattttaHNcaaMaHttgtgg
+ctattctacDtgaagattatcgacaaVRHttcSaSaatactNHWaaNcgtWaWgaccgRS
+ttNtHtcttcKatYatatBaagtcgctBtgagccatatScctKaagaaKDaWactWagBg
+ctgattBagKtgaaataBaaaaagSacScaaagagtagcgaDaYtaMcaYcKtaataMat
+ttttaactttgYgtcgaaggacgcHctBcgYgaaVacRYagagBaaYgtagattgcgagt
+caagtStDagatBgtgaccctaSWtctDgactaSHttctWatWttctaWtatctYacact
+gBWatKKctgtatYgacaaHSatYSaNgSagtatagatgagtatttatgaccMaatgtaH
+tStaWttgYagccaWattcagtBaYtaaNaBtaNatactggcttWcaagatDctacggaN
+ctatcacatSgKgattgacgacccccgagtNDtattgagaaatattaatcVttNKtaaWt
+YacgSNcBHgttgWtatgtttcgccaactKaattaRgacgNataatctacaacKgttBat
+YatNMSaaaNtctKgacttatgcttatKtcaVtVcagDaataattYgNtRtHaagcaata
+HcacaVgtaNNHtHDatgttaMNtggWagSVaRttcMVDtcttWgtRttctacKaaVttc
+VcgcatcctHRKtattSgttSacgaagtcccRDVaacBWagtgYtKtgattgSgaBtgcc
+BtcaKacaDatacttHatcattNatttacgtcagtgaggcBtaRNaRcaSgcatattatS
+tatgctYcacgtattcattaaRtgStcttWgtattKtSYttNaHaRtNYcRaYtVtggtD
+cKcttctactaMcacggcMtacgcttctatatHtaatggcattMDtaaMaKattgaagtB
+aaKMVMNacKaDtttKNcgagctaaagtccMMtgagaagVaataatggcaWaaaaVaBgt
+aSaVgaaaSaaaataDttVtBccaNagcSBgaMaDaVaVYYRVBgttYMtagtaactDta
+agWaattBtattttMDYHtSaStScRaKatattacacctMttgNBKtcRtRggNagtYMa
+ttaaatMctYgaatgcKHagSggaaaaBcaggtHtatWcatcgtStagMcctcatgatta
+WRcStcgWtgRgttttcctaacatcgctcgDDtRaatatMgtcMtHtMaDYatgDattta
+tagctKDtYHaaaaattaSatatctggtctttattttatMtgtYttgtcatactcaaVcY
+BgatgSctKtYcctWaRaataWcMgNgcgggagtcttRMgactataHaHtgctNtVaatc
+aaccacgSRaDtgKtaaMSKgtaaaaWaKtttVagSDtaaaaaatgttYattttNagMHa
+aRtNgBttWattatatgcttatatcatttatKtKaaaagctRaaatcgcYgacgNtacNt
+ccVtSaaatttcDVctaatacWgcaMtcttSaaWaaaWagtagtaattaactagRttaVc
+SaaatataacHgHatWaattggaagtgcgSSgaaVtgYgSttccatWVataatcgaatat
+gHtRcgtBttcttaaggatatgttgtBcNtaatgtcacVatactgaaatMBttRRcRatc
+catagagggacatcgccWttagttgWttatKagtaaaagHtttccttSatVatKtgagca
+atttattaaYVattcaaattctgSattRaMtgaatMgttattattacaNcggVagcctta
+aKgccYcaaDattWtggMcttMacWttccMVgtgaattctDaBYgacttKYtBacatgct
+DcRaaKaaRaatatctttagKcKtaactttaatNaaggctgScacctYgcgcaaaccaHt
+tVHcBaDgtaatHaHVaaatMgttggtSatHtNNaaVagtgtacaataaagacgKttcaa
+aWVacagctcacWHaatcctgtBNWtaNMKcVcVSWtSgcaattctgKtVVaaacaRaat
+tgatRcgBacaKacVccVMactagcgMNaaactgataDaSgagaatVHaatVSVtccgga
+tgRgtagRatttgtaactaBataVaggcaagHgaaSMSaKgctRagcStNcatttVgcta
+tacttcNDtcaKBDcaHtDcaatagttHttattMBgagctgtaaagtMgatStStcagat
+atYcBtataacRcaggRaaaggtaWSatKgatatgagcgtgMYatcagcatVttSgaaaa
+aatatatgttYttcattatacataatVcacgattataDggttBtRaagtHMtatagaDgN
+ttggDaKctBcaaRcgattcgtgccttacaaaWattYWVcaaWagDattgaaagggaaga
+HattBtatVggtaHtWtaMagtccagaKttSatatcaStDtgWaagtKWaggtatttaWa
+aRcattaatStgaaVtacggaacatKctacatHtaaaBtcNWatttBBaNatRcDattcg
+aactataaattataactcagtSgatataagRaYaKHctggtaaNtttaaNgaRHtttatt
+atacNttttaDccttYgtaaacaggaagtgataaacatBgaSgtaaaaaaVcBgtWNtRM
+ttBttaaBgtaaaatatcHNStaBtaggtaVatYaccNtBaWagRctNSacRtMatDact
+StVctaaDtaYSRgttaRNttttKggccagaaBcatagtYcaYNtDatcgtatVcaatWR
+taggaattMcatRtgggatgtcMggMtttataagtaBgtggacNaaKYtgctWgagYtWc
+ctWtVcttaaactaRacatggtRcatctSDcHcMgcaactttttagttaccttattHRgt
+acggcactDBggtMHcVaaRatKctSHacctacaccactaaHaacgSttagKtKttttgN
+HVgagtaYaMtVYNVcggttaSBaBtaatttSRcgtBgaWaatctttttKggacaWKaat
+tKSaccttgDRgtcatatDatVMtMaVcgaattaNaagMWccctaaHgataatatgtatt
+WataaaatBaaMtgRttcHctaagctaagatatattMcggactaRttttKaSttactWYt
+gBcaMMacRRgNtactttaaaSKtttcaYBaBttaVagtRtHcWaggaVccttNgtgagt
+catataWttYScMtWgVRgattWtaSggacggWWctBHatattataaKaagttactaMRa
+aataSRaDttDaaatataVHaatggaaBDgWgHtcKStVcatHtaatcatggBWaagHta
+gtMtgHcHtcatggggWcatacaHNHagcDatRcaaattcgcttgDggDNVcaacgSgtg
+gcaccttMttaatattVYtVgaagRttaBcagVaYaHcaRDBagatgaVHtNMtcttact
+DaggMgMaattRWDcctVtgagaaaaSKatHHttVDgtctgtcacatHNttgaatSaagt
+KBatatagacaaRVctcWtgtacKtaacHtgHataSgVtactaggtttatggBgtcaaaY
+aDgaaaaaatcgMtagaKaYatgaattatYcttKtacaatttgWttMaatBgaatSttMt
+NaVgVtScgcttctBHKgtaRcNBaatcDtacgattgacgtgctatNaaBtMgagNgKct
+tWcWKacactYgttVgNcgaattttcttgaaaaactacccctcgcNtgMctatcccacMc
+actcMatttatttagtagaacMNtttcttgYKaWtaaBtttcWttagHtgtttctcttgt
+ggctatgDgctaatWDataatttagaNcgcRRNataKtctaataHgaaMYctNaKWtact
+aacDtgaVcgagaactggtaccaactHgaggctagagHHagtMgKtaaactacaggMatg
+tYgSBaKaaaattMgatRtggggtHBVgttaattgKttaaRDacgMactcaaacStaaag
+ctctgtgccttcgtSagtSaRctacaataKatattctaVgtgtaattRacKagttattga
+MtaatgaNatacDataaggactttccNtStatatKaagaataKtatggtcctctatgagg
+ttaaDtgtattgataaaactggatcactKBtttggcgtcaaagaaaNtagtWKatctaaW
+BactDaBaYtacaWtaSgcaattattWgaaBgactgaKctatBRgtagttaBaRRgattt
+aagBHctStgtVYRtaaataaagtMWtcHgcattcacaaMWtcMccWttgVgcHaWttca
+NtgtVaggNgcVatKttataaWDcccctatgatVttttattacagRBBWttcttRaWgaa
+tBVgcgtHgWgaccagtYacaattgSttaaMcVtDatttaVttRgttKtcaYWatKtaaD
+tttWaYtaatYctSctatagtcctBtccMaMMtaMYHaSSgKaaacttctcBtMtgDtgt
+ttttagRcgtacttataHgKtNtMtKcBtaNKaHStgSagYHtataDtcKtagRtNWaac
+VgctVtRtttStNtgaaccttaVatgagaaggtcaKSttaDataagcYaSatNStcaatD
+NgttcgacaatttaSgaRaBNNacattRatNtgSttHVtgWHgtSHccaactKttYtatH
+YttVtgHcNgactMcaacttBatatgSgattttacgtatttgtggtScaacggYtHtgca
+tctatttttWtaSatcagaYatcgcagtgtgtMgtattctttcattaRatttStcaatat
+gcttDtStaaagaccDcVtaWNcHYtWMaMcgaacKcaNcttacctaBtgcDacatcaHK
+tRcDaaacataaRacNNtccDataNactttatBSDYatDtctBtaBatctDatKaMcatt
+MatatcDHctaagRgYVcatgttcgtgataHDYaagttSgHYctaaatgtaaaactNgta
+gaaactaattRaatcttttBKcgaatSctMaggVaVaaatgagataaataSgttKgtcat
+KaKatDYtaaaRttYaMtgctcSatRtagttttagcaaNtaKgatcgWYcacDgaatcaa
+tactgBgaNtaactaaWatatacaatacactaNatcaVaKaaMaaaaaatcaccBtgttg
+NctaacaBattttaaKWcaggataWMtaattgtaaHtgVtcgaHtScaHtctcHacVata
+gtaMcaaKtcccSagMYtWcaaatHHtaagRttDagtMtcYtttaaWWaaaVaRtcHNtc
+tcSttagcacaKttgtagtNgWYtatKDtcatttgaacctcKHtatccttattcttNggt
+BgtgtKaggWtYgtStgtVaRtaRaaagtagtgtcgcKtKagatgagYtttaatKcScct
+gaaaaaRaaHtttttaaaVgtatagKctaNtKaSVgttcgagacattttRSatagttSac
+ataMtaYHccacttttctatactagtatgaBaagctttaMtgaatgtcaKYtaaatatgg
+attataNcgBHatcctaRaaactgttgacttYaHtStcatcctDaMBttgtaWgagtaat
+WKataaaBgBattcttttctttaatWStaatacgNaagtWaMaaNgactMtgaaDaggaa
+aSctaSSgatatDttattatcatagBcaataVcHcRgcStaHaaatWagatHttMHacta
+RacttaYaaaaNtataHKVaataKtatgatcgtcVaaWgttYtVcaaYggctRWttaaKt
+RttDaKtgtatcaattWKaatBHaaaaNgaatggStHgVVgatMgBYtaRNgBDttMcNt
+ggaNgtcaHtgttDcNaggBtatYtacVaNttctcWtactHYcSctgtYtDtgWaatcHg
+atDatatcHtcttatattaaKaRYaDgaatgSYcgactgcRgaagttagtStYatYtttc
+cgacactacagKcaaagDttaatVatcttaaacRaDatRcBatKNtNtaaaHtcBgatKH
+cWStSRaKaSMgtaKaBacWgDDttgYaaYttaNtDgHtatSaSataaaaMBaaDtaMat
+DaagWtggaMtRcacttatggctNataaaaatatWNMtacctatgtcaYKaRacagttHD
+agccgtaaYcaatataatcatagggaaSatgMYBcKBBtaaRVRatRtccVtgtgaagVN
+ttcttagtgtcWataVggtaaNaatVgVaKctttNgtttagtaaagBatBtgaYSagHtt
+SYaacaStcgcagaSttcDBtKtttggtctacNttgNgKNNtcaaaaKWactgaaYgaYa
+ctatHtaWcaactgttSatNVtgtctSttYctgattVaatKgtaYcaaattSgttaStat
+ggtccaatgSWccaaactattgccgttacgcNatcHctctcaKatgtagtctattttaag
+gHRatcDaagSaVgaVNccaBKtacgtttStagKgtctaHtcattaYcctaVKtttaYaa
+atYtccgataaaVttcDgatWcgBtcctaatttNaattgctDYgtgatcaatttaagggc
+tctcatcKattgBtaBagcaYcKctctttNtaacHacNStggRtMatHHgtacatgcaMa
+gtgtccatRWttRKctaaaDtcMctttaNVgaNtcMatcacHcctgWtaaStcacgtctN
+aagRNNaagMaDtactDgctttttcatcYacttaKttatgcStDaStNaMgDtaacKtMt
+acctaaWattggtttNaaVHatgaaattaattacgVNaaWtggaWatctgVatcacYctc
+VHMtVaNacNtcccaWtttgcaacctcWctHaatcttWcaaaYaBaattSctYatctaag
+DgBttagtaSgaWtBcRcKtccYatatcKBgtctttatgaaHDcgNaMatggatgtWagR
+ctStagagaagaacagctWtNtataaaataRatHatKgctNactHgttRgRgVcRacatg
+HYaNttaHtattaNStaagatgtagaHcVctcYgggccYcaaaatgatcttctagctctH
+MaMMgcaVtgHgtaagaWHHtggtaactBcaMNNctagaacggWtctttgaggHcYNaaM
+HtaYcttKaagtSccgttgggNMStatacDttataaaVaYcKtcgcattttcgacctctc
+acVttNtttattgtcttctaVcatagaattMttgtHtMgacataaatagttctMtgtWgW
+ctttcaagYgcgtNaagcaaDaVHaaStMtaaagccccgtgVgtcacatcHVaDtgttBt
+BacBtcggYttDagaDYtccMttagcttacNcgaagatRtDataRtgctaatatatgRtW
+VttatWKtgcBgactcgagaSgtaaaaagttaaWaaagtatttctcWtatcBtcataacN
+cgctcRKaaDKactRaNtagtatBtgaaatttcgcDactttaNtYgagagaNttgaatta
+ataaaSMattRHNtYtgttgaDBRBttgWttagSatgacDggNVagRWcggctacDaYSg
+aaattHgtYaaagctccVtatacattaMctttgSgacatBKaattRgtaBRtttaactat
+tctagcMKMtttctgtgtgVgtctttcDcgtaaMtaggtaaaDtcaYtatccgattcYtg
+aaRttctKaNctaYgYaattYgRttWctWttaaaccaatcactVatgcgYttgaaatgat
+KBcNRgctcatgaccHagcgaaaatgtVgccatcaBSatKccRStSattaaatttggtaa
+gcVattctgVcattMtacatMgaaaaaataYNDtDaatcatWattcaggNcaccctcBtg
+cKcHagYtatBatgBttgtVttaYBgBgataaHNtacRtcaaBaKcagNtcagaatYgtt
+WgggaNDagtatagRtctcDtDaHScagttcYcatcSYacHcagagNgtgcHagtacagc
+tgRtatatMtaatRaWMHgaaKacaBRtagHtaaaNcVHcatWBgWaaacWccggtaaRc
+attgMgttaNgttVMVttgcaagagaatcaaaaaagYScKVtgccgacHgacgttcaMcc
+tcattatgcBttttaagtKatDactccgBatHYgttcatcgaaatctSaKaagaatWVtc
+gttgtcttaMaaYaSDtaaaataccgcKMtatgKtgScaaDMaaaactgtgagcVtttaR
+cttgtaNMatatatttggtMgYVatDaatttgctttaaRtaBgttaYaaagKtataMtWS
+tcHaaaaNacgctacMttDDgactacaNaatBcagtcattatatSttaVgRtWgSggcaa
+tSataVgSYgctBttataaYRRgaactgtgHtgacHWSactYNgtttBactatWStaNtc
+StcMttgattStacctgaattctWatNaaHgMatattcaaaKWaBaataatHKgaWgata
+YcaWMBtgtacKagaaaaagaattttWttDaMtggttgtgaNMtVtDcaacNttactatt
+acggKctatttaaaaBKatagttHaatggaatatYWgtaVtNaaYgataatMaccWagag
+atRttMtgKaMcgatattaacaagatgttBBcNaYattcNgtRttgaBcctaagaSMttc
+MtcctcYattcaNaRBttaatgVcMNgaacKagatcgNctaWVgttaaYRtgctSctaaa
+aNtttgctaaScttcVattaHtaaMacNgttNtKHMcctattttaRtttVtSgtacatBg
+tVaaSSaMVaRBcaSaRHtaWtWHttMtattVcaMtWaaaNaccccgHYtcatagaaRta
+aBaatttaBccaatcRctcatagWgcBHRtacaaDttcBgaHggcgctaHtgacagcSNa
+ttcctcgagaccBggtcaagWctgVcRDgVtaagtttaattatcMtgatNagYttHtYta
+gccRatagDtaatcNtaKtacaMSgDaaaatttgHaHtRDgtaattKtaMHgaBcaWtBN
+YaWgtttStttaSttgataatgactMKatHBtttaVcYatgggttttaDKcSatttMata
+tcagtYaBtgVacaatHcaDMcccgtaataatagDataatVaaagaagaVtctccgaRgt
+RtaatcgagtcacttgttSatgNDHaSNRcggtaSaagcSaBgWSgcatcaaWatgttac
+atgattcWacMtagtgNcacgatgatttttRcWttSgtaatMRRBaacNWRHaaBaattD
+aagStgatccttcaDacccctKaagScSSHaaYHWcHcaWcaaaMBataattgDtagccW
+tcRHataMNKtMgHaBcatcgaagtgtaRgtgggaVMatgttaWRtStBHactaaRaact
+NctcHaaaggcatgcVHKHgaatcSccttggSaWatWtNcaaBctaRagaaacacgcttc
+KatRattcWtgYDaaaaaaNatWtKgaacgtNttactgWHBaccaWacggttcaaVgaga
+aacVtMttatagaagtatWtaaaNHYaMacagWagtaatttgcatcttcgaatacggaHt
+aatVattctaDaHtRKRaNHcttacatcDKttMDKaWggDtaatcttYctcWtRaaaaKt
+aatcctgccccatgcgDtctaaVMtWRKKDctaatatDgactagWtaaaBcKcacMactM
+HHttgDataKHDaDttHttatttagtcaaVatccKWtacWtSVcaggtaatatDSatgcc
+tKtatDtttagacKaaaagcgtttaaSaaaYtgattgtKtgBMcKttgDaaaagttBRat
+HgcaKgDgtgcWataatMWgcVaVatcYgWttaDatcatNaVgtttgggcttgaHRDaWg
+atttctgMHgtVtgccttBtWtaatcgttcgKgRcaBaRMtaattWgctaatMaVBccaH
+tDagaBNaataRcacYcYcHcatBgaNtgaNgKHttctYaacaaaYgBttRNtNggaagc
+WtDggattgagtHaWttVacaaaBtgttaNctaatactKaMaaaaaDtaRatttDaaagN
+ttcYcaaactcMgaYgtacaaatMaaatYtcacVaacgaaDagatWgBgaataggtWtKa
+aMtgDttHtgagttaatttgVaaDagttNMataatttaSVattNaDtKVccaaatcgaYV
+taaaacKRaataatgaBDtctRtgVcttatttYtgaHgttBWatgaatatacSaacctSa
+tNNRccagtactKagaRtgSKMcgaaDattttagtHcKcaaagtggtataaaggctccta
+SatHtaMtRKattaNRcWtccgctataKggatWttaggtaatHDRatttattRWgcgatc
+ttagSgtcttactatgYgttYaVBtgcaYaaRtDaatacHHtDcttHgBgNcccataDta
+aaaatctNtacatatWaRMBgaattaaaacgctctctcaagtKcacNacgVRVcttttta
+acttgctcStatRScaRaMataNaKagtatcattRttNaVatcKgtacNatttttgaNcg
+acaaKctHWtgaKStacMaBatgWttNSacaaKcaDaatcWaKaccgYBggMScgaMcct
+agcaDatgtttcVatgtRBtKNWHtcctWDtatttttNNSaatattcMttgatKgNgaNB
+atcSggtctRcttttttatatggtNttDYNYgaaaKctcacacYHRgttacatacttYac
+aataNaagaaaagttataNaataSatacagttScacVaScaccSWtccagKHtaatcaaa
+tVacatWacgBctccaataHaaYtMtacKacHttttKtcataWWtgtgaatWaataaaaa
+catttcaccttaHtttgttccaatcccgRBaWgatKgagtttBaVgaNtaNVBgcaataa
+gaatagcaKRttgtatcaattaMtaacatataDBgtaaNttcaNcgagatYactggttat
+gtNVtaBNtDaaDtDttaSaWtactaVtHactttNttcttcatWttcDatKaacgtttgg
+VDaDtVagttatgtcagactKaatcaYtSgttttataaataDttKttKagacWgHgatat
+aaatcttagatNKtttWtWaaatattacSHaRgtttScttaatWttacgRRaaMactcat
+BacaccatRtttgaacctacttcDMggcVaSBagaatcttaKMagcaVtctDVataWtSg
+atagacttBctDtBNWgtgKatWctYgaaStccgVaaaDattYatagtatcaacBaWYct
+gaaatttaKVgYtStNtcaVggtggaNYgaRtMaacataSttcagacVactcaVaagtgg
+tattaaDBNDaagtatatMtactatatgatRSgtttgccaacgcacRMtacRYNataaga
+tcMgttgatcataaacttVcatatgWtacaaaWttggaaactttaScataactRattMtD
+acVYataaaagMaattttKtgaBttKcaacatattVtagtcatgactcgDaacDtaWcta
+tRttSSYNtgWaScaaataagaaatKtagacataatggNaatttcSKtVWtgacagKWat
+tcgVatttcKWgagcaWgNKaaaatatgtaaacgttcactaaWgacaccBNaacagaaSt
+ctgctaHcVtttMtcYttStagYcgtttBcRtaYacttgNaacMtDRtagcatgtgcgag
+cScaMgtaatBaKataactMttttattaRcattattatacgtaagSNatVRgcttcgaVa
+acHNtctaHBKYgKaccYcttagagcccaVgatttgttagactaaacgtgcaBgccaWga
+VataggattDBWaattttgtBacWtttttaatDtMgaactaagcVtctcagBMKatgatt
+gaNaVttggatDaSaBatttcgccatatgctaattgYacatgatccacaaMHtttcKYKa
+WtYcgDtNaaDccgNaNcacacHKttDtttaggctagRVtYgtaactagctttcacaaat
+YtHaattYacaattaMSagMactcctcatgtScttcaaYtataaaaScHYaKcaYacact
+VcacataNtaBcaRatgYagVBatttgtaactttgRggacaagcVacctattacRcaaMa
+cHRagagtaVNctacagtgagacgaaaggKttacattgggacaataKNtattcaagWKtt
+gatNagNtgctaNgagatNacSatctNatttatctatRgaaaatKatNKSBcKactatac
+StcagtaggtVtcaaaBYYgctattKtWNttcRacaaaNatgaacttaRtaaDSttVBYt
+aatccagtNaaacRttagaaccRBatataWaatKctcattcSacWaacaacactDttVtt
+gacYaagagtaSgcMttBttaVNgRVagKDcttcttcNtaggttgcgacYacttaaggVH
+caagDagaagataaVaatctgtatRatDtKaaSDgattcaattYtcatgYgtgaVMtMaa
+ctaagaatgRgDtHttaaccaatStaaaaMctVDDtgttatcttaBBgccNacKMaHggc
+BMttctgNctHggagaataYMgtaMccaataattHttYttKggtKaccaactcccHtMSa
+atNactcRtttcatgcKcatgcacttcatSaatatactttVtaYttDattgWcctcactc
+YccattaDDaHaaKcaatSttagKtWtcatRcaactattaattYaDggKtagtNcgSgtt
+tKRgtDWtVHtDNcHWNtKtccgtctagtatSctaBcacgcaBtaacatgagatVtttaa
+ggcaVttBttaStWtattgYaggtSatBMBDactVtggttDagacataaactactBgcac
+aacMaagaStccaWNaaSYMYtgtaKaMcYSaHaaaatatttMgtcaaDScaKtcaBVta
+MVMRRDMtcttRBgWctaacttgaacNaatgttWgtggBtRttHVKgKcHVtatattSaa
+aatBttcBtttcDgHccBagtRBRttaVagBctRcaagcattacKccaWVWtaVcggtta
+tNaSgccgKtYcBaagcWgcatgaNHaKtagNgcHcgtgtcataaaatagagacttgHYa
+tattctaBgtttatRatctatttagacattttNtWaaSagtaHatRtctcggatttatgt
+gatBtctRggggcatWctaSVMaRtcatgKattgRcatMaHaataNcBcDcaggcactat
+tHBgaatStatattcatBgMVataaSacVacKHatggttaaBKtgtaSaWMattttMacK
+tgaaWaaWgctgRatgtgDacBtSaHtDgtgtMVttagatgattagagaSttgattgtSa
+aacagHaaatacaRcaccBtaaDtcaMtKaaStttatKagaataaNcaaBtattKaVNaW
+aNactagtYattaaagWgHttaMcKaSagatSactctatMSagtggaYctcacKKgaSMg
+cRgKtgccagNMataatccaVgatcttHagttttcttaaccataggggcttaDtYatcga
+aaMataagcaaatBttgHHcHagacagagaggcacWtacccMttacgtgNttattYctVa
+aactgttaagtKatMagttcacaaagggatgaVNMatgcaSattatcKagtHaBtgaagB
+cggagtWttVaaDaccMScactgVatccaRaSatattNtgcBatgBaaNgtcaBMgggaa
+tgagtatRgaatgtNttacaggcttaHaataaHSagatagtgVctattaaagggaagDWV
+ccatcKaaaatRccccaSVaaatttMtatStgtWagtStMaaatBctgcctKWgttDDaS
+KactctaaVRtaSWcVactggaaaaNMaaaccgcacNtaVgaagcttDNgaDBtaMaMKN
+tKccaVtgctcttMMYaaaaHaattcWgHcgtacatWaMaaKtaataccgBDaYRaggat
+atSKcScYagMtaatKHMtaaccatgHgtagDaggtgtaaatatagaKVgccRYctcRaK
+BKWtgatHYcaHgBaYtttMcatataatgaDttcatttaStgtcVSgacggtggVgtBtg
+acatgtaaSgtBgatKtKtaYcatVtNattataaaHaSccHaaagctSMKattcatagca
+cagtgBRataacaatMttKcWaaaaatagStcggRttaattatWaataatMaYagatgVt
+atccttttHaScgtBgagWcatgBtgcctatcgtaaWHacagtactgaattaaaaaNatt
+RNMaSSNSctattcaaagccVVcatattttagMcgtattNtVBactacScattgKVtata
+aKtttgNaWcttNacctagtgaNaaDcagtaWgKggaaKtacgcaaaYttatacSttgYa
+YttcDNagggttVDagHatSgtacYVatataVattataSataacgKgatVtVacHYRWtt
+atcctaaDtgtaaDgRDttttattWtaaDttggatcattNgtVaaaVggaaggcYgSWaa
+attcWHcgaSaVWaMatctMDtHBgttttaatctaWaagatatDKtVttaccgaMatRaa
+aBttaNagHatDHWcDtBVttaatKtMataYttSRHHcgtaHDtggttccaaagRRtaWt
+VctRcaNDttatacgatMcaatNHtacgaattBaatHtcccatctctccBtgtataYcta
+tgtcgaaDYWtNggatNcacRtMaatNtKcttSYSctaDaaaggctDaStatKtataBgc
+VaatttggYcttaaatgatgtHctaaccaactttgggttcMaaDattatKtVacgVcSca
+actSataSccHttYctttgtggcDtMcactaNSBtMRBMaggttWKtattaatgtKHact
+tcaMVatctgttgtccaaYNtaagttKaacttctHcgcWtYttatMBgBaMacaattaDa
+actNaaatSatcVtSSgatctatgNatSYaattRatgcDgtctataagagaagRgatatt
+tcccaataHgttttWKtgaagNRtctaaBtWcHHcDgaattgaaaKtgttaaRtatgtaM
+aggDttcMaccaMaattDctgYctaWtStaNtgRKaBtNcMHcSttMtaKccYacgNNct
+ttatStgVtaYtaagttaagaBHaaStVKHatgttRVWtataMtSatgcaattcMcttat
+KgMcagtgaatcYtcctNaYcttactttctcttcatggcgNcatScStBtagctWtHaaW
+attaccgtctcgtBMcaaacKctcccaacttBgtWStVttMRgKcVagHttVtaagMaNa
+tcaHttacatcYKttDBtatgSattVcgBcBVYttHNtcatKgcYgaaSaKtatttttMt
+ctatctaSaattDttcWagHSacgttagYgacWaSaDKatcNgctaatgVSctgctYgaK
+gKtaataggtggagcgtcgaaaaRYtgYWYSaatacBgacWtaNStcaattWtRctttta
+aSYgttcNgtBWWgtgaatHttttBaMcMtKccagtattttcgaHaDtSVgatgaacatg
+cacgtcagagDYattBcagDctcttNcNtaaaatRctgMcDacaagtttagtcaaSSaag
+aaacatacaDtctctYgcaaacBcaagaBatgtattgacgagYacBDgttcgtgRtaMga
+attttcNtgVcttctgtctagtgtccatatctgatYatNtatVWgttacaDacaHDDagW
+tgataWtatcaaBRatDRtMgVcgaaattcSMagYgWacgggtaacaaattcagcatagS
+gttactBctgSVWatYcYgcBWgggRcHtataSaattBcagHgcgcctttKcttWaggct
+ttaaDtRacBactaaVaaKtaaacctcgcgccattactKactKSDcgacaVtatatagga
+taKctcgSatgHSatVcgtagtgaBtSYtgaBataatStaaccaagttcaDtHtatatta
+acYatattatcctacgagatcaccgtVSttctYgtcataaVactcgWtaVatttgttgga
+ctaaaVcaSaDtYcgNtYtctVaMtaattatWRtWcaNtaKcaaYggatgNgaatcaatc
+RtcgagtHcgVgttataHDcatttaagttctHtcgMRHtaaagaVactBMtatgaagtaa
+aaaBNtataaNttcKcctaNttaaDtcgMacgDcaMatttgYtaaNtcaccgatgagMtg
+ttaggWcacHttNgtcttHYMcaattKcagttcNcaaaacgNaaSattgKttaaBaKtta
+tttaMggHcttttaaRNVgttaYttttMVRtYVgRatKcgVtacgaatttccBatBgYBR
+tSKKctaaaatgatatgBtcttcgtttgacHagtaattatatctgDtBttatgaDtatKt
+cKRcRttagattattagHgDNaaaKgcgMtHtttKtDtgaaaagtaMatcagaaccgaat
+KgtatatVaccRaKYtDHtcSagtBgtgccWaaaggtYKcaHatDDaaattDStDtcKgg
+tMgcMtgtHtcaaVcgtttNtagtNtgKgctaDcScgBcWSatgtatagcKgWgttgaac
+gagtgcgcgtKaaaacgRtttccatatatttttMgaKagcVcVRataccWctctcgBcga
+ggcgttaatgaHYtttHtaSWtagcagtttKtYaacaaataMtaNDatRgMBaBacSaat
+aSDctgaactattgataaRtaVtttHatWaacWtVaHaaBDtactYtaDactttSgtKtR
+attgatttatatattattataattBatagattctaacDcRMaaggttcgtcatattRVYc
+ttKgtRcgWaatcgaaWWatDctacaaaagaattHaatctgttttacYatKatBaccMaM
+aaVtcacStaaYgYKgtttctcattatattNgSaaHtgRaBtcataKYtHtacttgtaca
+aaDtYtgatagNRcYatgaStaaagactgtcWDtYaatVaNStagaaaWtaaaataDYtc
+aMatSVBVaaaYagaaaattgtgcDagWSaStattttaatNcacgataNBtaattggaat
+gcMgacattHaattctctaaMatactaBaaattacaHWgBNtNaaSattttaacHtgtag
+tBtcRtttSaNNaYaMaDtatDtagaKggYgcaaSttgctactDcNRtWgtttaVtggca
+aactattgSgaagtattatgDgcgtgtcttagcNtRctKggtMaHgaDaaagtactgtcg
+atttagatcagNggtaattaKaatgaaYaaHaattggttVaaMggatactctaBgtYHMc
+ttccVcaaWtgttHHRgagttKaaagaBtaRtaaWaggttctatRatSgtatcYtaWcat
+gtaBtcaatctaatRgaYYtWtccattataBacttWtcctaHaaaaggttgacgtRattK
+gaagcattSBtttctaNcSctSStNtYtWaWtgtagtcttgtctttaagNKgaagacgDa
+RgtNaBaVDgaattggaYtaccSVYKctSKKcatagttgSttatcStactcaatSMataH
+caKgatWVYtNacagtttBtRagYHaagtaNaaVVDgatattMaagattagcatcctaMa
+aMctgNtMcSaRcgctHMttaattDtttYttcgataaagtMtaagttaWaaDcaatccKg
+tgMMcatBgtRtaHBcttgtBaBggcaDcgaWttgggtaDaggtgatRtYaMWDttatcN
+tVcttRaKagctRgtgcNaatctgattatagattagtatatgaataDNatcYaggKRaca
+atcaHcaagttagtKgRatRgttaagaaaatacVctaaaagtgtaagKVgcttSWaaHat
+agHctagtDgDtSaVtgatcatttaNKgKHataKBctatatWaNgtttgcRaVNttaDgt
+cttagHYKatYaVaBtaatgaBattaYcNtgcaBtHaacttVtccatDagVaaaYgWtND
+BgacagVgctcaRtaHaaacttttacaaggaSRaaatagaagaatacccVaHatcBRtct
+tttaaDMHWtHgacMtctcaagKDttctgYctctcNagaMgcgaaDWatMcMatatttDc
+tttactaVSctagttcaRKWgtttKRaVaaKtacaacaKttatttttggcctataaDgtc
+BctBDgcYYaatNactcaaRgaRWcgattgVNcWaatctgKagDMgctatKttRatcatt
+MaagtctaRaVaattKctgaKtatccgaaRatcHMaaaaaagattccacgtacgaDStat
+atctcataggtacgcgatgtgaaggtHYtatWagKVKgaMDcaatttWccttgKgagtct
+agatgaatgVRcctaMttgtaRaaYtRtaacWgaaaMttatcatNcgttactaaggtDaa
+ggcagtRctcatcaatggYagccagcgaatatagtgttWtaccaRctagatttDtaaatR
+cDKtccHtBWgttctWaagccYBSgtggaaagHNttHtctaaattaBatggaDMgaBgat
+atcaatactcMtaaKtcYccgatDaYgHDBaagBattWattgatttttaagaRaaggatg
+gYggaKttaKtBVBcttaWcttBtacctYaNYttgctgtBaaMtWtcWaagtaaggWcgM
+DaaNtccWMWtatcMVgaSaRctaKtBgKWDacDgaaaaNgttcaaaaataMcttaWtat
+gNaVaaRataWtgKctRatataagtgttgacgaKgaNgtaHattaaRagSgattctatgt
+YtcaattagBYBatccYtgtNacHagHtacVcVacaacaccgNgBtataYaatWHSttat
+tgctDacttgtgHgHcMcHacagctRSDtgattaggaDHtYagatggagWtaMatcRccc
+acRaaaYagcagatgatacatatttVBBcaaMtctctaWgaNtttcctaVcttaYBDBct
+RgSaagcNgatttcacgtcRDaVBttaRaggtaaggHcacttccgDBKgagaatttataa
+aMaRattagcVgtttacaaagagaaaMtgDtttYttggcttataKaStacaVttBttctt
+gBcVaataaagagtgagBgcgNcNattgaaacRcactDaaccaatWMtaaHtBgaaacaa
+ccctcMctcaaatctMWttggttttacttagcRtttacatRtccBttVcatgaaBacaYg
+agHttatWDtcctSatRtYggHtNMttRgNtgcatcacgacagaHgtYaSaactgaaNWV
+agtagttagaNgatctgcatWYaDacataHtaWttaatHaDgactYgttcaSVtttacct
+aatttaDgRcagacaDtgcYVttaagaSSKBYtgHtDtNtcgtcWttDtgtcNtgacKag
+cactccDMacDNcccctWataRKcaaatttctRVaacagcaMtataaattWBctttgKgV
+catttaVgtDgtatHtgtaSctagtatagcBtBtgtatgtcgcMcgagttctacgaaBgW
+ccgaWatgcaRtWtaagYttaNtcWaHtgattYDatWRgRWagtRcHggNatNttWaaac
+aSgcaatMatgacNgggaSatgatttcBHcctaaggWactacagaaaagctMcaaagaYt
+HVgtaaHKgKattVaWtttcctaWgaKattatgMaattBgaaagtgaSaaaWtSNBtttY
+ataVgNatgaSgcBaaccatattcctctagRtattatctttctMtgaRtctcYgaatDtR
+cHgcRVtWtaacDtcacYatRcttNgcgaDtVctWtacHtatatgtatKaaggtaNcata
+KRaataacacDctcctWgtSaWcatcDgatatBtaatHSNBtcaataaStHtacttaYaD
+aMtaagMtgNaaaaNccccgYWHaatgcBcttaBcgtMBKggccaVgacaWgaaaaaVYc
+RKctMgcaccWctcSacttcVtacgaagtYtcctttttaYgttattaataactSttRggt
+cVgagWRStatKataYcaatNMtacttcgcttVBaYRaKttaaYatacagctBgagcttc
+HcaatBaaaVcgctcacaMgttaHaggctaDtSgatattggggBgRMagtaattggattg
+YYHtVtcttSRYaacttataBtNKgatVaWSDWacatVcttgttgaagScaDaSttcact
+aattagatKttaMcHtMgKccaYatKataMcKNgattgtYtaaRHHcaWagctgtgcYat
+MHaatRDgtgttYctatNKtSDtaKgcBttgagtKtacatgaaggcgMatDaWtcBatag
+taaaatNYtSVgVatttcaNgRtaRaaNBttggaatVgaaaaagaaggtgNtttVBgcct
+tgtgaBtgMgtaaacBgtactWgtaacctatatggaSYattYtVgtttaagccaRtatRM
+cgWMgDVSNgataatBRccNagagStHttBgctaBagatattaacaagaggttttcDaRa
+gtcDgtHttcataagaacaKBttaBgactaRatgaaDYHttgVagcMcBDgYactWgSga
+cBataMMcttSaRHgcagKcgaaYaDgttcataYKcttcMWttattaaBacDcttDtttB
+catVggttVHtgtMgKcgaaVgtcgMaaHHYBMaHtaaKaDttaNgNtttttaggMcWtt
+NaaaDaaaaactRgaatagSVHtaataagttStccaatcHataatacMcattHtacaatt
+tctgatggacatatgcaaacaKBatgcagacagVcctccgcaacNatcMaHtcMtaSctg
+taYgtStcBtcatDacRggttRgagaaHatVcttYWgaDtatgYcaBKgtSWVYtttctW
+ttHtctaYttttaBtcataaNgtBRaNcgttKgtgVKgggVtWatcWagttSttttttaM
+aRWtccgttttattaHatttBVtataSctRWtgcMacaattaStBcacggaatRatactV
+gaagMaaagWacaMgctaacaHctHtaatacacgaYagtcttKagcDttaKBHccgtaHa
+acaKVtcMKcaataaaNaggttSaatcatgaNaaBtacggBcaagatcRgttttHaNgtK
+ctYatBHHtaaaDNHtaVtVagttVacKtcYgcattcatacaaagtaacKaKKtaaNtNa
+taaNaaSaBtagaattctgacacNtaHtataBDttBctataatagYSctgtaHcgccgaM
+BaggttaMHtKgttactaaHaacgDatataaagcaWtgaMtttgVatcKaattcgHVNat
+NgDaaYtataHacaaacaagagtatatDStgcNgcRtaaWVVaDStNgtcaaacgDttaa
+ggNttWcaVNaccctgaaaMcagVYVaMtBgtatacSacgSgNtaaaDtRaBSaWcNacg
+YaggtcaYtattagVStaccgatgSStMattctWtattHtHaDtatgYaatattgtttta
+NggttVatcttRcgaNtHaVaStgaagactcacaaatcactgataaKBtNHtttctWWta
+ttgactacNtaWatataaaBaatBttgggtatYtttYtgttttVttgagtcVaMVgaatN
+taaNgKMaacgtaatattKWggcagtgRttgtgacactaaYacactggaaKaWYRgcatg
+cgttctBcttggtVaaWgtttHagtcaatctcggaNWtaatBNcaMVKStaNcMtgatat
+aatDYMctttcgcatgcYtHtVNgStggagcBtggMgccctgtgNtVatactgcctcHca
+taDBtaStgNcagaYttaMtcaYtgtagatDaagaHaaaRcRataattcaDtcaDgttgt
+atRaaaaYaRgtttDBgDcgaagcNttgcVttcacttaMgtMWaYaattcggaDcgaVtY
+attaBYaaaattaHVttttWaacDttaRaSWactcBgaRctacaVStBaaatRgaacMSa
+agaatagYtNctcaatagctNttaVtgctgtttgYcttaatgtgMaStactgDBagVSgg
+tSKMYttDatgtMaaSaVtccSRMgaaaactHaatWWtcatttctDgcMcggVtgtRtca
+tctttNatcaatatYaKaaaatKWtDDDaaactaagtacRHtcKttacaataggttWctt
+ataSaYctgctVtaaVggatcctaHVttgWtgHtWttaDHaNgaccctatatgcWtNtta
+cctaYtttDWtttaggHNgccatattacKggattVatatcRcggRWMtgcaVRaaHgtaa
+taattttaggtctcDccaatatgSaaaagatDtaaVtYgNaHBtcaYttaaaaacagata
+taaagttaaaDWccMHMattggtaaagtccgaKtatDKaVHaBagaBatactataVttDt
+tDaMagctctaaDSggtttgaDacacVatcttNtgatKtVaBStatgNtgDKYcaatcat
+aWtcNatYccgRtcgBHacaBaatagaVtagcttgaKagcgHtttDNtgaagMttStttt
+gDDKRWtagtaBgtgagtgBcaDtWtaHcctatHatttgttWgagcggDtgtRDRcaaat
+agcacacRtDgtgVaWtaattRacVataBWacSYWVctgYtWDaVtaKataaacttKaaa
+MVHaaaaKNtaaacttgVataaaatMaaatMaagtatcaaRtatSYRtBtaataattgtt
+tgaWtaNNtctcaatNaataaaaaaattgaaaattattgtgttaaYatccccHtaNcatt
+cacttttaMgVDtaDMtcaWSgYWcSYtSgaatHtgctagaVattaBtaaaYgatattcg
+aaBtgaaDacacatRaagcgggagggDMtatDttaatttggaKSNtactRMttactgtBg
+gcgtcatNttctattaVacgttccKtVttMacttWtctaYcacgtaVtaaRgKcttggat
+SYatattttgttacaaMgtgagagaSatattWcagDttggNtNaaYtaggaaKtYHcttg
+KattWagNgtaagHHVatYatcattaaaaaYtHgttcaaaataattatBgcaKWKtagaa
+tagtatBagaaMtattMagaMtHcWgYcacgttagtgtDNggctatNatRcYYHtaacMa
+SStattRagRcgataaaatWNNatgaaatttVtKcRtKtDtaaMcctccaDRcaHtBSWc
+YtaKttcacaaMaataaMaactccgSgtYattDtaWctagatBtaatSgatgatHKgttg
+caaaaagaScHtgaaHRDatSagatcBcggcatcatYVaatgMaatStgNgWaaaaMttg
+cYaaagttSHaYgaaatHattBgtaaMRagSaSacBaagtttttcatgttaaYcagYtgK
+tYctaStcaagcgtaVattaNatWtHgtHKNDtcNaKaVaStSacaaStttagaaataat
+gcDSatgtaKtgMMtcaaagtNattacMYgtgctNgVcaaNcDtaaaVtYggtaaaactg
+caagaWNcaaacctDSaaSgVaKtctcatataMtggBtaRttKtagRcctgttaHgWRaa
+ttgDaaatttHtaccagctcagaccKaaBctaagtatWtaVagBgtttatgaHaaggatt
+StaactWacKDVtMHccgtacaMWYctDtagatttRctaccRagtWcWgaaaaMcagttc
+tgacSctaaaactgaatcacaNcaMWtWccYgtttNaatttggttaaNtggttSattttc
+aacgYVccMtcgaactBtatcYttcYDVMttcgattaKWtatttagcaatatcagWatgc
+RVaatgRtacWaVVBttggatRtaNgRagttDYataacDVBcaaactttgtttgaccata
+gHMtRctaWcgacagtgcVcaaVgRgtaagtRaaaattSBKacBaatcagaatgtHattc
+aVRtatVSSaKatNataWRVaaagMaacataDgataWHatcNYcMtatttggaSatttcH
+cgacaYcaKaaatattacHcSaBVatHacactaMDataaaggcacaacaSacctgtaaRg
+tcccaaaatWtDtagtcaagNtttgatDacDgcagaDcWgatDaaKagctDWtttatatW
+gDcaaaWttStDtKtatSagVgaaKtaacgaccgMgaSaatRRcagYtgttNDggcHSca
+aYDWtcaacgtaHgaStKtgMtRtaatccagtDaaacHgtacaaccHtagataNaattat
+cVtgaKaaNaaaaaaaagttgMgtcRaNaacagtaKcaBgtttgaMDgDMacttattatg
+aDgagcgtcacaaRaagtYaggMtaaactagaacagVaMWataggtatHagtttaaHtca
+gtaaatgRgcatgRctgaMttBaaataagWVtcHctgtgtYaaaaVtKtaSaaBatMttt
+gttatattattcaaBYctBWtggatBtgaggDagtgcacVataRBctaBaaaataatttt
+tNggtccgtVaaaaataaattBHaatBaagaHgttaagcctaatcaaatgaYtKaatYta
+aggtMgaRggtWgggNactaacgaRaaattSttWtaataaVtHgtacttNtaagHaSacg
+WggaYggNStcctgacgDcgHggtttHggtNtMtttDatNDgtgacgtatacgatKatat
+aaacaattSaaagcagatKtttSagcaaMttttgaKtMtagtcRacctKSttBttaatMt
+gcgttacaaagaVaataattcaSaaWcBVacYKtacaNBaaKRtRtcgWtWBaRKVtYWW
+WgattgBctaaatKaattaYtMtSBMBHDtBtaggDtcNctWYagtgSaaBaVtcttNgt
+cgttHtgtMtctatKtatVggKaSaagtttattttatgtactactHtHttSMactatHca
+agaattVataaaMKNtaMccgtgatDaHcaacttRataacaNgaatcSBtatgacBcctc
+gggtaatWaaWtacacaattctRVgattctatgtgtatHagatagggacVaattttDtNa
+WKagtatatHtagacgaggtatgtcagtgagHccccaatNataKMBaHtcWgctagtgHa
+atBatSataDatatcacccaagattttcSatKgatWtgaagtcBMataaHaaMaattatg
+cttWWtttcgVKYNBattggtacttcaaMaVNcctcHatcgctVcttKatgtctctBMgg
+acatcaggacSgaKttgagtctKVYaaagtaaSgaaaHaWactgRattaaBttVaHtgga
+ttagRWtaaDaaatgatttSMBWMaDactScgRYtgaVagNctgtSBataKacStHRatc
+tVgBKaggccaRctaacttcYKtcaDcttgaaacBBataatacYMgWgctgtacttttat
+gaSaaatYcccgattattRStccaaaBagaacaaaVtttgcttatagaaacacScccSaN
+taaaaBgtaaggcDgtSttRatMYSWatcgtaacgtStBagttaVaaaScccSggaMDBS
+gcaaKaggatatacgtatgcWactccgVctNttMaYtaaatKaaatgKStaaaHaKatat
+gBtcctatgtVaBggaatBcgcaatgagtatHcYagctDgtWaaccagtatWWtaRtKag
+atagtgKatatgaaaggcaWgtNKaaagataWaatHaaaaaKMaaatttBtatHtctNac
+tKtBVVagtatcacgtMgtgttaKtaatcgaaMHtYKNcMaatgcaSaaDBaaaaagaWa
+DtWMgaacatttDcatttaBaBtDttaaSMtcagcttttRWWaataattcNctactWaat
+NaBaattaagaaacttYRHaccatatKtaKcNVgttYagttBtaaaaVtctcgVctagct
+cgSVatatagVtMcaaHRctaHStttNtcattRaatgtaRtgttaatYtaagcattgaat
+ttaKtctaKKgaaggtcgMctttcWaagcgWaKcttcYttgtgaRaagMtDatgWgYaat
+aKaatSWScatKBtYgtaagagaVcacgctHStaacaSgBtgtaNRYaaWtWcKgaccDt
+gaWtgagMaYgVVgBaRacYtcKgatcagttgtaKcgttgagNaStctggaatVtactaS
+NtaaagtaatcaattaaVaaDattHDBaHKDHctVggcaaacccKMaatVtgttacBcct
+StgBgMtScgaaHcatgctMtStaVttttcDaNagtDVaatYcggaDaYtaactaNgtcc
+aattSacaaaaRgtagaaKgtcRSNtgatBacccttMtactatKgtaaRMagataMatgV
+tVKagaRagtcagMgMaatRHNttagaagaatgggaatcHtttttSgtNgYatgtgcYta
+atgDctMaaaMccVScgcRgKNaaagtaMtacaKaMNaBatagBttttcttttYatataN
+aWcagatttgMtgaaacaBYtHaaatgtaDactatttNatttKttSattgBatSRtgKHt
+tacgattgcggtaaaaacHHtaNgMcgHaVDtgtagaagatBaaagDttaacSatttaat
+ttaccagatataattggVgaRctRtcgccVatRNtDgcagBcVaHtBaatDttatgKRKa
+gataaRgcagtaKgagttatatcaMSagttccRcttaaatgatcttataaacaaatttcc
+cttaBaWtagtagttMaacMaKaaaagHatYKactttRatgtctcgattBcSagaDKttt
+HtBaccttNttVttVVtggttacgtaaBMRgatcgtctacaaNBtaVggttYaaggattc
+caNgRgtagBtgtaBacaagtataaatBaaatKRtaMtKHgatcgYggDSgKRaSttHSt
+catgtatatWacacRacHcatYtttaacYatatgtgttNtgcSagDHgataYttNattat
+cVattcaaYttggtaRHtWtcgaBacgtttaBaccaBaatgtcgcNagaNtKtaDtgDta
+tgDaBtcKgtBgatacNaccDDatttYtKggMtYNtaactgVacattaaHgMttatcgtH
+MNtataBtKSgccaVttaBcttattcBaagtgaWtaRtcctDVRatgaattgatatgaWg
+ccacDaatKaHtttacatNttaWNWgtacaggctacttBaYaaatatacaaaatttcgNH
+gMgttHctcKYcttgMtaacBaDVtaatttacagaRttttttagcKagtKactatMRtgt
+DtaattccRcaaKSttagttttBtctatagaKaVttttgcNagtKVccttagRgWaNaKW
+ttataDgcgaatgMKatgatRcYtctgVagaccgcgVgactagaWaaHNtcRNRKaatac
+tcYaNtSDKtcVVggNgDagtttaaKRgttaDcgtNNgtcaYttggtttYtatgtaaagg
+attttagatattKMcatgYaaatcaVactcagagtRYtgtaactatagtBaDtVaWatDa
+tctataaaSgggtactaYaKKWagaaaaataaattatagRcaaaVataVagatatgtagg
+cWagacRWattctgacgcDtaBcYattgtaDggMatgagcgagaggctaaatVtctcagR
+agDtSgKNcgtVcStacatttagNtgatSNgatcYVtHattHtBgMacRaattaHBacRc
+NaaccctVaaYaattcVccatacKcttSagtctgKMNagRaNcatNgcgHattStSKYRg
+gtcagtcaccattttagtMaccctggVattHaatVagaaMaattaVacatacacaaatta
+attacgtKtagaaaMgatWgWccatYtagacKatctKatMcggYcgcatgHRtcStVtaa
+tHgSaaaVagtgaatgtgYtattaYcRagatgatcataacacSgaYaactMKttatRcga
+ataaMSatacNgaMatttcggccacgaYYMcaKattRagDtRtatMVBtaattWtMHgNa
+WDgStaaSNggStcBcVYtaYagaHtacagttccMcgtYtYttcattgSWcttagttcgt
+HtgVRYgaMacttBtatcaactaaaaVtDgataaDgtatcatYDttaStgccBacctaaB
+agttgRtaSBtaaaagWgcacBggttagcMaYatttBgtaggtRBaSagttcacgtaDaY
+aaaacDSaKattctgtSatatgtatggVBcctctgtgaaHDKgttaRttttBMHgRMgHa
+gtagMgacgaagttaatattgRtHtHttatYaaagcagatgtgattagtggcactactVa
+ttagatctctgtttatcattYttgatHcHttagStgatgactctDaaatcagtgttgttt
+ttcYaaagtatatcYcaSaacaVttcgWtatKaaaHWtRgtttaKacttctgaaNaYacc
+tNtcStatttaaagttKgtgatcctBcaBtctttaaaKagttgDtWctDtgtgctataKa
+gtaNHatctagYgatcMgtggYaagactgacacttaRaaccHgttcaYtagWtggtgBcS
+tacaMcMHataaaNagatactccaggagttaatcatRttttgaKNgSgcaggtgttRaYc
+aaataBtaDtatHgBtatacKaataKtaggaaatatgcataaHgaKttttatMaaaNgMa
+tYattgaatNtatVaggtKctttHattcatttatYtattagtataYtttagYcattagaa
+ataHtaaccttactcatYttHMRagttctDagNSVgcgVaNNattctVcaaVagaattta
+agaggttttacRagtagtaaaBaBaaMtaScKgVaRcNtctgtataagtatVgtDgHaYt
+tcHYttaagatRgtgaattctYaaaattRtcWtacDDaRatcaKtaSacaagctaNttRY
+agMSDKtWgWaYNgaaaatatNtaatatHMtMWRaRacaaaatgctgctacNKaKtagtt
+gVatDaVccatSDtgaSggcgWatccBgaaVtgtaWttagatVaBWtacgWtaYattaaa
+tMctDgDaaKatttgaaatgctWctttaHtggHaBBSRVBWtgattgagatccNcaaaHt
+tccgVcttaDHtNgtttaMggccVWaagattgKcaacgagtatgtccctctcttaccDtH
+cttcctBatcStVaactaatctacatgtacataacDgcgaVttataagcaaRWataattc
+ggtMaaBccYgRctagatctNtBaggacMaaaNgctgttHgScgttaaVgattVDtaaNa
+ccggatatHatKcgataRtaMcagctattcaagagaatHcYRNgNgcaWtgagYtacttN
+taagStaVVagctgcaaggHatgtcaWgaattKttgtcgaBcKatKKtDtRtNYNtctac
+tatgcgatgtaacDtcaYgaactSHctDataKtcaagtccVRtWaaKMRtagKttaatag
+tggKttYtaKtVataWYgHBatataatcatNMRtDYaYcttgttHagRtYacgaDaaMMt
+cagattBVScattYcaataataBWaBatgDtBaKaHacagtBggaVtgtgttRtgacata
+aagtBtaVgttaNaatcaSgcctgtcBBaVttctHgVttcttgttatccaatacaNtgcg
+ctatacctcatHtNaBMtgtagaDtKagtHatacctHgtgaDVWtatcWgtatScattac
+tSgatcWatatDataRSgctHaaWataataYacgtacgtgDatHcgtaacSaaagYaMat
+aYaactggaagtKgattKMaatStRgtatVgttcttKSMtcataVtttaDtgttatatta
+gWtatNaDcttgccHaMDttStgtctgagtRtatRSMWttaStcatattaNaDtcaattt
+aVatgMtcaattagMYWaRcNtDttcaaagMgagaVHtatYaacggttScaaccVKHaaa
+tacWagaataaccMatWgctDtatttgaatBtNttgaaBgagaaWcttggatcRctctaD
+agWBcacaatMStBcBWtatggtagtgaagaMKatacttaYHtNctgttHSMaWttacaS
+aatgtattttggccatatSatcgctctttgaRRVVtDaatcSYHcSDNacattcMDaNVa
+gatctSctBcatagtggHagaVtgtSactctSHaMaWtgtatcattWtacgaaHatatBa
+aSaYacagtaaaagtVacatKtatatataVtagcgWccacagctcaaccttRtatNactM
+tcattaaatttNaaggctgYctctacatcaVgcMHaagaBttcgYDaSRtHgaaaNcaWY
+BggataatBactgaataYgcgtaacccactHataagaaWgcgRacccagagaVtataggc
+ttNtaaaaHatacatttttYYatHattgaatgtNcttatNaVcaaRtKctcgaaWctDtt
+ttataaatgatagcgSttcVtgatataaataataBgaatgaRacgagtaRctttaactat
+tNagtcagtgtgaSgaHRacgVtggRccatttatgtMtattaNatgttaaatRaBRttca
+tcttaRBtNtaNSWgtVSgcNacBtWaDgaaNBMgagaBMgaHaHagatttctNtWatca
+aaaDgtgcaaWaataBattaNtatgDaMaWDataNtctatDagatSWctctggaccatca
+BgtatattaaHacHgattcgatgtRtaYattactNtWgaaRgcgDaatactgWcKaMacR
+SaSaacDgtgSgSRaagNtKttattcattaagtctgtctctataaVgctHKttgVtgacg
+attgRYcatccWcMtaBagaHacaaaDaaaRVgcacatgatYaatatttMttaaWBtctc
+gaNcWDtttcagYKattaRtttagHcKaacaBcaggtaacctaHtaMtttaHacctVacc
+taaagtcactttcWcaatggatSaataHattacaMggtgaaWaacagaaattgttggRgg
+cgattatWtaKtScWKggtttcttgtcMaRgYYacacggagtgccDcDattcaaacHaac
+ttSScaaStMttaYtgtcWaaaaaaaataBataWaatatBNttcgttgtVatgacaHtgt
+acatHtaatgtKcatgSatacVRcVctttagNttaatKYgHtRccttDBggHgDtgaatc
+aagacacWtcgRWKaactgRaDNMactactgacaDgVgatcaagNRatacagattSMtta
+attYtgWctRgttaaKMgggaaataagttatgHaScYaattccRMggSagaKKttRggtt
+tgDtcgtcMttttggaDgcVctYcaaataattSctDaccatNataDtaaaWtttagHMSS
+aagaaBgatYaaggNtagtgctcMaatttWMggtctatttggaKagaggatWcatttgct
+atcgcccBacacttataagaYtcNcagaNatcaYHgNgaacRgtaDgaNYttcattRtag
+NDcHNVcgDctggDatDtgNaaaaaHgaYagtRtcaaDcgcaKatcagttattcataacc
+NaatacacaaYWcatBaaaacaRttMgtaattctWttMaMtttccgaNcatVtgatcBaR
+tttgSaactcaKYaaNtKDttttRagaMcDYgcaKcataVaaagattcatatWcHtagta
+gatttctBtcWHtctaRgaSttgHatgaHMtNtaactgaaaNWtDctgDcacattMctNg
+WattatatctSttaScctaDaatatDYataaaaatataatNctKaNaatatcSgagttaa
+gtKDttaaStaaHtttaatgaRataBtaVcBtcDWWaaDaacacRNtaVggatattatag
+tBttggcaaKcacRNgaaYaaMRaHtatBcaaacNataKacttaMtaacaacgRtaattg
+ggaRcttagtWataactKttDccgaMcacNHKtattStaRcSStDttacggagagtMtaN
+HatttWRNVgaaacattcScatgctaVSttaRaMagatcScaBggtatacgatVttKcVt
+agtgccgtcDtagtRagggcagggRRttKtcgtKDRaaatgatVttDtcatMaNKtNaca
+gMattgttcaacKaatYKttaactaatgagattttaBattBctcaaRWgtYtYBatDcat
+tggRtaaHttcaNagagctcaRatBtaagHtctcttRatagBttHtgatgattgcRcgtg
+SaagcYaccacBWgtaNtctagacgaaSatBNtHMcKagttaaDcHtaDaaDtttccaat
+McaSaaacWWggtgDtgtMtcacggcgcWttcBctaaVatggaagNgtaacctagatggY
+KRVttRtMcgttaagccaHgatHBcgNtctMKDcYtaVttHaaDWcYcKtttttgatata
+cataggaaaaacWgctgttatWHaggatcgtggcataagaaaWtttgatcaagaDatgaW
+tRtttgMagcBattcNaatNcKgaatatWBBcttKVHtgcagtagaYRatcggaagaRta
+ttaBNttattaataatatgtttttaagMggggMttctBgtcgaaMctcctaVttRtBatt
+aatattgVDcDtggtgaccBaNttDWaVtaaaaactHcaVtacKMtgaataacggHtaaa
+atatataYtacBcattttSaaSttgatcatccacatatgcYaVcattatcaagacYcMaa
+taagaWWcBataBattcBtaKatgtaRgtKgattaSttYaHcgttHcacaatatKatgRM
+gatgatgRaattctKNMRtggatNttttagYRtgtgYttaataaDcttHaDcctttgggM
+tcgcMgNYtcNacttKtttttgYBaHMgcccgggtWttatVttttMtVgaHagDNtccBV
+aaagtaKttaaacgaYgHagVatMgaacBaSacNaaaBcagaaaatatttaYgaaSccaR
+acgctgtYcctttStttaacgatVWaatKtaBtaaataVaBVcctgKaatcaggaDYatg
+VcgctaaacVtcHctggttaDggtatRatttttaaatDttaMtMaggtMaattaRcaagg
+aatVaaaactSRctatttWaDtBataaBaaKattScSVgtatcWaaaBtattVtattttt
+atYtaatacRKcgcgYtccaacVBtagcttYBtgtgttaataataWactatataaVccaN
+tcaBtttcMagataatgactMBatBctaaRtatataaaaaaRacagtatYgtHgcaDgaH
+taaNMMStKtDgtaaaaactgtaaccBttMaaMDVaaaggaVatcScMRMaBttctSgac
+KaccKcDgaWattHVtKaNcDaagRSgcgcaRgagtacMKtWaacRtcKKtBYgtagNta
+tgtttVttatcRaWtattcgtttaDccttMVtatgHagaBgtaMWKtcVagaagcaaaaS
+taaatgagaWtttDttttagNMgVttcWagacDgaMatataaataagtttgcctatRttt
+NtcttggMtggVcgaMaBMgaatDtVaDgttaaacgaagVtttNccaagtgHgtgtcSca
+ataaRYaactgcVWtaNRDccSggagttattatgcctMaaNcgtttVgtcaatctaccaD
+MtaattBaatMtKgaDcBggatVtaattRBattgcccatgaNtttMDcKtgcaccttccB
+ccaatctgDgMSgaagcactctaWtattgaHgcDaagVRgtaBtaaRtgtYcYttaagat
+aaaHaHataattaattaStcttcgatHWaaRRSHctggttgtccaacaDttcaKggcVcg
+tSBctBNaRaattcgcatagaMtNattStRSaaattVtMtgttNYaatgtaHaKNSagat
+caHctaaaKKgtaYatDgaaaBKSacaatacRgDctaSagVcagDgtYMtcatcgttcRa
+tgaatgtcBSKtSagcttagKKccgHtBRgttStgtBaaKaMtaaKHBgaVaVattaatN
+NgcattgagtcaBaggMgctHtaatatttDatcWatagRatVaaattNttttaaVctYag
+tRaHttatttaaaVtaccgtNattataKSRcgcagMgaaMccagaatatMgtgNtcttNt
+gattaBgaaaagatWtccNtDggaaagaNttttNtttSggtDcaaagagtactccattMa
+tataHcgcHMBtgaaKHSYtctaVtaattgtacctctctaaaVtatgKaWaacagttYaM
+tNgDYtttcYRtgYaWaaaacagataaacgtaVatNaaBtBattcctWaaggcacatgWt
+ttaMtVtagatatacgataMtttggtVBagatctRatKggttgcYtacSaMStattBgca
+tttKatKtVgcDgcttNaaataatWNtaDStRaacHtacttacataatacaMtYgcggca
+tYcactttttDtcaacBtgHttggctttHNtRcgatctcactctcattMtatccgattag
+gtgggNgagacgttctDtHcaaatacaVaaaHttctcMaNtaattHWaMYgatNacKNNM
+atcRtNtYMgVtataaaatttaaaBMtaaaatBtaaacttgMataaaagBaaatBVacta
+gaaaHtWtKRHttgaatVattctttgaNgaDDtatcVWtDaataaaVaaatgcaYaagga
+tgggcttaaRataaacttVDcattcaattgtaBcMtgYtBtcaMKcRNaKRtKcaatttg
+atWgaMagtWtgYVaRcagattacaWttgaataaaaWgHaagacggYccctBtWttttYV
+tttggatKBtVagHBgtaatgttcgaggaWtDtgatattaMaagttcattMtttWcgtNg
+cgaRcaactaMgaVHctctgcgagKRatWtggtcgtWaaaBctcScVcaHatattNcact
+ttccBtDaaNtYggaattRtcggctaggNVgDcgaacttMatNagaagtaaRaaRttggt
+aVSaagaattattcaatNttWcaWtaggattScaStgattBagVBttaNcNaSagttagt
+cttDccctatBatHaRRttaacBYKKtattHVcHagStaSaatNDDatcSaVgtgMttaH
+ttgttaataatcaYtDcatttHNaRgWtgtaYcaaBaagaatYaagaccKggRattttaN
+cgacStttaatKcVtcYtttcggcaaaSYacaKattgSatHtWtKVcagatccccStaat
+RMaatgtaatKtcDgNaYaaBttccRaaacttHtaRcaaagtatgtctaaBDVcKSKVat
+SagtggttaatcttaVNaagRtctgRataKgcaagactSKattaBatNttggttDtgcDa
+taKaKgKacaWHgttScVaagaWtcatHagcgattcBBtcWaactBatgacBRctgatDc
+MaaVDattWaaKtRcctYVYacggaaagVNBaaaaaattKYaKcMatgagcatStaBtcc
+tgaHgtttacHacgcttatgNHWatgctWWattttgYaaacctaacYcataVtagVagtV
+tNgaMagtcgttatcYtaagcatgKgaaagNSattKtttaaggacaBNRatttacatttH
+ctaaaHactNcNcaaaYBcacggctcaaHagaaSaagcaWtcaaaDaaBNtNacRgtttB
+SVtttccttaaDgcctgKSttgtcaaacNMcaBtagaWatttVgcRtgaRtMttgccVtt
+atNtatggacaaagWgcacNatcaDMaWtcHgaaNaMMtttgcatHtYDcDactttRYta
+aatMtaVaaattggtgtcaacatVctBtHctYNacaaactcaMaaaMcHgtaactHaaWa
+ttKttactYataagaYgcttattaWMDgStMKKatatDataNHMaSagBaaaVtYtgVta
+NtataDRcBtagttcgVKagggatacaaSRaataaatagtaataKatMattVaSatSBta
+gVaYccaaaYacaKSactctaaHctaaaSaaagNttgactaSacDtttcattVctccagY
+tcNcagtWatacattNgttagagNctaYaYNttKgttttatKacMgRatgaaacVccgtc
+aKaatHHcacRtgtgDtccatHaaaRtNgcaSagtStgWKtttgBtHtSagaaacgtaSa
+atctacWaaattagagaDaWgtataMtgataaDaaaaaaaagttcBggaHaDWWcYctYt
+catctttcaBtctBaattattagcatgWcacgcaaaaDaactRVccBtaWaatYcVVcac
+MatNatacctSgtWgtttaattcactaaagcHgaatcHatcaBtgtaWatSScMMgctat
+ctctRaaaWMgttaKaatagBtttcttagaggVttcaatRattNtccatttcagctactc
+cacMatSHtagataaaWgaagtttgDcctaagtMaaaYagaaattttVattRacatctga
+accataYtcaaatcaRttaStRgSacctBcaHcgtMcccBaagaaagaDaaattKttNta
+ataaMgtctYcttDgaactaKaacNgcaRccDKtcatgaagtactcgtgttcctBtBtgt
+tatDtctgaactataacagtagStaaaaaatgHaaacaacYgtgtgHacaaattgttcSt
+tBtVctaHaacttKtttttWatBtcccttaaVaacaMaagaattcaKaSNatMScRtgaa
+aDtSStDtHtacNtNtaHtMtNMNNcWtgctctaaWttaattaNtttKtBttttttagct
+tcDagMNagtcKWatVMgcttBcgccttttgtBtatatttYtMgctaKaacttgatttta
+tctaatRagtttggKBSatagtaVVcaattMataaSBtDtaBaactgSgtatcaactgHa
+taacaDcaRtcKttatgaatcatacgcgaagNYaNgaaacaattatHMgYgtagatctct
+WttacatVgcgRcMaagttgttDaNtScgStWgtgacaacacggVgcgaSctcactcaaa
+aYtDatatBtattaNgatactctaagtWtKSgYtatataaaaaYagaggttaKagtcYtN
+tgaagtctBWgaWtaaBaattStcatgNNtttagMtRDtWttgctYattcVSBaMDcaga
+tVgccatMatttatctatcgtBgcScYtaaccaaHcattgcagtcttMNVaactWWKcaa
+ataNaatgHatgaatgtMStgccattacHNgVataaYtgaggtKttNBVtYagKacHRgg
+YMacDatcgKtatVtWaKgtHatatMgttScgaaVHagaaattaNttaatatgcaaactt
+WgRagaaRBcNcatctaagtggatgVKaaVgNcaccagtatgHKgacaWatYcSacaRaM
+gttgcttatVcaaWcVaKaaaKaDtaaaatcgVaccatcgKgtDagBNKNatccgaacgt
+KgtYctgaKaaSKcccKgcVtttKcaaYtagcagatVcctVtgaMYctaccMcgDtgBaR
+taaattaaagctKtaaatatatVgctgaatatctMatccaattacaSYgcactWttaRac
+attgtNaYcaactatNNtaHttYcStactctatatcWSaccaVNctBtaaagataNaagt
+aaaaStBaaVtggttatttagDScttttMMWctagcaactBctcttattSatacSatttR
+tBataatcaaKVSttaaaaacaNattMBcaacagtttcVtttatatttgtaaKBgcacat
+tttHNNaVtWaggaDataatNaWtBataattVacWaaattRHtacaSgWtttataDMctt
+RScttttaaaaMgatacMatYccgacKMagVtWcMtBaaatDatatHtttDtaattHaat
+ctaHgcgtaagRgWaccattgaStttattctattcVacctccBcgttaNaacagNWtagt
+aNgtctgaHaacBgtatgMcRVatataatKNKaagtttRgtaYcYcaMaaagattKgaaa
+aKcttgtaBHNaWNgMatcacctgcaMggScBaRgMMctaDaaRgctcYtaacgtgtata
+cttcacDaKtatgcaatMtactaHDtaaVcgaagaaaggVaMaatYtttttattttatMg
+gaVYVaaatBaatMgctgWctaagKtctgBtKacaataYtgctBgKgaMtgtgataBagt
+tMaagRcccVtSNtaWcgVDctcaSSttKaaaaVaDctacYatctcHHDtgattaacctt
+ttYatattcgaaHBagWgYtSgcMtMtagaHactaSgBgBSatHtDttagaacSatccca
+YtatttgtgKcgDcRatctccNtaagctagBVWaBaaMHacaHctDVaWgtaBtaaStVt
+DYtatacttgttcttggNYtatWBSNcagatttgBtcVaacVtRgtYaatctatSatagt
+tDatgttgtKagtctagKHtcttttaccattcccctaaaaSatttaDgBactaMttctVc
+aacVgtaSYcttgYaaKaggtaWttgaaaYgagataatgccMgSHatHtacaaMatHDtt
+caagtaMatgtaagtgtaggtDtacStVaHcaactatgagttatataaBHagggccHagt
+aaagcRgcttagYaaaaaagttaaattatYNtYctagtttaacBataaWactVtRtaatg
+tHatctagacatttaKagStttgttttaaagtDttMtgMKgcgttaactaVttHcatccg
+ctaaaaDttSMccttNaaccattacaBcHctVcttctYtaaSSctVtRVattaaagtHta
+BgttcatacRcctKctHVHgttKtcatctatagNSaacHVatcVgRtgtaaaRatYtcgg
+gtBtgcKacttgataRttDattatcMaggcWWRttccgaHttNtacYtYactgtatWaaW
+taaggtacaDacaDgttStgcttatctattatgttgStaaDaaattagttRgtgcBgRDt
+aWaggMaaVttVRtcBttatcgttBDgVgatttKgaaaMttatatgattataWctcWMga
+HgaattMDatgVagtgatatcaNcaaaataSttattttaaatDgtaNDNggaaacgataa
+tttaRaaatataaaVaagttacDtgtggttctatRatgcBtaVatVtMtaYtttaaYgaH
+ttgttgagctacttaatatBHtctttaagtcaHaWYtKttacttgtttatagacataMgt
+tgcaBVcttMacttYcHcNaDatNttagatcagaatcttatcatHaNtatcMagYaacac
+McaatacaNRatDtaHDHtSYgaatcRaBtKttgaMKgcDgtacgtgYatHcggatactD
+DctaVRgtgctttRtatgtaaaccagtttacVtatttBcatcRaaYgcaMaagaacSctH
+RtctaWatatacgtattKaNagtagatataaWKcgggacgaRWttNacaaaaagaaatga
+tacDaaaaMataKacatVgcgVcgcNacaaHNattaggaacattYtcRYtggtatccBat
+caccgacaccagaaagMgataacHRgttKctDaggMaKtaaatttScBtcagKBgYtaRK
+ttagttttcBaaHYatgattaaDaDVacaagKaaRYattaMaaagVatattKactatctt
+DacHaDaatBcactattKtKtRHggtaSctaaaaagtttaggBScaatcgMStttaatKa
+caVBSattaKaaagacacaaagtaattWactttacWaaBgYtMcMccagRtacaatatct
+tatBacgNagaRtctHgaKtMgaattcKYaaMacgcaatctcNgYgtYRaHagYtcVgaa
+gaacacKgaRaacgBtttagDcgaWgaYtKataaDcaBatttccgaaaacaRRBaVtRtg
+HacttHgagtMttWattMtBtgDaNtgKtaaKDccKgctaMRtaNacattacWcttacBa
+cgRtRttaYggcKNattagtgactttcKHNcWBYagttgataaYagaWaSMttgataatc
+tataatRtggaKtcactWaataatYgtgcHgYKttaaaacNcaSatgcggacaBaRattt
+tcgacctHtaKYgttaaactataRaaSactKatSggatgtKYtatctYggcMtactatgt
+gaWtttctgYDttggtBtcHBctactacBcVacaagtgaatSttcHttttttatRYYacc
+agatctgatgacgcccVataagMaggWgYtatctgtgtatcWttRttcattattgYcHtg
+atcVatcttVSataactgtgcgtgtgaRWaacgatSgaNaVKaaaaMttccNtWgtVaat
+NtHgttgatVcttatcaaDaRScagDtaKtatttYaSctttctcatccttaattagttaa
+atactgctgNcttgctcatatatactaDtagctagRcataBcgccRaacaagcacaagta
+HYaaatgttaaRgacNgccgctcKtacataBtWtaaaDagagactacaccacggaagcSt
+HgggtcatDcKcaacctctgDVRaYaatattWttattcttataatWatattaccYaagWt
+gaataatgatttgtatBYSaDctatRattgaatDgWtMacggtattttRgtaagtgWtRt
+agtSctVtaRgttScRcattacYYatattaRaaggaataagRtttBHaggtattacBHMc
+acKaDDagtatMaaSMacaSggtVVgacctgttaaHagtactaaatYtSSBgaKatcMVH
+cDtatgtagaVgtWtMcttctYRtgctRtgaacatDctcRaggatRaaVWtgHtaMgaat
+taHataStgaKRaVacataDtgDRagBHttgNcNaRDcaaSagStDgaStattBtBNHRH
+acaYaatcagcatacDtattWctgcMattaMaaWgKttgRKgcacNYtcatcaaKtctaN
+tgacatMatMgYagNtaRWtgaaatBattctaStYgttcSYatcctMagtgatgcgtatt
+KHKtNtcattcacatccDaaWattgcacMattattgDcttgaBgccaMNaacattctcaa
+cgaggagctaactagattWaatgtagtcagtYtcKtMVSagWagataaatgtaaVtaSat
+cccVMttataacaVWHNataWtgccggBVYtacRgHatagVtctDttaccaataSaDgcg
+gtttcKaggtaaMcatgMttaaDacaccagYgtattacWgaDtaBaacctatgaWagaca
+YttcRHDgDgaaMtcagRtaattDtaagKtYMMacagcaYacgtWtctcaNcaagttttc
+tacVtatagttgttDgDRDtatScgatgcgagggSacttcaNcVaatKtattRtWttaVa
+gtaaMDtMaattHtagtttaSgWctcctggNgatgMataNRcttatataatcVtDBHgtN
+aRatgctttacHtRacgYtYaBBtaScWtttMKcStgRcaSgaagatNVtagctgtatVt
+aaagttcgWMtgtcgtHtcacSgaaWcgttaMcttWDWataVKcaatctattaKgtattc
+MttattcgtatcaaatacaDtcacatatVaatcSgtgDatBtgtagatgtagttataaag
+tctcatMNgataNgtagKcatgaagKcYgcNYtVttYtaHKcattaaMagaataRWacgS
+actctWgtcgtaaaKaWagRaBataRSVatccYacttcaggtBVatKtHctatMcttctg
+tHttcataMgttattcttRtYttagNtVtDatattgcatYBtggKtctatcYctDtagHK
+BNttYKtcWtRgtaDatgaaStgtaMagcBgaaagtSctRNaHcDgtttcYaacBcagaM
+ttatRaVacgttKaaaacMttaWSgWcNRcaVgSaaaBatNcatttatttgYatttDgtc
+aatgagaYNattggagcDagagatacNtaacaWtBHgtatNtaggctaggcaacYBtatW
+ctgaRttDatcgttKtaNtgaaaHaYtcgattgtgccaagagKatcgatatttcaDHMMt
+tVagaKRtaKtDacYgtcBtaDMacagatHcttcagactcgtagaMggtKSctagKtaBY
+MggtagcStgNgaacaatSgattaaKWNaaYggaaaacgMaaattgatagagaMtacacN
+acacSgagcYVaattHgatDWatBtaattaaYttgDaacgctcRatatacVtcaMgcBta
+agattgcgNtaHDgtcaaaDcYMRtgcataVgtaatcaagaRccctYWccaacttagaag
+aaNgccHWaaaacacaMgatScgatgDtWaaVtatacatggtgRNattattcaatctBct
+tatDaMcaaHttatacaaNcttgtttagSSatgatacccKttaMtcatWgaVataatatg
+YYtcaHaacactWHatttVYatatgDactaaggcgcaKcatHaccMtccHcaatgtWtct
+ttatgWDatctgWaagHVtDggaagagtYHttBgaDKMctMHccDaattMatcaaBtBca
+gatBcatatagatttatDtNatcaaaatctgaaSNaagatagtVBtagctaBVNtStWBg
+ctagtYgatHNatatgcWacWtaYtctatatgaatactcattagatcgHgaRattaatDt
+NcaaDgactSatactgNataBYaHKaKaactctcHcKHRagDttgtYgtaattaactagc
+tatatataaKcattttgcKtcaacSttgHRaagacNaBtatacataaaaataVWHMcaYc
+agcagRaagagttBttaaMtgatacSDaNtttgaagRtattaHtttagtatYaaatcacc
+gaYaatattWBtttataactMYactaaactaaatttcNcVatgcVgKVatatattaaatc
+cggaaNaacacaSatgcttgcHccacatgatNtatgKaNtgctggagtctataHcRRScS
+agcactcaatataggaaYaataaagtKKaaaKtBttYRtgtcNVVaaaaaatatagaNaS
+gattDtgacgtctMatcaaatggtSaYtttaatcttaagcKataaMDaMctgtYcDtgaa
+ttRctgHaatgttggtcttcaataWacaaYaNtacHNtVWagcHWtBBYagSagcaaatc
+KgataaSgDHataaacattKBttWagtRtcNagHcttaatBccgaaatVacggStctaKa
+RaVtgcaHBcgKVcattttHgctttgtgacgaBttttccatccMatRcaVataattKatt
+aaaagDatVttaSRMggtacttKHaacaatgagRaWcgDtaggcataBaVgttNBcgtag
+SttgccYtacWcgagNaatttgctagagacatacaaggataacWRtcDaacSDStcaRtc
+DcaaaHgtatcaDRtgcagtDtacBtatDMagtatcctagtgcDaSaaRtcaRactHgaa
+atccaRtWgaacttattaataScaDaatYaaaWaRNcagtaaaYcaHttBctaattctNg
+gBYBtggaacaDaatKgcagataHtgtcKaWctaVtNWYBgttttgtHScaBctRccata
+ataMaaacatgaatatNatgagtWgatggattgaNttataHcSKttgtatcatBtDtaWa
+tcaWaDNgtagctaaaWttBatDgMatgagatctKttaHactataSgattRataYaYata
+gaatDagtaDaagatcKcYgtgWSgtttttaYKtSatttgYatgYHStattaKcttatNN
+SataaaacHBtaKgcataggYtacgtttccaaVtaVaHDcaWRYSBHattattcaaaaBa
+tataaggaBtaacaYcgHgaatgcggYHagtactNagaaatttttacgaBcaaBttgagt
+KtYHaKKgttgaacgacacgBtWDtSttgNHDMgaaaaattcKcatgataMKttVHVBac
+ataKaatcggWtaccagMtttcKgScgcaactattVctHScccaacccHDtgttacgttH
+VaatcVgMtgttcatBWBttDaaactattcttaaactaYtRtgtaWataWggacVgtggW
+tatgtataaaHNctRgRtattaagtcgHgWStttaWDacacatcaHatttVacttagcgt
+HagagttgttcatcatgcaHcgtcKaagaRRacaatNgtYDtatVgYccaYKVttDttBc
+tYcttaWtatgYtaVttttacVatBaYKSSVaNNccgctgctBtcaagcacaNttctata
+YMatccWacBcgVaaatagWgccRtHMttHgBacttYScaaVtgSgttacBtctBttaRt
+SMgttaatNaRatgttgtcatVtaaYgVgcVaaYSaNcagcttatNtacgatagtcgaVt
+aacYVaMttggataaagatStcaNtDttgcBacatattaDWatDatcaatatNttagttM
+ttcaactacaRHYtcggaacVHtaggatDggStgSWtVatagctgtttaagBcccgBtgc
+gtctacYaBatactYMttHttVttaWtSttgKtcttcgtgacctaDtttMYMtaaaaaat
+tcaMgWatBtgWWtaScccttaaVVgatagaRtYataatttgKaVHtgcataYtaaaaag
+StcaRaMaattWgcaacaaRaBaataacaMNatagatattatgWtagcgVHcgtcatgaH
+gtRatcctgtcSaaatWgtatcHBcatcatcHaattattDBHggcatBtgttagNDggtc
+RttaataVtctttStaaggtcccBtccaBgBRgaDaatttgtttgcNtatBgaaaggcgN
+ttatMtggtBgMgatactDtcatMaaWctatttaaaacYNgtSgMatBcSactaKYaDVa
+VtcagaaaStagttYRcaaKacaHaacagctNcatttKtttaaacWtMNaatttattaaV
+gaMStMcagctaWgaSccatNatgMacataWaaMtataggcgtatcctagHatttttVaa
+ttttSBttScgtBSatgaHcaacgaVtMaaaactKHatatttNWtttataWtaatVttKa
+KMggatcMaaattattMgatttgtatRtaVgaaDtacacRtaaaaaMttScaggRttgtc
+ttSatYWtVMactagatVaMaaaDtaattttaBWcataaggaatBtRgtctaWDtagWta
+aWYSaHaaacgatRcttgcatcattaSDBBKttttctaYSaactcgYacatttBaattKa
+aaccaMStaHatHtatgtctKcWataactctcVNYtttMttaDatSacDKcacaaHgagg
+aaBtgNaaaHtattgtRcgacDtYtctttMttatcDaNgattagtttYtaattBMtaggt
+acatgtYBNttcMacaagaaaaaKgaaatcacaNttgtttttagDBcMgtaNacSatcWB
+WtataVatYagtttccatatHtttDtcgtggBggcKacaBWtBcaattgMatcttaVaac
+VYgMgttDcaaactctctcgcHaSatYVHRaaatccMMtaDHtaaKccactgattatcca
+tBYVDacgttMctaaVtatacaatBgaagttaattttgatatgcatKgaYttHtatggaa
+aatcaDtttBtatgccacattactcaaagctctcBKcaagcaatataNtattcVtcataa
+cMHgtattaaDtctNaNttYWcWtaVatatataWgtaWtgaHtattcgagtMVaHDHtat
+gcttctaaWYaatttaatccaMactKtcgtDaDVWttaccVtacYBgDattKtHKSVStg
+MtBgcgtDRSatggatatDKacataWtatWaVttctSRWgtcaWattKaaYWtYaHctat
+aKacMaagtctRttaatcgtgaHaggYWtcgatKttKaccttacttccgtttHcgtKtct
+taatSBgaatttcVKaMattVSgDDcaattcagtcataccBccgtgaVtaggttYgaNag
+YcHatMYaattDgtttaaMagRactHattgatttaaSKtSccggBattatatKDacaacB
+gVWBaaacaagattgtcDtcttBgcattatcaaaacagNtaaDgtggVaacYDgtttDtg
+gKccttaaaWcacgSatacaggtagVgatacctBttcaattKRtctaMgSattgtaccta
+tataaaMgVtctYMYYcacttRaBgDctRtttaRHgcRSMVaaaaacagaYaagtaMatD
+aatttaggcctNaacgaaaatgNtttaBtMtScVtVtSacStaBggtggtKtRcatagHa
+ttcctggaRtaaKaBKtagttgaattgtatttMcatgcttDaWYtaVtNDgatKtHaaat
+taattaaStaagWaaBtNcaccaatRcacttgttttcaaattctggcccttttBgHccat
+cgaWctataSttBgataacagtacggcccDcScaactgattttaSWYtaaaMaVatttag
+ctaBgSaggtNaBRgStDaatDBtatcHgDtRtgMtStWaYaggtaYatBtaWaattgaa
+YattcBVtaVSactWaWgtKaatagaaatgNttHtgtcaatMattcggtcaDcVttgata
+MNttYVgSSYMWaVtgcaRaaccYtgccattaaHVgaaaattMtaSgtaYaggctataBt
+cRtttaaBtcHDatDgtaaVttgcagNcatWggNtgRMaDcYgYttacWNtgcaWtaaVa
+NctVacaaccRcacttgMttgtRMtgtccatttgKagttctVagcttccaccaNgtgcat
+RgtSBaacggaattttttNagtDcagaHaaaatStcaMtctagcacactHWtNtgctcgt
+NaWatataKcMcWtagaggDaVatttaatttYSDgRccWattHtaggctaccDMctacVa
+attBYtDacaYctWaHaaHttcggaMKaacSagtattaaatDttNaVNtacgVttKaaHt
+gagttWcKtgtaDcDaKacgtactctttacatSgtagtaHHtgaaatRtttagttMctac
+KgaKaatBttataKWMcggtttatgtgtgaStaagaaRttaVtgttBaHgNtggaRaWat
+aacaWtRWacaactcgHWttttaDagScKgtgSagtcMgaRgttacccaaaKRaaatatt
+cKatttNgtMaVcataccaKgaWgHBWagctaagttatcDaRVVtggaaHSVacggttaH
+aWWagtSgctctVattKctKtMatHWcgccttaYtagtaKDaVcHtctgHagatcaSaca
+atKtatgatagDgtcgttttgatVtatStctYaYNtgtgKaKaVcVNgaattWccgattc
+ttgaMaRattRgcaatHctcattaBaaMtattNSSttHcagRKRaaccaYacMDtaYaaa
+atttRataBVtcacaagKtatgcctcatcgtgWataagcgtatcDtNagcatNNatgttc
+RaaScagaaaRaataMtacMSctKtDgaBactaggtWgcRtaWcaYtgtgWaagDKattt
+tttaaccaaatDHattgacSttttatWaataatDaDaaaaRtaYaggagcYatacYaKaa
+gaaNtaaaYtaVtDtBaaDcgtttKMtggcagtVatgccggtHgtgtaVaacDBaattac
+aNatttMgaDgcaDtttggaaMgtYtDtSgccaaaaYcNgaacDVgcattaNgatgaaDa
+BBttgccatttRtctaatgtHNtaaatBtaMaVattcctggaaaaatMattgtagRDaca
+aacgaataWSBctctYVcgtSaMStgtttSatNagaacaRcagtatgaNBtcKgBttRta
+ttVtaBtBaKactaWaMgRtcMtaDtYtatHattScggacMtaggcataaWaKHaataaa
+gYcgWatatStBattKaKagKttacMaRacaSaRaaWtKaatagSatcgaaaKaaVcDtt
+cVcgaKVattggaYgtMataaacRtaDaactNatYcagtDgttagacBataRYRDgttct
+tttattacBcHatgaRacMaactcatVVtttaaaHgctgttcaattaVaHtDcaYKacgK
+tcNtttgctttgHWcaaSactWKSatcgYaNVaattacRcatVNgtagatgcatYatVaa
+YWaSactgatccatatNMaNagNtaatcgttaSttattWattaggagaatcNaaccaaaW
+atRaatHMaattaNWatRaMKaWctWtDataaagHctMctttRSttaacgaSWcatcaVg
+atataattgtWMagKKaBBgatatctcgHSaaNBctgVtaStagtttgaggSgagcKtta
+aatHattDtaaattgaacatactaaWaBYtKttacWtaaVNcWacgttctcctaactBaa
+SRagaaatgttKVgtHacatctcaScaataNgaaVagaaHttaKgHgKaccgtcYtcctB
+ccataagaSacataaaggtttDtVStaVBgtcgNatgtgaVctatWaaDccWHcctttaa
+tcWactaatactcttacttgttcttatttatcaaagatWacYctacKtaSaaaStgtWaV
+caYaRctgggtSaaaWtgctgcHtttgMcgatSaagttgttttNattgaacttaaKaYcS
+BSacWattaataKDattKaHtgaaattKKttttgacDtDtattttDBDDcMgcatagaVN
+ttaWtgaDttgttttttttgacattatagBDacgatNatMBcaggtacaatgtgctttat
+atttRgBcctVtYVctgcatgtgatataatHagtttccttHatagtaMMaaWggBataaK
+tttgataaagcKgtVtaaaatgtatWWaataaHgatttYtcWataataacagaacDRWDg
+WaWaaaggattBcRctacYtagctNgtScagMcccHaBaYgtgctgtSDtHacKtNgtga
+caaaacccMcacaKctcactaaaaaNgtagWtttYtgaDcatWctataVctNttKgRtat
+ataYaaaRacaggttatagtcRgDgcaYctattNcaNtVatYattKgaaggBDtttactt
+HttNtgcatRatgaMHtRBtaagatMcacatBatgtStctagacttccKaRgaWccRata
+VtggaScgatttDMaaatNNtcYaYtaDaatctatgaVtctBKtgccYgtWatDcMYtaa
+RtcVgcttttDtMtRagtactHccRBWatatccttatMtNatgttagagBcttKacaaMt
+agaaattaDttaatatgaaaRattNcHSgaaHtaDcagctYacgccagcMtaaMgDaaaa
+aggatcttcaaVNatRcKVaaHRBctgcattatMaWaNaKataaatatgWaaatcgMaaa
+atcctgttactDtDagaccYWacttctRatgataaKtaaatcaMttttcaaRtScaWgat
+MactMtcaBNataaaBactggtWHtYaattaWacattgaaVtYtSgMcatgaatYgatta
+tacaYttaaaKRgaVagNgtaHWaattcgDaRaaacgVtBDtStttRaKgVagatatWtc
+MKaaaaMDatttaaYcataDYagtaaaaKttVWMggctgVgtgagtKagtgtBBNctaca
+aacttagattSttHagacKVttgHttatSataaWtMHttSaSaaaaDatgBtaYaaaggt
+taMttgVtVtttctaattgaacaggtttDDVMtNSgcatataagDaNttatSVttMScNa
+aattDttYaaHcNgttatatBatgDKctttgVVaaBgataaBatRaagactBYgMgNaBt
+taaattagatttttttaVgttaYtatVtccgtaagDcNVcaWtgcaKgggYtgagattaM
+aaagaatagtgaBaVcacBNtagtaDctctcVtaSctgtagcBcHMWtataattDtaact
+ttHctaRcRaaBaYacatttcVRaatctgctattDSNDgBatcaaatgcaBccKctaHcB
+tctVtaaHgatcRgaacggctRtaagtaSatatgatcaaagBtaagatttVaMagaagaW
+WgcMWBRStRggtttWttttagtccaMRMaaattaSgBccggNataagtgctctttacYa
+taRtcattgtgYBtggcatRtacttBaacDacaKtHDtaNacMtataaKKtgtaaaRMVt
+ctVcRatcgatttgcattSaaaggttRatagtagaattVcNgRtKccBgBtWcataataK
+ctctKatttttgVcaacKStcacSRtattgcggtcctcHatcgaaDgaVgctagtMNVta
+attaaatattMYNcgattaaKtMttRtYgacttgttagggcDNgagNtKBaScagttctg
+cMaaaMtHctRaYtcgRtHatVctttatcttggtYctctYgttgattttaacSttaaact
+aaaWHattgWtctactatttcgMcVaaMctaKRcttcRaatSgctVNgtgaaaNcagata
+atcaatcKtagtgacaaBVtttgtaaVctaBatgtaagtgtacctttacKtMWtaaaatW
+tcVctgagataattacggaatacgSaWgaHcagtagNWaaaSacggaaatgatRBtRctV
+ctgtVaatataVNactMgDtaatggtatctacaaatgtatacKtttgttttaaacgttgB
+ggBtgacttWacgaMtttcagaacagaaRVtttKBacttDWaccagtaaatatcgMctta
+tRtaaKKcgMtHKattWYYgttgatgttaRgacHcattcttKtcgtttaatagagWgDKa
+YatKataKcDgctaaaHWgRtagccgttcatYattcagSHtttattataBVccaNMHtta
+cgWttgDgaaRtRaatcgatNaaNtWVcctacatacYtctgKtcattatctattatcgtc
+KtaataaattagggHctcatgHttSNacctYaKttMHtctttSgacgtttgMcStgttca
+aSBggataggWttataNagaNBcatcaagtBtagcMagtcagagaaDcaaaataKgtatg
+tgSaagtgtYDtDccVaaacagaagttaHSWatagaaaMYaggtacttctccttatatHa
+tgctgVMatKttgaNtggSaRcattggttgWcatYagtaatatttgcttgaVctaataMR
+ttttScggggtgagVcacatYBggtccatMattBaatgNataDatWtDttVcataacSVt
+attagaagtaDtatcBacNaacaaBaaagaaWBHSttgattttKRcVataHatttttgaB
+tcctctacctcRYttagcatactttagaMHgtcatgtHtatctaaYacacggtaaMtatg
+ttaagaHWaRcaaBaacaVaKattHgataNatatacgtatttaDWctagatataaNtacc
+gaacaDMttDSaSYaaYgYaVtcatactaaWWtatataaVtMcagMccaDaaSatBatta
+gcaaaatgRtaHRgccgataatagcaaacacWacagaaVgBcagaYctHctgtcttaccB
+attVaYtttHatgaVgttcRgaHtttagttttataatRWggattYatatMaaaactWaDR
+aggataaWgMataggtactatatttVctataattaaatatgtgttDtcctaKataaaaac
+ggtacgtKaaatccBKtgtaattacaKtKYtgStRaagaaaaaaaggYagtNactttaaN
+aStcNtBcBaaacHtacaatSgattYttaacDacaHtcttcatttgSYgtctRaatVagc
+aWtctcDcRctNHatScRtaMgaacWaaYatcaHaaagttggagtacaNcSRttagaatc
+atVgtgaccaaYacWHHtaMtHtctaatttcactBtgNVggBgttctaDtcttaWttaat
+catatHgaDacatgaaNagtaatacgDgHttaNggatDaggactcaatttcttDaNtRag
+ttgVgaVRacWNVHBttcVtYYtagataagHtccattcaatNaataYtNctgatcRttga
+YaaaBcaKatcacgSaataHatggtacacctttatRcgtaYacgataHWVKaattVtKcg
+atcgtRtatagRgccBtaatagctcVNtttatgRtggggtttcttatactaatcMaaaWc
+gcaatKttatttgtttatHRRacaVcSgatcagcaacccaMatYacBVccNcRgagatct
+gtSgaMttHgtaattatggRatgcWtcKatattMKWtaaatctccgtgtcaHNYaagStK
+caDaMtaaaWBttacBgNctMaatDttcttgatMagtagaaatYHKaacttattSgttNa
+KagttctcataagtaatgactgaVStaatcctcDagtcataagWtataatattacagScH
+aatatagcaHYaaSagaaaaactYtRYaatcggaaHcVcDcaccctattRaatattNgVa
+atacagaataaSaaaagcWRgaKttccgtaWttctaaWacgatctMHaNWSgVtgNttVg
+tattStaatNatVttacaRWagNgcaSgRVtcYtgtctYgtRKatctStHWttcYagtgN
+tBaacgtagtgtHcgaSggcNgHgWggKatMtaHcgtKaHaWggacRRatattaHaagga
+agaSgHggtttacctagtaattBaaatSttYgtagBaSKBaaSKgctMMcacagcgtYat
+SctWctSaatRtKKtgatatctMtattagcgagaMctNtBcgtatRDtcatHtgaVcYtt
+ctaHacgagDaaMNtcttaBgWattatagaKtcWtHaMacagattgtHacttttgDaBWD
+tcSWKacKttcaHtSgttttDtHtSaVRYVgcagaatWattYtgNcgccBSttataaNct
+ttcHtccaaDRgaataSatgctVDggacagBYtBcRacDtYDNtgWaattattatYKtNc
+ggaKRatcagBactgatgcctSttttttDtcSgtcaaataataaMVttgaacBagtattc
+tatggYtcaaatDWacVtgataYYacSccVcataaagacagtNaatgtactaagtRtatt
+BMKacNacagaaWtctSaMgaKataaaMBgtYtaWaaKNtDStSNggaacgtMRtaaHct
+atacMtattttaccaataKVtcagctttatacgtSWBaStgttgWVtYaacaacRgtSgt
+acNgatgRtaYcagStcaNScaaaRttaDttctcaaBgcScDtWaggtgaacttNBBYaa
+ccaNaactNgctaaDaaaggttgagaaMtatacttgtgtctHtgagKacagcacagcgKS
+attaSDaKaatttagtHtMttaMVctaaBtgBaattttactttaKcMagcatgcDcatcB
+agaBHattVgWtaataMgtttgtDaHaggctgtVattDYacNtNStttaKaNggtBtaKt
+gHaaKcaacatDMtagatgtatMtaaacttccNBgctacgtgcaaKgWSNacttSBaggM
+tNStaKtcaatagattatctagtaBttaggactYtaaaStaaYtgaaaagYtMaagaKct
+gtVtttcgWcatctacgtatVaagtagaattBcagaDcgSgtaSggaactaRcaBRtMtt
+RgattaattWaBYcaataHMacgHactatNctacgaVataNVcHatatVHKKagaaRSat
+taacgttMattgtatagBagtatctttgaagaBctgattattHgRttacDgMgtWtaggc
+aatNttgcttagagaRatttSgtttBtgRtgaNtHcgStatgaaKtgtaBacctgaaWgt
+KatHDStatctttaRaaataacaBttStHVMaccggtaVYaaBttYNKgNaBHaaKcKaa
+atStBcattgagggcRSttttctaaatcacaRBattccacatagacatSaDtaaaSNttt
+gtatDgWgcatacgaSacRttagNaggaHtttagccttttWDtcYaVtaRtacWggctca
+aaacVctWtacatagttaattBBttMacatDtatttaaRggattatBVcacattattaag
+WctactVcaBgcttKagagttatRBgctagaHtgDgaaaSVtKgattaWtMDWaRccaaW
+aagtaaVttgWgVgacaBtSaacDaaaaKcacaRKaagttgagtNatttaSttaWRgtct
+aaccataDatagYaMgaWBcattaacSttcacDtSttgtaWYataRBHtccagaMctaag
+aWagSDaactRNaaaWagtacaScaSDcaatMaaaaaaaVBcatKacaggtgMaaMtatV
+aVgcctcDDYgtattcaatattaggagtYBaaatttagaaVWDattcgttagHKSgcWtW
+caatttaBtaatNcaMYgYagatcRRtcataaaYctNtatttKRatRggtYcgaWcgccc
+ataWttVaaBtaataaatcgNtctttaggNtatatgNaagtMttccaagactRttgtgat
+tBagBtaataattBStcaatttaWcattaatVtacatgtatttBataVYWStagcaYKDa
+agYtaggKtgagatVtMDtKgNtcatagtNcagtBagagcaNaaNtaRtagatatcYWtS
+ataWggacagagtcaDSggYatttDaaatcactKatWatcDatatRattataaatatcta
+ttHSctttggNctaagtSacgagatatatatRataagtttcatgcSaaKttctHaRgaaD
+atgStWcataaaaatWMNttaaRaVgaYcHaagWggttttaaBtcagacKtaBtggcaac
+HtaggVttttactatRWaataVcccaRaagattNttggStYaatBRaataVacgaaattt
+aBaMYgcaMgtKStStVtgVaatacccYaDVYaVaYKVtgatgcctacaaagcWgDtVtc
+taBtcctccacgatatWtcDHHaHacaaataaatataccaYRSataVagtttaaStgttg
+RHtctaDMMaYYaaagatacaBWKcagttgcaacgagBagcaaatccgKaRgtgaatcgt
+aWcatYtWaBtaBatcgRattcaagtHctctaatcttcctattaaYgaNaaaaRaDtact
+DtMNagatMtttRacKaccWaYtatcagaaKcttVtVaaaatgttgtNYgtHtaDactag
+gaRttaccVaagMacgcKtatataHaMtcaattcctMaRtttttcatgtctcaacatggt
+gacatcaBatHaaMagaatttattaaaactYgMttaKHBccgacttttaVaaVtcScHaN
+ccttacccatataMgggDtactagKgtcacRtacMacYgBaatttcagYcacaaataaaa
+ggagYaaMHtataaaHtKgaaHtctcaVatcgStcatHtcaYctttWcttattBactata
+atWctcctRKaaHtaaHYcttcaYataaaHtNcaSctgattaagaKaatWagRaVaNSHD
+aactaYVRaatgttatVYttatDcctRtgcgaacStaWttgaYcatYtggtatWNataMt
+DNRtgtttgggtHcWtatHaaataatVtaaWaVgcaatagDatgScgNcagggagtcaDt
+gagataKtgtctataattgtgaNatcaNatDgtagctaaaNtgtagtcBatgWcagagtg
+tWtaagWtaKgattHagWRaNatacaagtactYtaWgatataRctcNKcttttgaRtgKW
+tgtgRagcNtKtYtgatatgatBDKVtaaaaatttWtcaatacgRtaactttaaaaMtaM
+attaVNHRKttattattaaVaatagatYaggattVaaaRactcaagccccRtagtScgDW
+gVSagtggtaacataVatttcagtttRtattcttcYaccaaaagttNttKtggBttBcSa
+WaattataatcataBtgtMtMtaaagataYtacgMtWaaacBtttatcKacaaaatattM
+agtKccaaWccatttgtgacctttMSataMgBtcttaVgtNttttSaactatgaggaSWa
+taRtHtcgaMagSMccSaMctcgNtatgtataaVtBatHcHtattaacgactgNKtttaM
+tVaaaagaatVgttMWcttacacgtacScttcttcWtaatccatactctaacaHHaaaat
+DctNtgatMcRaaWRtMgttgttatRagtaNtatgRtaMttggaaKWttaRtHKMaDDaa
+catgcgttaaaccaaaDttatagVRBatacMaatacMaaatWcNcaaHttBgttgtacgg
+RKaaaMtcHgttaattattttaHgKtgttaatDaHatctggtaatMtYaRgMccKRaRKa
+DaagaggatBtSacatactccaKgVaaRMaBttgcataaacYtKgaVDtttgcatSaata
+ttatNattataWatWgBttaggtBttaaYataaSHtRtaccaacMttaccattccKggKN
+tMatacctctgtaYctaaccttgagtataaRatagaatRBtttttMtgWNtKtgcttatg
+actcSaatattgtBRBtSWVWYagtaWBcNatttcNNgSKacctgaaMKgatWcYHgRat
+aYggtctaMtggcagaRgaaYaYgKgaaHVtaattMgaaWaWaDataagaaaaBDataca
+tatgatcNtagagMtactcatgatgtHataaggtaHaWatMgtagcttaWtcStataStt
+agttttgcaagtgctgacDtgctcDtgaSgVMtagttKtaacgtacattaaatctHgatY
+atttcgggcaDtVttcaaacccgDgtatBggcttcBcWtacttgaatBaRNcgYtgtaaa
+aaRDctKctagtaKSatRtRatMaMtaacVYaKtactgRDcaataaatSacagctDaatg
+gttttaaacNttBaattgattaaMgVBKtBaacctYNcaKcaVtDYtcBaaataNSaBga
+tacccgtVtaatactSgtttgMSYtttgKtgtKacgtKatgataaVccaMgtaVaWattt
+atattgBNtgtVgVNtYStMtgtatBcgagaBaVatgatgBcStttgtagDgYMgaatta
+cacHtaaaaaBttKaaggHttctaggKagRNtMBaatWcagMSBaaVtgaatgtgatNaa
+tSagcaatttHctatWMtgVcNtSaNRHatVaVacVtHattcaataatgSKttttttgta
+taRKYaatccRYaatggtaVtttaaaaaWBKtatatttatgtagtcNatSaatatcMDRt
+gtBttYtatKaattaaaaYtcWccVattcDaaatgattgtHccactgNgctttBtgagat
+WDgVgtactgtRtaaggtBgacctaaatctRtDttaBRaYacaaaYYtcaaagaWaSDtt
+ctttggacttcBcgaDacHataNtNgWtVMVtRactggaaagSgtgggtgaggcctccat
+aaatNttaYYgtcBatattWMaacMRctcgttaaaVatatagagataKatRMtHaVagaa
+BBtStttaatcaaatgagtatcaagtRMtaccgtBagaWKtagaaaYttcSScttaVttt
+tcatatcaSgtcWNgtttagccaaaVgaatgtgttatgaaYaatgaataaaagagatctt
+cYacaaatataDgRttcMtcataYaBtctStgaatgagDaDgtRNaMtYMatatagWNgg
+aNtcattatgacYgtBKYttttagccttataaNRaatggaatccaBacgttacttatMNg
+gaaaMtaaRtctagtttttKKKgcBttgccgtHKatcgatVtttacataMtagNaMttct
+KHNctaaNatttWaRNgRatctagatSctaactctDttaagacgcatagcRNgagatttg
+tacattSattaacttttcgttgattWatKtgaatttaMtSBattKKcttaaSggcactaa
+taaatcactcaMgacggtRcaDScNctYtBRYVgttgtttaVtacHWattattcatttVa
+KtgKaacctaggStatttacaactcKNtaaacaagSttcgattatttcaRttVtaVaaac
+RgDtaatgtccMaacNtcggttgcctaattaaaNaWcgKataaYcctSgMcataaatttg
+aaatttHtagSBgKYggcgYaagagataaWBcMgatRBNRaYctgHatctatHttgaHtg
+cHKBKVaWaacacWNRactWBVttaatttVccaagBSWacaaaatcDgttattBtHaMtM
+tHacKgWtcctcctttHaatagtYttaagccaHtYatatttacgtcaSgtgtYttgBcat
+catttaNRgaKgBtgattttaaatgaattVaKtVYgNaatgDaacaaVtHaaatggtttg
+aYYatgctgcacatttttctacVtacaNatataHtgtcVtaacVgtYccgaactaKaaaa
+tcagtttaKNRtaaataMatgtacatatcKScctDatDcKttSattttagatgttHtcBt
+KgNVRagctaRVtttaNYWttcWYRatgatMgaMKRctNVMgttVagWcaVStcDgtttc
+tcRatBVggaccgaatcMttgagaBDgtNMgKKRBNSMgcaWHYWccNgcacaggVYtMc
+aaaatgBtaKcgaRacccgStattcHttgaYttattattctaVMttgaacDaWtNccDtc
+HBataNcRggaaNBtgaYNtaaMaDctMaaaaaaHaaattcBgtcgHtgcgaaStttcta
+cttcgMagagtaaaacaDctgcagHctHtWaacgaatgtggtDacgtcacataSaatKtc
+WBtataccaaScttNgDgcctacgBaNWtagataBaNtRcSggtaMattgaatgtRHtgH
+aaNWtgttaccatacctBataaMWatttNttVaaRagMataVtgtaccattYVcKYcgag
+taaYtttgDaKDgVacMtttaVttcYcgtMattctatatataaggaagagttaaatHgtW
+ctatttgaaatHttgScgtBataatgatRWgtttVgatMBcgctttatgtctgWKtaaca
+aHttaMtctttatcDtccaHaNYtSWcWNtHNacaaatactNggtgStacKatgtgKVct
+aBcaHcttaccaaWatHaaYtattatYtttDgtBaKcataaaatcaNgttNYcatVSgtg
+atatYDMMtggaatKMaagcttVtaNNYctKcctagMWtttatttBattNagccggaRga
+gtattaKatgatctacatcaKVaaagttYgcStagtctacttttcatKtWtKtctRaRDt
+cggtataMcMDcaattNcacattattgaBaHattHgcYattagaattataaBtattBKHt
+gtaacHtHaacaaRYaBttaRVSaagttHVtatMtcacaWctgVtgaatcVtcctcNata
+acacgWtattDWccatDDYtcgtaHaaKaacaYaHaataBtaaBKagtttcStWataccg
+NcaDtWNaaRgctcNaacttatttgttaaacaaStttagtgVaKgggtatNaatVagtat
+aVVaHtaRaccacaRatacNStaacaYDgaWaRtaKttgtaatacggtttgccaaggMWt
+caaccttcgctaMSaattaatgaaVDagttBcatccattttccaaBggRttgKgccaaaY
+NcDcaSatMcaattYDcatcWatStttggaaWtttHtatVaggttDgVWatttaBWMagt
+cagcgaSaaSgtattctacHtaaSaVacaataNKtatagRMagtKYBKggtttKatDaca
+WaYDaactagcaDttctctttHtagtMtWtttatYatWNaBgHtaBgSttRgattatgKc
+ccaaBtWcccataaNattaYtRYWgRccNatatHttWgttatactttacBYHaaaKaHYa
+NttaatagKatacaaatWSMctttcKacatMattgcaRctBataaVaHtataSctDVtRa
+acttcggScYctataHRHtgttctgtgattYatatYtcYHaataaataYtMMgttaaatg
+atcttaaattaKRtttaaRtaacttaBtgtcatgtctNcaaKactMtKatagRaDKaatg
+SaHcRtMDctagatcaYtRatMSVRMYKYaggataaatYtDBaDacDtaVtacggaKtta
+ttNaggScgWcaYtaBaaacaWaNVtHVagtBaatgaBNagHaBtaNatNttSgaaactc
+tBaggtHHtgaSagYKNcataaMcatagaSttctNBYcttattcatagagagtHWWDtct
+gMtRHtactgggagcKcacctggaYattatttgaaWgtcaVaataagaaNatRgtttacN
+tWYMBcNScgggataataaagtWYKDYcVWVggtttMcttYaatagaaKaaataDcaYMV
+caVtgtStctctWaagtaRtaagtaaatWacSKaaatYaScctggtgMKtYMtctacDat
+ctcaMatVtNaataaNtaattgaagaNaataataagcttaagtgtgcgtVgttataYaag
+VgNaaRctSctgWKVaYKgctNWMaaRaHatcgctHaaYMtccggattgtgBacatHaac
+ttggtggDVgtcaaaggSatWRaKtKacNVggaatYttatttattcaaSttttttttcaa
+tgttatttgttttaBgcatacWKDgtYNtcYtgtcttttttgtcaaatgatacttWagat
+DatttcacctaaaaggtgagttatWgtgHctaatMtRKagccagcgcVgagYagtactgt
+actttagVctaBBaYNggtYtaattttcRtaaagatctMtaVYatctYgNMaVtaWtcat
+tgRtaNataagaaaacVSctHNtcNaMaRYcgagttaHcgacNgagagBgtKaactaaat
+atYRcggatgtKtttactgDctcVaYaaSaacBcacatagaaataaaaWDctVcNtttRt
+cataatNagatVMctBgttcHtVgagaNaaaHaaSccggatSctaHgtgaYRagattDcS
+DtMStNYtgtgaagcttgggaatttttDgcaatHatgaBttHttaacatBcaaagtaggt
+KgagacaattaataHcaNaaHataMtccaKagagtttBYSagDDtaNaRtWtWagatSgc
+SKtcttttcaaRgtMattatRtYSHgaMccttttttBtHactaattcaHtMatagaattV
+tBtDatcttVgagtatttaaaattacYSattatttaYtagcaVSHattDctKcVattata
+agagRaccccWcaBtYYtctaaaaYccSgattaaaMDRtHatMaYtHtcgcaaggWgBaN
+VDatataaatWtcMYSVtacBYaaatactcgtacttttWgaacRNaattctHagcYtaSt
+taaataatttttaaSDtKaaMcWgBaagBgaatDagaaatactcctNtgRaattaNWcat
+tgYVMtRtHgBaatcaagRcagtStaaWRgtaaatHcaMacDctatNaagtactVHaaVa
+gMgttgKtgtHatcMacatagMgaBtSaaaBtagttaaNaYgStRRctYWYVtttMNBgc
+ctgMctcacttagtgtttDagacaYaattagaggKtttacaatMttctttatKagaaNtB
+tttKSHWSaVtVtgttaRSaYccgtaBgggMtKtttctYWttcaVaagctttttMBgDKc
+catagVactWDgtRtKMtgBKaDaVaggtttRaataBgttYtattatgttatgtcMMaat
+cagaatagHaacaattRcBcDatttaYWttagattggttgaMcgtYRgagMtcactaRct
+cBMaaNgcaStgcgNtgagVttaBaaagaatacgcatYMaaatDtacgatatataMtYKa
+tctScatattNgStYWgtttaYcttgtagaHaHaYtaRaaagttcMHaStatcatYtttK
+BtctataaaatcaStcatatStattatMtSatcataHcaWaccagHtaaggaHatatgag
+aaYYgtgVacSttgKaBacSYcaNNccBNtHKtHcctttMttttagtaaaBHBaaattWK
+gtaaccDataactgatatgtaaRVtaHgaattctcRttcgcatHtaagttYYctaaattt
+tgWDacBtataatttctVaYHtMtagMaHWtagatttcaVgtKaaacctgHagSgtacSW
+ttMaBcHttaatcttMaStYatatatattagtttggMaYaatHgaaaHHgatggccctac
+tatSgacaatcVMcatactBBMtaattaaatattBNDacYtgYattBttHtNcaatgcgg
+acccctDcYcDtttaKaSggtatcaBYaaBttctDSRgacHttagMcggtWgagtcctRa
+tatRcttgattggaaaKggaaaagaaSNtattcNtataatVttgagBaMaaBctWtHatg
+cDaatHccgMDcgcWaaDaacWgaagcaatattactcaaaatMgttgtaaMatatYtctR
+SctctWcatttVatgBNtaaYagNtaMatcSgSgaVttSaccaataccKRNcataaggYc
+DMWaSKVcccaaaggVtHtgHagMaggtKVatVtVMDVatBgttWagcctagagacaaag
+gtataatttgcttgtSaaccttctccttcaatgNaacaBtttaVcaacagWaHMttgtta
+agttNWaaYcgaaVtatacBatgagHtSattacBgttYgtNRRcttgatcttaHcaataa
+ttattttccttgaYgacVgNcttaRattatatctcagWWatNcDgacacgttaatRatta
+YcKtggtSggWgatMcaaDBttgaacNttctcaaHtHaagcgVtDaaDtNMcagaaatWa
+NtatcttcattSgatatgatactattWatSaattWccgtctaatcttgKDacatRatggB
+ttatggKgaagtttcBaKtgttaaaKtcgatagcNgtatVDagaDtaVtcaactttYgaB
+YcgaYgWgaWtaaaWatVtctVtgggKaVctcgRtttacMaVaaagaaggtVtKNYtWcY
+aVtRVccgaattatacttatattagcatcKBattttgVDggcKaHaYttgcggcNaatRa
+ctWagWgttcagtgWMctaataBHtttgHaggcctgacMcYaRtRtcggcaatBagttaa
+gcDatatatNttgtMcVtaaaHMgattVgaYgtattatatSaDaaaaataWacaaNttKt
+tcatttttHaMagatYtgtttcattaatatVacgcHRttacaYtaagttacaBtcgaagc
+gttWtatVWRaaSacggWaBgSgcttaScatNaHcaatWacaMatagttcagYBagYgVa
+ctWtgtStNatacatYgSYDtaaacSaaatBtttKaKRSWRcRYMgcYgVataSNNtWgV
+tSaMgBcactaaatYaKattVggacaWaaatgHtatHccacStaatagaYaaaVaMaaac
+YYMctcagaNattatctattaaatatgMaRgggtatgaMcttaHgattgtScgtgtatVa
+tHNgcYttNatatBWaaactNVtHScgataaNcBataggtaagagatttMatVtaagtaa
+atYgctgttttaagatagaWaaYcgctaacttaaagaattggtSYgtVaStttRtcKtHa
+VcWaYaWVSccRactDaattgWaBSKtaDgtataaRcttaaaatKcagtNgtaaataaat
+gattcatgtcKRctatHaYtMacaWNgagatcDcgDtatKaHgaBcaaaNWaRataYtYY
+acttgcactaaYDcKDttWcYataStKcgcaaaaaRaaNtttatttgctYatgtcVcttt
+cBKcgtcttatSttattYMttaatcatattcatSaYtgWaDacgaataactctggaDcca
+ttacgSagaaattgatttaDtHacgtcMgaMHaaNDKttgtaMgRNtacataWgttccSt
+gaaatDaagYRtDagcatcHttcVNWWataatataaccKaatWtYgcctacVaagttWtH
+actaRaagatatMMtYattMttccatactHgStagHcaattaagacagaMDtttagcHtg
+ccctttattatSatWataBaaSMaccVVgtggatgtgttgYgtDHSaaMaKcagaagcWa
+caaaBagRactKacDaDgagagagcgKcaBggtgtaYttatgcDatgaNgatagagtBtN
+taWatagcacgcgcatDRSacHttcataBtaWaNtgtaatcDctBaSttttaggcWtBac
+gacaVYtRttaacttatgKcggDStacgtagaYtaagtaatgacggVMKtWagcatatag
+tcataagMgatVagVttSaacHataatatacaatRYaHacaWaaactRtHRaatagcaVt
+cMataaacatattHaStattDcMWVtYaacYagaaHaaWaccNHcatgtcccgaNttata
+aNaacatctBtaDNKgMtcDtgMgtatgKgSatDSgMtgVaaHNWcDcaaKgHMtaRtgg
+cgRgtHtVtatHgtMggaRVgtcDgtWaactactgttagaKcccDctcNcgtagtgStac
+gtataNcgVaHHagYttStaaccWacaKctgctttaactagtVatttaaatKttRcgact
+aHttSaKtcagBBaWaacccgRatKagNagKaWtHttttcWtatatttattacagacSBa
+gDgtagtatHtgcattgcaMaRgtagatYacactYSBDgctgatcMattStSgattcNtt
+aBWaacatgcttSattttctatNttaHNtSctgtcWttKgttgtttttKaMHNMcaacaa
+gNattRtcBaccatKgtVtaaDcttgattaaaatHgaataKYtgagMtgcWaWgtRttcD
+aatgRtDgcNWSgtagtatRttDcggatHWgaagtacgcVtcaatHtttttttgaKggaS
+aStaataWBMtgcaaatacgWttctagccRtaaaattNWaMggataRRaaHaaMcagaaa
+cacacgDaatctactaactDgatgtttaaDacacVaNgagKaBcatataaattcgRtSNa
+atDttKgKDgcaaactBDtaatatagWaBgagtgtYaaVatatMtaacaggtataacgKM
+taKgcttgNMtRaaaaVcHctKctaaBcWtcHtaRaacKgcaDKaYaSHgtatttataaY
+tcaKatgNacgtcWWatgDttRaacaaDWaatDgagaStaVScctgcacaaBtatacttc
+tgtctttcactacWcaaaWcactKattaKtatWagttacttgBtgaBMagaattgtYYtt
+ttVatttWtcBagaatcctcWtatYcVttattMgNgYStaBgtttcttWtagcaggtMat
+gtRaaDtDKttgataDggtttatgctaataVYcSttBtYcatctVtBtYaVagtaaDtga
+gacctgaaatcNKDactgKtacgBtDKgattaaatagattatagactatggacgacgRga
+aYKgYaRtgaaaagRgBaacatctctMttgacNaWtctVagtStMaactacaatttcVga
+tacKctaKgcSactaDaatHgBgtHgYttaagtNYtRcaRgYtBaactaatatDctaacS
+KatSDMatWtagKtttagaaHKattaVactttSgtgtagWctaggagctttgaScatcgg
+SttaggtgHtgYatgtctNtaggaaatDttcctgagagaHagttKcttttgcHtcaDgtc
+gKtatcaatgcgStVcatcaWNcgtatttHtatctggaHWSataWaVttgKgtKBaaagg
+taMNaatttRDtcDattaStctaaatKgtaagtcVgccaHKgtgtcgaSVtaaaaHtatg
+aaVcatacacVtKattaWaKDgttctattgNcaagaacaKYaHttWcDaccattttagac
+ttttMttaRaMtaHtacNgccgaaaaacKctNgaaagagggaVttttgtBVcatttattt
+VaHcgattWttMaWcattagtaYcMagaatKaYtcatttagacttStDtcagacattctc
+YaaKMttcagtSNtBtMaHacYWNaactVaMgtcNgMcVcVtgKaaataaVataacaDta
+aggtcSgtDatttaKtgSNHcgctVaaaatatagacRaBgaNtaattVWaKtgcaattHt
+tctaNRWtaHtttaaSgWBctVacaNVcKtaaagHDaaaNagtYcYKaVKtaaatBaaaS
+aVaMtcSgtaaacctcBYWttSgMaMccagcttRgtVggaaWgagtaggYctRtaaWtgt
+acaaMNtagtacggVcttKcaMgNaaatgtatgaSgDcSBRgRVcYtaDHgaVtWaaNag
+DtagggtHagHgctRagaNacacaStaNttMaatgaataaSgagBgagtgWccDtVgagc
+DWVctBttccaWcacgHttgtcYtttacttaatVatgtKtaaatttaNaYttaStMtVaS
+tggattgtVgaMRNHtacaaNttRScRtVcgttcScatMtBtttcDtcatVctDaSctta
+gacaaDaaBtaHtacRgRgaRNtKataNgcaaScactcWtKggRagtgtaaYtaaattWg
+NagatatYtHattWtYWatagatatttKatgtcgDagaVcgKVagacagagatVgHWtaa
+gttgcatgaKaatggattaHcaatatgKtMaWtWaYSVtNBDttaaHaMcaRctWScNcg
+gtggYSttcagaattattggaaaattVccMtgggWatatHMaYtaMaacaHaagVtgDtg
+gcHtRaagtHaagVMWacaaagggataBRcaaBcttKtHtMgcKaVtaacaRatKRaMaR
+tMtcagcaataaaaVccNcttMtctattaagacacgagatNtatttataaaSagaaatat
+SccaRHKatYMacgttaWKtgttgHtgagatBBaRRWSacatacWtNtcWgttcaaacca
+ctVcaSaYtaactaHgtcVWgactaNaatRgNattatagacHatgcYWcttatctaagct
+taatatgaaRcaDVaSaHatgaatttBDacatBtttHactacaNaNtataVcaVtattKg
+MaSaSggttggDNcgtgatactaccYHttaaaMaVcBSacctgatatataBgcaattaat
+BaHtttgtaagggataaacatgcgcaaataatattaaBVcaWgttagtVaaWctRgBtgY
+tttccgYattttYMaVMtaHatRDaatgVacaatatVBccgttaagactcgcaaHtVaBa
+aRctaVgggaacRaaaaaatYaSaccVgRaaBtgataaatttcaVttataSMatacKtaW
+ttgcaRcgtgNattatttaatagaatNctcatHtSWttaVtRattcaRYtaaattDcaKa
+gcWggaWcStaatNVgHaMaBKttaaatYRMHaRtcgtagMRgtattcctHtcacaaaKt
+aNttcaRcatRtccgatNDagaBttDHtcttggccttaNtattaaStaWgKtVWNaMcca
+VgVgtatcKacDaYcccactcattcacYtattggatVgaWttctgSDagaWDattctaca
+taaaDggtactatagcNcSgagtgtMtaacNtVtcStttSgNDaDYgaaWVgtactRtaN
+cYgataHagaDtagttggaHtgtNtcgcHYgaDttgRtgStatcattttKtWVaYattgN
+taaYgYccHgWactgtaaaVBtaBattaMBtHtttYttVgtaYMWatWgWtNaccVtgMW
+aSDaatcYWccaaaHtacgKagtNcMKactcgtaaaVtaMatttcRcttgHtattattcR
+aaaWaWactgDttttccttttaKVNaVggataagaagWttcgBtBtVaYcataRtaacBg
+NaaYctggtatctacaaaagatttagttaaaaNaaattgctcaactttBKagatctgctg
+aMgtBttgtKaSatVgcacgaHNatVDgttacVBacKBaaKaBctccDtagctataWKtt
+agtcttYgtaSccaatcBttggaBtMaaaagaYtMgtgtNatgacacctWcKattctgaN
+taSgaaataatatVSaattaaWattagDtgagBaHaaNHtBgttcttatHaggaBtatcH
+tSttgccaatNgtaHtttBattaacatcactgaWaaaaaatggatagMHtSgaaBSatac
+BSaagMaDcaattttcgtctaacgHtaaaBtatcttaattagtttatcttcgtWVttata
+tcgccgaagBgRaDcBaatHVDtataacaccVgttHaaSgaagaaatcMSaHBattgcaS
+gaSVaRttcaMtgtgcaatKaatWggatBVgtataNWgNctttacctttgaaRatSaKtt
+HgaaaYSaBttVacWttcctgctDgBSgYcagcgggWRataaaatgcactagaaHStaca
+atHtggtgtBgcNDttggattatgaagaKaatStgcttHtgKNMNRagtaNtaDattgaD
+DcKtaaatcVVBtcSgNcRtcHataRcggctVBtccaWcaDgaaRaRctgaatMtaRtgB
+caWNaNatatWScYYaWttatScYtSgcataDtWcacBtactaWgcYtcgtataagctat
+aNSgBctagattaNgaKgatVKgtagttttcaaagtgcgcYattcagatggaKcMBtacg
+tttaacctaaattaaatattcatRaggtcgcccattMttaaaaaaactggSgtcccgtct
+aNtWattcaattVHDagRtggVSSaaHtattatWctatKatHtHattYBtaVaMRatgYa
+gcHtaSataaStKaaacattaagggttggVYaaDgttWSttcattaRBcMttttaacatR
+DaataaMttRgataaagVDKatcatacaacgMtaatYctKcgggcBKNgtggttcttaag
+ttYgcataVMaaVBgtVMSNagttatSttgtDtgtMgMDtNKtBgctattacagataMWt
+cSggtcHgggcgagtcRtcRattaaaatgaaYYattgtaaccttgatacgtWcHDgBtVa
+gNcSgBKtaaMtcaStgggatDaVtKScaYagtttctagNBtcMcDgKaDHtVtMaMacM
+gtagtaaWtaYtgHtttttgtctagYHtRaagacDRaatgctVMtttWaYaaNtttatat
+ttStcgactaDatKaatatattHggttgtRtattaattaaaaRtaNacKattctVaatga
+ttcttacWatgDgagggtggScatNtcMggaagggHtaaccttcWcatWaStagHtttga
+tHaRVaaSVNNtcaRacaNaKttgctgggcVattatccatVatataDtDcNgMBMgHSag
+ggaaagKctgggtcacgaatcaataaVtDttaRRgtctStattNBaaaBHatcgttaaWM
+agatagacatatVgDBttYMacaatttKtttaataaaagcacgVgaaactDBtaaccgta
+gaNtgagaaaRttcKKagtYKttttaStataaHgtcNDcgttYccaaaaMcaWtgggtta
+tcaaRaaggaataaVWcacatattaRYaaVagagVtcHggaBtaataNattagKtcVRtg
+actatcgHDaBgRBStVtSgNBccWDgaatgaggaaNctttNttttacaaggagaaDDaV
+tcgaataaataagttaattStBDccaaaBgVaDtctScgtgtttttgctgtcacgtttWg
+acStMtttVaVgaBtacDWtttagttDctaSDVtttNaDDcHatatacYtKataaatagt
+tgaacaagaatacaDDcacatttgtaaaggHattaaatgttacgtcagtNStttcVattt
+aBtHtVggttattaaHcgaWagaYtVaataaatcaBgaccctHcatKaDatRttHRMcgt
+cgggSMtaatNagtYtgaYtggMYttgtaaactacgKgStttaaaYatatDtaaSaVVcH
+gtagatgaggtcaHggMtaMWaWaHctgaatctaaBaWaDtcgggtccctaagtaVYDaN
+actataaNcctKcBcataaatttcaWSttttgacHtctRggagRaagacagWVNtctcat
+HtDHaRagctStatattggcattcattttMaNaSaRaNDHaagNtMgtVWtgtMccaact
+KNaaaVaStatcgtStgtgtaBgBgtaatcNtccgaagtttaWgactNgtaaccaatgNa
+tWttgWagtaaKgtctRgtctaataagttVDHgStgttcVttgtSWatcYaggMatgMRc
+BaStgtaaaaaMttaYagccggtgaRRatgatccaaaggtttctaaKgacaDagagatgc
+tcMgaaaMcgRaacaaatataaaagcagtgtatDHgRaVtWBVtggacatStctKccttV
+ttatgtKattttYcatctgttatgtcDKHYcctSHMttgSDRNgtaMNHaggatBcSBtH
+atDMBcttMacNaVMKtctgtttcgaHSgtMgcacagaStaBttcWcattctDtcttHtD
+KBcaaNtRNaaDgaaaaccMRtBcWVVagcttatcgaDYccacKtatgatgtcaRttatt
+YttctaMBggcaYctaNtBactgattStaDaHccYaDtgcaRDgSYtYtatBSaYaaata
+aagtctcgcgttcagaaKtttctVattagtWcacgaaVaaVtctcaVgtagttNaaacaa
+tgtccttaactaaaStaKWagttaNttatacaaaKattBctgaagaagtYDNtagatata
+DtHcKcctaBaggcaatctHttctaaDNtgtgaaaagRaattataaBMaggtDgtMaWHa
+cBStSMtcgaacYttRMatNacScgaaRtttctattcMaaBggtaKttaRcgtBattcga
+tatYtVaccSacacgtaaagtctNatYttgcSSattttcKccttataatcRtHNctttMc
+atBtacatgtYtctagcNttYacaatgtaBgcgttVtattaaWtaDRtKNaNDttDWaaa
+ataatDgcgcKtaatatcgctMctatcatcgtaaaaYNRttSaNtWggatRgtgtcttat
+aVgaaaatcWDcttDRaatMKctcatatRttBtccaattBSacctgMtaDDRagtcagac
+BNtttattttagtDacaagcaHcacgRttVtatcatatacStaatMaWagttRccKtRct
+cgaagttgaatttNtttatHaHttagctatSBaBtcaagtDaaaRtgattcatStagttc
+aRattacaVgtatWRttWggttttctaactttSaaaVHRatttYHMKVVcgttMtatBta
+SaaMctgMtcaagaMtactcDatSaaaacNgatttNcaagttRgacgataVtaacYNata
+StRtgaattactgtaKtNagaaccDaatgNDaaHcataDSYattatgtctgYWaaRaHtt
+tWggcKatgcgtagDSVtMactataKMSttaHaaaacaHatVaDKtSaaaRtcaNWHtat
+ttctWataagctttcccaacctNtaaacattcgagaBKVattaWtcVaKtWcggtaatca
+atgttcaaatccDttctcaaSaWNDataaKatBcaYttRtcataMVtKttggcaaNgtgt
+tatMaccgttgMNagtgVtNBWggaacacaKaaKctagtctacttSaKYMacaWtWDtta
+tagHBacttRttcctgttagtScVNaRtaacgScaStttatctttttSgtBgNtttStRa
+tNDWtctgatcKtgHcattatctaaaaattNaaaWgWaDWttWRtHRNcHacBVgWttgt
+NggtWtWcttgSatRtaaYtYtNaDttYagactStacYaYtNHBatggatacVtBatgcc
+aHcgtagaaMatgataHagtKgHaWcgtaccKaNatagWtDttcgtagggcSgtRatatN
+gaRtYataaataRtBtcttaSatcagatgaaSgtVtHtgtaaDtVactgattcgcatctc
+tBaWWtaagBttVgacHattWWgcKataHtBtagScWtcaNtHStBKMHBRtRagcataa
+YtNtttatacttaMgacccattgagtDYggKccNaaRgataWaaaNWDMttMacttaatg
+StDYgtattaBatBttKcSaactagtaccgttggaKacRtDaataSBaatacaKtgagDt
+NcttattaagYcagacttNNttatcBtHtgRatgccacctaSaatccaRSgtWggtgaaM
+cgcaMaagSagaaDatHcttgaaDgNRttaDKacgcataagYaagtMRttNaMMMgcggt
+tcgtRaSgacaStaaVgStcaRBKcaMtctKtctatNaactaHtaactaaatNWaKtWaS
+tRSKcatggtgBtgRBtagaatagataSBagMtDVataaDtaattgaYgaBaagWagaac
+aggaagtctgacgMgtgagaRVacMcBaaDatKatcNtKaRtcatDNBaaHatatacatt
+aWRBtcaccattctctaaWttWacgtccgcgtMctcaaaccHYtNDatttSaDMccaStR
+ttWgttattaSVKtgttttgtcWatgtgStttgttttatcaagacMttgtRDgcRtctct
+gtgggggcSaagcatVattMacattSgttaacctaaaaccgcagtgagNgtctataatBt
+HtacaaSccccMgagRVctYagcgaatttacMagVttaRDcctRgSSttttcHtVaacat
+agBgaMRagatRcDBaMtaNtcatggHgaDYgaVgWaaaaMKattBtaDYBaHRccagtt
+atacVaDcacactcgtaSctaaatatRDaccagctttttaatgtagaMaRaaKaaataaa
+atacaRagaaYaNtatKcDttgHgcVtaYgDacagMBagtgttatgMcSgWDWYWtSaKa
+agcatKatatctcaRHacagttaKtgBKtDRggtcaYcattcgcYattttgtccaagtVg
+cattttttaVaagtaaaagtWccttgacYcaagtaatataYBaatataBtaaatacactt
+ttRHagtttaDSHgNtNVcatKgaKtgagttgaaaHcgBattatHgRKtcaBaagttgtt
+tgtVatYattaattBatYgaatgMgtttatagtKcVctagttaaYWttWaRKWggYttga
+RgagaaMKtaggtattaMVttataVcagHYacaaMaattRRtataWaaRacHcattaVaB
+tHgtatBaRtttaccaaggNgtaDMtatYtaYVtNtcBRKMgaatRaaagaatactRatt
+ttNcaaaDDaagtagtacaNtSHttaaataattggtaaKtttaaBaNgtaagtcaYttac
+VaataataatDtgHSSgtSDNaattcRMBgHttctaagaYVcHcactKgaaNHcgWaWtt
+aaBactcgYtDaacgactMtaYKacBgttcttgttataBacatScBcattKaaattactt
+SSDaRgKtHHagRNRMtttBDtcaagcBcgcYattactcgtttacSaaNVagtacacgtg
+gtSaWatBtgatttWttScaaDtttggtKtNKaMtMgcttaHKaRaccgatccctgtggg
+agRMttaaMaWccggtttBtgttaaVtagMWctNtctHgtBgcttatSMYccttgHaata
+tctgNgVttagcttagggaBBSStaYgYatYgtaaaaattHatctatgtWRNgtVcSgtg
+cgtcYBagtRHgacttaaagSHatatBaaDgcaKtcccDgcacMttatRaacaataaccW
+tNBaYatttYacYtagagattRtatagKcatattDgKtNNgtttWNagggtacStataRt
+VDYaacgtaBtVKtagaagRttttttatataSaagaaKtaatatKtattagBtHataata
+tcWNaacagtgWaccatatStcYcaaNRctcKacKttgtStaaKRaWDDaatBtttgtca
+gggBgtggSctaaWtttYVWttNtctaacatagVYatcagatctVaHMgWtcaagtataH
+tgacaagttSacgtNRataaatgttgNtaattagaattgctMaRttBtacBatNgacatt
+tcaMcgtaaacctctagHctaaKNttBatatttaatattBaKtRagYtatattSgtgtcc
+BaNSattgaaattgYggcaaataatatHcaaaatcMBaagYatttttaYttYaStatttD
+tacRtgRattttttgDcRaggagcaccaattcRcttttataHcggatcatNSatgtagtH
+HcactgtWgtaggtNgactactHagagHattcaggggSaatgcaaaacSSKDtaggcDta
+tVagMtggactaBSatagMttaggatSYttaacBtagaNSVtaSaNcSScaaatattVct
+cYaWYtBcttcgaYBagWtRgagHKagagMaatttMatgtDtaYNagDtaBagcKcKcaM
+ttKaaaaatVaatHDaataacgRatBNVKtMaccYaaccMgttgtactagcttMatKgKB
+tMagtcttMWgaatRcacaaaaSgcgVtSatggcaggcgKaYaatgctcattaaaggDVa
+cStgttaMaaaaacNVtBtgcttaacgtDNaaRcgWaKtatactagcactgKVttaatct
+tRcgDHHattcStatgatcWataagtattttacgtcaRgaaMcDattYHattYgatatca
+cNNWtDatgaaaactgaatHaggaNcttcctKggNgatBaaatttgcaaaDtgctcaatg
+tYagacMgtVVtgDBaacVaatNaDtatctgaaggKcagSggVtacgatgNWtKWaggMa
+cctagaatattcttYaatDatcgttgatggtcaacgttatatgcttaWVttccRgVcaDc
+gagMtacattaMtaVWcgttRcatRacaRcMcaNtaYWNYgMtatMgccctaKctagHtt
+taaBVMaaWcSaccgMttBRgNcRWMtHMaccaatgataaggagVttYgaatcttagtgt
+cMtgcctVtaRtgcaccaDaagHactNYcNcttaaggcMBagaWtattgtgctaccacgc
+WataRaHtDtacgaaVttagttVacctatatStDgtggtaMgaSattcatgMcaRctatg
+WgatKatYYaaataNYcSaDtttgtcYttttttaBScatRtctgtaWttaatagMaacat
+DttaaaNgaacttacYttagaaccctgNgagMNHaaKacccNatgKccttaKcatDStaa
+StNaaVBatagttcacRtYcRcKaagMgctKtBagSaagNcKRttaaaaKaaRtttttta
+tHHNHaHRtcaRcMataKDDtNcKtKatctaaataaatRatYttMccaaaNaaWgctgat
+tcaaaKgaatScaNaaaKaBaaaaRNtataVcYDattagctattaaatWtgBWHgggtat
+catattatcVttcgHacgcgatMattDcaRggDYtYttNaaaatBKttKccStYVDatat
+YcctSacVcattttatMtWRctaYagRgctcttttaacVtagaNaVRaccgRaattaaVc
+aattgcgKRctMaKtttHgctttVMaNaRaNMKacHSagtWagtgNatKttatctataaH
+atgSaSattcagtDctWaataaYtcagtaYtctatHcgattSRttaaaNDgagatatact
+tVttatcataSSaBNaDataRtRRaattcaRataaRtattttNaRYtaKttaccaaaaaH
+VaBtttWtttgatRagctaMattgcttactctgatKtgatgRBttaataagYttcStKaN
+gcNatacgWatYaatctggVtaaattYccKagaVagggatttatttWacgaBcaBtaaDt
+tttcgaBcHDgaaSgVNctgaaKtgaVagtVWgRHgtacaatattgcMDNNataatagaa
+aataatNtNgccgaaMaagtgNttacgVHaacSgStBBtRagtBgtaaWgacttcKgact
+aaatgaagVaacaBtggtacattcaaagtgattagKagNatatVaKBacaMMctccatcg
+cgggRctttKaaBatcacaScaNaaaaatVgHaattaatatcWcacacactcatgctcga
+RggVgcatatcaDcatYgaggttDgWNagagaaagagaYttHKaatgtaVtYttSNaDtc
+gaatctattSKgtgtaggaMgtaccWcaMRtHttaaatgWtgtccgtKtacggacaNgaa
+cgaSgcYagcKBttNacaagatacgaagaVcBgStMacMtgKaactataSgWtaaaatDR
+ataaaNaSaagHttHWYgaccWMtatataaaaagatgtaKtVtgtcBNMtRaSaRacVat
+aaNaaaDtaatgtaaagaDgtataVDaacagatttWtDtcBgatggBcgagctcKWgtHc
+BgcMaatDNatcaYtctBgaHtccagHctttMtattgtBccaHMctatctNaaatacgcg
+tacatacatctaDactactcKtacctataDccMattRgRggHtaaaaNYcVtatccgttS
+aagYcgMatttaVattttHagVatVtttKattaagttaNaacaccHSttagDactSNgtg
+tttaNtVtatttatgaaacSaKtactctacgagttgaagtcaSBaDgtagatNaaactRK
+ttcatcWtaBaggKtKcYttaDttatMaWcStgattKattgtatatDttatDtKatgtaN
+tgtcgtcttttttaBtDBcaaaaSgDatgHtctacaattcgMtVYtatgcattaaaattc
+aVgatRtcagBtcaMaNctHgtatVatcHttcaDNKgtWcgagHtttaccattNgaactY
+acaKgaaagtggtttgtgatcgaKaHgaatYNtBgcaaVatWacNggataccaDtaaaWt
+tBMaBccagaHDaataaBaagYVacYaScctYVgagWagaYagtgatgtttWatSaaaMY
+DcactYtaStWgaaattacHgKDaYtttttgttcaaaaatttgYatatVcMatcactggR
+aaMVtStBtaaaagggatYaagtBtatcatgcDttDaaaaMatagtctaataNtcttWHa
+aatcaVttaRaKtcgatttataWRtaatatcDWcctaNMatgtttDaYaaWtMaagtcag
+aKtaMKacgccaaVatgWtSagtagctatttcactaaNcaaaNaaattaggattatMWgt
+gacgtcttcattacaYttctRRtttgMatggNtatacaataataNgatNcMttaggBcDg
+RHgatctttagtNtacaaccgBatgtHaatgttttgatatccgttatcataStaKRaKgt
+tgNaagagKttgNYMaggaattcagaactcaRataDttaagcttaccttttgVttaWWga
+cYggStacYcgatgcSccaacHcaYNtgRaHtcaYaacHctYacatagatBgtgacDaNg
+atMacgKgBaWagacaSgttaKcatactatatcaHaatataattctggtcNttaYggDRt
+DaSHgNttYaatWagagtagaacKtWtHtBatNtScttttacaattagtaMaatttHgtc
+tagMctaccagagttcaKcStaccKggaggtctgcNatctctDgYccaaVgttgaatgac
+VcatagtgtattttccttcatctacttSgaaStcagHtMaataWNDagtatttttatagg
+catNKataNaMtgctgtttVaacctVBDWattgHttatattaKtatSVSttgtaScgcMc
+ccattgggtagaKMgaSaSttYgcaaMaatVaVaKgtatgYNattcttagWgtcBaaagS
+aaatRatttNctacaStggtYcaaggttBtgaDWBtRtgaaDccacaaaVSatatBcaaS
+cWccgaKttttcgtMaVttgatgtMatacatgNttBaNaagtaggaRaBagaagtaRtaa
+gttacWatgHtttaagSaatgataNWattgtaSggHDtttBataaNNBRaatKWBgtaDc
+BaMaKtctaYatVaKataaaattWYcgtaHcttagtgYtgcKDtccatMSaaagatYcSa
+HatcaDtaatgMMatgcaaatgtttagaDDNtatttgaaKcNtagKYcaBMattaaagtt
+aaWDacgRaRtaKttaaattaVVKaMaBtaKctaaWcatctRMtgKcBaBaaagattHcg
+McgaSNgactaccRatHtaSNtctYcaaBDtaggaagcMatttcaBcDaaatggWtcaHc
+taKtHcHMcRgattgaMtNVaDagttaggcttYctcatDacWDaaaaaKtaBgtBaatca
+ataaKgactgactcNcattMcacatNMattgtaaaNaaacttgctaRtttacttaatKYg
+cttgaSStgtaDaNgtaKgBgMaKgccagtgtMgatHDtgacaWDttHKaDgMacttaKa
+agBtttgtcttaagMagtaHcttWcacaatSatgYtgacHgHcaHDgtagaDccVaKcaa
+taNttccHYctctaSRtaYagtNgDagatWtRttSttNtRNagacatattttatggacta
+cYMagtMacYaagYgVgKgtNtaVcgtgaatcataatcgattYtaaatYtctgBaMgNWN
+KMgDttttaWtaBaaHatNHaDacctccNKtgaVcWattYtgccaVRattMacBtcccNa
+gYttBYNgaBaaaStWacMgcttccatgHaacttYagMtNaaVSYgcgatatHcaatatt
+tgtgBcatWMtaaaaDRttHaBaHttgaacaaataaWaMcaDctgBtatWttaacaaWac
+acWtDtatttatWaaHacaVagVgKaaaDttWgRBVagttVNttctgcttgacatttSHH
+MKScSgSaMtDtaMcgtcaWaacactMcaHWRgaactWtcgcMNcactVDaatHcDSttW
+tagactatgaRNcttagataYgaggaagagcaSHcWtMaKStatgYatttttVaattgtt
+tWataaaDaDgataMcaMtatttctVKaKgcttcctDagtgatWatacaRtttaaaBSMc
+tHaaatcagStatStgaaVttaattatttgctaagcgagaWaaWtccgcaaSgaatVgta
+StMcSNcgtWggMVWNatHctggRtttaacNagtttRtaMBgatatHtaatcMaaaYgat
+MtaccttaagYatcgaaattMataaHatYMcccaaaDaYaVaWgRaHaaaMcHSattcat
+WSatttcaMtgataKBYtactgaNttgaaDactgBatgYgttaagVgaagDagaatttKN
+tgaMtHagtaaHRgaaatttaYtaccNcgWNcKtaYtBMctVBWttttaSagRHBtaHtc
+gtactHggagtaatttaaaVVattWDgtaaHaYgDtaacatDtacWttttttatgccact
+taDtagtaaKgYNcttMNDaBcaVMcMctWgatactaRcaaWagaatgcWcRtattccag
+KgaNgtctcKtWgaNtSttagVaagaSYtcctWatatSgaDaKcactcgBtYacDgMtaK
+ggtKcDtRtRgSaNKctaatHtRDaRgatatacattagtgccSttctDgcgatNcatttc
+HgcKtagcYgttttgNKWRattgBtaaNcRaatcNaagcgaaVKttYtWttaBttttttN
+ggKcgaRBMVtNcNtDVaaMtcBNaKtaataRMcaaaattYactactBattWcgccgWaa
+MtaBYtgtaHagtcttVttaggaHVaaNaNaatcttgtgcattttatMDYKccataScaW
+gNttccttttMaRcVtWHgaaatgBaaRatgcgatataaaWYacYggtacttaaaaDaaa
+ttgatcWaatgtttRcatatcaggaBcttttcttVKatKccaccYtDatMtcttacMtSa
+ttaatatagaatgSgagYgWNtttagtatgRggYKacaatattgggVtttaSaYcaRtBc
+ggtDaggYaaactNataggaggaDgaKcaaataagatMKaattaaNagtagttcWctata
+aDtttcgtcgtattaccStgYgatgKtgcccYatDctYtttttYttaaaagaactcaNVa
+aYaYtccagacBttKcaatKataatKVWcBataaatgttcctatYaacttaSVtgatagg
+VatgagttgatcttacgMMgtWtYtagcacaSctcHYtataattMttataYaaccKgtgt
+aaKcYagaaVtcBKattStgcaaKcaKKaHgtaaBtctgcaattaWgMcgYttMctWtaD
+NcDatggWaattggaVDagKattttgaaaRHattgMaaMgtaatcattctKgNaacaccc
+NHataaaatgaaagagSatKtacVagttggtcgtgcBtgtgcatgagcaacataagKtca
+gtttgtDBBHWcgaDtatYttgattcttaaagcMMttaKgDaHtatVgWHccgatKttca
+aNcYtcaaDWDatcaWtBtWHgctaaMDaDWtWtNKcRRaNttVgHaRgKgcWgattNaa
+attaataNcaRtagtRgaacagataDKgtatScattaDgatcatMtcgYcgtttaaaRct
+cagcRattaacatccStcBtgaccgtgWaaagaaatgaaWtattaVtHacctaccaaatg
+BgtaVVYaaaatccKgtcaactataDgNagtcaSgtKttacHtccMKKWattagtatNct
+attagtttWttRtgaKaBHStgRagattaKRtWaKttaaWaagtaVccctgcgMRWatgt
+tNKgtcSggSHtaBttgtaYaatDtaVtaatgtHcatWaYcMttataVgaaaaagBgaag
+RattccggcttDgggcttcttaacttRgaStaMBaaMtctMBHBacttVgKggcttgcgB
+cBtgDtttcctattaaRcatStNgcKgctatcccacSctcHtaHWtgWaYatgVaRRYtg
+ctaaaatggagacctMcttgttMagBaKctttYWBtaYKgcccYttaMgtHaaNYgtgta
+gagDttcBatgtStttMtBWtaaBctaggaaNgaRgcttttttgtagacRttHSagaatD
+aYgcctMBtgtNSNaaBttgVtWtttKgacaatatVttVatagatttgcgtcgDtVgtSa
+ttaaaVHtaDaatYttatKSWtcattagtaaNatctcagcgtgcKcatDtaBccaaccct
+gaYcattaNaagNaKgagttttcattaHMaVKMDDtaSHScaDattgcaggcccMattat
+acYtMatWgatttcBcBtBctKacccaaWctatccctcaacaataaataaMttgtaHHcg
+atKgaggBtRYattatacgtaYNBacagacaaatVtMcttttRtVcaattgtttgaWtaa
+SacaRccMcaaacttttaaacgtacVBtcWcSaYHgtattacgRtgtgtaKgWgaatcta
+BtcgtgRaaaWWVBcaNtcgctgYtaaaHaSccaagaVMNaacagattaHRaaMWcVgMt
+ctgcatgaagRDattactgcKHtcactYtccttatgHtKgMgKcDtacNtcaStgYccaa
+DagttDtttgYcaagcacWWttaMgccaStaaWtVactgaagtKtttcaWaatgMattat
+KcctctttttcatgtaaactttNcaaKgttttMaMcYtgWctMtttactttagaKtMgtt
+DYttctatagWcRttatYSagacttcaScaacaYtSaattcaaagtgctSaagctattaa
+agggtaactcacgDKgttaMRgggattttMcgttattaVtccaNagaRgMaataaagaSt
+cSaacgtaWttatatHgttHBcgtacggKBtSatDactRggaRgccBRttctaaaatSac
+tcKtttVaWRatatttWaHaKMatgtacatcagctaatggBgaBNSNatatcYStagaat
+SNattaccgtcaataaggYMRtaDaatVgYaDaattataRgVaagtgcaNKtgttgactt
+atHccacHaacVcWcNMDtatcatttttaHacatKtatagtgccWttaattttBSDaKaH
+aDttYacDtBgtMNgggBaaaaattDaaVMaKgatcggKtgtctatctctVatcDtaaga
+agtgtaMcWatDggaaaaaYtcDVtNttcNacgaYtcgatHctctaWgaaggtMttcKtc
+ttaMgtctKNagcRWcgBVtcBDatYKtctaVaaaBgtaRagcacggcaHHagcagaaaa
+acgggtataatcaaWtacYcWtcctaBgVVaBagHaaaaaatataRYagaacgggVtttc
+HaMtNtMgcgaaatKtattaagtMttatcttWttttRaatatgttatgtatttRaagKtB
+gtgHtHDggaBDtWccattcKtttagtttagtBYcDaMBtgatcttgacatKctBcaaaa
+caHtatggaNaVttcgttatttttttcaaDtDDaatcaaaYaaBHttaMKMVgctgWtac
+VtRaaactgYtcatggcVHtgattRttataBtcgaaRataDttaatcattHtatatccNa
+ttcaaHtgKRtRtagtKaRWaataYaggatccacttcacaatgtgatMaggactNaacca
+aMaaKtagaaMctacttDSaaaWSgctcagtWaataWaHtStMacttaDtgagWaaaata
+tttatcaacaactRtDgYcYtatatgtataatWtagccaagcgtttataatDgctgVaaa
+gHaattagaatBWggttctBaNtactHtKBtcgaaaRttHBatDaaKccaSHgtgctWtt
+cBaatcctYttgaHacgtatgagStatRtMaacKacacggaaSctagDagNttgaKKSgt
+ttctacgtagSataHttDctggBcYtttaaatcgRgagagaDtgRSaVStggVtgacgtM
+tatgaaNtWtHgtDaDtgttNaSVagaattccgcttVatatacattatataYtaggYaaa
+RDHttHYDtNgcatHggctattYtaMcWaaVtaNtatttHaagBtatcagatHtttgaaW
+WtttKaaaggBtattHagtaacactDggtattttScttaaaacaStcaacHttMtatcag
+atSaHtaVtBaNYcttHcatgHatagaaggggaWgtgBtttagtVttgacatYtKtatta
+YSggtaaaHgcaggaStHtYcgtaaDWgtaaaMcgYtNHtgNgcttttataWatttKWaa
+KtHattgRtBtMMccgtBtYttgaKaWBatcBgaaacaBgaagatYgKWaaacBgatgtD
+aaacttDcacgatSKtaVaRDWtVKgHtcRattactctattBacaaactaatgDtaatca
+tatKRattSggtcggRMaaHVtgttMcgatatcccgVctKMgBactVtWtBKtgWtaaaV
+aatRgKatttKSaYHtcVBNtgStgtatNStaaccgttaaaaYactBgaaaaattacacV
+ttKattVNgaMattNccctaVtaaStctgaaVatactgtctaaaKYNDtataWtattaaN
+gtHtaWgaBMttttccaaaDcgctgagBacacttctDSctcMtBtNccaacaaatSVtat
+WggagSattKatRBaaaNtNtttagacttaagtHttaatcgtWctHaMBaHtaaagKaaK
+ttgatattttgKcgtcDtgtKtHagDtMtatgatcttgtcSgtWgctaaaaattDaaaNg
+NYtMttNHgtHBataatMgMttctDcgtNtNatggKatHtaaRtRtDStttRVcaatKga
+aRSRtBttatccataaMttagcaaWtagtVgaVBatcVtYtagttgtaMactaaataDat
+agNttttactagcgcKctDatatDgaHtRatVWagaDtttcggSKataacaggaaKggMt
+ttctaVttMaatgattcgaagcgattaNNtYactttKgaatWttNNgctatatgttacKa
+MtaaDgtKgttBttHtDacaagaaRgDgttWtaatgVBcaaccatgcYggtRcctaaDaa
+HcatYNaaVDNtBgtBaattYYgcHttRctattVtattgttcKaaatagtacccttgcVt
+aaHttaagaKtaagSaYtgcacttDattYttaVgRcacaattDDttagattttcHagcca
+YaataKaatccVDKctNcctcaaBccaaBaYgKacWVtWttatgcSatcDHttattaaca
+agaacRSactBHttDaBBBcacgttactHaKgacaKtaWMcHtaVHttaattcgttatat
+BaaagatgaactaaYgDNattNaHgHKtaatcctcttcHttagaatVcagaHtagBgtMa
+taattaagtcSRcatSagMagaaaacgYacgagcacgBcggacaHKaaBatSatagtatc
+DttRHtcagtDtaStYtagaaagtYNHtgaacaatgcgataaNgtNVagtacccctBcga
+YWaactRtDtatttKatBccVKtHttNcttVtgaKMtgcttggcgaNatctcKggtcttt
+tataaacWaBttcgHtcaHtcgatcgcggccaHaagcVgKattBaaWttKcttaVaagYa
+VacagaacgcScDcgatataagttttacaaKcaaaBcYcHKctRagcgaatgtScBagMt
+tYHtaatHcKKtgggatgKSaaatactgWBHVcagHcttVBgYDtaVtcctcatRcVKcN
+aaYaBtattttatRtVtDaaScgtatacMatcaaactagtaKataaatStHtacaagagt
+tgtYatctagaBaHSYtaaataaaStacaHagWSRSDtagtatggctgaKtaRctaaagB
+tactcttatgBcHcNtNRNtHataaccRttagatataaHtacScgtattgttgtDcctaY
+RaattccaNatgtgctaaaactMcaWttgttgVMaSgtaVaSctMcagtcacNaWacgaa
+tWtaRtaatSgatgaaWtaaWcgtttHtWcttgatKtgDtDMcagtcattcacttgaaat
+actWgtattcHttcataactgctgtgtKatRagtaatttYgNcaatcBctgtStaggtaM
+atacgtYaRNtgNaHtNccRtgcSHgRcaatttVcctattaBKtgYtaMaactRaaaaBa
+attHHtatVNWYHaatcagtaMVtttctattWHtttacaaVccDctYtttVtNtRRKtBg
+atHtBcaatHYaSgaagaagHagtttDaVaattVactactYcaDtKttgVVVtaWtggct
+aSttgtaataDctWactcaRttWcMSYtWagaagttctKHcgKtDaYggaDttgtgtata
+acaRKctaacttcYaDtccNaNttaYtaatagRttaSagaatBtVRtaatcttatgcgtW
+tataaWgHataatttYYSttYcggKKtaHcttttagHDDBtggtttaaacatagaRagtV
+agactttacKaWDMacgYaacctgctKaNattggatggNgtKcYSttttcctttDtYttB
+catgattSHaaccVtccatctcccacDBtgaWBaMaaccgttttcttaaMgScBNatBta
+gtcttccttatKBRcctggtVStatagcDgMgtacattacccattKKtaRcRatRctYVa
+SagttatatYtcgNDDggKaHggcccgcRtacgDtcYctgaaacHtatattaVtcaatta
+aatgaWaBggYtHYYaVagWacaNtDtaRattgRacRtacacatgHtagagtaatatttc
+tgDDcttgNDagcctaaHtatYHtKtRaScgtattMttacaacHggttttatSgaHVVga
+attaatagttattactgtRtaWgataMDaaaactgNYacYtagKtaRcaYDHatatVatg
+gctKtWatHaNttaatttttgtaagcctggcgKataaNtttRMNggDtataaaatVcMRa
+taacagctMatBgMtaaVcgagattcaaaSgtgKacgtDHatWaatgttcDtWatgYcWR
+ttcatBSHtttgaatatBgaaWgggaaBcctSSVaagctSctagYatDggtatatgtaat
+atgtatgHYcRtagagtHcgggcataDHattcaaattcRgcaaaataagattcaaYVtaB
+taagRagtttgSRtgRYKgWggtttaaHgcHStgtggtctaHaccaccSaaaattaHatg
+ttVtataccagaatDKVtctagtttcaatgtNctaccgDcacgaattacactatgaaggc
+cKVatccaSWaaKHtttSggatgagMagttgcaatatKYtacBttaccatHRttaactta
+caDKKtaKaDcHHcaYatatgMagaRaNNttcggagYRtacMtHgacttagacBaagggB
+atcttgaRDactgatacatatcSBggtaaaVWgMaatttaYtaWacHattDMtttaaaRR
+ScatcttctaatacagtBVgtgtttBagtatgBNcaagHaaaSaSYKcacMtKatggcac
+gcctSRaagcataattaYacctMaaKtcggaBaVaaWaDMttgccttaaacttDaaHacN
+VtgagaataccactctMttaatcttHcctttaggaKgaggWtaNataYgtaggtgaagtc
+WDcWaBatattRtVgtRgVtataacDDNttatcYaaaagcaVgtYggaDattccgtccDc
+SttaaWtttcaaaatggataSatctRYcaaBctMMtcttaacMaSgDatgagatcaYgct
+cacHccMgaacatcDNgtNRcgBaaatagaYgatgcttRaattStccttgagcctaVaag
+ggatatcagtaNMttaaHcMaatccScBtYaYttatgaMNagtgHaatHacaHaBaaDta
+RNDNcBtagBgacatStagacttgtaatMtYaNaKSaccBtttHcDaHNBttBaacSagg
+agaacgWcMgtRcaagattSctgtaBtcaatMtaHgcaaccataVgtaagDRcDcggaac
+caBtacVMgSttgtcataaaaacaMataHatgttaacaaMgtacgtMVcatagYtKgtgt
+cctaBcYKattcaggBaaHagStcNcattatRRaSYtYDRaHYttttggaRggggttatK
+cVtHgctggaNttaagagBaacattggYaaDcSacggYaRttacaacactcDcacBDtYa
+taaaaDWtctcaggVtaYttKtaVKtDSaMtYtYcgtaacHtRcHctaacBgattttagH
+aScDctHttaaaatVaHttggttatttDtatHtcaHcBagSttttDctttWtctaaataa
+WtHYtRgtBccSaaDSaNgatcSttaaaatgaYgKaaDaVatatYaRaHDtataKaNtag
+tacataggSaatMtctMtccctWgaYtaggataMttcgtacgccYgBSgttaaHgctRgR
+gtDVSRattttttaaKtRMtatSgRaatKacMaYgggtagBgNHcgYRagHcatatgtga
+acMtacSDRMHaaacHaagtWSMcaattcagtDctBattgttcatttMBaDVHVDBtaat
+KactNacgcBYtttgatctatVVtatcKaKSgtaWcgtcgNYatSaRtcaggaRtctatt
+agattKHttYaaBtcacatataattMgtatcataKKatDVtWtaHtHHVaggaaHagWaH
+tattgtDaHRgatgtaaaWaaSStMatttgNtgtcagDWgagaBagtcattaataggagt
+tcagcHttgWagaWcRttaKttaDgaDWtYacMWgRaatatccMtaaattRaatacaKYc
+gcatgtatgtNaccataSttSatttttcgatcttcaaKcMDatgaattcaMWctKNcHtc
+tacaYgatgcaBtDDWtaRtScaYaatYSgBtDcaacYataacgcDgtaacMtSaaKcKt
+tttDVgttgtaaNcaattctcaataaatcSVcKaacattgggacatgaaaacggaggagt
+acDYgatMYttaaaBBctccYgcgagccHattttaWtataYcaKaaDYaaaStMctSatt
+aatataNaWcacaataVtcatacaHcgMgaatYgaataatRcWcgtttcNDYcacaaaca
+caNttttaatctaKtRttHDSttccWatatagtKtgtcgaccaBgtVacNaYBHgtttSS
+agcNtctacctttaacgacaDcWVacSHcaNacatttgBYaaagatWagaacYMatcKgB
+YcBggtaWatataKcNgaaaattHYtSaYDVHSactgttNRgaaaMBtatataaaaacVt
+ctWtgKggtatDBgHaKaHVcMWtYYBaaattaVtcgaaacatggagYKtaaaacagttN
+tttatcatgctagYcctctNgttctgctaYttBataaRtattgatgaaactagttBgagt
+cttccatBagatctBaaagSacagtaaStaaatatataataatcttaactatVtaaBatt
+HcHgcttSSaaDRaKtataagggKaacRagBaggtaMYttggtacMatMttttYttaact
+taBaYaaaatKgtactactKDctcttgaDtMgattgVgcRaaaKattaatataagWgttc
+aWgtcaKtatcgacatDaaSatHtttcagcNtatSggtgtaRtgatttStBaNaHgcagt
+taggggatWtttgattttatcgaBtctaggcgtgtgtWttttaaSaWKctWggtgataaa
+attacBtMRtatccattaaSWttaSMcYtHtaacttaaBaDattctatKatctttcatDt
+cgNcgacttgtaaaattDcaVatRacatgaaagtcctgtctcatacatatcSWgNDttga
+aVKatNacDggagWaaatgaaVNtttBataaagVttVataataYcNMVaNaKaatRMcag
+NacVRactcWgctttNatHaRaBRtaaatRtaKtNgYWattaatcttaRttgttcttaaW
+aaagttcNVtagMaBatcVcgccDaaBMgKttgaVaaccgYtRaactttYtcatgattgt
+WSaaBatagtagSataDgatgNtaWatcaMttaHattagVtggagaNHtaatatctNaag
+aDBatcttttaRaaNtBYagtaacVttYBtaagcaaaMatcNgKaggacagagtgaRatW
+aDaaSaDaaattVgcWttatBNctgSagtctgcSttacSRtgatHDgggcBagccDtatY
+aaagaataDgatDaBttagctatcHtcWtagggagtDtSaaacagtagcttVatgttggc
+StataacttVtaatWKtatDatcttcDaagactgtgDNBaccaattaacaaagaaHWtat
+ttaacattWaatgttcMttaNNcYaRccHtacRagatccKaaYactcVRDtcHVtgaaNa
+SatctRSaWtagagtcgcaataDcagBaagtctSNagaaaKgttataStaatagStaatS
+atataWttctcgtaDgtYRcgtHttaKtcDttRaatNacYgtagVaattNttttatDgKc
+ttttSaaattYcgYBaaggttctagYcBataacVcagggaWtaKtacatgcYcctatccD
+atatagtcRaaaSMgtggaatcaaMaatWcgctagggtcattaVtctaatgHcaSHtcac
+ttBaagaMDtactYgtttgWgacccStDtagaDaBtgctctttKaaaatMttNStggttt
+atWttYttatKMKgtctaKcgaBaaaattcccgacYtBcaKaKttRccaaBaWgMaMatg
+tWtcRDWttcggacNctataaacKaaatHatggDatSaaKtgcgRaaacgtgttcatNtg
+HtcaataaacaaWMKatattcWaKcNaccWtggttcctBaMttgRtggtWtaaVggDgtt
+aDaScgWccWHatacaagtaHtaacttWaNatgtgttaacKaVtcataDMattgtaKcct
+tttttStaaDDtHYattNtcgatataBattctWRatMVtStaSaWttNRacgatagtRcg
+cRtcctttacagBKaaVcYtRaKatVtaWttaVggBBatcaaWatgtggagattDgWttt
+caataDtactRaatBattWVacttWVNtVagHaHtatttaVagtRMMtaBattatataaN
+aagatHBtgtatVtaaacatttagtccaKDcacgWaaHagttVKBgcgRaSYtttVcgaa
+caBatttaatctaSYtccNtcatctatttatBaHcattcaBgDMYtactgScccttRcta
+agtaaNtaaaaattatggtVataaagVStcaatcacgcDaatgtaacatDBagtcgaaRD
+aSactgcagaHgttYatgaVgtNccttcaKHgcgataDcgYtgtgBatcacScgctBcVt
+tttcYaaNtttttatcBaatgataYgtgttgtatgaVcBagtatagtNaRaaatKVtcRt
+cWatctaattgtVgataaMataWagaDttaatRcgctaKHgaRagtDctScatNgHgtKg
+tDtHBVgYcagatgttagcgaataaNBactBaaRaWcRcMctctBtWKaggcaataatSY
+tccagtRtaSVtRgatctaBgDNDtBgtttgtaNtWtaatatDtataacgccDttcaMaM
+atgRtgaaaMHatgBaatgcccDagNgttRDcWtaaaKtMSaBgctgcaatgtSVattRW
+cBtDaaMKRcccWtVttaaatatttctgtcatNBgaaaatHtttWtYtttcaacaaagaa
+NYBaatatctgatNtgaacaaMaaYcNgtgatttWtNaatWcYMScMctaaStttNgHtM
+acgtMDtgagcattcacWtttKttBtKaKcHaBtttaBacgaaNYaaaatBaatNHgaaa
+tMtagatDcaagMtaattctKtgNtScaatagcaHDagtagagSRcagcaagaccYHtaN
+tBatKtStcRagtgttMaYgtgggtNatSaatStcYtaBaSBtaggtctMtatcatgaat
+tactcYtNagaaaDtggaaatKBattaaatcWgKtStKtcaWMggaattYtggccgaWca
+cagaNWaNgaacaYaHgaVtMctVHttaKDcctNccBKMDagtatgcHtttaaaDaggtg
+HtattcatatttaagcBaaaRcSgttaaatgWacRatacaaatgBatYatatRBcacaVa
+taRaKWMcDWtSaatatHattcVgMKYtgtaVBtgagattRgaatgaDgtcaStacgcta
+ggRggtSagKcWYctacaagtttBtgaBttacgaStHgVaStgtaRtacaDccNDattSR
+gttatMtNttttWHacDtttVtgacgYattccWctaagtgaaaMMatgNtctaataRctg
+aacatttVcNtgtttgaggcaaagtatgVgtaVtgRDcttBDtataaMBatatNgataat
+aHaaaNacaStgaNaHgYtgacagtcYDggagattNcaDtKgtagMaacSHRtcagNaga
+tKcatataVatactgRVatgBtatcgttattHtHcKaDtagRagtgHtaDcVtatacatt
+acggcaKttattgacatDaatgtctcattVcaRcttttgDtNHSggcttaYDcHaatcDY
+acccWaMttgRtNggYtttttggDgctacVDtBMgBaDgtMaaBgctBVttVagaHBaaa
+aatgNactaattattNagaagNVaBgVtRgggatacgctgMtgaccatMaaDYDaagctg
+gtcaatggtatBtNtccWtWKcaNcBttactgtgBYDaMtMtcWaatctWYHatccgWta
+taaaNNacNgctYagtaaaRtaaYggcagaMaagggttHaatatcaccVtagtggcgtMt
+agtcaYaaRttWgBtctgaaBtKattaatYtacaatcKcacNcMDtgtactatcDcgRta
+aYagattgccMtgtYKaRaWHgtaccttagcRaWaagDataccagcatcYtcaaSgVaca
+tttaSttSVDSctactgaNctatVattttacgaggWgtaaaKtcNgatgttgcaaNVtta
+gRtttttRttYYaYcaaagcVDMaaRaRtccVcSattttcaattagWattMMctataWat
+ggtaagagRaaattYKKtgatagcMYgcVcgggStattacgBBctNtRgacaacYHctct
+NtataattBttStaRaaaatctgtWatcRacaaMtattYttKtccaatcSttatgtaWtt
+cgcaaWgtWNcBccRgtBagNgYtDctatccMaagtgcYMtYctYttgtcVaaHtatgcB
+aaBcgaataattcttcDaacaaacBtagWYaagcaVacYcKYttgSaKVcttccgcctca
+ttctcaatgVgaaacatWWctgcagtttctttttMagWttatRggcattattVaagaBBt
+tatctattatMcNtaacagttgaaaBaRtaRRtNtataYNtttNtcctaVBtatNtNgBt
+aHHYDttKctaDctcaNcatgDaYatgYagaDcaHgactHgWWaagWtSttctagKaagg
+YtcataYgBtccRaggggaaaHagaacaDatgaaaatcaKtattgWacgtcMSaacYaYg
+cWYNgagtaMgtSccgaaaaaatctggaMMRaaaataatctaaacgatatgDaggaVKct
+tttaatgacBttNYttagtatDagYttWctttNgtHtcVtattHtcHacattatHgNStg
+tSaNaactVMcaatcccBHNatcttDtcgaKccKttatttctVRaagttaMtaYtcttca
+tMYRctttRtaMgSaaaactgWacHagtacccatttcgcatgagtaaagtHcaKgVBtaa
+ttatBtttWatgMctccattgactattcttgtcatSttaaHaVtKtDcatcatatccaac
+KatattatNggNaRatcMSDHRtcctYRaatccacYaatBattcttBVctatatttRNtg
+aNtcaaaRgtaBcttaaDRcgctacWcttgatatctHttttgtNtYatatacgaVBgYHg
+attgggtcgacacDtttKVcaattWRcaagBtgctDKDaYtttcKgNgggtcacVagatM
+gtMVgVgatttcagtcgtgKgtKYgtYSaMtgataatNggattKNgaSggactaaBagat
+aacactcataVgttataaSacaatcRRaagtaDaagDYtcactgtgaVttWtBaMttttg
+aHtKaYtattccagccaaBaggataaRtBatNcatgtatatttcttacaaYVNatagaaa
+gaSaaaagaaatSaBgtcgattacattgWccttHNattataacgVRDtYcWgaaYaVgMt
+tcttgtDtKaYVttctgggSNtaYHWaaHactaaSSagttgSaaactYaMttaMaHVRtc
+gattaccHtcgcgatgNcaYtatattacgcHaaaMNMtaYDgacaggRgaYVtVKcaSVc
+WMBBaWaWcagtatHaWBNaMcBtatccatgaScHtYtgactcattgaYatRtacttYtc
+tttgBgtattaaDtcaHgcNcaVatagtttggggRaaaccWcNNttRBgaaRKgaaNtMa
+agcVacgtgttaaMYWtcBYtgagtaatcgttttaatcgaaaagttDcaatgtggtBaBc
+NtgNatBtggactttagYttBcgttRttatSgacNaDttatRKacactgcSKaVaaaRgH
+aattaaaRctgatKaWcctWggWWagccgaactaYccttgtgaBHggcYttttBccttag
+gaKtaaaBacVDcBYYgaWagaKtaHaaactaNttatagtcttttacgaccctttKattW
+cgHgcaDccctHttatVVaagKaatatgggMaNHagattgNStatBatcgaaYgcVcaga
+atcctcYtBKDatatcNKgacaatKDatgaaacgaaatYYcgNBDtataatMcRWtaagt
+ataHgMaVggcaaDtggttcVattattaaaatSVaMaNcDBttataYgttttStacattg
+agagtccaNtgaatttttKtStatatttRaatttcgBDccctaaSWatttaaMBStcata
+cctgctctatctatKatatgaacaactctWBaNagtcgYaaaaRtctMtDgtaBaacaNt
+acagtcgataNgaVccgtttattatgatctagtDSgaHNcctKtcttatNtgatYKaaSt
+ctWDVcaaccgaVttScaagaaaaVcccggagWatcVaNtVaRcNtcagatcMMatacta
+aaWaagatYHRWcaSagcgMtttatSBtBtBgacRaVgtgattaagtBgtatcgtNgggg
+DaWgagctgatctatttHaactttcgcttttccatttNaaYgtattttactttacttRat
+aBttgatagggacattattaaSaaaYtgatggaDaMttacttatttttttaaWttttaat
+aaWaNaattgtaBtBMcatcNtaaMtDaaaatcRgcatccaMtggWggHggagSttacaY
+HatYtgtaatcatttgVtataaDVttcaYttctHtHtagttWHNYYtVRVccatacaatt
+aaaYatcgcatBagcaatDaWacVaBWattagaaBataatgtKaaaNKcagaactNaaga
+NatgKtBSctgattgWcNaaSataggtataaacVaatDttcRaRtVtVtgtataagMtSc
+caSScagttgatYattcagcMaaWctaagtYcSattNccgtcgtaBtaattgttgacaaa
+DttttattaatacSKtcgcatNttatWatacgRtgcataactYtcacHgVgHttYaataa
+WacgSVKatactagDggcattKctggataagtVgKYtatgttagcgtaRtttaaagacHg
+acacattcHKaMKtcgKtcacggtgatcaaBtMttcttattcttDaKKVgWagtaacatg
+KatVgacattagWtaRtaccRaaVHtttttRtgBccagtcgctagtRtaBcMVWMtaBta
+ggttaYcttagaSgYgttttcaaNNgtttVaagctgStttactaacWattcgtVgtgtKc
+gtYaaaaaKtaSaattgBtYgaVcagKatgaMttWDRatgtaatctagacWaccgcaNgt
+ctgtgagtMttgaaatNtttattaRKcgtaWatcaWccaKtttNactaatNcgVaaBcgR
+gDttcDcatttgagWNattttNaYtttatgcHtttBBacgttgRgtcataNtatatcaWV
+catgaacatRgtNaWaatcaggttaaSctttcaacatHttVKaHtNtMtcttcHattYat
+cgatgtacSaaataVtcttYStaagattDagtKccgaccHBYatMtcggBacatVtaaag
+McttBgtSagKgNttttcNtSaaMaStHgtattttKaRttaMtDtcKtcgagDKgaaaac
+ttaaaWNaattgaWWaaggaaacKtttVggMBcatattDacctaMgaaKgcgcaaMRtaa
+tcgataaatRDttataNtVgtaVDggttaNgatBgtggcaaYWtagctcWgtSaacgtat
+tKcgcBtttDacaaaaaStKMtatNccagKatgtVtHtWaSBgDttgWgaattWagtttt
+aagcctNcttaBtYttaRactaattggagagggtctagtatgggtttacttBtatcatat
+gctaKggNcataaaSatgtaaaDcDRtBggDtctttataattcBgtcgtactDtDagcct
+atttSVHtHttKtgtHMaSattgWaHKHttttagacatWatgtRgaaaNtactMcSMtYt
+cMgRtacttctWBacgaaatatagScDtttgaagacacatagtVgYgtcattHWtMMWcS
+tgttaggKtSgaYaaccWStcgBttgcgaMttBYatcWtgacaYcagagtaBDtRacttt
+tcWatMttDBcatWtatcttactaBgaYtcttgttttttttYaaScYaHgtgttNtSatc
+MtcVaaaStccRcctDaataataStcYtRDSaMtDttgttSagtRRcatttHatSttMtW
+gtcgtatSSagactYaaattcaMtWatttaSgYttaRgKaRtccactttattRggaMcDa
+WaWagttttgacatgttctacaaaRaatataataaMttcgDacgaSStacaStYRctVaN
+MtMgtaggcKatcttttattaaaaagVWaHKYagtttttatttaaccttacgtVtcVaat
+tVMBcttaMtttaStgacttagattWWacVtgWYagWVRctDattBYtgtttaagaagat
+tattgacVatMaacattVctgtBSgaVtgWWggaKHaatKWcBScSWaaccRVacacaaa
+ctaccScattRatatKVtactatatttHttaagtttSKtRtacaaagtRDttcaaaaWgc
+acatWaDgtDKacgaacaattacaRNWaatHtttStgttattaaMtgttgDcgtMgcatB
+tgcttcgcgaDWgagctgcgaggggVtaaScNatttacttaatgacagcccccacatYSc
+aMgtaggtYaNgttctgaMaacNaMRaacaaacaKctacatagYWctgttWaaataaaat
+aRattagHacacaagcgKatacBttRttaagtatttccgatctHSaatactcNttMaagt
+attMtgRtgaMgcataatHcMtaBSaRattagttgatHtMttaaKaggYtaaBataSaVa
+tactWtataVWgKgttaaaacagtgcgRatatacatVtHRtVYataSaKtWaStVcNKHK
+ttactatccctcatgWHatWaRcttactaggatctataDtDHBttataaaaHgtacVtag
+aYttYaKcctattcttcttaataNDaaggaaaDYgcggctaaWSctBaaNtgctggMBaK
+ctaMVKagBaactaWaDaMaccYVtNtaHtVWtKgRtcaaNtYaNacggtttNattgVtt
+tctgtBaWgtaattcaagtcaVWtactNggattctttaYtaaagccgctcttagHVggaY
+tgtNcDaVagctctctKgacgtatagYcctRYHDtgBattDaaDgccKtcHaaStttMcc
+tagtattgcRgWBaVatHaaaataYtgtttagMDMRtaataaggatMtttctWgtNtgtg
+aaaaMaatatRtttMtDgHHtgtcattttcWattRSHcVagaagtacgggtaKVattKYa
+gactNaatgtttgKMMgYNtcccgSKttctaStatatNVataYHgtNaBKRgNacaactg
+atttcctttaNcgatttctctataScaHtataRagtcRVttacDSDttaRtSatacHgtS
+KacYagttMHtWataggatgactNtatSaNctataVtttRNKtgRacctttYtatgttac
+tttttcctttaaacatacaHactMacacggtWataMtBVacRaSaatccgtaBVttccag
+ccBcttaRKtgtgcctttttRtgtcagcRttKtaaacKtaaatctcacaattgcaNtSBa
+accgggttattaaBcKatDagttactcttcattVtttHaaggctKKgatacatcBggSca
+gtVcacattttgaHaDSgHatRMaHWggtatatRgccDttcgtatcgaaacaHtaagtta
+RatgaVacttagattVKtaaYttaaatcaNatccRttRRaMScNaaaDgttVHWgtcHaa
+HgacVaWtgttScactaagSgttatcttagggDtaccagWattWtRtgttHWHacgattB
+tgVcaYatcggttgagKcWtKKcaVtgaYgWctgYggVctgtHgaNcVtaBtWaaYatcD
+RaaRtSctgaHaYRttagatMatgcatttNattaDttaattgttctaaccctcccctaga
+WBtttHtBccttagaVaatMcBHagaVcWcagBVttcBtaYMccagatgaaaaHctctaa
+cgttagNWRtcggattNatcRaNHttcagtKttttgWatWttcSaNgggaWtactKKMaa
+catKatacNattgctWtatctaVgagctatgtRaHtYcWcttagccaatYttWttaWSSt
+taHcaaaaagVacVgtaVaRMgattaVcDactttcHHggHRtgNcctttYatcatKgctc
+ctctatVcaaaaKaaaagtatatctgMtWtaaaacaStttMtcgactttaSatcgDataa
+actaaacaagtaaVctaggaSccaatMVtaaSKNVattttgHccatcacBVctgcaVatV
+ttRtactgtVcaattHgtaaattaaattttYtatattaaRSgYtgBagaHSBDgtagcac
+RHtYcBgtcacttacactaYcgctWtattgSHtSatcataaatataHtcgtYaaMNgBaa
+tttaRgaMaatatttBtttaaaHHKaatctgatWatYaacttMctcttttVctagctDaa
+agtaVaKaKRtaacBgtatccaaccactHHaagaagaaggaNaaatBWattccgStaMSa
+MatBttgcatgRSacgttVVtaaDMtcSgVatWcaSatcttttVatagttactttacgat
+caccNtaDVgSRcgVcgtgaacgaNtaNatatagtHtMgtHcMtagaaattBgtataRaa
+aacaYKgtRccYtatgaagtaataKgtaaMttgaaRVatgcagaKStctHNaaatctBBt
+cttaYaBWHgtVtgacagcaRcataWctcaBcYacYgatDgtDHcctaaagacYRcagga
+ttHaYgtKtaatgcVcaataMYacccatatcacgWDBtgaatcBaatacKcttRaRtgat
+gaBDacggtaattaaYtataStgVHDtDctgactcaaatKtacaatgcgYatBtRaDatH
+aactgtttatatDttttaaaKVccYcaaccNcBcgHaaVcattHctcgattaaatBtatg
+caaaaatYMctSactHatacgaWacattacMBgHttcgaatVaaaacaBatatVtctgaa
+aaWtctRacgBMaatSgRgtgtcgactatcRtattaScctaStagKgaDcWgtYtDDWKR
+gRtHatRtggtcgaHgggcgtattaMgtcagccaBggWVcWctVaaattcgNaatcKWag
+cNaHtgaaaSaaagctcYctttRVtaaaatNtataaccKtaRgtttaMtgtKaBtRtNag
+gaSattHatatWactcagtgtactaKctatttgRYYatKatgtccgtRtttttatttaat
+atVgKtttgtatgtNtataRatWYNgtRtHggtaaKaYtKSDcatcKgtaaYatcSRcta
+VtSMWtVtRWHatttagataDtVggacagVcgKWagBgatBtaaagNcaRtagcataBgg
+actaacacRctKgttaatcctHgDgttKHHagttgttaatgHBtatHcDaagtVaBaRcc
+ctVgtgDtacRHSctaagagcggWYaBtSaKtHBtaaactYacgNKBaVYgtaacttagt
+VttcttaatgtBtatMtMtttaattaatBWccatRtttcatagVgMMtagctStKctaMa
+ctacDNYgKYHgaWcgaHgagattacVgtttgtRaSttaWaVgataatgtgtYtaStatt
+attMtNgWtgttKaccaatagNYttattcgtatHcWtctaaaNVYKKttWtggcDtcgaa
+gtNcagatacgcattaagaccWctgcagcttggNSgaNcHggatgtVtcatNtRaaBNcH
+VagagaaBtaaSggDaatWaatRccaVgggStctDaacataKttKatttggacYtattcS
+atcttagcaatgaVBMcttDattctYaaRgatgcattttNgVHtKcYRaatRKctgtaaa
+cRatVSagctgtWacBtKVatctgttttKcgtctaaDcaagtatcSataWVgcKKataWa
+YttcccSaatgaaaacccWgcRctWatNcWtBRttYaattataaNgacacaatagtttVN
+tataNaYtaatRaVWKtBatKagtaatataDaNaaaaataMtaagaaStccBcaatNgaa
+taWtHaNactgtcDtRcYaaVaaaaaDgtttRatctatgHtgttKtgaaNSgatactttc
+gagWaaatctKaaDaRttgtggKKagcDgataaattgSaacWaVtaNMacKtcaDaaatt
+tctRaaVcagNacaScRBatatctRatcctaNatWgRtcDcSaWSgttRtKaRtMtKaat
+gttBHcYaaBtgatSgaSWaScMgatNtctcctatttctYtatMatMtRRtSaattaMta
+gaaaaStcgVgRttSVaScagtgDtttatcatcatacRcatatDcttatcatVRtttata
+aHtattcYtcaaaatactttgVctagtaaYttagatagtSYacKaaacgaaKtaaataga
+taatSatatgaaatSgKtaatVtttatcctgKHaatHattagaaccgtYaaHactRcggS
+BNgtgctaaBagBttgtRttaaattYtVRaaaattgtaatVatttctcttcatgBcVgtg
+KgaHaaatattYatagWacNctgaaMcgaattStagWaSgtaaKagttttaagaDgatKc
+ctgtaHtcatggKttVDatcaaggtYcgccagNgtgcVttttagagatgctaccacgggg
+tNttttaSHaNtatNcctcatSaaVgtactgBHtagcaYggYVKNgtaKBcRttgaWatg
+aatVtagtcgattYgatgtaatttacDacSctgctaaaStttaWMagDaaatcaVYctcc
+gggcgaVtaaWtStaKMgDtttcaaMtVgBaatccagNaaatcYRMBggttWtaaScKtt
+MWtYataRaDBMaDataatHBcacDaaKDactaMgagttDattaHatHtaYatDtattDc
+RNStgaatattSDttggtattaaNSYacttcDMgYgBatWtaMagactVWttctttgYMa
+YaacRgHWaattgRtaagcattctMKVStatactacHVtatgatcBtVNataaBttYtSt
+tacKgggWgYDtgaVtYgatDaacattYgatggtRDaVDttNactaSaMtgNttaacaaS
+aBStcDctaccacagacgcaHatMataWKYtaYattMcaMtgSttDagcHacgatcaHtt
+YaKHggagttccgatYcaatgatRaVRcaagatcagtatggScctatattaNtagcgacg
+tgKaaWaactSgagtMYtcttccaKtStaacggMtaagNttattatcgtctaRcactctc
+tDtaacWYtgaYaSaagaWtNtatttRacatgNaatgttattgWDDcNaHcctgaaHacS
+gaataaRaataMHttatMtgaSDSKatatHHaNtacagtccaYatWtcactaactatKDa
+cSaStcggataHgYatagKtaatKagStaNgtatactatggRHacttgtattatgtDVag
+DVaRctacMYattDgtttYgtctatggtKaRSttRccRtaaccttagagRatagSaaMaa
+cgcaNtatgaaatcaRaagataatagatactcHaaYKBctccaagaRaBaStNagatagg
+cgaatgaMtagaatgtcaKttaaatgtaWcaBttaatRcggtgNcacaaKtttScRtWtg
+catagtttWYaagBttDKgcctttatMggNttattBtctagVtacataaaYttacacaaR
+ttcYtWttgHcaYYtaMgBaBatctNgcDtNttacgacDcgataaSatYaSttWtcctat
+KaatgcagHaVaacgctgcatDtgttaSataaaaYSNttatagtaNYtaDaaaNtgggga
+cttaBggcHgcgtNtaaMcctggtVtaKcgNacNtatVaSWctWtgaWcggNaBagctct
+gaYataMgaagatBSttctatacttgtgtKtaattttRagtDtacatatatatgatNHVg
+BMtKtaKaNttDHaagatactHaccHtcatttaaagttVaMcNgHatatKtaNtgYMcct
+tatcaaNagctggacStttcNtggcaVtattactHaSttatgNMVattMMDtMactatta
+ttgWMSgtHBttStStgatatRaDaagattttctatMtaaaaaggtactaaVttaSacNa
+atactgMttgacHaHRttgMacaaaatagttaatatWKRgacDgaRtatatttattatcY
+ttaWtgtBRtWatgHaaattHataagtVaDtWaVaWtgStcgtMSgaSRgMKtaaataVa
+cataatgtaSaatttagtcgaaHtaKaatgcacatcggRaggSKctDcagtcSttcccSt
+YtccRtctctYtcaaKcgagtaMttttcRaYDttgttatctaatcataNctctgctatca
+MatactataggDaHaaSttMtaDtcNatataattctMcStaaBYtaNagatgtaatHaga
+gSttgWHVcttatKaYgDctcttggtgttMcRaVgSgggtagacaataaDtaattSaDaN
+aHaBctattgNtaccaaRgaVtKNtaaYggHtaKKgHcatctWtctDtttctttggSDtN
+taStagttataaacaattgcaBaBWggHgcaaaBtYgctaatgaaatWcDcttHtcMtWW
+attBHatcatcaaatctKMagtDNatttWaBtHaaaNgMttaaStagttctctaatDtcR
+VaYttgttMtRtgtcaSaaYVgSWDRtaatagctcagDgcWWaaaBaaRaBctgVgggNg
+DWStNaNBKcBctaaKtttDcttBaaggBttgaccatgaaaNgttttttttatctatgtt
+ataccaaDRaaSagtaVtDtcaWatBtacattaWacttaSgtattggDgKaaatScaatt
+acgWcagKHaaccaYcRcaRttaDttRtttHgaHVggcttBaRgtccctDatKaVtKtcR
+gYtaKttacgtatBtStaagcaattaagaRgBagSaattccSWYtttattVaataNctgH
+gttaaNBgcVYgtRtcccagWNaaaacaDNaBcaaaaRVtcWMgBagMtttattacgDac
+ttBtactatcattggaaatVccggttRttcatagttVYcatYaSHaHcttaaagcNWaHa
+taaaRWtctVtRYtagHtaaaYMataHYtNBctNtKaatattStgaMcBtRgctaKtgcS
+cSttDgYatcVtggaaKtaagatWccHccgKYctaNNctacaWcttttgcRtgtVcgaKt
+tcMRHgctaHtVaataaDtatgKDcttatBtDttggNtacttttMtgaacRattaaNaga
+actcaaaBBVtcDtcgaStaDctgaaaSgttMaDtcgttcaccaaaaggWtcKcgSMtcD
+tatgtttStaaBtatagDcatYatWtaaaBacaKgcaDatgRggaaYctaRtccagattD
+aWtttggacBaVcHtHtaacDacYgtaatataMagaatgHMatcttatacgtatttttat
+attacHactgttataMgStYaattYaccaattgagtcaaattaYtgtatcatgMcaDcgg
+gtcttDtKgcatgWRtataatatRacacNRBttcHtBgcRttgtgcgtcatacMtttBct
+atctBaatcattMttMYgattaaVYatgDaatVagtattDacaacDMatcMtHcccataa
+gatgBggaccattVWtRtSacatgctcaaggggYtttDtaaNgNtaaBatggaatgtctR
+taBgBtcNYatatNRtagaacMgagSaSDDSaDcctRagtVWSHtVSRggaacaBVaccg
+tttaStagaacaMtactccagtttVctaaRaaHttNcttagcaatttattaatRtaaaat
+ctaacDaBttggSagagctacHtaaRWgattcaaBtctRtSHaNtgtacattVcaHaNaa
+gtataccacaWtaRtaaVKgMYaWgttaKggKMtKcgWatcaDatYtKSttgtacgaccN
+ctSaattcDcatcttcaaaDKttacHtggttHggRRaRcaWacaMtBWVHSHgaaMcKat
+tgtaRWttScNattBBatYtaNRgcggaagacHSaattRtttcYgaccBRccMacccKga
+tgaacttcgDgHcaaaaaRtatatDtatYVtttttHgSHaSaatagctNYtaHYaVYtta
+ttNtttgaaaYtaKttWtctaNtgagaaaNctNDctaaHgttagDcRttatagccBaacg
+caRBtRctRtggtaMYYttWtgataatcgaataattattataVaaaaattacNRVYcaaM
+acNatRttcKatMctgaagactaattataaYgcKcaSYaatMNctcaacgtgatttttBa
+cNtgatDccaattattKWWcattttatatatgatBcDtaaaagttgaaVtaHtaHHtBta
+taRBgtgDtaataMttRtDgDcttattNtggtctatctaaBcatctaRatgNacWtaatg
+aagtcMNaacNgHttatactaWgcNtaStaRgttaaHacccgaYStacaaaatWggaYaW
+gaattattcMaactcBKaaaRVNcaNRDcYcgaBctKaacaaaaaSgctccYBBHYaVag
+aatagaaaacagYtctVccaMtcgtttVatcaatttDRtgWctagtacRttMctgtDctt
+tcKtWttttataaatgVttgBKtgtKWDaWagMtaaagaaattDVtaggttacatcattt
+atgtcgMHaVcttaBtVRtcgtaYgBRHatttHgaBcKaYWaatcNSctagtaaaaattt
+acaatcactSWacgtaatgKttWattagttttNaggtctcaagtcactattcttctaagK
+ggaataMgtttcataagataaaaatagattatDgcBVHWgaBKttDgcatRHaagcaYcR
+aattattatgtMatatattgHDtcaDtcaaaHctStattaatHaccgacNattgatatat
+tttgtgtDtRatagSacaMtcRtcattcccgacacSattgttKaWattNHcaacttccgt
+ttSRtgtctgDcgctcaaMagVtBctBMcMcWtgtaacgactctcttRggRKSttgYtYa
+tDccagttDgaKccacgVatWcataVaaagaataMgtgataaKYaaatcHDaacgataYc
+tRtcYatcgcaMgtNttaBttttgatttaRtStgcaacaaaataccVgaaDgtVgDcStc
+tatatttattaaaaRKDatagaaagaKaaYYcaYSgKStctccSttacagtcNactttDV
+ttagaaagMHttRaNcSaRaMgBttattggtttaRMggatggcKDgWRtNaataataWKK
+acttcKWaaagNaBttaBatMHtccattaacttccccYtcBcYRtagattaagctaaYBD
+ttaNtgaaaccHcaRMtKtaaHMcNBttaNaNcVcgVttWNtDaBatgataaVtcWKctt
+RggWatcattgaRagHgaattNtatttctctattaattaatgaDaaMatacgttgggcHa
+YVaaNaDDttHtcaaHtcVVDgBVagcMacgtgttaaBRNtatRtcagtaagaggtttaa
+gacaVaaggttaWatctccgtVtaDtcDatttccVatgtacNtttccgtHttatKgScBa
+tgtVgHtYcWagcaKtaMYaaHgtaattaSaHcgcagtWNaatNccNNYcacgVaagaRa
+cttctcattcccRtgtgtaattagcSttaaStWaMtctNNcSMacattataaactaDgta
+tWgtagtttaagaaaattgtagtNagtcaataaatttgatMMYactaatatcggBWDtVc
+YttcDHtVttatacYaRgaMaacaStaatcRttttVtagaDtcacWatttWtgaaaagaa
+agNRacDtttStVatBaDNtaactatatcBSMcccaSttccggaMatgattaaWatKMaB
+aBatttgataNctgttKtVaagtcagScgaaaDggaWgtgttttKtWtatttHaatgtag
+ttcactaaKMagttSYBtKtaYgaactcagagRtatagtVtatcaaaWYagcgNtaDagt
+acNSaaYDgatBgtcgataacYDtaaactacagWDcYKaagtttattagcatcgagttKc
+atDaattgattatDtcagRtWSKtcgNtMaaaaacaMttKcaWcaaSVMaaaccagMVta
+MaDtMaHaBgaacataBBVtaatVYaNSWcSgNtDNaaKacacBtttatKtgtttcaaHa
+MctcagtaacgtcgYtactDcgcctaNgagagcYgatattttaaatttccattttacatt
+tDaaRctattttWctttacgtDatYtttcagacgcaaVttagtaaKaaaRtgVtccataB
+ggacttatttgtttaWNtgttVWtaWNVDaattgtatttBaagcBtaaBttaaVatcHca
+VgacattccNggtcgacKttaaaRtagRtctWagaYggtgMtataatMtgaaRttatttt
+gWcttNtDRRgMDKacagaaaaggaaaRStcccagtYccVattaNaaKStNWtgacaVta
+gaagcttSaaDtcacaacgDYacWDYtgtttKatcVtgcMaDaSKStVcgtagaaWaKaa
+gtttcHaHgMgMtctataagBtKaaaKKcactggagRRttaagaBaaNatVVcgRcKStt
+DaactagtSttSattgttgaaRYatggttVttaataaHttccaagDtgatNWtaagHtgc
+YtaactRgcaatgMgtgtRaatRaNaacHKtagactactggaatttcgccataacgMctR
+gatgttaccctaHgtgWaYcactcacYaattcttaBtgacttaaacctgYgaWatgBttc
+ttVttcgttWttMcNYgtaaaatctYgMgaaattacNgaHgaacDVVMtttggtHtctaa
+RgtacagacgHtVtaBMNBgattagcttaRcttacaHcRctgttcaaDBggttKaacatg
+KtttYataVaNattccgMcgcgtagtRaVVaattaKaatggttRgaMcagtatcWBttNt
+HagctaatctagaaNaaacaYBctatcgcVctBtgcaaagDgttVtgaHtactSNYtaaN
+ccatgtgDacgaVtDcgKaRtacDcttgctaagggcagMDagggtBWRtttSgccttttt
+taacgtcHctaVtVDtagatcaNMaVtcVacatHctDWNaataRgcgtaVHaggtaaaaS
+gtttMtattDgBtctgatSgtRagagYtctSaKWaataMgattRKtaacatttYcgtaac
+acattRWtBtcggtaaatMtaaacBatttctKagtcDtttgcBtKYYBaKttctVttgtt
+aDtgattttcttccacttgSaaacggaaaNDaattcYNNaWcgaaYattttMgcBtcatR
+tgtaaagatgaWtgaccaYBHgaatagataVVtHtttVgYBtMctaMtcctgaDcYttgt
+ccaaaRNtacagcMctKaaaggatttacatgtttaaWSaYaKttBtagDacactagctMt
+ttNaKtctttcNcSattNacttggaacaatDagtattRtgSHaataatgccVgacccgat
+actatccctgtRctttgagaSgatcatatcgDcagWaaHSgctYYWtatHttggttcttt
+atVattatcgactaagtgtagcatVgtgHMtttgtttcgttaKattcMatttgtttWcaa
+StNatgtHcaaaDtaagBaKBtRgaBgDtSagtatMtaacYaatYtVcKatgtgcaacVa
+aaatactKcRgtaYtgtNgBBNcKtcttaccttKgaRaYcaNKtactttgagSBtgtRag
+aNgcaaaNcacagtVtttHWatgttaNatBgtttaatNgVtctgaatatcaRtattcttt
+tttttRaaKcRStctcggDgKagattaMaaaKtcaHacttaataataKtaRgDtKVBttt
+tcgtKaggHHcatgttagHggttNctcgtatKKagVagRaaaggaaBtNatttVKcRtta
+HctaHtcaaatgtaggHccaBataNaNaggttgcWaatctgatYcaaaHaatWtaVgaaB
+ttagtaagaKKtaaaKtRHatMaDBtBctagcatWtatttgWttVaaaScMNattRactt
+tgtYtttaaaagtaagtMtaMaSttMBtatgaBtttaKtgaatgagYgtNNacMtcNRac
+MMHcttWtgtRtctttaacaacattattcYaMagBaacYttMatcttKcRMtgMNccatt
+aRttNatHaHNaSaaHMacacaVaatacaKaSttHatattMtVatWgattttttaYcttt
+KttHgScWaacgHtttcaVaaMgaacagNatcgttaacaaaaagtacaHBNaattgttKt
+cttVttaaBtctgctacgBgcWtttcaggacacatMgacatcccagcggMgaVKaBattg
+acttaatgacacacaaaaaatRKaaBctacgtRaDcgtagcVBaacDSBHaaaaSacata
+tacagacRNatcttNaaVtaaaataHattagtaaaaSWccgtatWatggDttaactattg
+cccatcttHaSgYataBttBaactattBtcHtgatcaataSttaBtatKSHYttWggtcY
+tttBttaataccRgVatStaHaKagaatNtagRMNgtcttYaaSaactcagDSgagaaYt
+MttDtMRVgWKWtgMaKtKaDttttgactatacataatcNtatNaHattVagacgYgata
+tatttttgtStWaaatctWaMgagaRttRatacgStgattcttaagaDtaWccaaatRca
+gcagaaNKagtaaDggcgccBtYtagSBMtactaaataMataBSacRMgDgattMMgtcH
+tcaYDtRaDaacggttDaggcMtttatgttaNctaattaVacgaaMMtaatDccSgtatt
+gaRtWWaccaccgagtactMcgVNgctDctaMScatagcgtcaactatacRacgHRttgc
+tatttaatgaattataYKttgtaagWgtYttgcHgMtaMattWaWVtaRgcttgYgttBH
+tYataSccStBtgtagMgtDtggcVaaSBaatagDttgBgtctttctcattttaNagtHK
+taMWcYactVcgcgtatMVtttRacVagDaatcttgctBBcRDgcaacKttgatSKtYta
+gBMagaRtcgBattHcBWcaactgatttaatttWDccatttatcgagSKaWttataHact
+aHMttaatHtggaHtHagaatgtKtaaRactgtttMatacgatcaagDgatKaDctataM
+ggtHDtggHacctttRtatcttYattttgacttgaaSaataaatYcgBaaaaccgNatVB
+ttMacHaKaataagtatKgtcaagactcttaHttcggaattgttDtctaaccHttttWaa
+atgaaatataaaWattccYDtKtaaaacggtgaggWVtctattagtgactattaagtMgt
+ttaagcatttgSgaaatatccHaaggMaaaattttcWtatKctagDtYtMcctagagHca
+ctttactatacaaacattaacttaHatcVMYattYgVgtMttaaRtgaaataaDatcaHg
+tHHatKcDYaatcttMtNcgatYatgSaMaNtcttKcWataScKggtatcttacgcttWa
+aagNatgMgHtctttNtaacVtgttcMaaRatccggggactcMtttaYMtcWRgNctgNc
+cKatcttgYDcMgattNYaRagatHaaHgKctcataRDttacatBatccattgDWttatt
+taWgtcggagaaaaatacaatacSNtgggtttccttacSMaagBattacaMaNcactMtt
+atgaRBacYcYtcaaaWtagctSaacttWgDMHgaggatgBVgcHaDtggaactttggtc
+NatNgtaKaBcccaNtaagttBaacagtatacDYttcctNgWgcgSMcacatStctHatg
+RcNcgtacacaatRttMggaNKKggataaaSaYcMVcMgtaMaHtgattYMatYcggtct
+tcctHtcDccgtgRatcattgcgccgatatMaaYaataaYSggatagcgcBtNtaaaSca
+KgttBgagVagttaKagagtatVaactaSacWactSaKatWccaKaaaatBKgaaKtDMa
+ttttgtaaatcRctMatcaaMagMttDgVatggMaaWgttcgaWatgaaatttgRtYtat
+taWHKcRgctacatKttctaccaaHttRatctaYattaaWatVNccatNgagtcKttKat
+aStRaatatattcctRWatDctVagttYDgSBaatYgttttgtVaatttaatagcagMat
+RaacttBctattgtMagagattaaactaMatVtHtaaatctRgaaaaaaaatttWacaac
+aYccYDSaattMatgaccKtaBKWBattgtcaagcHKaagttMMtaatttcKcMagNaaK
+agattggMagaggtaatttYacatcWaaDgatMgKHacMacgcVaacaDtaDatatYggt
+tBcgtatgWgaSatttgtagaHYRVacaRtctHaaRtatgaactaatatctSSBgggaaH
+MWtcaagatKgagtDaSatagttgattVRatNtctMtcSaagaSHaataNataataRaaR
+gattctttaataaagWaRHcYgcatgtWRcttgaaggaMcaataBRaaccagStaaacNt
+ttcaatataYtaatatgHaDgcStcWttaacctaRgtYaRtataKtgMttttatgactaa
+aatttacYatcccRWtttHRtattaaatgtttatatttgttYaatMcaRcSVaaDatcgt
+aYMcatgtagacatgaaattgRtcaaYaaYtRBatKacttataccaNaaattVaBtctgg
+acaagKaaYaaatatWtMtatcYaaVNtcgHaactBaagKcHgtctacaatWtaDtSgta
+HcataHtactgataNctRgttMtDcDttatHtcgtacatcccaggSttaBgtcacacWtc
+cNMcNatMVaVgtccDYStatMaccDatggYaRKaaagataRatttHKtSaaatDgataa
+acttaHgttgVBtcttVttHgDacgaKatgtatatNYataactctSatatatattgcHRR
+YttStggaactHgttttYtttaWtatMcttttctatctDtagVHYgMRBgtHttcctaat
+YRttKtaagatggaVRataKDctaMtKBNtMtHNtWtttYcVtattMcgRaacMcctNSc
+tcatttaaagDcaHtYccSgatgcaatYaaaaDcttcgtaWtaattctcgttttScttgg
+taatctttYgtctaactKataHacctMctcttacHtKataacacagcNRatgKatttttS
+aaatRYcgDttaMRcgaaattactMtgcgtaagcgttatBtttttaattaagtNacatHg
+ttcRgacKcBBtVgatKttcgaBaatactDRgtRtgaNacWtcacYttaaKcgttctHaK
+ttaNaMgWgWaggtctRgaKgWttSttBtDcNtgtttacaaatYcDRtgVtgcctattcN
+tctaaaDMNttttNtggctgagaVctDaacVtWccaagtaacacaNctgaScattccDHc
+VBatcgatgtMtaatBgHaatDctMYgagaatgYWKcctaatNaStHaaaKccgHgcgtY
+aaYtattgtStgtgcaaRtattaKatattagaWVtcaMtBagttattagNaWHcVgcaat
+tttDcMtgtaRHVYtHtctgtaaaaHVtMKacatcgNaatttMatatgttgttactagWY
+taRacgataKagYNKcattataNaRtgaacKaYgcaaYYacaNccHatMatDcNgtHttR
+aWttagaaDcaaaaaatagggtKDtStaDaRtaVtHWKNtgtattVctSVgRgataDaRa
+WataBgaagaaKtaataaYgDcaStaNgtaDaaggtattHaRaWMYaYaWtggttHYgag
+VtgtgcttttcaaDKcagVcgttagacNaaWtagtaataDttctggttVcatcataaagt
+gKaaaNaMtaBBaattaatWaattgctHaVKaSgDaaVKaHtatatatHatcatSBagNg
+HtatcHYMHgttDgtaHtBttWatcgtttaRaattgStKgSKNWKatcagDtctcagatt
+tctRtYtBatBgHHtKaWtgYBgacVVWaKtacKcDttKMaKaVcggtgttataagaata
+aHaatattagtataatMHgttYgaRttagtaRtcaaVatacggtcMcgagtaaRttacWg
+actKRYataaaagSattYaWgagatYagKagatgSaagKgttaatMggtataatgttWYt
+tatgagaaacctNVataatHcccKtDctcctaatactggctHggaSaggRtKHaWaattc
+gSatMatttagaggcYtctaMcgctcataSatatgRagacNaaDaggaVBagaYttKtac
+NaKgtSYtagttggaWcatcWttaatctatgaVtcgtgtMtatcaYcgtRccaaYgDctg
+cMgtgtWgacWtgataacacgcgctBtgttaKtYDtatDcatcagKaVMctaatcttgVc
+aaRgcRMtDcgattaHttcaNatgaatMtactacVgtRgatggaWtttactaaKatgagS
+aaKggtaNtactVaYtaaKRagaacccacaMtaaMtKtatBcttgtaaWBtMctaataaV
+cDaaYtcRHBtcgttNtaaHatttBNgRStVDattBatVtaagttaYatVattaagaBca
+cggtSgtVtatttaRattgatgtaHDKgcaatattKtggcctatgaWDKRYcggattgRc
+tatNgatacaatMNttctgtcRBYRaaaHctNYattcHtaWcaattctBtMKtVgYataa
+tMgYtcagcttMDataVtggRtKtgaatgccNcRttcaMtRgattaacattRcagcctHt
+WMtgtDRagaKaBtgDttYaaaaKatKgatctVaaYaacWcgcatagBVtaNtRtYRagg
+BaaBtgKgttacataagagcatgtRattccacttaccatRaaatgWgDaMHaYVgVtaSc
+tatcgKaatatattaDgacccYagtgtaYNaaatKcagtBRgagtccatgKgaaaccBga
+agBtgSttWtacgatWHaYatcgatttRaaNRgcaNaKVacaNtDgattgHVaatcDaag
+cgtatgcNttaDataatcSataaKcaataaHWataBtttatBtcaKtKtatagttaDgSa
+YctacaRatNtaWctSaatatttYaKaKtaccWtatcRagacttaYttVcKgSDcgagaa
+gatccHtaattctSttatggtKYgtMaHagVaBRatttctgtRgtctatgggtaHKgtHa
+cHtSYacgtacacHatacKaaBaVaccaDtatcSaataaHaagagaatScagactataaR
+ttagcaaVcaHataKgDacatWccccaagcaBgagWatctaYttgaaatctVNcYtttWa
+gHcgcgcDcVaaatgttKcHtNtcaatagtgtNRaactttttcaatggWgBcgDtgVgtt
+tctacMtaaataaaRggaaacWaHttaRtNtgctaaRRtVBctYtVtatDcattDtgacc
+YatagatYRKatNYKttNgcctagtaWtgaactaMVaacctgaStttctgaKVtaaVaRK
+DttVtVctaDNtataaaDtccccaagtWtcgatcactDgYaBcatcctMtVtacDaaBtY
+tMaKNatNtcaNacgDatYcatcgcaRatWBgaacWttKttagYtaattcggttgSWttt
+tDWctttacYtatatWtcatDtMgtBttgRtVDggttaacYtacgtacatgaattgaaWc
+ttMStaDgtatattgaDtcRBcattSgaaVBRgagccaaKtttcDgcgaSMtatgWatta
+KttWtgDBMaggBBttBaatWttRtgcNtHcgttttHtKtcWtagHStaacagttgatat
+BtaWSaWggtaataaMttaKacDaatactcBttcaatatHttcBaaSaaatYggtaRtat
+NtHcaatcaHtagVtgtattataNggaMtcttHtNagctaaaggtagaYctMattNaMVN
+tcKtactBKcaHHcBttaSagaKacataYgctaKaYgttYcgacWVttWtSagcaacatc
+ccHaccKtcttaacgaKttcacKtNtacHtatatRtaaatacactaBtttgaHaRttggt
+tWtatYagcatYDatcggagagcWBataagRtacctataRKgtBgatgaDatataSttag
+BaHtaatNtaDWcWtgtaattacagKttcNtMagtattaNgtctcgtcctcttBaHaKcK
+ccgtRcaaYagSattaagtKataDatatatagtcDtaacaWHcaKttDgaaRcgtgYttg
+tcatatNtatttttatggccHtgDtYHtWgttatYaacaattcaWtatNgctcaaaSttR
+gctaatcaaatNatcgtttaBtNNVtgttataagcaaagattBacgtDatttNatttaaa
+DcBgtaSKgacgtagataatttcHMVNttgttBtDtgtaWKaaRMcKMtHtaVtagataW
+ctccNNaSWtVaHatctcMgggDgtNHtDaDttatatVWttgttatttaacctttcacaa
+ggaSaDcggttttttatatVtctgVtaacaStDVaKactaMtttaSNagtgaaattaNac
+ttSKctattcctctaSagKcaVttaagNaVcttaVaaRNaHaaHttatgtHttgtgatMc
+caggtaDcgaccgtWgtWMtttaHcRtattgScctatttKtaaccaagtYagaHgtWcHa
+atgccKNRtttagtMYSgaDatctgtgaWDtccMNcgHgcaaacNDaaaRaStDWtcaaa
+aHKtaNBctagBtgtattaactaattttVctagaatggcWSatMacccttHttaSgSgtg
+MRcatRVKtatctgaaaccDNatYgaaVHNgatMgHRtacttaaaRtatStRtDtatDtt
+YatattHggaBcttHgcgattgaKcKtttcRataMtcgaVttWacatNcatacctRataD
+DatVaWNcggttgaHtgtMacVtttaBHtgagVttMaataattatgttcttagtttgtgc
+DtSatttgBtcaacHattaaBagVWcgcaSYttMgcttacYKtVtatcaYaKctgBatgc
+gggcYcaaaaacgNtctagKBtattatctttKtaVttatagtaYtRagNtaYataaVtga
+atatcHgcaaRataHtacacatgtaNtgtcgYatWMatttgaactacRctaWtWtataca
+atctBatatgYtaagtatgtgtatSttactVatcttYtaBcKgRaSggRaaaaatgcagt
+aaaWgtaRgcgataatcBaataccgtatttttccatcNHtatWYgatHSaaaDHttgctg
+tccHtggggcctaataatttttctatattYWtcattBtgBRcVttaVMRSgctaatMagt
+YtttaaaaatBRtcBttcaaVtaacagctccSaaSttKNtHtKYcagcagaaaccccRtt
+tttaaDcDtaStatccaagcgctHtatcttaDRYgatDHtWcaaaBcWgKWHttHataag
+HacgMNKttMKHccaYcatMVaacgttaKgYcaVaaBtacgcaactttMctaaHaatgtB
+atgagaSatgtatgSRgHgWaVWgataaatatttccKagVgataattWaHNcYggaaatg
+ctHtKtaDtctaaagtMaatVDVactWtSaaWaaMtaHtaSKtcBRaNcttStggtBtta
+cNagcatagRgtKtgcgaacaacBcgKaatgataagatgaaaattgtactgcgggtccHH
+WHaaNacaBttNKtKtcaaBatatgctaHNgtKcDWgtttatNgVDHgaccaacWctKaa
+ggHttgaRgYaatHcaBacaatgagcaaattactgtaVaaYaDtagattgagNKggtggt
+gKtWKaatacagDRtatRaMRtgattDggtcaaYRtatttNtagaDtcacaaSDctDtat
+aatcgtactaHttatacaatYaacaaHttHatHtgcgatRRttNgcatSVtacWWgaagg
+agtatVMaVaaattScDDKNcaYBYaDatHgtctatBagcaacaagaatgagaaRcataa
+KNaRtBDatcaaacgcattttttaaBtcSgtacaRggatgtMNaattggatatWtgagta
+ttaaaVctgcaYMtatgatttttYgaHtgtcttaagWBttHttgtcttattDtcgtatWt
+ataataSgctaHagcDVcNtaatcaagtaBDaWaDgtttagYctaNccDtaKtaHcttaa
+taacccaRKtacaVaatNgcWRaMgaattatgaBaaagattVYaHMDcaDHtcRcgYtct
+taaaWaaaVKgatacRtttRRKYgaatacaWVacVcRtatMacaBtactggMataaattt
+tHggNagSctacHgtBagcgtcgtgattNtttgatSaaggMttctttcttNtYNagBtaa
+acaaatttMgaccttacataattgYtcgacBtVMctgStgMDtagtaRctHtatgttcat
+atVRNWataDKatWcgaaaaagttaaaagcacgHNacgtaatctttMRtgacttttDacc
+tataaacgaaatatgattagaactccSYtaBctttaataacWgaaaYatagatgWttcat
+KtNgatttttcaagHtaYgaaRaDaagtaggagcttatVtagtctttcattaaaatcgKt
+attaRttacagVaDatgcatVgattgggtctttHVtagKaaRBtaHtaaggccccaaaaK
+atggtttaMWgtBtaaacttcactttKHtcgatctccctaYaBacMgtcttBaBaNgcga
+aacaatctagtHccHtKttcRtRVttccVctttcatacYagMVtMcagaMaaacaataBc
+tgYtaatRaaagattaaccatVRatHtaRagcgcaBcgDttStttttcVtttaDtKgcaa
+WaaaaatSccMcVatgtKgtaKgcgatatgtagtSaaaDttatacaaacatYaRRcVRHc
+tKtcgacKttaaVctaDaatgttMggRcWaacttttHaDaKaDaBctgtaggcgtttaHB
+ccatccattcNHtDaYtaataMttacggctNVaacDattgatattttacVttSaattaca
+aRtataNDgacVtgaacataVRttttaDtcaaacataYDBtttaatBaDtttYDaDaMcc
+MttNBttatatgagaaMgaNtattHccNataattcaHagtgaaggDgatgtatatatgYa
+tgaStcataaBStWacgtcccataRMaaDattggttaaattcMKtctMacaBSactcgga
+atDDgatDgcWctaacaccgggaVcacWKVacggtaNatatacctMtatgatagtgcaKa
+gggVaDtgtaacttggagtcKatatcgMcttRaMagcattaBRaStctYSggaHYtacaa
+ctMBaagDcaBDRaaacMYacaHaattagcattaaaHgcgctaaggSccKtgaaKtNaBt
+atDDcKBSaVtgatVYaagVtctSgMctacgttaacWaaattctSgtDactaaStaaatt
+gcagBBRVctaatatacctNttMcRggctttMttagacRaHcaBaacVKgaataHttttM
+gYgattcYaNRgttMgcVaaacaVVcDHaatttgKtMYgtatBtVVctWgVtatHtacaa
+HttcacgatagcagtaaNattBatatatttcVgaDagcggttMaagtcScHagaaatgcY
+NggcgtttttMtStggtRatctacttaaatVVtBacttHNttttaRcaaatcacagHgag
+agtMgatcSWaNRacagDtatactaaDKaSRtgattctccatSaaRttaaYctacacNta
+RtaactggatgaccYtacactttaattaattgattYgttcagDtNKttagDttaaaaaaa
+BtttaaNaYWKMBaaaacVcBMtatWtgBatatgaacVtattMtYatMNYDKNcKgDttD
+aVtaaaatgggatttctgtaaatWtctcWgtVVagtcgRgacttcccctaDcacagcRca
+gagtgtWSatgtacatgttaaSttgtaaHcgatgggMagtgaacttatRtttaVcaccaW
+aMgtactaatSSaHtcMgaaYtatcgaaggYgggcgtgaNDtgttMNgaNDMtaattcgV
+ttttaacatgVatgtWVMatatcaKgaaattcaBcctccWcttgaaWHtWgHtcgNWgaR
+gctcBgSgaattgcaaHtgattgtgNagtDttHHgBttaaWcaaWagcaSaHHtaaaVct
+RaaMagtaDaatHtDMtcVaWMtagSagcttHSattaacaaagtRacMtRtctgttagcM
+tcaBatVKtKtKacgagaSNatSactgtatatcBctgagVtYactgtaaattaaaggcYg
+DHgtaacatSRDatMMccHatKgttaacgactKtgKagtcttcaaHRVtccttKgtSata
+atttacaactggatDNgaacttcaRtVaagDcaWatcBctctHYatHaDaaatttagYat
+SatccaWtttagaaatVaacBatHcatcgtacaatatcgcNYRcaataYaRaYtgattVt
+tgaatgaVaactcRcaNStgtgtattMtgaggtNttBaDRcgaaaagctNgBcWaWgtSa
+DcVtgVaatMKBtttcgtttctaaHctaaagYactgMtatBDtcStgaccgtSDattYaa
+taHctgggaYYttcggttaWaatctggtRagWMaDagtaacBccactacgHWMKaatgat
+WatcctgHcaBaSctVtcMtgtDttacctaVgatYcWaDRaaaaRtagatcgaMagtgga
+RaWctctgMgcWttaagKBRtaaDaaWtctgtaagYMttactaHtaatcttcataacggc
+acBtSgcgttNHtgtHccatgttttaaagtatcgaKtMttVcataYBBaKtaMVaVgtat
+tNDSataHcagtWMtaggtaSaaKgttgBtVtttgttatcatKcgHacacRtctHatNVa
+gSBgatgHtgaRaSgttRcctaacaaattDNttgacctaaYtBgaaaatagttattactc
+ttttgatgtNNtVtgtatMgtcttRttcatttgatgacacttcHSaaaccaWWDtWagta
+RDDVNacVaRatgttBccttaatHtgtaaacStcVNtcacaSRttcYagacagaMMtttt
+gMcNttBcgWBtactgVtaRttctccaaYHBtaaagaBattaYacgatttacatctgtaa
+MKaRYtttttactaaVatWgctBtttDVttctggcDaHaggDaagtcgaWcaagtagtWt
+tHtgKtVataStccaMcWcaagataagatcactctHatgtcYgaKcatcagatactaagN
+SStHcctRRNtattgtccttagttagMVgtatagactaactctVcaatMctgtttgtgtt
+gccttatWgtaBVtttctggMcaaKgDWtcgtaaYStgSactatttHgatctgKagtagB
+tVacRaagRtMctatgggcaaaKaaaatacttcHctaRtgtDcttDattaggaaatttcY
+HaRaaBttaatggcacKtgctHVcaDcaaaVDaaaVcgMttgtNagcgtaDWgtcgttaa
+tDgKgagcSatatcSHtagtagttggtgtHaWtaHKtatagctgtVgattaBVaatgaat
+aagtaatVatSttaHctttKtttgtagttaccttaatcgtagtcctgBcgactatttVcM
+acHaaaggaatgDatggKtaHtgStatattaaSagctWcctccRtataBaDYcgttgcNa
+agaggatRaaaYtaWgNtSMcaatttactaacatttaaWttHtatBattgtcgacaatNg
+attgcNgtMaaaKaBDattHacttggtRtttaYaacgVactBtaBaKtgBttatgVttgt
+VttcaatcWcNctDBaaBgaDHacBttattNtgtDtatttVSaaacaggatgcRatSgta
+SaNtgBatagttcHBgcBBaaattaHgtDattatDaKaatBaaYaaMaataaataKtttY
+tagtBgMatNcatgtttgaNagtgttgtgKaNaSagtttgaSMaYBcaaaacDStagttV
+acaaaaactaaWttBaagtctgtgcgtMgtaattctcctacctcaNtttaaccaaaaVtB
+cacataacaccccBcWMtatVtggaatgaWtcaaWaaaaaaaaWtDtaatatRcctDWtc
+ctaccMtVVatKttaWaaKaaatataaagScHBagaggBaSMtaWaVtatattactSaaa
+KNaactatNatccttgaYctattcaaaVgatttYHcRagattttaSataggttattcVta
+aagaKgtattattKtRttNcggcRgtgtgtWYtaacHgKatKgatYtacYagDtWcHBDc
+tctgRaYKaYagcactKcacSaRtBttttBHKcMtNtcBatttatttttgSatVgaaaga
+WtcDtagDatatgMacaacRgatatatgtttgtKtNRaatatNatgYcaHtgHataacKt
+gagtagtaacYttaNccaaatHcacaacaVDtagtaYtccagcattNtacKtBtactaaa
+gaBatVtKaaHBctgStgtBgtatgaSNtgDataaccctgtagcaBgtgatcttaDataS
+tgaMaccaSBBgWagtacKcgattgaDgNNaaaacacagtSatBacKDgcgtataBKcat
+acactaSaatYtYcDaactHttcatRtttaatcaattataRtttgtaagMcgNttcatcB
+tYBagtNWNMtSHcattcRctttttRWgaKacKttgggagBcgttcgcMaWHtaatactg
+tctctatttataVgtttaBScttttaBMaNaatMacactYtBMggtHacMagtaRtctgc
+atttaHtcaaaatttgagKtgNtactBacaHtcgtatttctMaSRagcagttaatgtNta
+aattgagagWcKtaNttagVtacgatttgaatttcgRtgtWcVatcgttaaDVctgtttB
+WgaccagaaagtcSgtVtatagaBccttttcctaaattgHtatcggRattttcaaggcYS
+KaagWaWtRactaaaacccBatMtttBaatYtaagaactSttcgaaScaatagtattgac
+caagtgttttctaacatgtttNVaatcaaagagaaaNattaaRttttaVaaaccgcaggN
+MtatattVctcaagaggaacgBgtttaacaagttcKcYaatatactaaccBaaaSggttc
+NtattctagttRtBacgScVctcaatttaatYtaaaaaaatgSaatgatagaMBRatgRc
+McgttgaWHtcaVYgaatYtaatctttYttatRaWtctgBtDcgatNatcKaBaDgatgt
+aNatWKctccgatattaacattNaaacDatgBgttctgtDtaaaMggtgaBaSHataacg
+ccSctaBtttaRBtcNHcDatcDcctagagtcRtaBgWttDRVHagattYatgtatcWta
+HtttYcattWtaaagtctNgtStggRNcgcggagSSaaagaaaatYcHDtcgctttaatg
+YcKBVSgtattRaYBaDaaatBgtatgaHtaaRaRgcaSWNtagatHaacttNctBtcac
+catctMcatattccaSatttgcgaDagDgtatYtaaaVDtaagtttWVaagtagYatRtt
+aagDcNgacKBcScagHtattatcDaDactaaaaaYgHttBcgaDttggataaaKSRcBM
+aBcgaBSttcWtgNBatRaccgattcatttataacggHVtaattcacaagagVttaaRaa
+tVVRKcgWtVgacctgDgYaaHaWtctttcacMagggatVgactagMaaataKaaNWagK
+atagNaaWtaaaatttgaattttatttgctaaVgaHatBatcaaBWcBgttcMatcgBaa
+NgttcgSNaggSaRtttgHtRtattaNttcDcatSaVttttcgaaaaattgHatctaRag
+gSaNatMDaaatDcacgattttagaHgHaWtYgattaatHNSttatMSgggNtcKtYatR
+ggtttgtMWVtttaYtagcagBagHaYagttatatggtBacYcattaRSataBatMttta
+aatctHcaaaSaaaagttNSaaWcWRccRtKaagtBWtcaaattSttMtattggaaacct
+taacgttBtWatttatatWcDaatagattcctScacctaagggRaaYtaNaatgVtBctt
+aaBaacaMVaaattatStYgRcctgtactatcMcVKatttcgSgatRHMaaaHtagtaaH
+tVgcaaataatatcgKKtgccaatBNgaaWcVttgagttaKatagttcaggKDatDtatt
+gaKaVcaKtaataDataataHSaHcattagttaatRVYcNaHtaRcaaggtNHcgtcaac
+caBaaagYtHWaaaRcKgaYaaDttgcWYtataRgaatatgtYtgcKtaNttWacatYHc
+tRaDtYtattcBttttatcSataYaYgttWaRagcacHMgtttHtYttYaatcggtatSt
+ttcgtRSattaaDaKMaatatactaNBaWgctacacYtgaYVgtgHtaaaRaaRgHtagt
+WattataaaSDaaWtgMattatcgaaaagtaYRSaWtSgNtBgagcRYaMDtactaactt
+aWgtatctagacaagNtattHggataatYttYatcataDcgHgttBttctttVttgccga
+aWtaaaacgKgtatctaaaaaNtccDtaDatBMaMggaatNKtatBaaatVtccRaHtaS
+acataHattgtttKVYattcataVaattWtcgtgMttcttKtgtctaacVtatctatatB
+RataactcgKatStatattcatHHRttKtccaacgtgggtgRgtgaMtattattggctat
+cgtgacMtRcBDtcttgtactaatRHttttaagatcgVMDStattatYBtttDttgtBtN
+ttgRcMtYtgBacHaWaBaatDKctaagtgaaactaatgRaaKgatccaagNaaaatatt
+aggWNtaagtatacttttKcgtcggSYtcttgRctataYcttatataaagtatattaatt
+tataVaacacaDHatctatttttKYVatHRactttaBHccaWagtactBtcacgaVgcgt
+tRtttttttSVgtSagtBaaattctgaHgactcttgMcattttagVtaagaattHctHtc
+aDaaNtaacRggWatagttcgtSttgaDatcNgNagctagDgatcNttKgttgtaDtctt
+tRaaYStRatDtgMggactSttaDtagSaVtBDttgtDgccatcacaMattaaaMtNaca
+VcgSWcVaaDatcaHaatgaattaMtatccVtctBtaattgtWattatBRcWcaatgNNt
+actWYtDaKttaaatcactcagtRaaRgatggtKgcgccaaHgaggatStattYcaNMtc
+aBttacttatgagDaNtaMgaaWtgtttcttctaHtMNgttatctaWWatMtBtaaatag
+DVatgtBYtatcggcttaagacMRtaHScgatatYgRDtcattatSDaHggaaataNgaW
+SRRaaaBaatagBattaDctttgHWNttacaataaaaaaatacggtttgHgVtaHtWMtt
+NtBtctagtMcgKMgHgYtataHaNagWtcaacYattaataYRgtaWKgaBctataaccg
+atttaHaNBRaRaMtccggtNgacMtctcatttgcaattcWgMacttacaaDaaNtactW
+atVtttagccttMaatcagVaagtctVaaDaBtattaattaYtNaYtggattaKtaKctY
+aMtattYgatattataatKtVgDcttatatNBtcgttgtStttttMagaggttaHYSttc
+KgtcKtDNtataagttataagSgttatDtRttattgttttSNggRtcaaKMNatgaatat
+tgtBWtaMacctgggYgaSgaagYataagattacgagaatBtggtRcVHtgYggaDgaYa
+KagWagctatagacgaaHgtWaNgacttHRatVaWacKYtgRVNgVcSgRWctacatcKS
+actctgWYtBggtataagcttNRttVtgRcaWaaatDMatYattaactttcgaagRatSc
+tgccttgcRKaccHtttSNVagtagHagBagttagaccaRtataBccataatSHatRtcH
+agacBWatagcaMtacaRtgtgaaBatctKRtScttccaNaatcNgtaatatWtcaMgac
+tctBtWtaaNactHaaaaRctcgcatggctMcaaNtcagaaaaacacagtggggWttRtt
+agtaagaVctVMtcgaatcttcMaaaHcaHBttcgattatgtcaDagcYRtBtYcgacMg
+tDcagcgaNgttaataatagcagKYYtcgtaBtYctMaRtaRtDagaaaacacatgYaBt
+tgattattcgaaNttBctSataaMataWRgaHtttccgtDgaYtatggtDgHKgMtattt
+VtMtVagttaRatMattRagataaccctKctMtSttgaHagtcStctatttccSagatgt
+tccacgaggYNttHRacgattcDatatDcataaaatBBttatcgaHtNHaaatatDNagg
+ctgaNcaaggagttBttMgRagVatBcRtaWgatgBtSgaKtcgHtttgaatcaaDaHtt
+cSBgHcagtVaaSttDcagccgttNBtgttHagYtattctttRWaaVtSttcatatKaaR
+aaaNacaVtVctMtSDtDtRHRcgtaatgctcttaaatSacacaatcgHattcaWcttaa
+aatHaaatcNctWttaNMcMtaKctVtcctaagYgatgatcYaaaRactctaRDaYagta
+acgtDgaggaaatctcaaacatcaScttcKttNtaccatNtaNatacatttHaaDHgcaD
+atMWaaBttcRggctMaagctVYcacgatcaDttatYtaatcKatWatcaatVYtNagat
+ttgattgaYttttYgacttVtcKaRagaaaHVgDtaMatKYagagttNatWttaccNtYt
+cDWgSatgaRgtMatgKtcgacaagWtacttaagtcgKtgatccttNcttatagMatHVg
+gtagcgHctatagccctYttggtaattKNaacgaaYatatVctaataMaaaYtgVtcKaY
+taataacagaatHcacVagatYWHttagaaSMaatWtYtgtaaagNaaacaVgaWtcacN
+WgataNttcaSagctMDaRttgNactaccgataMaaatgtttattDtcaagacgctDHYY
+atggttcaagccNctccttcMctttagacBtaaWtaWVHggaaaaNatttaDtDtgctaa
+HHtMtatNtMtagtcatttgcaaaRatacagRHtatDNtgtDgaatVgtVNtcaaatYBM
+aaaagcaKgtgatgatMgWWMaHttttMgMagatDtataaattaaccaactMtacataaa
+ttgRataatacgBtKtaataattRgtatDagDtcRDacctatRcagagcSHatNtcaScN
+tttggacNtaaggaccgtgKNttgttNcttgaaRgYgRtNtcagttBcttttcHtKtgct
+tYaaNgYagtaaatgaatggWaMattBHtatctatSgtcYtgcHtaattHgaaMtHcaga
+aSatggtatgccaHBtYtcNattWtgtNgctttaggtttgtWatNtgHtgcDttactttt
+tttgcNtactKtWRaVcttcatagtgSNKaNccgaataaBttataataYtSagctttaaa
+tSttggctaaKSaatRccgWHgagDttaaatcatgagMtcgagtVtaDggaBtatttgDa
+cataaacgtagYRagBWtgDStKDgatgaagttcattatttaKWcataaatWRgatataR
+gttRacaaNKttNtKagaaYaStaactScattattaacgatttaaatgDtaattagatHg
+aYataaactatggggatVHtgccgtNgatNYcaStRtagaccacWcaMtatRagHgVact
+YtWHtcttcatgatWgagaKggagtatgaWtDtVtNaNtcgYYgtaaactttaDtBacta
+gtaDctatagtaatatttatatataacgHaaaRagKattSagttYtStatatatagtctt
+aaaaMtcatgttcaaDactgRttctaagagDtatttttagcgacttgtgRtgNctgSgRa
+aaaatgcaMtYtDcatcaaYKttHcatSWgaaaatDataggttatgBDMtgttataacaa
+YSgagttacgttatgtDStttaaatctcgWKtcSacgagagaSgttatBMDgtcggtgtg
+cgaNtaSHBatBtttVMgVcagaNatcaDDaKMtMYtatagaBccctctDtgtatttata
+tKNtgggtatgtRaacttgaWaaYgcaHatccctggtttStatMtcgcMtaaaWKttMVt
+WctVtgttaKDWctgWaVttaDVatgKtagagtcatctaKWgtaaMttSacBaMattaKa
+aHDataattgWtgttttgtcatBacacgtStacaaagtNctNtgtgatcHtWttcKaaga
+gttttaaaaWacgRacatctNatVStgaatDHgttWcgtRKcatatatctcaNttaaBDc
+ctgaaaaaDtaYaHaKttNtaYVaVtttaDtctacttctWttaactaattttMagWcaat
+cccNKYtBaacatgttgaKgKcgcBHaatDMttatatcSWacatDatRcWaMtDgatBct
+HgScttaaaHtSgKtDtttattgtRStWgttccatatttcacWttcatattgtaHVgaBt
+acaMtgMaaagDaataactDatattagMaNBagcttcattcgtaaKtgtatttcacMtgB
+aVtaattStcttagtYgtgtcgccttKatgggtgaWaataggaatacMMagaSKRttBga
+tgacRtgMtagaSRataggtatcaccgaNaaaWSWacDgatacttgattagcttgtgVMt
+tatYctaRgHVcDtVRRtSaMtcaVtVtatcaYaHatattaaVaatctaBtgtacRatNt
+atttgaYatSaHctaNgNtYtYaYagattVgatcRtaacgYggtgtatKttaatMagatg
+RtatatgHaKccHaaaaYtgaacgaWaNgtYHgacagaYtctaVtacccgatttttaaag
+cDttatNRgattKaaattttcatctaatgccgcaataataattgttatYtagtRNtaagt
+tggtHaKttWMtDKgatSagBYcgRggtWaVaattHtatgtaaaMgSaaagataaKaaKg
+ttDttttRaagaacaWRcaacDgtgttaatattaKtatcaWacacatttVtctgatHRca
+gtttNcaaatcNctNttttataactWacBBttgBttaaaRaWtBKaaacgtatcRcaMaa
+tgYacaaaagtgBataStWYtggtatgacaKWtctSgcKHgtcNaMNcataSatattgac
+tacMcataattNVtDaRccaaatcagttttYttagYaacgtaatMtMVatNgKaaMaaBg
+attaKttatDaBcttKtccttttacDagaYtacHgttggacaaaVaatagtYatcataSg
+atcaaWVttcgaatgaccctccttNtaSBWaatttDttttcaatatYggctatDcttatN
+ctttagDcMttcaacWaaNattSYgctttcaHcRaattaataaaatcVccRaattactct
+aMaVRattacagtgRcDtcgtgctcttNtWVtacagtHtatHaBDtcWggtgctcaaRHt
+atgtDgacStgcaaaVKtagttataatactaatatgtagScaatRSacaattgtattgca
+gatHHtgBcaatKKtaaMMcaRcgactatKBaMaYatgKatttDaaNtRatattgtatWt
+tagcaaaaacaWgcacaaHcataYtDaHgttataaSacgcagggggtYatgcKctaaaHg
+cVgctBDaVttccStagNgcSgtatgVYaMatcaWRBtVtgYttgtgRcYttcgctgaac
+NttgtgtctattWttttcctagMtagaWtaKgatStScatMaBtaStaSactattYNatc
+tgtacRatYDaatgatgatatgaatYaaaaSHttaaYMaWtDcaNHaBcaYtgVgcatVa
+acattMRatBtaatttaDacRtagtaaaNYVSMtcagaaDtttDHtRcYatacSNKaaMc
+HgatBaaVttactggBYgaYatttttgcDacHctWatcgtagagtactcattDggtcatK
+aSgctttatttagtDtRBacttaWYaaaattttgaccttaaWtaatgcRgccacttMtag
+gKtcBtgacgaHctttatcgtcStatMHDNagattatNagVaaaWcggaaaYcaVactDY
+actaStattgBHtcYctgggtacatataaYcgaYagaggaggacaVatacHRtYtctgta
+VgaYcNgaaaNatacVgcNgtaatttDcatttttcaacttSNcaaDatVYctSgcacctt
+agMgacgcttgaSttaaaatagttaggRHttaaacMatagcaWgMgagtcgctagtgtKg
+actaaHttattaWgcaaaaaaSatatgcgttaBNggttaYVatgaactttttgccatata
+aataRatSaBctagttataBccgaaacaagatacttaattttgaHgHMgtaaKctttaYt
+aaRacBMtBaYgaBaaacaYtVtagcRgWatHaWagattWSacStMHatttaDagacaat
+cgtgtKtttggaMtgtWtgtgcaaNaaaaWtKaaBcMWtcttctatgacVgagcgaggHa
+YYtttWgSaaYYaWtRYHHaMDtctttacaatggaaMctataagcttBcgHcNWaatttg
+tatatYtStatctagcactgtVttccagaaattaDtttaRtVataBttWagcatDMVact
+YtgcatWtttgaaMggKaatgaaaaHtataDtgYcMggVaaatSMHtttgVttaYaWaat
+aRttgttaYttattttRtWtataaBgtDtttatatcVgaaBcaDtatgtcaDagaWtgaY
+tWctcVagctcagctatatagcRVtcaKtaataatHgNaccgaaaatVHBaatattcgtt
+aVYttatttctBYaatKaagaccVStttcattgaMagSaaaaccccWKcaaNtMYaccta
+DStagaaatttatcatVgtcaatacccKattgtaaagtggWgtatatVtagBcttDaBac
+aattWtDYKtatRKggStRtaaaWatBtaagtaattDaaaaBRacWtaagtacaSttaaa
+tccgctaaccKaattgVWttDattatttattKaMtcYtMRWagMtcgKgBagacgggVaa
+NaaatgctKcgtaataaKtaaagtccWcttHMatSYgataaatDttBaHccattgBttSg
+aaHYtaataaaMtgaagatgtttBgRcattaRaDHcttBgaMaWaaVMMattaatttgtg
+BRctattgKMagNcMtatttaaaWttgaaacatWgcScgYYDYgttYtVtattgcKcWta
+gcggtgBaSctaKatacaaVtcaRDccccgtgttBgKgggtHagcgaattaaagMMttSc
+ggtDttttaHcSaagaacactcacactBcVgaKNaDHacacttatSagaattSKHtcagt
+ataaatKaaHtgaaRagaaVcBtaHtaaatcgatcWcaRtaaaatttaWttaagtcaggR
+ctgaWcttDttgactttaVSaaaatggtaWDaRMtBtaaaaaKatBgatMtctatatcaV
+aMgatttgNagtDRttDatcttttaMtYaaatcggagttctctaYatNtagaNcgMMact
+acHcaagtaaaatStaSaacaHcacSgggtNKatggaaagcggaaKgggtaYtacSgccg
+BaggcRacgtVgDtggaMcYaaaMatggacgYStKKatgaBcaaRtStccSagcRccgcc
+gcSDtgcggBDgaDtBtSSggacMttttaWcatcMatgtNMBWgataatcaaVtgaataa
+taaNatgcaaNttNctgacDMcaHccgatgKgWVttccaStggattctcDacttttttct
+ttaaNcWaMWccWKWttgaaaMctDaaBactRtVattttBtcMaNttWcKacagttKStt
+aYaWSactHSaBtHgatgttacatgcatatMtttgtaacScWHBatHactggatatatct
+gagMgRSatctaaSttaVagcaRcttggaYaatKHtagBBactattcgtaaagaagttgt
+VcgatgaVatHMtcaggtcgKSgWattgaaaVctccVgtDcaaatgaaHgMYactcaMat
+atatattNVttWtWaatttacRagKataaaNtttacaaWgMVactattaSgaggVaaagV
+taccDRHaaataRaHaRgcattMttcaatcaKaaataDcaDKtctcgaggBggacctDtt
+tatHacWVaWgatDctaNaNcgKatcMtcMaatBtttggacgtgataatagaaacRactc
+BtattttaKtgSaaggKtaggRaVtatagcccaNRttaccttSMaagatcggDacNBatW
+cgaactacactaactNBtaStgVtNagcatctaVtaKatKgaBtcgtttWaagWMgagRa
+NatHaaaaDtacagacaBagtgcaHaNatctcBccNttaagttDgaataaNtcgctaacR
+BgtaatSttaatatgcataacccaSattKcccttDttggtcaatgggttWaacgatacat
+tBtgMaYgaRttatgatKaKgtattDtKWgataacgNBtaccgaKWatcttcttKtgtct
+tagcattcctWcaaHgagtatDMSgKtcagcttgVHaKcttDaataaaVaatttDgtgaa
+ataaRgtcaVaatacttagtVatatgggcatgtDDtMtgtatBggattHtgcVtgtgatc
+aaSattatKYVaacSNNttNWcgaHttKDaaMYHatcgttaattaSttgctWaacHtaKB
+taaaaKHttcRWgaaWcRtBtttggBcDtgtacNttaagcKtaHgtagaaaaRttgaaac
+atagtWRaacYggtaaatcgctYaBtWDRtgttgSctaaKatNcattgtgtMttatccat
+atagctSacgccSNaaactacgNtgtgcttMatSKtcaaBaNaaacataacagaaatagt
+agctcNcatcVgaagStaataVcDKKttcagDHDtattctaatgagggRgBMctatacaa
+gYactctMaaagtcgctttctcgtgaattatNcgatMtttaggcBaaatctNtactaaRK
+tgKactattgtcatatgtacgagttMaaHSSgHgBatatcgcaSaataaaWgaagtatag
+aHgcttctttatgaccWaatttaRtaDaatttaatcgaaattgattMcatcaWaMtaWaK
+actttctBacactatNgtccttaWgtctgaccKatStaKtgagtacgggcgcgtYNtatt
+tagacctctKcatgatKWStcaataactaWgMSgHtgatctttttgtcgacgtSacttaY
+gcctWctcctctacaagVtttMaBactWVaccaYtgtSgcgttattcKtatStgaaKacc
+gNaataaHtatWtYtRacggcaDaScagcagHaYWRtRNcDtHtcVWtggaataaaYttg
+VaNtgttagtYttgtagSaaatDgaggccDcgBRYStattatttaaggccgHgggYRaac
+cMaagttatSttctttagcMtgcgMtgaSagaNaDagttSatgattWatttagtDgcttg
+agtgMKaYWaYccagcaHatKctaKaDgctagacttattgattaaYttatcttattattS
+taattWaRaYBWagYaatatgttRgScttgBagDaWgcgtgcVDaggcttgtctaDRKac
+ttgcaKBWRtaaVaSctKtacttMaaSVaWWcgSaNtttSWgtcggtcacttggVVtgag
+aataaataaDttgaaccaaaaMttaaaagaaaaaaaatcNBtatMgccWagcaNgaVaNa
+aaaaaYaMgttaWtatHaagtNtacgacaBtMMattttWNaRtaaatagYaScKattaca
+gctVKBtWNSKgYtYgtWatHaVatDaaatWgDatcctggSRagagtaaaaMgatttRta
+HacatggtaKagVcctgatgaMtaaYgatgtattattttHggBaccaDctctggNNtYaa
+tctVttgVtRtVcRacttNctttataggHSRtaRacaaattaacHaHgtgttgtttcBtB
+tatWtgtattttgcKagMcaaagaMtattagtStagcBacYaaHcagVgWtgtttcgtgD
+HaVtagDatcRaRtggtWtaactgcacgaggaaaRttSDaaVaSttaaaaacSMttacta
+NtcaacaattDtacttttYatVSacYtWtMttaattatcKtcttctatcaKDtctStSaa
+acggtYccatgtgagagtWtagWKgcaBaaaaKttgNactaatcgaggcWtcDDaaaaaa
+cactHattaattcactatYttaagacactaKaagRtRataaattttcatHggtaataaat
+gataHtggctaacBacDgtaatattRtYgtDNDBgKtcaggcHattttgHNgWtaatttc
+cgactactgacatVNttYYgactcgctctatttagaMcgggatHcgtttatBaDSagBaa
+aagRttBggttaaBactVHgatgaatttattcaaaattgcacttcDgacttYcVttactV
+tttatBaKHagaWgtgaatggBtaaSggcagacNcttaDttVgMtWagattggVatttac
+HtctNcMatacttSatMagcttgtNcYaaScaYactcKctKtagScStcagtttcatWaa
+tggtgagaggHaggggcaacgcRKtaRcMaNtHaatRaRaaactVtBtgttaatRtWWca
+aagKttccaaKaaatacgVttcacaaacgcggtgagaRaatggtgDMWatcWVScacaaa
+DaggaaHtgttSMaaaaaccYccDBtatYgtMagcSagaccaVcctcggtVWaaagttat
+cNaagataataSaataaaKccgtaDtYttatYcttHttaagKcMctaaatggaatRgaaa
+VaaVtcKYaggatWcaBtDaggDatccttcYNtgcSMRgaRtNgaatcgttRttatDVMt
+agctttacatDVtatatatcagctaDagMtataccYgaggYaaatgDaaaatSgctctga
+tgtttVaaBcctgataKtagaaaccaKatatgttaDtgaDtatagataatacagtaDtat
+cNtgtDMtYcattRVtctataNtWttggNaSgtMgaaYctctDggHtggHDccaccacKK
+aaacaaaatRatttccctttaagcRattMHctattHaRtataVattggatcSttaaHaHg
+aaHNDtacattSaaggDatttcaaaYgctBcatattaaaKagtgcccatSctcgatRtaa
+aMtgWactttNMaWctYgRatDggaactcDcaattaKaactgagtatctataagYaaaSR
+ctggtacWtttccWtaYRtKHattatagWtKttaNgcDtatHacccattaatttataacg
+ctMgaagtaacaacagMgtaYHYVtKMHtacMgKcaaatctgRYataNtcgttcaatacg
+gWtMcaatYcBWaagYtVaDNagtatagDaaNtaaaYtttcYWttttStgggataaMgat
+attagaaYtNctcttcBagactaYDcgtacHDWccKaHgttcttHgVggVDttatcatKa
+MttttacWaaSattctatagaHaggKaDagBtaaagtcYccattgtYcatctaNgRgVtg
+aagtDKttatBKcggDtattRYgHccgtgcgBNMtttVRgacaYctSctaRacgtagagc
+cgtacRaagtaHKagStSttttgYSatattaaaWHaaWagttDKaaNaNHaaHttaYctt
+MtcaaatgKttBtSgtccaaVaattSaacgttgNattgatatNctaWtVcagtactKcWa
+cgVagggHaaRgaDaatcMttattaataacaBMaaVtgYtKgRgHactgtactatcBaMt
+VggtagKcYtHtBSaattagtaatgMcaVVagYYgWtactttccaaSttDgaaMaMttca
+cttYtRgacttcagcttWtttagtgataMaattaagVtagaatatKataagtagttaagH
+MRaDattaHaaVcctDtagtcVYcaataaYcNttNaaaHctcaRaatttcaNRgatSHgV
+atagctRtcatgaBttMaaagRtcgHVtgRgStgatttgtagaKagaRWRctgNaHYgaa
+atBctgtttRttNWagaccgagKgtgcggHKVttaatattaatataataDtaNcctacaa
+RgcaNMctctgaaSHWWHcttagtNagtWgWaaKtYaNgcBattatccaaaSctRRHKaN
+tKcBgtgagaDRWBttactaaattSMctatatagaaYacDgatttccVtaagRtgRataa
+tatagtctttttatgtMgtcaacaaNtaaaaactctWtagaVaaaDtaattatagtBStc
+gaatDtgattVaatMtcaDattVKWaagatagggttgtMRSgtcYgWMaatgNtagtcBt
+tagtttctctWaaMtVgctWgSgtHagaSagactagKtagWggcatttHgttgacaaact
+cggggHggcWBgVgtatgggagVgagtcVcBtDctttagtctaagVWtHtgtttaScata
+cMBtKgattatRtgtttgtctttDggcHaBtRtgtaataNataatttataWctgaYWata
+StcHaatcRtaaVagDWaSatagtaccNDgaagtatacgttttacgacgKRtattgDcta
+tRRattVtStaaactagatgVatttagaMaSaaaattVtatYtgttgtRMagtHaatttS
+ttaaYNaggWagtgcacgaMcactgHgtgtgggHMgtKacttaaYgtcgcatcSatattg
+BaagtttacMtYagSatttatttaVtaaDtaWaHcgNatactgactHtggWtataDcDSc
+atactcStcDtgtcgtgtatgaggtHaaNKgDattgcBccaagKgtatgacKSMtttttg
+ttcaaatcaaYtagtaSatgDaaaMccKNaMaatagaataagcaattattataaMgagtg
+aSgtctNYttattHaNaYYtcDDtaatNRgtatttaaYtaaatcactHVaHcStccttcc
+caaVatcVggatKtatgRaaDBgaYtttacttYggactSDtaBcaaNggggtattatatt
+BDcttagagYNMatBgttYaagactMatgttRgatacccgtaacacBHtatKacWgatRc
+HttaattYtKtStccaaatVDcaNKHHaaataatagtagtatcttgctNDggVaVVtaVa
+RaaagSaccgttctcMtVtgNBgtDtttctYgttactBctcRtStWtWDScMtcWSaRat
+gaataRHctaNtcStctYtWacagatgtatYBtHaHWBtacggtDcaaBtatcaggtcaV
+attaNctactgaaaatWaDgactNWtMtggagaattBaataYcMWYcgatMYatWtgatt
+SatgaRtDaRgccagtSttatatRaBtattRcWtagtVgaagttMctattatatDttagg
+tctKtgtgtBagacgttatRKtgatctatttBtataactgataacKcggagtgHgtVttc
+ttgtKDgcDtaYatBDatcaatattgttNtaBacatcgcNcaKcaWcRataWcVgtacgS
+caWgttcggHcMttcRccatgaRStYgNacagatacYacWWtggNaDcWagttHatMaNa
+atNtcDMDcMaKgHNatScVgatKWatatgNRgtccgYgaagattDHgtMtcHaSNaaat
+tBatRagtaaatttacaagHWtKatcaagtccHtYcctgttKDMSgtactactVctgaca
+aaaHgatatacataatKtStHgctScSatNatacaYttaaWHtctgaatYtagtHtKagg
+ccWBaStaDctaagagNtaatcaatcgttNgaYDaagtaaaaHatagaatcgcgBaYaBg
+aacSaaWaaaaactccgcMttHttYgtaagaMctKBtacSagattcBaaWtaattttacR
+ttatcgaRtacaRHgtgRagaaBcttaVgacVDgggaatVatagaactRRtacgYttNat
+tVHgaHttacaaaaaaaYtcRWtgtgattatgccaSDtttatKWgaatatSNDgatttta
+acgtcSRtatggttcttcBtWtttMtBtMScttaHatBattHacYtaYacattcgttKgt
+cStSctcKtatatttcaKSgagcttccaacaccRDtttDaccattatatSgtcWtVaaag
+ttgtagccattDtYaatattDaccatcVDaaRccagttttgtcHacMattcHgaNcatgt
+tKcVttcctgtgcSataaatattgaKtctaWctMRaKggtaYcaagttDttcgttacRta
+tgatggHNaWMtKttcatattaaDaSaBaaaMtMatBgKtttgHtHactaatcatcgtWa
+atKaaWcaWtcctVttaaNaggaaaagtaaagaDctNttaDBaBgatagMgaataacRcY
+ggatcRaaaHaagatRDtVRactaYagttcaccaaWtctcSSaaatcSKattctggDgaa
+cagDtaDagacagtgtaattcaStYttNaStgtaHgccttaScatMRcaccWtcatttat
+RtaagatWtNataaWtMNtDVgWttgcWgtgaRttttRgWcttMtctaHacaaYtKctga
+BagtRagacttDatNttaaaDgRtatNcHatcSDgtBatcttacVcYacNgaattaacga
+gttgYgacttDattatacBattMgctagcctagatVcaactNttcctaatgtDaacgYaN
+atagMatSWtYBaaaRtgMtatSRgaataYaScaVgtaScMagatNNtttacaaHBaWtN
+tRtctaaacDaaaaWMcaNtcVaDNcagaDtgcWKYgagttaHtgcDYataaacataBaW
+WtcggtatgtgaaScaacctttRNatcgttaaagcaDctaatgcBatttacaattVaMgS
+MMtccYaaaBYtggattttcataWttgBtatDtBgactaatgtccWaaHataaScHttWt
+tDtcgtcaagMctMDtaaaatRtBaaaacaatgtcagcatBgNNBVttttttcBacWttt
+WtSWWtgaaaaSacgBtaaataaagtcDStaagaactgttaatYatgDctattactgaHt
+aaatStHaagacaKtagDtaaHaDgttccaaDtaaggacactctDggcgtDagtcWaHgR
+cHgDgaSctttattgtcttttccttRYaDgNactaaatcaWggcNSBagttttatatStK
+gtcRtgattaaggtcaSBttaacaaKatgggatcaaattgRgcBagtNtcgDcatttWcc
+tttgtNagDgctgcatttactttgtgtcaBgSatttNHaMcggcagSctcKDtWBaagSa
+gWatggYtVatSRgKagattgaVatKttcgatYatKYSgDaacNtcVgtttaWataWtgV
+ctgcgSggMgatccatgagttgtWcatYWWcctVcNHagtNtgtKtttgatcaacttaSt
+tattgatNcatWaVgNHcagStVHcggHacaaDttgDttWcaaRaKgaaatKaattagta
+WacattgaaatgtgaatgacagtgaRVtaaYagYtcggcatMttgaaggDgagDRcaKgH
+tacacaaaMcaBtagHactgKaatRtNttcttcatcatNgYgStggactatgSMttgKtD
+aDgacRRgtWaVattgatttaagYctatatagactaagaggtatWtataaactaYaHRct
+StgKWcgtRtKtYtYtagacgattRaaYBtaStcttaWataatcHttataRcactgagtg
+ggagccaattctcDtgDaggHcDRVaVVggaaBtRttaataaRRttgtaagKNcaVWWgt
+atacctgatcttBtcttRgaWcaVRKcagttSacttagcgtKtgtYWatatcgNttcKac
+cacacVKctgattBtggacgtctgacaDtWKttattttgMBgKaacaDataattWtBtBR
+tVtacataaatatttgtWtttatagtDtgcctagctHYaatgcaNaaRcaatVtacctgg
+gggKtagBgagaBgRaaNttttMtMagMtgtgattNctcNaKggWtMatcttagWgtaat
+atatNctaYBggKaataBattYtaattataVtggNtcgtgtctaattaaacctHtacaaa
+ctDctDtctgatatgMtgataacWctgtgYSaaNScgDYaWtatDatMKgcaatttctgN
+cgtHtaWtagatatcYBttaattactcaaaVattYRWtatttDtaNMYMttgattataat
+gcgNggWaatYagttgBagNcaagaaaDtRgtaaaagctgcatctagcttaVgtBttata
+gcKMSaattYtHcMaBttcagtcttgKatgVSVttKgttttttagtgtDHgNggtcaVta
+tttaacNtgaatatgctatMcatgaaaBtgBSaWctaataaattatYttagtaDtaccgg
+aatgagtaattggatttaacBtctSMgWYtgKgattacgRctctccaatgtaggcctgaN
+aatScgYataaBBacaKtHtttcatgaaHtgBtagaKHVtacctVtcaaccaDaaWNHNa
+atgataattgatgWcagggtcMBtgSgRataHctMctgMHHtKaBtaaMtMgataaRWta
+gYtgaaMaSgctYtgcgaaHatDtatgtcWRatKatatYDcBgNtRaRacattMcagaHg
+aaagRccgcgWttggSatBagagcHgYtatctVtcatYaaVRtcaSacaMYDcgRtcaaW
+gaRgataMtaaaacaggtgtaaYcattgWgDHcWgttaVatttgcatctaatccacaaag
+aagSatgcgtagRgagtHDgaVcgtgcttatggMttttcatKSctNacHcctMaKRattt
+gatctaaatgHaaScataataatgtttgtgtHaVcaaaaNHaaaatcgctgSVtattVtt
+agaaNWcacagtgKtatgattHcYcttgDaWVataBatBttttWtaactNaattttcttt
+aaYHaMtttaaaccgStcHaVBaatcRacaaWactgtagVKtNRtcctagcWaatNgctK
+ccttctcDaBDcatYHatatgcaataaBaagaatgDMttaHcaaYYtcactgttRtgacR
+aacctaWtBtBMagBctaaBaWtgatgVtttattataggttaattgtaatYcaRtVctct
+tgcacSaaMaatactRSgcataKcagcaVNKttcgSatcaaactaattDtaHtNaVtgtt
+ttttaWVtatNccagWttcgtatBcgttVctcBttaaaaMSaDattKRcctttcataHaa
+ttaatWaaataKcaHVaggaatataBYKHVtgVcVgtcHcttccgcctattDtMMgWaac
+ttgWttYtttcMcgtcctaaVHtgWtggtgacKtcaWaYMttacttagVWtacgSatatc
+gWcKaaatHKaaaYttgtagtcaacWtttggtcaagttgaaBBaSHacVcgYgttWBSRW
+ggtattttaYDtHatattcgatNttacaaaaVacaMccaaYStaataRttVtcttagaVK
+aacaWcgccgtRatcatctaaatccMcctttaMggccHgYcDgaKctatgMRYBagcaND
+tgMtcRttgtgHaRttacatgaWcDtgctgtataggNggtgaatagBgagYNtatcagKt
+HcatBatgVKgaHWagattRDatatcgYcHagRtaatgWtcStagcVatNaaaaKttgRa
+RBYNgtaaDtStaVRgcMccatMWaaattBDatttaatttataaHtagtVVaDRMKBtaa
+caatttttttDaRSgaaKDtVaBatcagtaaMttaagcctRgaNVgggttcataatagNa
+tcctacactacgcatgtcggaYgtaKcatggattgactttHtaattWNRaaWYggttcaa
+aggaaNtaatgcHcaaaattBtagcttattcaagVtatttWgcctaKtatBttDYcatta
+gDacKVaYNccgYaYRaaMaattRaagaHtatgcttgcRagcgctSaatagaaRacaRac
+SccagcacVMataatHgRtagcgaKgYRaDcVWSDVgRaMgcDgtaattttaYttggtaa
+WcttKDaaYtatMRcgKccYcagtYcBgRccattcaKtgaSSRtactgacgHtgtaaaaB
+atWgcaMcBcYcgccagactcttcSatYattgatgaNccaaaaWaKatVgcaggtWtBcg
+ttaRMagcaaagtgttcacatataaagaHWtKatctacttatatcacYRaaVagataagt
+aattttgatgtBctaataggtaRtaaHaattgtaRcStYSYaWRgMtacaHcNSttVNSc
+attNKaaKgBtagtgatYcaaaStactggttggggaBggtNtgtcaaWBaYVSNgtaata
+BNtagtatatcacMcScccVcgtVRRtttNcKaSRNaNtHRttatttattgacaatggSa
+BagataaccgttcctaDNaattgctVtatNtHtatagSccaagctKttaaacaaattatt
+gtSHgMWgStttNaccattBMYatRtccStNgttgaaBcctVagcaaaatgatattcRaB
+ccMWaagKtttttcMtgaRYNaataDttgttWRttattggHtNtataatggttgtStYga
+McYVtcattaggtaatVcaNggaRtNataMWcctcYgcgagagRgcHMgcWtgaYtVStt
+gDaacgaaaatMttYWtWttcctgaKNttatttattRaattaagaccMKtttcWgtcaBa
+gKSaWaaacaNtaYaDtBNaaagWtHgacaaagtgVtcatKcgcaatVaactatgcgaaa
+ctccNctatatMgactatttatSaaVttNttRttagHtccKtHtaaaNatttYVctaatt
+taaaatHWaNtSacgaaaHggaaatcacagVYcctaattcMNtgtYtgagttatttaBtc
+RgBHNacBtactctagaacgcKaaDWYYgcattactVagaYtgaVVcgcaNctttBagKR
+cSgaaatttgtatccattgtggHcaatRtaVtaSaBtcYYcatcgtgtcHaVttaHattc
+tgtcaBSNYaKBBattaatggctgtHatattgtBacDcBgatttaaaNtggaaaaYtNca
+KagRRtRgttRtMtWgggatcNtacacctgtWKagatataaYVMtaaDtaaacctctgtg
+tgccttScacWaggaYacttttKacgtttgtgataKYagaYaVatcWcSattaMcatBYt
+tYaaatgStKagWattKtttaWgtagaaSgtRattcSaDagVaMattattYaagccSgcN
+aaDgaaSaggtaNgtWactaWcgHctgaNatttttcaatgtaMHSWaRtggtaNtaHBtt
+tWWaaatattcVtBtctStWtaWMaBcatttcDagttDtttatatgttWBtNaYatcccS
+gtgagcgaRYtBtagaDacBtaagaataWactaaaagKtaKaWaataacKcccgDtagcc
+aaagcggaatcgctSRtacKgcactacccHaactMgtgccaBaRaaaBVtcgSacRKttt
+StgatcaaHgKtaaKaccHaccacccKttgagcttcSttttKKcgacBgggtYMaatcBS
+tcgDBtMcataWtaWaMtgaataagaaDatccSYDtgBatgactBaVtaagatctcNMgt
+caWKtgcWggcgatacgtgtttatttWaDaNWBNaaNtNttcaaatagtaatScgHtMWt
+tgttgaBaDtgNatSaagtttHttaNaNKaattKatttgatcgtVcatgaatatBtttct
+aacKaNttVttSagccatRtatatcactcHHatctWSKttaMacaaDattccaRaYtttt
+agttaatattcctYaacVactgctMcgagcaMYtttgaagctagtKgNWttgaaaMatca
+McttcSVatcaatgtNactaaBagatagagtDMgtNtNWatttSaHactagaaaDggtaa
+aaNctMaatagtaHgacgMaaacMtacatHtaSagaHatYDccagtBtgaWatcYtVaag
+ataattgatcgacctgcaacgttttattacNMWNcattataDVDactatattatYatttt
+gcgaagtgagYVtagYaWaHaatctgWttttatgcHaacgttaccDaKtatagaccaDDt
+taacgtHBaacatccgtYaBtVtNccaaataaaatVactDttSKtcMtDSgaagctaMta
+tattgattactgtNaagNBcagHaDattaaaWttacacaaatactcaatSDatagctcaD
+ttWactttgaStaaDtagatSaaDtgtaatKtgVataggaagWSaaaaKatttaaagttt
+gcgtaaagcccggNWaacatacatgttctaRcaHttVtcattatctagttttNcataaac
+DttWaagVtNYtaggctttggtatgagaWgtactNaVatcactVttBKcttaaccttcMt
+atcggtaataYaMaYggttgtcaaagSWHctaRMSatVcggactMatatccgaatctttt
+ttcgagtccagtttgaMtcgcatcaaKagtattRMaaaKDBttDNccatttttaaBNtVt
+ccgtaatgaKgtcagMVSattatttaWaattttaHNcaaMaHttgtggctattctacDtg
+aagattatcgacaaVRHttcSaSaatactNHWaaNcgtWaWgaccgRSttNtHtcttcKa
+tYatatBaagtcgctBtgagccatatScctKaagaaKDaWactWagBgctgattBagKtg
+aaataBaaaaagSacScaaagagtagcgaDaYtaMcaYcKtaataMatttttaactttgY
+gtcgaaggacgcHctBcgYgaaVacRYagagBaaYgtagattgcgagtcaagtStDagat
+BgtgaccctaSWtctDgactaSHttctWatWttctaWtatctYacactgBWatKKctgta
+tYgacaaHSatYSaNgSagtatagatgagtatttatgaccMaatgtaHtStaWttgYagc
+caWattcagtBaYtaaNaBtaNatactggcttWcaagatDctacggaNctatcacatSgK
+gattgacgacccccgagtNDtattgagaaatattaatcVttNKtaaWtYacgSNcBHgtt
+gWtatgtttcgccaactKaattaRgacgNataatctacaacKgttBatYatNMSaaaNtc
+tKgacttatgcttatKtcaVtVcagDaataattYgNtRtHaagcaataHcacaVgtaNNH
+tHDatgttaMNtggWagSVaRttcMVDtcttWgtRttctacKaaVttcVcgcatcctHRK
+tattSgttSacgaagtcccRDVaacBWagtgYtKtgattgSgaBtgccBtcaKacaData
+cttHatcattNatttacgtcagtgaggcBtaRNaRcaSgcatattatStatgctYcacgt
+attcattaaRtgStcttWgtattKtSYttNaHaRtNYcRaYtVtggtDcKcttctactaM
+cacggcMtacgcttctatatHtaatggcattMDtaaMaKattgaagtBaaKMVMNacKaD
+tttKNcgagctaaagtccMMtgagaagVaataatggcaWaaaaVaBgtaSaVgaaaSaaa
+ataDttVtBccaNagcSBgaMaDaVaVYYRVBgttYMtagtaactDtaagWaattBtatt
+ttMDYHtSaStScRaKatattacacctMttgNBKtcRtRggNagtYMattaaatMctYga
+atgcKHagSggaaaaBcaggtHtatWcatcgtStagMcctcatgattaWRcStcgWtgRg
+ttttcctaacatcgctcgDDtRaatatMgtcMtHtMaDYatgDatttatagctKDtYHaa
+aaattaSatatctggtctttattttatMtgtYttgtcatactcaaVcYBgatgSctKtYc
+ctWaRaataWcMgNgcgggagtcttRMgactataHaHtgctNtVaatcaaccacgSRaDt
+gKtaaMSKgtaaaaWaKtttVagSDtaaaaaatgttYattttNagMHaaRtNgBttWatt
+atatgcttatatcatttatKtKaaaagctRaaatcgcYgacgNtacNtccVtSaaatttc
+DVctaatacWgcaMtcttSaaWaaaWagtagtaattaactagRttaVcSaaatataacHg
+HatWaattggaagtgcgSSgaaVtgYgSttccatWVataatcgaatatgHtRcgtBttct
+taaggatatgttgtBcNtaatgtcacVatactgaaatMBttRRcRatccatagagggaca
+tcgccWttagttgWttatKagtaaaagHtttccttSatVatKtgagcaatttattaaYVa
+ttcaaattctgSattRaMtgaatMgttattattacaNcggVagccttaaKgccYcaaDat
+tWtggMcttMacWttccMVgtgaattctDaBYgacttKYtBacatgctDcRaaKaaRaat
+atctttagKcKtaactttaatNaaggctgScacctYgcgcaaaccaHttVHcBaDgtaat
+HaHVaaatMgttggtSatHtNNaaVagtgtacaataaagacgKttcaaaWVacagctcac
+WHaatcctgtBNWtaNMKcVcVSWtSgcaattctgKtVVaaacaRaattgatRcgBacaK
+acVccVMactagcgMNaaactgataDaSgagaatVHaatVSVtccggatgRgtagRattt
+gtaactaBataVaggcaagHgaaSMSaKgctRagcStNcatttVgctatacttcNDtcaK
+BDcaHtDcaatagttHttattMBgagctgtaaagtMgatStStcagatatYcBtataacR
+caggRaaaggtaWSatKgatatgagcgtgMYatcagcatVttSgaaaaaatatatgttYt
+tcattatacataatVcacgattataDggttBtRaagtHMtatagaDgNttggDaKctBca
+aRcgattcgtgccttacaaaWattYWVcaaWagDattgaaagggaagaHattBtatVggt
+aHtWtaMagtccagaKttSatatcaStDtgWaagtKWaggtatttaWaaRcattaatStg
+aaVtacggaacatKctacatHtaaaBtcNWatttBBaNatRcDattcgaactataaatta
+taactcagtSgatataagRaYaKHctggtaaNtttaaNgaRHtttattatacNttttaDc
+cttYgtaaacaggaagtgataaacatBgaSgtaaaaaaVcBgtWNtRMttBttaaBgtaa
+aatatcHNStaBtaggtaVatYaccNtBaWagRctNSacRtMatDactStVctaaDtaYS
+RgttaRNttttKggccagaaBcatagtYcaYNtDatcgtatVcaatWRtaggaattMcat
+RtgggatgtcMggMtttataagtaBgtggacNaaKYtgctWgagYtWcctWtVcttaaac
+taRacatggtRcatctSDcHcMgcaactttttagttaccttattHRgtacggcactDBgg
+tMHcVaaRatKctSHacctacaccactaaHaacgSttagKtKttttgNHVgagtaYaMtV
+YNVcggttaSBaBtaatttSRcgtBgaWaatctttttKggacaWKaattKSaccttgDRg
+tcatatDatVMtMaVcgaattaNaagMWccctaaHgataatatgtattWataaaatBaaM
+tgRttcHctaagctaagatatattMcggactaRttttKaSttactWYtgBcaMMacRRgN
+tactttaaaSKtttcaYBaBttaVagtRtHcWaggaVccttNgtgagtcatataWttYSc
+MtWgVRgattWtaSggacggWWctBHatattataaKaagttactaMRaaataSRaDttDa
+aatataVHaatggaaBDgWgHtcKStVcatHtaatcatggBWaagHtagtMtgHcHtcat
+ggggWcatacaHNHagcDatRcaaattcgcttgDggDNVcaacgSgtggcaccttMttaa
+tattVYtVgaagRttaBcagVaYaHcaRDBagatgaVHtNMtcttactDaggMgMaattR
+WDcctVtgagaaaaSKatHHttVDgtctgtcacatHNttgaatSaagtKBatatagacaa
+RVctcWtgtacKtaacHtgHataSgVtactaggtttatggBgtcaaaYaDgaaaaaatcg
+MtagaKaYatgaattatYcttKtacaatttgWttMaatBgaatSttMtNaVgVtScgctt
+ctBHKgtaRcNBaatcDtacgattgacgtgctatNaaBtMgagNgKcttWcWKacactYg
+ttVgNcgaattttcttgaaaaactacccctcgcNtgMctatcccacMcactcMatttatt
+tagtagaacMNtttcttgYKaWtaaBtttcWttagHtgtttctcttgtggctatgDgcta
+atWDataatttagaNcgcRRNataKtctaataHgaaMYctNaKWtactaacDtgaVcgag
+aactggtaccaactHgaggctagagHHagtMgKtaaactacaggMatgtYgSBaKaaaat
+tMgatRtggggtHBVgttaattgKttaaRDacgMactcaaacStaaagctctgtgccttc
+gtSagtSaRctacaataKatattctaVgtgtaattRacKagttattgaMtaatgaNatac
+DataaggactttccNtStatatKaagaataKtatggtcctctatgaggttaaDtgtattg
+ataaaactggatcactKBtttggcgtcaaagaaaNtagtWKatctaaWBactDaBaYtac
+aWtaSgcaattattWgaaBgactgaKctatBRgtagttaBaRRgatttaagBHctStgtV
+YRtaaataaagtMWtcHgcattcacaaMWtcMccWttgVgcHaWttcaNtgtVaggNgcV
+atKttataaWDcccctatgatVttttattacagRBBWttcttRaWgaatBVgcgtHgWga
+ccagtYacaattgSttaaMcVtDatttaVttRgttKtcaYWatKtaaDtttWaYtaatYc
+tSctatagtcctBtccMaMMtaMYHaSSgKaaacttctcBtMtgDtgtttttagRcgtac
+ttataHgKtNtMtKcBtaNKaHStgSagYHtataDtcKtagRtNWaacVgctVtRtttSt
+NtgaaccttaVatgagaaggtcaKSttaDataagcYaSatNStcaatDNgttcgacaatt
+taSgaRaBNNacattRatNtgSttHVtgWHgtSHccaactKttYtatHYttVtgHcNgac
+tMcaacttBatatgSgattttacgtatttgtggtScaacggYtHtgcatctatttttWta
+SatcagaYatcgcagtgtgtMgtattctttcattaRatttStcaatatgcttDtStaaag
+accDcVtaWNcHYtWMaMcgaacKcaNcttacctaBtgcDacatcaHKtRcDaaacataa
+RacNNtccDataNactttatBSDYatDtctBtaBatctDatKaMcattMatatcDHctaa
+gRgYVcatgttcgtgataHDYaagttSgHYctaaatgtaaaactNgtagaaactaattRa
+atcttttBKcgaatSctMaggVaVaaatgagataaataSgttKgtcatKaKatDYtaaaR
+ttYaMtgctcSatRtagttttagcaaNtaKgatcgWYcacDgaatcaatactgBgaNtaa
+ctaaWatatacaatacactaNatcaVaKaaMaaaaaatcaccBtgttgNctaacaBattt
+taaKWcaggataWMtaattgtaaHtgVtcgaHtScaHtctcHacVatagtaMcaaKtccc
+SagMYtWcaaatHHtaagRttDagtMtcYtttaaWWaaaVaRtcHNtctcSttagcacaK
+ttgtagtNgWYtatKDtcatttgaacctcKHtatccttattcttNggtBgtgtKaggWtY
+gtStgtVaRtaRaaagtagtgtcgcKtKagatgagYtttaatKcScctgaaaaaRaaHtt
+tttaaaVgtatagKctaNtKaSVgttcgagacattttRSatagttSacataMtaYHccac
+ttttctatactagtatgaBaagctttaMtgaatgtcaKYtaaatatggattataNcgBHa
+tcctaRaaactgttgacttYaHtStcatcctDaMBttgtaWgagtaatWKataaaBgBat
+tcttttctttaatWStaatacgNaagtWaMaaNgactMtgaaDaggaaaSctaSSgatat
+DttattatcatagBcaataVcHcRgcStaHaaatWagatHttMHactaRacttaYaaaaN
+tataHKVaataKtatgatcgtcVaaWgttYtVcaaYggctRWttaaKtRttDaKtgtatc
+aattWKaatBHaaaaNgaatggStHgVVgatMgBYtaRNgBDttMcNtggaNgtcaHtgt
+tDcNaggBtatYtacVaNttctcWtactHYcSctgtYtDtgWaatcHgatDatatcHtct
+tatattaaKaRYaDgaatgSYcgactgcRgaagttagtStYatYtttccgacactacagK
+caaagDttaatVatcttaaacRaDatRcBatKNtNtaaaHtcBgatKHcWStSRaKaSMg
+taKaBacWgDDttgYaaYttaNtDgHtatSaSataaaaMBaaDtaMatDaagWtggaMtR
+cacttatggctNataaaaatatWNMtacctatgtcaYKaRacagttHDagccgtaaYcaa
+tataatcatagggaaSatgMYBcKBBtaaRVRatRtccVtgtgaagVNttcttagtgtcW
+ataVggtaaNaatVgVaKctttNgtttagtaaagBatBtgaYSagHttSYaacaStcgca
+gaSttcDBtKtttggtctacNttgNgKNNtcaaaaKWactgaaYgaYactatHtaWcaac
+tgttSatNVtgtctSttYctgattVaatKgtaYcaaattSgttaStatggtccaatgSWc
+caaactattgccgttacgcNatcHctctcaKatgtagtctattttaaggHRatcDaagSa
+VgaVNccaBKtacgtttStagKgtctaHtcattaYcctaVKtttaYaaatYtccgataaa
+VttcDgatWcgBtcctaatttNaattgctDYgtgatcaatttaagggctctcatcKattg
+BtaBagcaYcKctctttNtaacHacNStggRtMatHHgtacatgcaMagtgtccatRWtt
+RKctaaaDtcMctttaNVgaNtcMatcacHcctgWtaaStcacgtctNaagRNNaagMaD
+tactDgctttttcatcYacttaKttatgcStDaStNaMgDtaacKtMtacctaaWattgg
+tttNaaVHatgaaattaattacgVNaaWtggaWatctgVatcacYctcVHMtVaNacNtc
+ccaWtttgcaacctcWctHaatcttWcaaaYaBaattSctYatctaagDgBttagtaSga
+WtBcRcKtccYatatcKBgtctttatgaaHDcgNaMatggatgtWagRctStagagaaga
+acagctWtNtataaaataRatHatKgctNactHgttRgRgVcRacatgHYaNttaHtatt
+aNStaagatgtagaHcVctcYgggccYcaaaatgatcttctagctctHMaMMgcaVtgHg
+taagaWHHtggtaactBcaMNNctagaacggWtctttgaggHcYNaaMHtaYcttKaagt
+SccgttgggNMStatacDttataaaVaYcKtcgcattttcgacctctcacVttNtttatt
+gtcttctaVcatagaattMttgtHtMgacataaatagttctMtgtWgWctttcaagYgcg
+tNaagcaaDaVHaaStMtaaagccccgtgVgtcacatcHVaDtgttBtBacBtcggYttD
+agaDYtccMttagcttacNcgaagatRtDataRtgctaatatatgRtWVttatWKtgcBg
+actcgagaSgtaaaaagttaaWaaagtatttctcWtatcBtcataacNcgctcRKaaDKa
+ctRaNtagtatBtgaaatttcgcDactttaNtYgagagaNttgaattaataaaSMattRH
+NtYtgttgaDBRBttgWttagSatgacDggNVagRWcggctacDaYSgaaattHgtYaaa
+gctccVtatacattaMctttgSgacatBKaattRgtaBRtttaactattctagcMKMttt
+ctgtgtgVgtctttcDcgtaaMtaggtaaaDtcaYtatccgattcYtgaaRttctKaNct
+aYgYaattYgRttWctWttaaaccaatcactVatgcgYttgaaatgatKBcNRgctcatg
+accHagcgaaaatgtVgccatcaBSatKccRStSattaaatttggtaagcVattctgVca
+ttMtacatMgaaaaaataYNDtDaatcatWattcaggNcaccctcBtgcKcHagYtatBa
+tgBttgtVttaYBgBgataaHNtacRtcaaBaKcagNtcagaatYgttWgggaNDagtat
+agRtctcDtDaHScagttcYcatcSYacHcagagNgtgcHagtacagctgRtatatMtaa
+tRaWMHgaaKacaBRtagHtaaaNcVHcatWBgWaaacWccggtaaRcattgMgttaNgt
+tVMVttgcaagagaatcaaaaaagYScKVtgccgacHgacgttcaMcctcattatgcBtt
+ttaagtKatDactccgBatHYgttcatcgaaatctSaKaagaatWVtcgttgtcttaMaa
+YaSDtaaaataccgcKMtatgKtgScaaDMaaaactgtgagcVtttaRcttgtaNMatat
+atttggtMgYVatDaatttgctttaaRtaBgttaYaaagKtataMtWStcHaaaaNacgc
+tacMttDDgactacaNaatBcagtcattatatSttaVgRtWgSggcaatSataVgSYgct
+BttataaYRRgaactgtgHtgacHWSactYNgtttBactatWStaNtcStcMttgattSt
+acctgaattctWatNaaHgMatattcaaaKWaBaataatHKgaWgataYcaWMBtgtacK
+agaaaaagaattttWttDaMtggttgtgaNMtVtDcaacNttactattacggKctattta
+aaaBKatagttHaatggaatatYWgtaVtNaaYgataatMaccWagagatRttMtgKaMc
+gatattaacaagatgttBBcNaYattcNgtRttgaBcctaagaSMttcMtcctcYattca
+NaRBttaatgVcMNgaacKagatcgNctaWVgttaaYRtgctSctaaaaNtttgctaaSc
+ttcVattaHtaaMacNgttNtKHMcctattttaRtttVtSgtacatBgtVaaSSaMVaRB
+caSaRHtaWtWHttMtattVcaMtWaaaNaccccgHYtcatagaaRtaaBaatttaBcca
+atcRctcatagWgcBHRtacaaDttcBgaHggcgctaHtgacagcSNattcctcgagacc
+BggtcaagWctgVcRDgVtaagtttaattatcMtgatNagYttHtYtagccRatagDtaa
+tcNtaKtacaMSgDaaaatttgHaHtRDgtaattKtaMHgaBcaWtBNYaWgtttSttta
+SttgataatgactMKatHBtttaVcYatgggttttaDKcSatttMatatcagtYaBtgVa
+caatHcaDMcccgtaataatagDataatVaaagaagaVtctccgaRgtRtaatcgagtca
+cttgttSatgNDHaSNRcggtaSaagcSaBgWSgcatcaaWatgttacatgattcWacMt
+agtgNcacgatgatttttRcWttSgtaatMRRBaacNWRHaaBaattDaagStgatcctt
+caDacccctKaagScSSHaaYHWcHcaWcaaaMBataattgDtagccWtcRHataMNKtM
+gHaBcatcgaagtgtaRgtgggaVMatgttaWRtStBHactaaRaactNctcHaaaggca
+tgcVHKHgaatcSccttggSaWatWtNcaaBctaRagaaacacgcttcKatRattcWtgY
+DaaaaaaNatWtKgaacgtNttactgWHBaccaWacggttcaaVgagaaacVtMttatag
+aagtatWtaaaNHYaMacagWagtaatttgcatcttcgaatacggaHtaatVattctaDa
+HtRKRaNHcttacatcDKttMDKaWggDtaatcttYctcWtRaaaaKtaatcctgcccca
+tgcgDtctaaVMtWRKKDctaatatDgactagWtaaaBcKcacMactMHHttgDataKHD
+aDttHttatttagtcaaVatccKWtacWtSVcaggtaatatDSatgcctKtatDtttaga
+cKaaaagcgtttaaSaaaYtgattgtKtgBMcKttgDaaaagttBRatHgcaKgDgtgcW
+ataatMWgcVaVatcYgWttaDatcatNaVgtttgggcttgaHRDaWgatttctgMHgtV
+tgccttBtWtaatcgttcgKgRcaBaRMtaattWgctaatMaVBccaHtDagaBNaataR
+cacYcYcHcatBgaNtgaNgKHttctYaacaaaYgBttRNtNggaagcWtDggattgagt
+HaWttVacaaaBtgttaNctaatactKaMaaaaaDtaRatttDaaagNttcYcaaactcM
+gaYgtacaaatMaaatYtcacVaacgaaDagatWgBgaataggtWtKaaMtgDttHtgag
+ttaatttgVaaDagttNMataatttaSVattNaDtKVccaaatcgaYVtaaaacKRaata
+atgaBDtctRtgVcttatttYtgaHgttBWatgaatatacSaacctSatNNRccagtact
+KagaRtgSKMcgaaDattttagtHcKcaaagtggtataaaggctcctaSatHtaMtRKat
+taNRcWtccgctataKggatWttaggtaatHDRatttattRWgcgatcttagSgtcttac
+tatgYgttYaVBtgcaYaaRtDaatacHHtDcttHgBgNcccataDtaaaaatctNtaca
+tatWaRMBgaattaaaacgctctctcaagtKcacNacgVRVctttttaacttgctcStat
+RScaRaMataNaKagtatcattRttNaVatcKgtacNatttttgaNcgacaaKctHWtga
+KStacMaBatgWttNSacaaKcaDaatcWaKaccgYBggMScgaMcctagcaDatgtttc
+VatgtRBtKNWHtcctWDtatttttNNSaatattcMttgatKgNgaNBatcSggtctRct
+tttttatatggtNttDYNYgaaaKctcacacYHRgttacatacttYacaataNaagaaaa
+gttataNaataSatacagttScacVaScaccSWtccagKHtaatcaaatVacatWacgBc
+tccaataHaaYtMtacKacHttttKtcataWWtgtgaatWaataaaaacatttcacctta
+HtttgttccaatcccgRBaWgatKgagtttBaVgaNtaNVBgcaataagaatagcaKRtt
+gtatcaattaMtaacatataDBgtaaNttcaNcgagatYactggttatgtNVtaBNtDaa
+DtDttaSaWtactaVtHactttNttcttcatWttcDatKaacgtttggVDaDtVagttat
+gtcagactKaatcaYtSgttttataaataDttKttKagacWgHgatataaatcttagatN
+KtttWtWaaatattacSHaRgtttScttaatWttacgRRaaMactcatBacaccatRttt
+gaacctacttcDMggcVaSBagaatcttaKMagcaVtctDVataWtSgatagacttBctD
+tBNWgtgKatWctYgaaStccgVaaaDattYatagtatcaacBaWYctgaaatttaKVgY
+tStNtcaVggtggaNYgaRtMaacataSttcagacVactcaVaagtggtattaaDBNDaa
+gtatatMtactatatgatRSgtttgccaacgcacRMtacRYNataagatcMgttgatcat
+aaacttVcatatgWtacaaaWttggaaactttaScataactRattMtDacVYataaaagM
+aattttKtgaBttKcaacatattVtagtcatgactcgDaacDtaWctatRttSSYNtgWa
+ScaaataagaaatKtagacataatggNaatttcSKtVWtgacagKWattcgVatttcKWg
+agcaWgNKaaaatatgtaaacgttcactaaWgacaccBNaacagaaStctgctaHcVttt
+MtcYttStagYcgtttBcRtaYacttgNaacMtDRtagcatgtgcgagcScaMgtaatBa
+KataactMttttattaRcattattatacgtaagSNatVRgcttcgaVaacHNtctaHBKY
+gKaccYcttagagcccaVgatttgttagactaaacgtgcaBgccaWgaVataggattDBW
+aattttgtBacWtttttaatDtMgaactaagcVtctcagBMKatgattgaNaVttggatD
+aSaBatttcgccatatgctaattgYacatgatccacaaMHtttcKYKaWtYcgDtNaaDc
+cgNaNcacacHKttDtttaggctagRVtYgtaactagctttcacaaatYtHaattYacaa
+ttaMSagMactcctcatgtScttcaaYtataaaaScHYaKcaYacactVcacataNtaBc
+aRatgYagVBatttgtaactttgRggacaagcVacctattacRcaaMacHRagagtaVNc
+tacagtgagacgaaaggKttacattgggacaataKNtattcaagWKttgatNagNtgcta
+NgagatNacSatctNatttatctatRgaaaatKatNKSBcKactatacStcagtaggtVt
+caaaBYYgctattKtWNttcRacaaaNatgaacttaRtaaDSttVBYtaatccagtNaaa
+cRttagaaccRBatataWaatKctcattcSacWaacaacactDttVttgacYaagagtaS
+gcMttBttaVNgRVagKDcttcttcNtaggttgcgacYacttaaggVHcaagDagaagat
+aaVaatctgtatRatDtKaaSDgattcaattYtcatgYgtgaVMtMaactaagaatgRgD
+tHttaaccaatStaaaaMctVDDtgttatcttaBBgccNacKMaHggcBMttctgNctHg
+gagaataYMgtaMccaataattHttYttKggtKaccaactcccHtMSaatNactcRtttc
+atgcKcatgcacttcatSaatatactttVtaYttDattgWcctcactcYccattaDDaHa
+aKcaatSttagKtWtcatRcaactattaattYaDggKtagtNcgSgtttKRgtDWtVHtD
+NcHWNtKtccgtctagtatSctaBcacgcaBtaacatgagatVtttaaggcaVttBttaS
+tWtattgYaggtSatBMBDactVtggttDagacataaactactBgcacaacMaagaStcc
+aWNaaSYMYtgtaKaMcYSaHaaaatatttMgtcaaDScaKtcaBVtaMVMRRDMtcttR
+BgWctaacttgaacNaatgttWgtggBtRttHVKgKcHVtatattSaaaatBttcBtttc
+DgHccBagtRBRttaVagBctRcaagcattacKccaWVWtaVcggttatNaSgccgKtYc
+BaagcWgcatgaNHaKtagNgcHcgtgtcataaaatagagacttgHYatattctaBgttt
+atRatctatttagacattttNtWaaSagtaHatRtctcggatttatgtgatBtctRgggg
+catWctaSVMaRtcatgKattgRcatMaHaataNcBcDcaggcactattHBgaatStata
+ttcatBgMVataaSacVacKHatggttaaBKtgtaSaWMattttMacKtgaaWaaWgctg
+RatgtgDacBtSaHtDgtgtMVttagatgattagagaSttgattgtSaaacagHaaatac
+aRcaccBtaaDtcaMtKaaStttatKagaataaNcaaBtattKaVNaWaNactagtYatt
+aaagWgHttaMcKaSagatSactctatMSagtggaYctcacKKgaSMgcRgKtgccagNM
+ataatccaVgatcttHagttttcttaaccataggggcttaDtYatcgaaaMataagcaaa
+tBttgHHcHagacagagaggcacWtacccMttacgtgNttattYctVaaactgttaagtK
+atMagttcacaaagggatgaVNMatgcaSattatcKagtHaBtgaagBcggagtWttVaa
+DaccMScactgVatccaRaSatattNtgcBatgBaaNgtcaBMgggaatgagtatRgaat
+gtNttacaggcttaHaataaHSagatagtgVctattaaagggaagDWVccatcKaaaatR
+ccccaSVaaatttMtatStgtWagtStMaaatBctgcctKWgttDDaSKactctaaVRta
+SWcVactggaaaaNMaaaccgcacNtaVgaagcttDNgaDBtaMaMKNtKccaVtgctct
+tMMYaaaaHaattcWgHcgtacatWaMaaKtaataccgBDaYRaggatatSKcScYagMt
+aatKHMtaaccatgHgtagDaggtgtaaatatagaKVgccRYctcRaKBKWtgatHYcaH
+gBaYtttMcatataatgaDttcatttaStgtcVSgacggtggVgtBtgacatgtaaSgtB
+gatKtKtaYcatVtNattataaaHaSccHaaagctSMKattcatagcacagtgBRataac
+aatMttKcWaaaaatagStcggRttaattatWaataatMaYagatgVtatccttttHaSc
+gtBgagWcatgBtgcctatcgtaaWHacagtactgaattaaaaaNattRNMaSSNSctat
+tcaaagccVVcatattttagMcgtattNtVBactacScattgKVtataaKtttgNaWctt
+NacctagtgaNaaDcagtaWgKggaaKtacgcaaaYttatacSttgYaYttcDNagggtt
+VDagHatSgtacYVatataVattataSataacgKgatVtVacHYRWttatcctaaDtgta
+aDgRDttttattWtaaDttggatcattNgtVaaaVggaaggcYgSWaaattcWHcgaSaV
+WaMatctMDtHBgttttaatctaWaagatatDKtVttaccgaMatRaaaBttaNagHatD
+HWcDtBVttaatKtMataYttSRHHcgtaHDtggttccaaagRRtaWtVctRcaNDttat
+acgatMcaatNHtacgaattBaatHtcccatctctccBtgtataYctatgtcgaaDYWtN
+ggatNcacRtMaatNtKcttSYSctaDaaaggctDaStatKtataBgcVaatttggYctt
+aaatgatgtHctaaccaactttgggttcMaaDattatKtVacgVcScaactSataSccHt
+tYctttgtggcDtMcactaNSBtMRBMaggttWKtattaatgtKHacttcaMVatctgtt
+gtccaaYNtaagttKaacttctHcgcWtYttatMBgBaMacaattaDaactNaaatSatc
+VtSSgatctatgNatSYaattRatgcDgtctataagagaagRgatatttcccaataHgtt
+ttWKtgaagNRtctaaBtWcHHcDgaattgaaaKtgttaaRtatgtaMaggDttcMacca
+MaattDctgYctaWtStaNtgRKaBtNcMHcSttMtaKccYacgNNctttatStgVtaYt
+aagttaagaBHaaStVKHatgttRVWtataMtSatgcaattcMcttatKgMcagtgaatc
+YtcctNaYcttactttctcttcatggcgNcatScStBtagctWtHaaWattaccgtctcg
+tBMcaaacKctcccaacttBgtWStVttMRgKcVagHttVtaagMaNatcaHttacatcY
+KttDBtatgSattVcgBcBVYttHNtcatKgcYgaaSaKtatttttMtctatctaSaatt
+DttcWagHSacgttagYgacWaSaDKatcNgctaatgVSctgctYgaKgKtaataggtgg
+agcgtcgaaaaRYtgYWYSaatacBgacWtaNStcaattWtRcttttaaSYgttcNgtBW
+WgtgaatHttttBaMcMtKccagtattttcgaHaDtSVgatgaacatgcacgtcagagDY
+attBcagDctcttNcNtaaaatRctgMcDacaagtttagtcaaSSaagaaacatacaDtc
+tctYgcaaacBcaagaBatgtattgacgagYacBDgttcgtgRtaMgaattttcNtgVct
+tctgtctagtgtccatatctgatYatNtatVWgttacaDacaHDDagWtgataWtatcaa
+BRatDRtMgVcgaaattcSMagYgWacgggtaacaaattcagcatagSgttactBctgSV
+WatYcYgcBWgggRcHtataSaattBcagHgcgcctttKcttWaggctttaaDtRacBac
+taaVaaKtaaacctcgcgccattactKactKSDcgacaVtatataggataKctcgSatgH
+SatVcgtagtgaBtSYtgaBataatStaaccaagttcaDtHtatattaacYatattatcc
+tacgagatcaccgtVSttctYgtcataaVactcgWtaVatttgttggactaaaVcaSaDt
+YcgNtYtctVaMtaattatWRtWcaNtaKcaaYggatgNgaatcaatcRtcgagtHcgVg
+ttataHDcatttaagttctHtcgMRHtaaagaVactBMtatgaagtaaaaaBNtataaNt
+tcKcctaNttaaDtcgMacgDcaMatttgYtaaNtcaccgatgagMtgttaggWcacHtt
+NgtcttHYMcaattKcagttcNcaaaacgNaaSattgKttaaBaKttatttaMggHcttt
+taaRNVgttaYttttMVRtYVgRatKcgVtacgaatttccBatBgYBRtSKKctaaaatg
+atatgBtcttcgtttgacHagtaattatatctgDtBttatgaDtatKtcKRcRttagatt
+attagHgDNaaaKgcgMtHtttKtDtgaaaagtaMatcagaaccgaatKgtatatVaccR
+aKYtDHtcSagtBgtgccWaaaggtYKcaHatDDaaattDStDtcKggtMgcMtgtHtca
+aVcgtttNtagtNtgKgctaDcScgBcWSatgtatagcKgWgttgaacgagtgcgcgtKa
+aaacgRtttccatatatttttMgaKagcVcVRataccWctctcgBcgaggcgttaatgaH
+YtttHtaSWtagcagtttKtYaacaaataMtaNDatRgMBaBacSaataSDctgaactat
+tgataaRtaVtttHatWaacWtVaHaaBDtactYtaDactttSgtKtRattgatttatat
+attattataattBatagattctaacDcRMaaggttcgtcatattRVYcttKgtRcgWaat
+cgaaWWatDctacaaaagaattHaatctgttttacYatKatBaccMaMaaVtcacStaaY
+gYKgtttctcattatattNgSaaHtgRaBtcataKYtHtacttgtacaaaDtYtgatagN
+RcYatgaStaaagactgtcWDtYaatVaNStagaaaWtaaaataDYtcaMatSVBVaaaY
+agaaaattgtgcDagWSaStattttaatNcacgataNBtaattggaatgcMgacattHaa
+ttctctaaMatactaBaaattacaHWgBNtNaaSattttaacHtgtagtBtcRtttSaNN
+aYaMaDtatDtagaKggYgcaaSttgctactDcNRtWgtttaVtggcaaactattgSgaa
+gtattatgDgcgtgtcttagcNtRctKggtMaHgaDaaagtactgtcgatttagatcagN
+ggtaattaKaatgaaYaaHaattggttVaaMggatactctaBgtYHMcttccVcaaWtgt
+tHHRgagttKaaagaBtaRtaaWaggttctatRatSgtatcYtaWcatgtaBtcaatcta
+atRgaYYtWtccattataBacttWtcctaHaaaaggttgacgtRattKgaagcattSBtt
+tctaNcSctSStNtYtWaWtgtagtcttgtctttaagNKgaagacgDaRgtNaBaVDgaa
+ttggaYtaccSVYKctSKKcatagttgSttatcStactcaatSMataHcaKgatWVYtNa
+cagtttBtRagYHaagtaNaaVVDgatattMaagattagcatcctaMaaMctgNtMcSaR
+cgctHMttaattDtttYttcgataaagtMtaagttaWaaDcaatccKgtgMMcatBgtRt
+aHBcttgtBaBggcaDcgaWttgggtaDaggtgatRtYaMWDttatcNtVcttRaKagct
+RgtgcNaatctgattatagattagtatatgaataDNatcYaggKRacaatcaHcaagtta
+gtKgRatRgttaagaaaatacVctaaaagtgtaagKVgcttSWaaHatagHctagtDgDt
+SaVtgatcatttaNKgKHataKBctatatWaNgtttgcRaVNttaDgtcttagHYKatYa
+VaBtaatgaBattaYcNtgcaBtHaacttVtccatDagVaaaYgWtNDBgacagVgctca
+RtaHaaacttttacaaggaSRaaatagaagaatacccVaHatcBRtcttttaaDMHWtHg
+acMtctcaagKDttctgYctctcNagaMgcgaaDWatMcMatatttDctttactaVScta
+gttcaRKWgtttKRaVaaKtacaacaKttatttttggcctataaDgtcBctBDgcYYaat
+NactcaaRgaRWcgattgVNcWaatctgKagDMgctatKttRatcattMaagtctaRaVa
+attKctgaKtatccgaaRatcHMaaaaaagattccacgtacgaDStatatctcataggta
+cgcgatgtgaaggtHYtatWagKVKgaMDcaatttWccttgKgagtctagatgaatgVRc
+ctaMttgtaRaaYtRtaacWgaaaMttatcatNcgttactaaggtDaaggcagtRctcat
+caatggYagccagcgaatatagtgttWtaccaRctagatttDtaaatRcDKtccHtBWgt
+tctWaagccYBSgtggaaagHNttHtctaaattaBatggaDMgaBgatatcaatactcMt
+aaKtcYccgatDaYgHDBaagBattWattgatttttaagaRaaggatggYggaKttaKtB
+VBcttaWcttBtacctYaNYttgctgtBaaMtWtcWaagtaaggWcgMDaaNtccWMWta
+tcMVgaSaRctaKtBgKWDacDgaaaaNgttcaaaaataMcttaWtatgNaVaaRataWt
+gKctRatataagtgttgacgaKgaNgtaHattaaRagSgattctatgtYtcaattagBYB
+atccYtgtNacHagHtacVcVacaacaccgNgBtataYaatWHSttattgctDacttgtg
+HgHcMcHacagctRSDtgattaggaDHtYagatggagWtaMatcRcccacRaaaYagcag
+atgatacatatttVBBcaaMtctctaWgaNtttcctaVcttaYBDBctRgSaagcNgatt
+tcacgtcRDaVBttaRaggtaaggHcacttccgDBKgagaatttataaaMaRattagcVg
+tttacaaagagaaaMtgDtttYttggcttataKaStacaVttBttcttgBcVaataaaga
+gtgagBgcgNcNattgaaacRcactDaaccaatWMtaaHtBgaaacaaccctcMctcaaa
+tctMWttggttttacttagcRtttacatRtccBttVcatgaaBacaYgagHttatWDtcc
+tSatRtYggHtNMttRgNtgcatcacgacagaHgtYaSaactgaaNWVagtagttagaNg
+atctgcatWYaDacataHtaWttaatHaDgactYgttcaSVtttacctaatttaDgRcag
+acaDtgcYVttaagaSSKBYtgHtDtNtcgtcWttDtgtcNtgacKagcactccDMacDN
+cccctWataRKcaaatttctRVaacagcaMtataaattWBctttgKgVcatttaVgtDgt
+atHtgtaSctagtatagcBtBtgtatgtcgcMcgagttctacgaaBgWccgaWatgcaRt
+WtaagYttaNtcWaHtgattYDatWRgRWagtRcHggNatNttWaaacaSgcaatMatga
+cNgggaSatgatttcBHcctaaggWactacagaaaagctMcaaagaYtHVgtaaHKgKat
+tVaWtttcctaWgaKattatgMaattBgaaagtgaSaaaWtSNBtttYataVgNatgaSg
+cBaaccatattcctctagRtattatctttctMtgaRtctcYgaatDtRcHgcRVtWtaac
+DtcacYatRcttNgcgaDtVctWtacHtatatgtatKaaggtaNcataKRaataacacDc
+tcctWgtSaWcatcDgatatBtaatHSNBtcaataaStHtacttaYaDaMtaagMtgNaa
+aaNccccgYWHaatgcBcttaBcgtMBKggccaVgacaWgaaaaaVYcRKctMgcaccWc
+tcSacttcVtacgaagtYtcctttttaYgttattaataactSttRggtcVgagWRStatK
+ataYcaatNMtacttcgcttVBaYRaKttaaYatacagctBgagcttcHcaatBaaaVcg
+ctcacaMgttaHaggctaDtSgatattggggBgRMagtaattggattgYYHtVtcttSRY
+aacttataBtNKgatVaWSDWacatVcttgttgaagScaDaSttcactaattagatKtta
+McHtMgKccaYatKataMcKNgattgtYtaaRHHcaWagctgtgcYatMHaatRDgtgtt
+YctatNKtSDtaKgcBttgagtKtacatgaaggcgMatDaWtcBatagtaaaatNYtSVg
+VatttcaNgRtaRaaNBttggaatVgaaaaagaaggtgNtttVBgccttgtgaBtgMgta
+aacBgtactWgtaacctatatggaSYattYtVgtttaagccaRtatRMcgWMgDVSNgat
+aatBRccNagagStHttBgctaBagatattaacaagaggttttcDaRagtcDgtHttcat
+aagaacaKBttaBgactaRatgaaDYHttgVagcMcBDgYactWgSgacBataMMcttSa
+RHgcagKcgaaYaDgttcataYKcttcMWttattaaBacDcttDtttBcatVggttVHtg
+tMgKcgaaVgtcgMaaHHYBMaHtaaKaDttaNgNtttttaggMcWttNaaaDaaaaact
+RgaatagSVHtaataagttStccaatcHataatacMcattHtacaatttctgatggacat
+atgcaaacaKBatgcagacagVcctccgcaacNatcMaHtcMtaSctgtaYgtStcBtca
+tDacRggttRgagaaHatVcttYWgaDtatgYcaBKgtSWVYtttctWttHtctaYtttt
+aBtcataaNgtBRaNcgttKgtgVKgggVtWatcWagttSttttttaMaRWtccgtttta
+ttaHatttBVtataSctRWtgcMacaattaStBcacggaatRatactVgaagMaaagWac
+aMgctaacaHctHtaatacacgaYagtcttKagcDttaKBHccgtaHaacaKVtcMKcaa
+taaaNaggttSaatcatgaNaaBtacggBcaagatcRgttttHaNgtKctYatBHHtaaa
+DNHtaVtVagttVacKtcYgcattcatacaaagtaacKaKKtaaNtNataaNaaSaBtag
+aattctgacacNtaHtataBDttBctataatagYSctgtaHcgccgaMBaggttaMHtKg
+ttactaaHaacgDatataaagcaWtgaMtttgVatcKaattcgHVNatNgDaaYtataHa
+caaacaagagtatatDStgcNgcRtaaWVVaDStNgtcaaacgDttaaggNttWcaVNac
+cctgaaaMcagVYVaMtBgtatacSacgSgNtaaaDtRaBSaWcNacgYaggtcaYtatt
+agVStaccgatgSStMattctWtattHtHaDtatgYaatattgttttaNggttVatcttR
+cgaNtHaVaStgaagactcacaaatcactgataaKBtNHtttctWWtattgactacNtaW
+atataaaBaatBttgggtatYtttYtgttttVttgagtcVaMVgaatNtaaNgKMaacgt
+aatattKWggcagtgRttgtgacactaaYacactggaaKaWYRgcatgcgttctBcttgg
+tVaaWgtttHagtcaatctcggaNWtaatBNcaMVKStaNcMtgatataatDYMctttcg
+catgcYtHtVNgStggagcBtggMgccctgtgNtVatactgcctcHcataDBtaStgNca
+gaYttaMtcaYtgtagatDaagaHaaaRcRataattcaDtcaDgttgtatRaaaaYaRgt
+ttDBgDcgaagcNttgcVttcacttaMgtMWaYaattcggaDcgaVtYattaBYaaaatt
+aHVttttWaacDttaRaSWactcBgaRctacaVStBaaatRgaacMSaagaatagYtNct
+caatagctNttaVtgctgtttgYcttaatgtgMaStactgDBagVSggtSKMYttDatgt
+MaaSaVtccSRMgaaaactHaatWWtcatttctDgcMcggVtgtRtcatctttNatcaat
+atYaKaaaatKWtDDDaaactaagtacRHtcKttacaataggttWcttataSaYctgctV
+taaVggatcctaHVttgWtgHtWttaDHaNgaccctatatgcWtNttacctaYtttDWtt
+taggHNgccatattacKggattVatatcRcggRWMtgcaVRaaHgtaataattttaggtc
+tcDccaatatgSaaaagatDtaaVtYgNaHBtcaYttaaaaacagatataaagttaaaDW
+ccMHMattggtaaagtccgaKtatDKaVHaBagaBatactataVttDttDaMagctctaa
+DSggtttgaDacacVatcttNtgatKtVaBStatgNtgDKYcaatcataWtcNatYccgR
+tcgBHacaBaatagaVtagcttgaKagcgHtttDNtgaagMttSttttgDDKRWtagtaB
+gtgagtgBcaDtWtaHcctatHatttgttWgagcggDtgtRDRcaaatagcacacRtDgt
+gVaWtaattRacVataBWacSYWVctgYtWDaVtaKataaacttKaaaMVHaaaaKNtaa
+acttgVataaaatMaaatMaagtatcaaRtatSYRtBtaataattgtttgaWtaNNtctc
+aatNaataaaaaaattgaaaattattgtgttaaYatccccHtaNcattcacttttaMgVD
+taDMtcaWSgYWcSYtSgaatHtgctagaVattaBtaaaYgatattcgaaBtgaaDacac
+atRaagcgggagggDMtatDttaatttggaKSNtactRMttactgtBggcgtcatNttct
+attaVacgttccKtVttMacttWtctaYcacgtaVtaaRgKcttggatSYatattttgtt
+acaaMgtgagagaSatattWcagDttggNtNaaYtaggaaKtYHcttgKattWagNgtaa
+gHHVatYatcattaaaaaYtHgttcaaaataattatBgcaKWKtagaatagtatBagaaM
+tattMagaMtHcWgYcacgttagtgtDNggctatNatRcYYHtaacMaSStattRagRcg
+ataaaatWNNatgaaatttVtKcRtKtDtaaMcctccaDRcaHtBSWcYtaKttcacaaM
+aataaMaactccgSgtYattDtaWctagatBtaatSgatgatHKgttgcaaaaagaScHt
+gaaHRDatSagatcBcggcatcatYVaatgMaatStgNgWaaaaMttgcYaaagttSHaY
+gaaatHattBgtaaMRagSaSacBaagtttttcatgttaaYcagYtgKtYctaStcaagc
+gtaVattaNatWtHgtHKNDtcNaKaVaStSacaaStttagaaataatgcDSatgtaKtg
+MMtcaaagtNattacMYgtgctNgVcaaNcDtaaaVtYggtaaaactgcaagaWNcaaac
+ctDSaaSgVaKtctcatataMtggBtaRttKtagRcctgttaHgWRaattgDaaatttHt
+accagctcagaccKaaBctaagtatWtaVagBgtttatgaHaaggattStaactWacKDV
+tMHccgtacaMWYctDtagatttRctaccRagtWcWgaaaaMcagttctgacSctaaaac
+tgaatcacaNcaMWtWccYgtttNaatttggttaaNtggttSattttcaacgYVccMtcg
+aactBtatcYttcYDVMttcgattaKWtatttagcaatatcagWatgcRVaatgRtacWa
+VVBttggatRtaNgRagttDYataacDVBcaaactttgtttgaccatagHMtRctaWcga
+cagtgcVcaaVgRgtaagtRaaaattSBKacBaatcagaatgtHattcaVRtatVSSaKa
+tNataWRVaaagMaacataDgataWHatcNYcMtatttggaSatttcHcgacaYcaKaaa
+tattacHcSaBVatHacactaMDataaaggcacaacaSacctgtaaRgtcccaaaatWtD
+tagtcaagNtttgatDacDgcagaDcWgatDaaKagctDWtttatatWgDcaaaWttStD
+tKtatSagVgaaKtaacgaccgMgaSaatRRcagYtgttNDggcHScaaYDWtcaacgta
+HgaStKtgMtRtaatccagtDaaacHgtacaaccHtagataNaattatcVtgaKaaNaaa
+aaaaagttgMgtcRaNaacagtaKcaBgtttgaMDgDMacttattatgaDgagcgtcaca
+aRaagtYaggMtaaactagaacagVaMWataggtatHagtttaaHtcagtaaatgRgcat
+gRctgaMttBaaataagWVtcHctgtgtYaaaaVtKtaSaaBatMtttgttatattattc
+aaBYctBWtggatBtgaggDagtgcacVataRBctaBaaaataatttttNggtccgtVaa
+aaataaattBHaatBaagaHgttaagcctaatcaaatgaYtKaatYtaaggtMgaRggtW
+gggNactaacgaRaaattSttWtaataaVtHgtacttNtaagHaSacgWggaYggNStcc
+tgacgDcgHggtttHggtNtMtttDatNDgtgacgtatacgatKatataaacaattSaaa
+gcagatKtttSagcaaMttttgaKtMtagtcRacctKSttBttaatMtgcgttacaaaga
+VaataattcaSaaWcBVacYKtacaNBaaKRtRtcgWtWBaRKVtYWWWgattgBctaaa
+tKaattaYtMtSBMBHDtBtaggDtcNctWYagtgSaaBaVtcttNgtcgttHtgtMtct
+atKtatVggKaSaagtttattttatgtactactHtHttSMactatHcaagaattVataaa
+MKNtaMccgtgatDaHcaacttRataacaNgaatcSBtatgacBcctcgggtaatWaaWt
+acacaattctRVgattctatgtgtatHagatagggacVaattttDtNaWKagtatatHta
+gacgaggtatgtcagtgagHccccaatNataKMBaHtcWgctagtgHaatBatSataDat
+atcacccaagattttcSatKgatWtgaagtcBMataaHaaMaattatgcttWWtttcgVK
+YNBattggtacttcaaMaVNcctcHatcgctVcttKatgtctctBMggacatcaggacSg
+aKttgagtctKVYaaagtaaSgaaaHaWactgRattaaBttVaHtggattagRWtaaDaa
+atgatttSMBWMaDactScgRYtgaVagNctgtSBataKacStHRatctVgBKaggccaR
+ctaacttcYKtcaDcttgaaacBBataatacYMgWgctgtacttttatgaSaaatYcccg
+attattRStccaaaBagaacaaaVtttgcttatagaaacacScccSaNtaaaaBgtaagg
+cDgtSttRatMYSWatcgtaacgtStBagttaVaaaScccSggaMDBSgcaaKaggatat
+acgtatgcWactccgVctNttMaYtaaatKaaatgKStaaaHaKatatgBtcctatgtVa
+BggaatBcgcaatgagtatHcYagctDgtWaaccagtatWWtaRtKagatagtgKatatg
+aaaggcaWgtNKaaagataWaatHaaaaaKMaaatttBtatHtctNactKtBVVagtatc
+acgtMgtgttaKtaatcgaaMHtYKNcMaatgcaSaaDBaaaaagaWaDtWMgaacattt
+DcatttaBaBtDttaaSMtcagcttttRWWaataattcNctactWaatNaBaattaagaa
+acttYRHaccatatKtaKcNVgttYagttBtaaaaVtctcgVctagctcgSVatatagVt
+McaaHRctaHStttNtcattRaatgtaRtgttaatYtaagcattgaatttaKtctaKKga
+aggtcgMctttcWaagcgWaKcttcYttgtgaRaagMtDatgWgYaataKaatSWScatK
+BtYgtaagagaVcacgctHStaacaSgBtgtaNRYaaWtWcKgaccDtgaWtgagMaYgV
+VgBaRacYtcKgatcagttgtaKcgttgagNaStctggaatVtactaSNtaaagtaatca
+attaaVaaDattHDBaHKDHctVggcaaacccKMaatVtgttacBcctStgBgMtScgaa
+HcatgctMtStaVttttcDaNagtDVaatYcggaDaYtaactaNgtccaattSacaaaaR
+gtagaaKgtcRSNtgatBacccttMtactatKgtaaRMagataMatgVtVKagaRagtca
+gMgMaatRHNttagaagaatgggaatcHtttttSgtNgYatgtgcYtaatgDctMaaaMc
+cVScgcRgKNaaagtaMtacaKaMNaBatagBttttcttttYatataNaWcagatttgMt
+gaaacaBYtHaaatgtaDactatttNatttKttSattgBatSRtgKHttacgattgcggt
+aaaaacHHtaNgMcgHaVDtgtagaagatBaaagDttaacSatttaatttaccagatata
+attggVgaRctRtcgccVatRNtDgcagBcVaHtBaatDttatgKRKagataaRgcagta
+KgagttatatcaMSagttccRcttaaatgatcttataaacaaatttcccttaBaWtagta
+gttMaacMaKaaaagHatYKactttRatgtctcgattBcSagaDKtttHtBaccttNttV
+ttVVtggttacgtaaBMRgatcgtctacaaNBtaVggttYaaggattccaNgRgtagBtg
+taBacaagtataaatBaaatKRtaMtKHgatcgYggDSgKRaSttHStcatgtatatWac
+acRacHcatYtttaacYatatgtgttNtgcSagDHgataYttNattatcVattcaaYttg
+gtaRHtWtcgaBacgtttaBaccaBaatgtcgcNagaNtKtaDtgDtatgDaBtcKgtBg
+atacNaccDDatttYtKggMtYNtaactgVacattaaHgMttatcgtHMNtataBtKSgc
+caVttaBcttattcBaagtgaWtaRtcctDVRatgaattgatatgaWgccacDaatKaHt
+ttacatNttaWNWgtacaggctacttBaYaaatatacaaaatttcgNHgMgttHctcKYc
+ttgMtaacBaDVtaatttacagaRttttttagcKagtKactatMRtgtDtaattccRcaa
+KSttagttttBtctatagaKaVttttgcNagtKVccttagRgWaNaKWttataDgcgaat
+gMKatgatRcYtctgVagaccgcgVgactagaWaaHNtcRNRKaatactcYaNtSDKtcV
+VggNgDagtttaaKRgttaDcgtNNgtcaYttggtttYtatgtaaaggattttagatatt
+KMcatgYaaatcaVactcagagtRYtgtaactatagtBaDtVaWatDatctataaaSggg
+tactaYaKKWagaaaaataaattatagRcaaaVataVagatatgtaggcWagacRWattc
+tgacgcDtaBcYattgtaDggMatgagcgagaggctaaatVtctcagRagDtSgKNcgtV
+cStacatttagNtgatSNgatcYVtHattHtBgMacRaattaHBacRcNaaccctVaaYa
+attcVccatacKcttSagtctgKMNagRaNcatNgcgHattStSKYRggtcagtcaccat
+tttagtMaccctggVattHaatVagaaMaattaVacatacacaaattaattacgtKtaga
+aaMgatWgWccatYtagacKatctKatMcggYcgcatgHRtcStVtaatHgSaaaVagtg
+aatgtgYtattaYcRagatgatcataacacSgaYaactMKttatRcgaataaMSatacNg
+aMatttcggccacgaYYMcaKattRagDtRtatMVBtaattWtMHgNaWDgStaaSNggS
+tcBcVYtaYagaHtacagttccMcgtYtYttcattgSWcttagttcgtHtgVRYgaMact
+tBtatcaactaaaaVtDgataaDgtatcatYDttaStgccBacctaaBagttgRtaSBta
+aaagWgcacBggttagcMaYatttBgtaggtRBaSagttcacgtaDaYaaaacDSaKatt
+ctgtSatatgtatggVBcctctgtgaaHDKgttaRttttBMHgRMgHagtagMgacgaag
+ttaatattgRtHtHttatYaaagcagatgtgattagtggcactactVattagatctctgt
+ttatcattYttgatHcHttagStgatgactctDaaatcagtgttgtttttcYaaagtata
+tcYcaSaacaVttcgWtatKaaaHWtRgtttaKacttctgaaNaYacctNtcStatttaa
+agttKgtgatcctBcaBtctttaaaKagttgDtWctDtgtgctataKagtaNHatctagY
+gatcMgtggYaagactgacacttaRaaccHgttcaYtagWtggtgBcStacaMcMHataa
+aNagatactccaggagttaatcatRttttgaKNgSgcaggtgttRaYcaaataBtaDtat
+HgBtatacKaataKtaggaaatatgcataaHgaKttttatMaaaNgMatYattgaatNta
+tVaggtKctttHattcatttatYtattagtataYtttagYcattagaaataHtaacctta
+ctcatYttHMRagttctDagNSVgcgVaNNattctVcaaVagaatttaagaggttttacR
+agtagtaaaBaBaaMtaScKgVaRcNtctgtataagtatVgtDgHaYttcHYttaagatR
+gtgaattctYaaaattRtcWtacDDaRatcaKtaSacaagctaNttRYagMSDKtWgWaY
+NgaaaatatNtaatatHMtMWRaRacaaaatgctgctacNKaKtagttgVatDaVccatS
+DtgaSggcgWatccBgaaVtgtaWttagatVaBWtacgWtaYattaaatMctDgDaaKat
+ttgaaatgctWctttaHtggHaBBSRVBWtgattgagatccNcaaaHttccgVcttaDHt
+NgtttaMggccVWaagattgKcaacgagtatgtccctctcttaccDtHcttcctBatcSt
+VaactaatctacatgtacataacDgcgaVttataagcaaRWataattcggtMaaBccYgR
+ctagatctNtBaggacMaaaNgctgttHgScgttaaVgattVDtaaNaccggatatHatK
+cgataRtaMcagctattcaagagaatHcYRNgNgcaWtgagYtacttNtaagStaVVagc
+tgcaaggHatgtcaWgaattKttgtcgaBcKatKKtDtRtNYNtctactatgcgatgtaa
+cDtcaYgaactSHctDataKtcaagtccVRtWaaKMRtagKttaatagtggKttYtaKtV
+ataWYgHBatataatcatNMRtDYaYcttgttHagRtYacgaDaaMMtcagattBVScat
+tYcaataataBWaBatgDtBaKaHacagtBggaVtgtgttRtgacataaagtBtaVgtta
+NaatcaSgcctgtcBBaVttctHgVttcttgttatccaatacaNtgcgctatacctcatH
+tNaBMtgtagaDtKagtHatacctHgtgaDVWtatcWgtatScattactSgatcWatatD
+ataRSgctHaaWataataYacgtacgtgDatHcgtaacSaaagYaMataYaactggaagt
+KgattKMaatStRgtatVgttcttKSMtcataVtttaDtgttatattagWtatNaDcttg
+ccHaMDttStgtctgagtRtatRSMWttaStcatattaNaDtcaatttaVatgMtcaatt
+agMYWaRcNtDttcaaagMgagaVHtatYaacggttScaaccVKHaaatacWagaataac
+cMatWgctDtatttgaatBtNttgaaBgagaaWcttggatcRctctaDagWBcacaatMS
+tBcBWtatggtagtgaagaMKatacttaYHtNctgttHSMaWttacaSaatgtattttgg
+ccatatSatcgctctttgaRRVVtDaatcSYHcSDNacattcMDaNVagatctSctBcat
+agtggHagaVtgtSactctSHaMaWtgtatcattWtacgaaHatatBaaSaYacagtaaa
+agtVacatKtatatataVtagcgWccacagctcaaccttRtatNactMtcattaaatttN
+aaggctgYctctacatcaVgcMHaagaBttcgYDaSRtHgaaaNcaWYBggataatBact
+gaataYgcgtaacccactHataagaaWgcgRacccagagaVtataggcttNtaaaaHata
+catttttYYatHattgaatgtNcttatNaVcaaRtKctcgaaWctDttttataaatgata
+gcgSttcVtgatataaataataBgaatgaRacgagtaRctttaactattNagtcagtgtg
+aSgaHRacgVtggRccatttatgtMtattaNatgttaaatRaBRttcatcttaRBtNtaN
+SWgtVSgcNacBtWaDgaaNBMgagaBMgaHaHagatttctNtWatcaaaaDgtgcaaWa
+ataBattaNtatgDaMaWDataNtctatDagatSWctctggaccatcaBgtatattaaHa
+cHgattcgatgtRtaYattactNtWgaaRgcgDaatactgWcKaMacRSaSaacDgtgSg
+SRaagNtKttattcattaagtctgtctctataaVgctHKttgVtgacgattgRYcatccW
+cMtaBagaHacaaaDaaaRVgcacatgatYaatatttMttaaWBtctcgaNcWDtttcag
+YKattaRtttagHcKaacaBcaggtaacctaHtaMtttaHacctVacctaaagtcacttt
+cWcaatggatSaataHattacaMggtgaaWaacagaaattgttggRggcgattatWtaKt
+ScWKggtttcttgtcMaRgYYacacggagtgccDcDattcaaacHaacttSScaaStMtt
+aYtgtcWaaaaaaaataBataWaatatBNttcgttgtVatgacaHtgtacatHtaatgtK
+catgSatacVRcVctttagNttaatKYgHtRccttDBggHgDtgaatcaagacacWtcgR
+WKaactgRaDNMactactgacaDgVgatcaagNRatacagattSMttaattYtgWctRgt
+taaKMgggaaataagttatgHaScYaattccRMggSagaKKttRggtttgDtcgtcMttt
+tggaDgcVctYcaaataattSctDaccatNataDtaaaWtttagHMSSaagaaBgatYaa
+ggNtagtgctcMaatttWMggtctatttggaKagaggatWcatttgctatcgcccBacac
+ttataagaYtcNcagaNatcaYHgNgaacRgtaDgaNYttcattRtagNDcHNVcgDctg
+gDatDtgNaaaaaHgaYagtRtcaaDcgcaKatcagttattcataaccNaatacacaaYW
+catBaaaacaRttMgtaattctWttMaMtttccgaNcatVtgatcBaRtttgSaactcaK
+YaaNtKDttttRagaMcDYgcaKcataVaaagattcatatWcHtagtagatttctBtcWH
+tctaRgaSttgHatgaHMtNtaactgaaaNWtDctgDcacattMctNgWattatatctSt
+taScctaDaatatDYataaaaatataatNctKaNaatatcSgagttaagtKDttaaStaa
+HtttaatgaRataBtaVcBtcDWWaaDaacacRNtaVggatattatagtBttggcaaKca
+cRNgaaYaaMRaHtatBcaaacNataKacttaMtaacaacgRtaattgggaRcttagtWa
+taactKttDccgaMcacNHKtattStaRcSStDttacggagagtMtaNHatttWRNVgaa
+acattcScatgctaVSttaRaMagatcScaBggtatacgatVttKcVtagtgccgtcDta
+gtRagggcagggRRttKtcgtKDRaaatgatVttDtcatMaNKtNacagMattgttcaac
+KaatYKttaactaatgagattttaBattBctcaaRWgtYtYBatDcattggRtaaHttca
+NagagctcaRatBtaagHtctcttRatagBttHtgatgattgcRcgtgSaagcYaccacB
+WgtaNtctagacgaaSatBNtHMcKagttaaDcHtaDaaDtttccaatMcaSaaacWWgg
+tgDtgtMtcacggcgcWttcBctaaVatggaagNgtaacctagatggYKRVttRtMcgtt
+aagccaHgatHBcgNtctMKDcYtaVttHaaDWcYcKtttttgatatacataggaaaaac
+WgctgttatWHaggatcgtggcataagaaaWtttgatcaagaDatgaWtRtttgMagcBa
+ttcNaatNcKgaatatWBBcttKVHtgcagtagaYRatcggaagaRtattaBNttattaa
+taatatgtttttaagMggggMttctBgtcgaaMctcctaVttRtBattaatattgVDcDt
+ggtgaccBaNttDWaVtaaaaactHcaVtacKMtgaataacggHtaaaatatataYtacB
+cattttSaaSttgatcatccacatatgcYaVcattatcaagacYcMaataagaWWcBata
+BattcBtaKatgtaRgtKgattaSttYaHcgttHcacaatatKatgRMgatgatgRaatt
+ctKNMRtggatNttttagYRtgtgYttaataaDcttHaDcctttgggMtcgcMgNYtcNa
+cttKtttttgYBaHMgcccgggtWttatVttttMtVgaHagDNtccBVaaagtaKttaaa
+cgaYgHagVatMgaacBaSacNaaaBcagaaaatatttaYgaaSccaRacgctgtYcctt
+tStttaacgatVWaatKtaBtaaataVaBVcctgKaatcaggaDYatgVcgctaaacVtc
+HctggttaDggtatRatttttaaatDttaMtMaggtMaattaRcaaggaatVaaaactSR
+ctatttWaDtBataaBaaKattScSVgtatcWaaaBtattVtatttttatYtaatacRKc
+gcgYtccaacVBtagcttYBtgtgttaataataWactatataaVccaNtcaBtttcMaga
+taatgactMBatBctaaRtatataaaaaaRacagtatYgtHgcaDgaHtaaNMMStKtDg
+taaaaactgtaaccBttMaaMDVaaaggaVatcScMRMaBttctSgacKaccKcDgaWat
+tHVtKaNcDaagRSgcgcaRgagtacMKtWaacRtcKKtBYgtagNtatgtttVttatcR
+aWtattcgtttaDccttMVtatgHagaBgtaMWKtcVagaagcaaaaStaaatgagaWtt
+tDttttagNMgVttcWagacDgaMatataaataagtttgcctatRtttNtcttggMtggV
+cgaMaBMgaatDtVaDgttaaacgaagVtttNccaagtgHgtgtcScaataaRYaactgc
+VWtaNRDccSggagttattatgcctMaaNcgtttVgtcaatctaccaDMtaattBaatMt
+KgaDcBggatVtaattRBattgcccatgaNtttMDcKtgcaccttccBccaatctgDgMS
+gaagcactctaWtattgaHgcDaagVRgtaBtaaRtgtYcYttaagataaaHaHataatt
+aattaStcttcgatHWaaRRSHctggttgtccaacaDttcaKggcVcgtSBctBNaRaat
+tcgcatagaMtNattStRSaaattVtMtgttNYaatgtaHaKNSagatcaHctaaaKKgt
+aYatDgaaaBKSacaatacRgDctaSagVcagDgtYMtcatcgttcRatgaatgtcBSKt
+SagcttagKKccgHtBRgttStgtBaaKaMtaaKHBgaVaVattaatNNgcattgagtca
+BaggMgctHtaatatttDatcWatagRatVaaattNttttaaVctYagtRaHttatttaa
+aVtaccgtNattataKSRcgcagMgaaMccagaatatMgtgNtcttNtgattaBgaaaag
+atWtccNtDggaaagaNttttNtttSggtDcaaagagtactccattMatataHcgcHMBt
+gaaKHSYtctaVtaattgtacctctctaaaVtatgKaWaacagttYaMtNgDYtttcYRt
+gYaWaaaacagataaacgtaVatNaaBtBattcctWaaggcacatgWtttaMtVtagata
+tacgataMtttggtVBagatctRatKggttgcYtacSaMStattBgcatttKatKtVgcD
+gcttNaaataatWNtaDStRaacHtacttacataatacaMtYgcggcatYcactttttDt
+caacBtgHttggctttHNtRcgatctcactctcattMtatccgattaggtgggNgagacg
+ttctDtHcaaatacaVaaaHttctcMaNtaattHWaMYgatNacKNNMatcRtNtYMgVt
+ataaaatttaaaBMtaaaatBtaaacttgMataaaagBaaatBVactagaaaHtWtKRHt
+tgaatVattctttgaNgaDDtatcVWtDaataaaVaaatgcaYaaggatgggcttaaRat
+aaacttVDcattcaattgtaBcMtgYtBtcaMKcRNaKRtKcaatttgatWgaMagtWtg
+YVaRcagattacaWttgaataaaaWgHaagacggYccctBtWttttYVtttggatKBtVa
+gHBgtaatgttcgaggaWtDtgatattaMaagttcattMtttWcgtNgcgaRcaactaMg
+aVHctctgcgagKRatWtggtcgtWaaaBctcScVcaHatattNcactttccBtDaaNtY
+ggaattRtcggctaggNVgDcgaacttMatNagaagtaaRaaRttggtaVSaagaattat
+tcaatNttWcaWtaggattScaStgattBagVBttaNcNaSagttagtcttDccctatBa
+tHaRRttaacBYKKtattHVcHagStaSaatNDDatcSaVgtgMttaHttgttaataatc
+aYtDcatttHNaRgWtgtaYcaaBaagaatYaagaccKggRattttaNcgacStttaatK
+cVtcYtttcggcaaaSYacaKattgSatHtWtKVcagatccccStaatRMaatgtaatKt
+cDgNaYaaBttccRaaacttHtaRcaaagtatgtctaaBDVcKSKVatSagtggttaatc
+ttaVNaagRtctgRataKgcaagactSKattaBatNttggttDtgcDataKaKgKacaWH
+gttScVaagaWtcatHagcgattcBBtcWaactBatgacBRctgatDcMaaVDattWaaK
+tRcctYVYacggaaagVNBaaaaaattKYaKcMatgagcatStaBtcctgaHgtttacHa
+cgcttatgNHWatgctWWattttgYaaacctaacYcataVtagVagtVtNgaMagtcgtt
+atcYtaagcatgKgaaagNSattKtttaaggacaBNRatttacatttHctaaaHactNcN
+caaaYBcacggctcaaHagaaSaagcaWtcaaaDaaBNtNacRgtttBSVtttccttaaD
+gcctgKSttgtcaaacNMcaBtagaWatttVgcRtgaRtMttgccVttatNtatggacaa
+agWgcacNatcaDMaWtcHgaaNaMMtttgcatHtYDcDactttRYtaaatMtaVaaatt
+ggtgtcaacatVctBtHctYNacaaactcaMaaaMcHgtaactHaaWattKttactYata
+agaYgcttattaWMDgStMKKatatDataNHMaSagBaaaVtYtgVtaNtataDRcBtag
+ttcgVKagggatacaaSRaataaatagtaataKatMattVaSatSBtagVaYccaaaYac
+aKSactctaaHctaaaSaaagNttgactaSacDtttcattVctccagYtcNcagtWatac
+attNgttagagNctaYaYNttKgttttatKacMgRatgaaacVccgtcaKaatHHcacRt
+gtgDtccatHaaaRtNgcaSagtStgWKtttgBtHtSagaaacgtaSaatctacWaaatt
+agagaDaWgtataMtgataaDaaaaaaaagttcBggaHaDWWcYctYtcatctttcaBtc
+tBaattattagcatgWcacgcaaaaDaactRVccBtaWaatYcVVcacMatNatacctSg
+tWgtttaattcactaaagcHgaatcHatcaBtgtaWatSScMMgctatctctRaaaWMgt
+taKaatagBtttcttagaggVttcaatRattNtccatttcagctactccacMatSHtaga
+taaaWgaagtttgDcctaagtMaaaYagaaattttVattRacatctgaaccataYtcaaa
+tcaRttaStRgSacctBcaHcgtMcccBaagaaagaDaaattKttNtaataaMgtctYct
+tDgaactaKaacNgcaRccDKtcatgaagtactcgtgttcctBtBtgttatDtctgaact
+ataacagtagStaaaaaatgHaaacaacYgtgtgHacaaattgttcSttBtVctaHaact
+tKtttttWatBtcccttaaVaacaMaagaattcaKaSNatMScRtgaaaDtSStDtHtac
+NtNtaHtMtNMNNcWtgctctaaWttaattaNtttKtBttttttagcttcDagMNagtcK
+WatVMgcttBcgccttttgtBtatatttYtMgctaKaacttgattttatctaatRagttt
+ggKBSatagtaVVcaattMataaSBtDtaBaactgSgtatcaactgHataacaDcaRtcK
+ttatgaatcatacgcgaagNYaNgaaacaattatHMgYgtagatctctWttacatVgcgR
+cMaagttgttDaNtScgStWgtgacaacacggVgcgaSctcactcaaaaYtDatatBtat
+taNgatactctaagtWtKSgYtatataaaaaYagaggttaKagtcYtNtgaagtctBWga
+WtaaBaattStcatgNNtttagMtRDtWttgctYattcVSBaMDcagatVgccatMattt
+atctatcgtBgcScYtaaccaaHcattgcagtcttMNVaactWWKcaaataNaatgHatg
+aatgtMStgccattacHNgVataaYtgaggtKttNBVtYagKacHRggYMacDatcgKta
+tVtWaKgtHatatMgttScgaaVHagaaattaNttaatatgcaaacttWgRagaaRBcNc
+atctaagtggatgVKaaVgNcaccagtatgHKgacaWatYcSacaRaMgttgcttatVca
+aWcVaKaaaKaDtaaaatcgVaccatcgKgtDagBNKNatccgaacgtKgtYctgaKaaS
+KcccKgcVtttKcaaYtagcagatVcctVtgaMYctaccMcgDtgBaRtaaattaaagct
+KtaaatatatVgctgaatatctMatccaattacaSYgcactWttaRacattgtNaYcaac
+tatNNtaHttYcStactctatatcWSaccaVNctBtaaagataNaagtaaaaStBaaVtg
+gttatttagDScttttMMWctagcaactBctcttattSatacSatttRtBataatcaaKV
+SttaaaaacaNattMBcaacagtttcVtttatatttgtaaKBgcacattttHNNaVtWag
+gaDataatNaWtBataattVacWaaattRHtacaSgWtttataDMcttRScttttaaaaM
+gatacMatYccgacKMagVtWcMtBaaatDatatHtttDtaattHaatctaHgcgtaagR
+gWaccattgaStttattctattcVacctccBcgttaNaacagNWtagtaNgtctgaHaac
+BgtatgMcRVatataatKNKaagtttRgtaYcYcaMaaagattKgaaaaKcttgtaBHNa
+WNgMatcacctgcaMggScBaRgMMctaDaaRgctcYtaacgtgtatacttcacDaKtat
+gcaatMtactaHDtaaVcgaagaaaggVaMaatYtttttattttatMggaVYVaaatBaa
+tMgctgWctaagKtctgBtKacaataYtgctBgKgaMtgtgataBagttMaagRcccVtS
+NtaWcgVDctcaSSttKaaaaVaDctacYatctcHHDtgattaaccttttYatattcgaa
+HBagWgYtSgcMtMtagaHactaSgBgBSatHtDttagaacSatcccaYtatttgtgKcg
+DcRatctccNtaagctagBVWaBaaMHacaHctDVaWgtaBtaaStVtDYtatacttgtt
+cttggNYtatWBSNcagatttgBtcVaacVtRgtYaatctatSatagttDatgttgtKag
+tctagKHtcttttaccattcccctaaaaSatttaDgBactaMttctVcaacVgtaSYctt
+gYaaKaggtaWttgaaaYgagataatgccMgSHatHtacaaMatHDttcaagtaMatgta
+agtgtaggtDtacStVaHcaactatgagttatataaBHagggccHagtaaagcRgcttag
+YaaaaaagttaaattatYNtYctagtttaacBataaWactVtRtaatgtHatctagacat
+ttaKagStttgttttaaagtDttMtgMKgcgttaactaVttHcatccgctaaaaDttSMc
+cttNaaccattacaBcHctVcttctYtaaSSctVtRVattaaagtHtaBgttcatacRcc
+tKctHVHgttKtcatctatagNSaacHVatcVgRtgtaaaRatYtcgggtBtgcKacttg
+ataRttDattatcMaggcWWRttccgaHttNtacYtYactgtatWaaWtaaggtacaDac
+aDgttStgcttatctattatgttgStaaDaaattagttRgtgcBgRDtaWaggMaaVttV
+RtcBttatcgttBDgVgatttKgaaaMttatatgattataWctcWMgaHgaattMDatgV
+agtgatatcaNcaaaataSttattttaaatDgtaNDNggaaacgataatttaRaaatata
+aaVaagttacDtgtggttctatRatgcBtaVatVtMtaYtttaaYgaHttgttgagctac
+ttaatatBHtctttaagtcaHaWYtKttacttgtttatagacataMgttgcaBVcttMac
+ttYcHcNaDatNttagatcagaatcttatcatHaNtatcMagYaacacMcaatacaNRat
+DtaHDHtSYgaatcRaBtKttgaMKgcDgtacgtgYatHcggatactDDctaVRgtgctt
+tRtatgtaaaccagtttacVtatttBcatcRaaYgcaMaagaacSctHRtctaWatatac
+gtattKaNagtagatataaWKcgggacgaRWttNacaaaaagaaatgatacDaaaaMata
+KacatVgcgVcgcNacaaHNattaggaacattYtcRYtggtatccBatcaccgacaccag
+aaagMgataacHRgttKctDaggMaKtaaatttScBtcagKBgYtaRKttagttttcBaa
+HYatgattaaDaDVacaagKaaRYattaMaaagVatattKactatcttDacHaDaatBca
+ctattKtKtRHggtaSctaaaaagtttaggBScaatcgMStttaatKacaVBSattaKaa
+agacacaaagtaattWactttacWaaBgYtMcMccagRtacaatatcttatBacgNagaR
+tctHgaKtMgaattcKYaaMacgcaatctcNgYgtYRaHagYtcVgaagaacacKgaRaa
+cgBtttagDcgaWgaYtKataaDcaBatttccgaaaacaRRBaVtRtgHacttHgagtMt
+tWattMtBtgDaNtgKtaaKDccKgctaMRtaNacattacWcttacBacgRtRttaYggc
+KNattagtgactttcKHNcWBYagttgataaYagaWaSMttgataatctataatRtggaK
+tcactWaataatYgtgcHgYKttaaaacNcaSatgcggacaBaRattttcgacctHtaKY
+gttaaactataRaaSactKatSggatgtKYtatctYggcMtactatgtgaWtttctgYDt
+tggtBtcHBctactacBcVacaagtgaatSttcHttttttatRYYaccagatctgatgac
+gcccVataagMaggWgYtatctgtgtatcWttRttcattattgYcHtgatcVatcttVSa
+taactgtgcgtgtgaRWaacgatSgaNaVKaaaaMttccNtWgtVaatNtHgttgatVct
+tatcaaDaRScagDtaKtatttYaSctttctcatccttaattagttaaatactgctgNct
+tgctcatatatactaDtagctagRcataBcgccRaacaagcacaagtaHYaaatgttaaR
+gacNgccgctcKtacataBtWtaaaDagagactacaccacggaagcStHgggtcatDcKc
+aacctctgDVRaYaatattWttattcttataatWatattaccYaagWtgaataatgattt
+gtatBYSaDctatRattgaatDgWtMacggtattttRgtaagtgWtRtagtSctVtaRgt
+tScRcattacYYatattaRaaggaataagRtttBHaggtattacBHMcacKaDDagtatM
+aaSMacaSggtVVgacctgttaaHagtactaaatYtSSBgaKatcMVHcDtatgtagaVg
+tWtMcttctYRtgctRtgaacatDctcRaggatRaaVWtgHtaMgaattaHataStgaKR
+aVacataDtgDRagBHttgNcNaRDcaaSagStDgaStattBtBNHRHacaYaatcagca
+tacDtattWctgcMattaMaaWgKttgRKgcacNYtcatcaaKtctaNtgacatMatMgY
+agNtaRWtgaaatBattctaStYgttcSYatcctMagtgatgcgtattKHKtNtcattca
+catccDaaWattgcacMattattgDcttgaBgccaMNaacattctcaacgaggagctaac
+tagattWaatgtagtcagtYtcKtMVSagWagataaatgtaaVtaSatcccVMttataac
+aVWHNataWtgccggBVYtacRgHatagVtctDttaccaataSaDgcggtttcKaggtaa
+McatgMttaaDacaccagYgtattacWgaDtaBaacctatgaWagacaYttcRHDgDgaa
+MtcagRtaattDtaagKtYMMacagcaYacgtWtctcaNcaagttttctacVtatagttg
+ttDgDRDtatScgatgcgagggSacttcaNcVaatKtattRtWttaVagtaaMDtMaatt
+HtagtttaSgWctcctggNgatgMataNRcttatataatcVtDBHgtNaRatgctttacH
+tRacgYtYaBBtaScWtttMKcStgRcaSgaagatNVtagctgtatVtaaagttcgWMtg
+tcgtHtcacSgaaWcgttaMcttWDWataVKcaatctattaKgtattcMttattcgtatc
+aaatacaDtcacatatVaatcSgtgDatBtgtagatgtagttataaagtctcatMNgata
+NgtagKcatgaagKcYgcNYtVttYtaHKcattaaMagaataRWacgSactctWgtcgta
+aaKaWagRaBataRSVatccYacttcaggtBVatKtHctatMcttctgtHttcataMgtt
+attcttRtYttagNtVtDatattgcatYBtggKtctatcYctDtagHKBNttYKtcWtRg
+taDatgaaStgtaMagcBgaaagtSctRNaHcDgtttcYaacBcagaMttatRaVacgtt
+KaaaacMttaWSgWcNRcaVgSaaaBatNcatttatttgYatttDgtcaatgagaYNatt
+ggagcDagagatacNtaacaWtBHgtatNtaggctaggcaacYBtatWctgaRttDatcg
+ttKtaNtgaaaHaYtcgattgtgccaagagKatcgatatttcaDHMMttVagaKRtaKtD
+acYgtcBtaDMacagatHcttcagactcgtagaMggtKSctagKtaBYMggtagcStgNg
+aacaatSgattaaKWNaaYggaaaacgMaaattgatagagaMtacacNacacSgagcYVa
+attHgatDWatBtaattaaYttgDaacgctcRatatacVtcaMgcBtaagattgcgNtaH
+DgtcaaaDcYMRtgcataVgtaatcaagaRccctYWccaacttagaagaaNgccHWaaaa
+cacaMgatScgatgDtWaaVtatacatggtgRNattattcaatctBcttatDaMcaaHtt
+atacaaNcttgtttagSSatgatacccKttaMtcatWgaVataatatgYYtcaHaacact
+WHatttVYatatgDactaaggcgcaKcatHaccMtccHcaatgtWtctttatgWDatctg
+WaagHVtDggaagagtYHttBgaDKMctMHccDaattMatcaaBtBcagatBcatataga
+tttatDtNatcaaaatctgaaSNaagatagtVBtagctaBVNtStWBgctagtYgatHNa
+tatgcWacWtaYtctatatgaatactcattagatcgHgaRattaatDtNcaaDgactSat
+actgNataBYaHKaKaactctcHcKHRagDttgtYgtaattaactagctatatataaKca
+ttttgcKtcaacSttgHRaagacNaBtatacataaaaataVWHMcaYcagcagRaagagt
+tBttaaMtgatacSDaNtttgaagRtattaHtttagtatYaaatcaccgaYaatattWBt
+ttataactMYactaaactaaatttcNcVatgcVgKVatatattaaatccggaaNaacaca
+SatgcttgcHccacatgatNtatgKaNtgctggagtctataHcRRScSagcactcaatat
+aggaaYaataaagtKKaaaKtBttYRtgtcNVVaaaaaatatagaNaSgattDtgacgtc
+tMatcaaatggtSaYtttaatcttaagcKataaMDaMctgtYcDtgaattRctgHaatgt
+tggtcttcaataWacaaYaNtacHNtVWagcHWtBBYagSagcaaatcKgataaSgDHat
+aaacattKBttWagtRtcNagHcttaatBccgaaatVacggStctaKaRaVtgcaHBcgK
+VcattttHgctttgtgacgaBttttccatccMatRcaVataattKattaaaagDatVtta
+SRMggtacttKHaacaatgagRaWcgDtaggcataBaVgttNBcgtagSttgccYtacWc
+gagNaatttgctagagacatacaaggataacWRtcDaacSDStcaRtcDcaaaHgtatca
+DRtgcagtDtacBtatDMagtatcctagtgcDaSaaRtcaRactHgaaatccaRtWgaac
+ttattaataScaDaatYaaaWaRNcagtaaaYcaHttBctaattctNggBYBtggaacaD
+aatKgcagataHtgtcKaWctaVtNWYBgttttgtHScaBctRccataataMaaacatga
+atatNatgagtWgatggattgaNttataHcSKttgtatcatBtDtaWatcaWaDNgtagc
+taaaWttBatDgMatgagatctKttaHactataSgattRataYaYatagaatDagtaDaa
+gatcKcYgtgWSgtttttaYKtSatttgYatgYHStattaKcttatNNSataaaacHBta
+KgcataggYtacgtttccaaVtaVaHDcaWRYSBHattattcaaaaBatataaggaBtaa
+caYcgHgaatgcggYHagtactNagaaatttttacgaBcaaBttgagtKtYHaKKgttga
+acgacacgBtWDtSttgNHDMgaaaaattcKcatgataMKttVHVBacataKaatcggWt
+accagMtttcKgScgcaactattVctHScccaacccHDtgttacgttHVaatcVgMtgtt
+catBWBttDaaactattcttaaactaYtRtgtaWataWggacVgtggWtatgtataaaHN
+ctRgRtattaagtcgHgWStttaWDacacatcaHatttVacttagcgtHagagttgttca
+tcatgcaHcgtcKaagaRRacaatNgtYDtatVgYccaYKVttDttBctYcttaWtatgY
+taVttttacVatBaYKSSVaNNccgctgctBtcaagcacaNttctataYMatccWacBcg
+VaaatagWgccRtHMttHgBacttYScaaVtgSgttacBtctBttaRtSMgttaatNaRa
+tgttgtcatVtaaYgVgcVaaYSaNcagcttatNtacgatagtcgaVtaacYVaMttgga
+taaagatStcaNtDttgcBacatattaDWatDatcaatatNttagttMttcaactacaRH
+YtcggaacVHtaggatDggStgSWtVatagctgtttaagBcccgBtgcgtctacYaBata
+ctYMttHttVttaWtSttgKtcttcgtgacctaDtttMYMtaaaaaattcaMgWatBtgW
+WtaScccttaaVVgatagaRtYataatttgKaVHtgcataYtaaaaagStcaRaMaattW
+gcaacaaRaBaataacaMNatagatattatgWtagcgVHcgtcatgaHgtRatcctgtcS
+aaatWgtatcHBcatcatcHaattattDBHggcatBtgttagNDggtcRttaataVtctt
+tStaaggtcccBtccaBgBRgaDaatttgtttgcNtatBgaaaggcgNttatMtggtBgM
+gatactDtcatMaaWctatttaaaacYNgtSgMatBcSactaKYaDVaVtcagaaaStag
+ttYRcaaKacaHaacagctNcatttKtttaaacWtMNaatttattaaVgaMStMcagcta
+WgaSccatNatgMacataWaaMtataggcgtatcctagHatttttVaattttSBttScgt
+BSatgaHcaacgaVtMaaaactKHatatttNWtttataWtaatVttKaKMggatcMaaat
+tattMgatttgtatRtaVgaaDtacacRtaaaaaMttScaggRttgtcttSatYWtVMac
+tagatVaMaaaDtaattttaBWcataaggaatBtRgtctaWDtagWtaaWYSaHaaacga
+tRcttgcatcattaSDBBKttttctaYSaactcgYacatttBaattKaaaccaMStaHat
+HtatgtctKcWataactctcVNYtttMttaDatSacDKcacaaHgaggaaBtgNaaaHta
+ttgtRcgacDtYtctttMttatcDaNgattagtttYtaattBMtaggtacatgtYBNttc
+MacaagaaaaaKgaaatcacaNttgtttttagDBcMgtaNacSatcWBWtataVatYagt
+ttccatatHtttDtcgtggBggcKacaBWtBcaattgMatcttaVaacVYgMgttDcaaa
+ctctctcgcHaSatYVHRaaatccMMtaDHtaaKccactgattatccatBYVDacgttMc
+taaVtatacaatBgaagttaattttgatatgcatKgaYttHtatggaaaatcaDtttBta
+tgccacattactcaaagctctcBKcaagcaatataNtattcVtcataacMHgtattaaDt
+ctNaNttYWcWtaVatatataWgtaWtgaHtattcgagtMVaHDHtatgcttctaaWYaa
+tttaatccaMactKtcgtDaDVWttaccVtacYBgDattKtHKSVStgMtBgcgtDRSat
+ggatatDKacataWtatWaVttctSRWgtcaWattKaaYWtYaHctataKacMaagtctR
+ttaatcgtgaHaggYWtcgatKttKaccttacttccgtttHcgtKtcttaatSBgaattt
+cVKaMattVSgDDcaattcagtcataccBccgtgaVtaggttYgaNagYcHatMYaattD
+gtttaaMagRactHattgatttaaSKtSccggBattatatKDacaacBgVWBaaacaaga
+ttgtcDtcttBgcattatcaaaacagNtaaDgtggVaacYDgtttDtggKccttaaaWca
+cgSatacaggtagVgatacctBttcaattKRtctaMgSattgtacctatataaaMgVtct
+YMYYcacttRaBgDctRtttaRHgcRSMVaaaaacagaYaagtaMatDaatttaggcctN
+aacgaaaatgNtttaBtMtScVtVtSacStaBggtggtKtRcatagHattcctggaRtaa
+KaBKtagttgaattgtatttMcatgcttDaWYtaVtNDgatKtHaaattaattaaStaag
+WaaBtNcaccaatRcacttgttttcaaattctggcccttttBgHccatcgaWctataStt
+BgataacagtacggcccDcScaactgattttaSWYtaaaMaVatttagctaBgSaggtNa
+BRgStDaatDBtatcHgDtRtgMtStWaYaggtaYatBtaWaattgaaYattcBVtaVSa
+ctWaWgtKaatagaaatgNttHtgtcaatMattcggtcaDcVttgataMNttYVgSSYMW
+aVtgcaRaaccYtgccattaaHVgaaaattMtaSgtaYaggctataBtcRtttaaBtcHD
+atDgtaaVttgcagNcatWggNtgRMaDcYgYttacWNtgcaWtaaVaNctVacaaccRc
+acttgMttgtRMtgtccatttgKagttctVagcttccaccaNgtgcatRgtSBaacggaa
+ttttttNagtDcagaHaaaatStcaMtctagcacactHWtNtgctcgtNaWatataKcMc
+WtagaggDaVatttaatttYSDgRccWattHtaggctaccDMctacVaattBYtDacaYc
+tWaHaaHttcggaMKaacSagtattaaatDttNaVNtacgVttKaaHtgagttWcKtgta
+DcDaKacgtactctttacatSgtagtaHHtgaaatRtttagttMctacKgaKaatBttat
+aKWMcggtttatgtgtgaStaagaaRttaVtgttBaHgNtggaRaWataacaWtRWacaa
+ctcgHWttttaDagScKgtgSagtcMgaRgttacccaaaKRaaatattcKatttNgtMaV
+cataccaKgaWgHBWagctaagttatcDaRVVtggaaHSVacggttaHaWWagtSgctct
+VattKctKtMatHWcgccttaYtagtaKDaVcHtctgHagatcaSacaatKtatgatagD
+gtcgttttgatVtatStctYaYNtgtgKaKaVcVNgaattWccgattcttgaMaRattRg
+caatHctcattaBaaMtattNSSttHcagRKRaaccaYacMDtaYaaaatttRataBVtc
+acaagKtatgcctcatcgtgWataagcgtatcDtNagcatNNatgttcRaaScagaaaRa
+ataMtacMSctKtDgaBactaggtWgcRtaWcaYtgtgWaagDKattttttaaccaaatD
+HattgacSttttatWaataatDaDaaaaRtaYaggagcYatacYaKaagaaNtaaaYtaV
+tDtBaaDcgtttKMtggcagtVatgccggtHgtgtaVaacDBaattacaNatttMgaDgc
+aDtttggaaMgtYtDtSgccaaaaYcNgaacDVgcattaNgatgaaDaBBttgccatttR
+tctaatgtHNtaaatBtaMaVattcctggaaaaatMattgtagRDacaaacgaataWSBc
+tctYVcgtSaMStgtttSatNagaacaRcagtatgaNBtcKgBttRtattVtaBtBaKac
+taWaMgRtcMtaDtYtatHattScggacMtaggcataaWaKHaataaagYcgWatatStB
+attKaKagKttacMaRacaSaRaaWtKaatagSatcgaaaKaaVcDttcVcgaKVattgg
+aYgtMataaacRtaDaactNatYcagtDgttagacBataRYRDgttcttttattacBcHa
+tgaRacMaactcatVVtttaaaHgctgttcaattaVaHtDcaYKacgKtcNtttgctttg
+HWcaaSactWKSatcgYaNVaattacRcatVNgtagatgcatYatVaaYWaSactgatcc
+atatNMaNagNtaatcgttaSttattWattaggagaatcNaaccaaaWatRaatHMaatt
+aNWatRaMKaWctWtDataaagHctMctttRSttaacgaSWcatcaVgatataattgtWM
+agKKaBBgatatctcgHSaaNBctgVtaStagtttgaggSgagcKttaaatHattDtaaa
+ttgaacatactaaWaBYtKttacWtaaVNcWacgttctcctaactBaaSRagaaatgttK
+VgtHacatctcaScaataNgaaVagaaHttaKgHgKaccgtcYtcctBccataagaSaca
+taaaggtttDtVStaVBgtcgNatgtgaVctatWaaDccWHcctttaatcWactaatact
+cttacttgttcttatttatcaaagatWacYctacKtaSaaaStgtWaVcaYaRctgggtS
+aaaWtgctgcHtttgMcgatSaagttgttttNattgaacttaaKaYcSBSacWattaata
+KDattKaHtgaaattKKttttgacDtDtattttDBDDcMgcatagaVNttaWtgaDttgt
+tttttttgacattatagBDacgatNatMBcaggtacaatgtgctttatatttRgBcctVt
+YVctgcatgtgatataatHagtttccttHatagtaMMaaWggBataaKtttgataaagcK
+gtVtaaaatgtatWWaataaHgatttYtcWataataacagaacDRWDgWaWaaaggattB
+cRctacYtagctNgtScagMcccHaBaYgtgctgtSDtHacKtNgtgacaaaacccMcac
+aKctcactaaaaaNgtagWtttYtgaDcatWctataVctNttKgRtatataYaaaRacag
+gttatagtcRgDgcaYctattNcaNtVatYattKgaaggBDtttacttHttNtgcatRat
+gaMHtRBtaagatMcacatBatgtStctagacttccKaRgaWccRataVtggaScgattt
+DMaaatNNtcYaYtaDaatctatgaVtctBKtgccYgtWatDcMYtaaRtcVgcttttDt
+MtRagtactHccRBWatatccttatMtNatgttagagBcttKacaaMtagaaattaDtta
+atatgaaaRattNcHSgaaHtaDcagctYacgccagcMtaaMgDaaaaaggatcttcaaV
+NatRcKVaaHRBctgcattatMaWaNaKataaatatgWaaatcgMaaaatcctgttactD
+tDagaccYWacttctRatgataaKtaaatcaMttttcaaRtScaWgatMactMtcaBNat
+aaaBactggtWHtYaattaWacattgaaVtYtSgMcatgaatYgattatacaYttaaaKR
+gaVagNgtaHWaattcgDaRaaacgVtBDtStttRaKgVagatatWtcMKaaaaMDattt
+aaYcataDYagtaaaaKttVWMggctgVgtgagtKagtgtBBNctacaaacttagattSt
+tHagacKVttgHttatSataaWtMHttSaSaaaaDatgBtaYaaaggttaMttgVtVttt
+ctaattgaacaggtttDDVMtNSgcatataagDaNttatSVttMScNaaattDttYaaHc
+NgttatatBatgDKctttgVVaaBgataaBatRaagactBYgMgNaBttaaattagattt
+ttttaVgttaYtatVtccgtaagDcNVcaWtgcaKgggYtgagattaMaaagaatagtga
+BaVcacBNtagtaDctctcVtaSctgtagcBcHMWtataattDtaactttHctaRcRaaB
+aYacatttcVRaatctgctattDSNDgBatcaaatgcaBccKctaHcBtctVtaaHgatc
+RgaacggctRtaagtaSatatgatcaaagBtaagatttVaMagaagaWWgcMWBRStRgg
+tttWttttagtccaMRMaaattaSgBccggNataagtgctctttacYataRtcattgtgY
+BtggcatRtacttBaacDacaKtHDtaNacMtataaKKtgtaaaRMVtctVcRatcgatt
+tgcattSaaaggttRatagtagaattVcNgRtKccBgBtWcataataKctctKatttttg
+VcaacKStcacSRtattgcggtcctcHatcgaaDgaVgctagtMNVtaattaaatattMY
+NcgattaaKtMttRtYgacttgttagggcDNgagNtKBaScagttctgcMaaaMtHctRa
+YtcgRtHatVctttatcttggtYctctYgttgattttaacSttaaactaaaWHattgWtc
+tactatttcgMcVaaMctaKRcttcRaatSgctVNgtgaaaNcagataatcaatcKtagt
+gacaaBVtttgtaaVctaBatgtaagtgtacctttacKtMWtaaaatWtcVctgagataa
+ttacggaatacgSaWgaHcagtagNWaaaSacggaaatgatRBtRctVctgtVaatataV
+NactMgDtaatggtatctacaaatgtatacKtttgttttaaacgttgBggBtgacttWac
+gaMtttcagaacagaaRVtttKBacttDWaccagtaaatatcgMcttatRtaaKKcgMtH
+KattWYYgttgatgttaRgacHcattcttKtcgtttaatagagWgDKaYatKataKcDgc
+taaaHWgRtagccgttcatYattcagSHtttattataBVccaNMHttacgWttgDgaaRt
+RaatcgatNaaNtWVcctacatacYtctgKtcattatctattatcgtcKtaataaattag
+ggHctcatgHttSNacctYaKttMHtctttSgacgtttgMcStgttcaaSBggataggWt
+tataNagaNBcatcaagtBtagcMagtcagagaaDcaaaataKgtatgtgSaagtgtYDt
+DccVaaacagaagttaHSWatagaaaMYaggtacttctccttatatHatgctgVMatKtt
+gaNtggSaRcattggttgWcatYagtaatatttgcttgaVctaataMRttttScggggtg
+agVcacatYBggtccatMattBaatgNataDatWtDttVcataacSVtattagaagtaDt
+atcBacNaacaaBaaagaaWBHSttgattttKRcVataHatttttgaBtcctctacctcR
+YttagcatactttagaMHgtcatgtHtatctaaYacacggtaaMtatgttaagaHWaRca
+aBaacaVaKattHgataNatatacgtatttaDWctagatataaNtaccgaacaDMttDSa
+SYaaYgYaVtcatactaaWWtatataaVtMcagMccaDaaSatBattagcaaaatgRtaH
+RgccgataatagcaaacacWacagaaVgBcagaYctHctgtcttaccBattVaYtttHat
+gaVgttcRgaHtttagttttataatRWggattYatatMaaaactWaDRaggataaWgMat
+aggtactatatttVctataattaaatatgtgttDtcctaKataaaaacggtacgtKaaat
+ccBKtgtaattacaKtKYtgStRaagaaaaaaaggYagtNactttaaNaStcNtBcBaaa
+cHtacaatSgattYttaacDacaHtcttcatttgSYgtctRaatVagcaWtctcDcRctN
+HatScRtaMgaacWaaYatcaHaaagttggagtacaNcSRttagaatcatVgtgaccaaY
+acWHHtaMtHtctaatttcactBtgNVggBgttctaDtcttaWttaatcatatHgaDaca
+tgaaNagtaatacgDgHttaNggatDaggactcaatttcttDaNtRagttgVgaVRacWN
+VHBttcVtYYtagataagHtccattcaatNaataYtNctgatcRttgaYaaaBcaKatca
+cgSaataHatggtacacctttatRcgtaYacgataHWVKaattVtKcgatcgtRtatagR
+gccBtaatagctcVNtttatgRtggggtttcttatactaatcMaaaWcgcaatKttattt
+gtttatHRRacaVcSgatcagcaacccaMatYacBVccNcRgagatctgtSgaMttHgta
+attatggRatgcWtcKatattMKWtaaatctccgtgtcaHNYaagStKcaDaMtaaaWBt
+tacBgNctMaatDttcttgatMagtagaaatYHKaacttattSgttNaKagttctcataa
+gtaatgactgaVStaatcctcDagtcataagWtataatattacagScHaatatagcaHYa
+aSagaaaaactYtRYaatcggaaHcVcDcaccctattRaatattNgVaatacagaataaS
+aaaagcWRgaKttccgtaWttctaaWacgatctMHaNWSgVtgNttVgtattStaatNat
+VttacaRWagNgcaSgRVtcYtgtctYgtRKatctStHWttcYagtgNtBaacgtagtgt
+HcgaSggcNgHgWggKatMtaHcgtKaHaWggacRRatattaHaaggaagaSgHggttta
+cctagtaattBaaatSttYgtagBaSKBaaSKgctMMcacagcgtYatSctWctSaatRt
+KKtgatatctMtattagcgagaMctNtBcgtatRDtcatHtgaVcYttctaHacgagDaa
+MNtcttaBgWattatagaKtcWtHaMacagattgtHacttttgDaBWDtcSWKacKttca
+HtSgttttDtHtSaVRYVgcagaatWattYtgNcgccBSttataaNctttcHtccaaDRg
+aataSatgctVDggacagBYtBcRacDtYDNtgWaattattatYKtNcggaKRatcagBa
+ctgatgcctSttttttDtcSgtcaaataataaMVttgaacBagtattctatggYtcaaat
+DWacVtgataYYacSccVcataaagacagtNaatgtactaagtRtattBMKacNacagaa
+WtctSaMgaKataaaMBgtYtaWaaKNtDStSNggaacgtMRtaaHctatacMtatttta
+ccaataKVtcagctttatacgtSWBaStgttgWVtYaacaacRgtSgtacNgatgRtaYc
+agStcaNScaaaRttaDttctcaaBgcScDtWaggtgaacttNBBYaaccaNaactNgct
+aaDaaaggttgagaaMtatacttgtgtctHtgagKacagcacagcgKSattaSDaKaatt
+tagtHtMttaMVctaaBtgBaattttactttaKcMagcatgcDcatcBagaBHattVgWt
+aataMgtttgtDaHaggctgtVattDYacNtNStttaKaNggtBtaKtgHaaKcaacatD
+MtagatgtatMtaaacttccNBgctacgtgcaaKgWSNacttSBaggMtNStaKtcaata
+gattatctagtaBttaggactYtaaaStaaYtgaaaagYtMaagaKctgtVtttcgWcat
+ctacgtatVaagtagaattBcagaDcgSgtaSggaactaRcaBRtMttRgattaattWaB
+YcaataHMacgHactatNctacgaVataNVcHatatVHKKagaaRSattaacgttMattg
+tatagBagtatctttgaagaBctgattattHgRttacDgMgtWtaggcaatNttgcttag
+agaRatttSgtttBtgRtgaNtHcgStatgaaKtgtaBacctgaaWgtKatHDStatctt
+taRaaataacaBttStHVMaccggtaVYaaBttYNKgNaBHaaKcKaaatStBcattgag
+ggcRSttttctaaatcacaRBattccacatagacatSaDtaaaSNtttgtatDgWgcata
+cgaSacRttagNaggaHtttagccttttWDtcYaVtaRtacWggctcaaaacVctWtaca
+tagttaattBBttMacatDtatttaaRggattatBVcacattattaagWctactVcaBgc
+ttKagagttatRBgctagaHtgDgaaaSVtKgattaWtMDWaRccaaWaagtaaVttgWg
+VgacaBtSaacDaaaaKcacaRKaagttgagtNatttaSttaWRgtctaaccataDatag
+YaMgaWBcattaacSttcacDtSttgtaWYataRBHtccagaMctaagaWagSDaactRN
+aaaWagtacaScaSDcaatMaaaaaaaVBcatKacaggtgMaaMtatVaVgcctcDDYgt
+attcaatattaggagtYBaaatttagaaVWDattcgttagHKSgcWtWcaatttaBtaat
+NcaMYgYagatcRRtcataaaYctNtatttKRatRggtYcgaWcgcccataWttVaaBta
+ataaatcgNtctttaggNtatatgNaagtMttccaagactRttgtgattBagBtaataat
+tBStcaatttaWcattaatVtacatgtatttBataVYWStagcaYKDaagYtaggKtgag
+atVtMDtKgNtcatagtNcagtBagagcaNaaNtaRtagatatcYWtSataWggacagag
+tcaDSggYatttDaaatcactKatWatcDatatRattataaatatctattHSctttggNc
+taagtSacgagatatatatRataagtttcatgcSaaKttctHaRgaaDatgStWcataaa
+aatWMNttaaRaVgaYcHaagWggttttaaBtcagacKtaBtggcaacHtaggVttttac
+tatRWaataVcccaRaagattNttggStYaatBRaataVacgaaatttaBaMYgcaMgtK
+StStVtgVaatacccYaDVYaVaYKVtgatgcctacaaagcWgDtVtctaBtcctccacg
+atatWtcDHHaHacaaataaatataccaYRSataVagtttaaStgttgRHtctaDMMaYY
+aaagatacaBWKcagttgcaacgagBagcaaatccgKaRgtgaatcgtaWcatYtWaBta
+BatcgRattcaagtHctctaatcttcctattaaYgaNaaaaRaDtactDtMNagatMttt
+RacKaccWaYtatcagaaKcttVtVaaaatgttgtNYgtHtaDactaggaRttaccVaag
+MacgcKtatataHaMtcaattcctMaRtttttcatgtctcaacatggtgacatcaBatHa
+aMagaatttattaaaactYgMttaKHBccgacttttaVaaVtcScHaNccttacccatat
+aMgggDtactagKgtcacRtacMacYgBaatttcagYcacaaataaaaggagYaaMHtat
+aaaHtKgaaHtctcaVatcgStcatHtcaYctttWcttattBactataatWctcctRKaa
+HtaaHYcttcaYataaaHtNcaSctgattaagaKaatWagRaVaNSHDaactaYVRaatg
+ttatVYttatDcctRtgcgaacStaWttgaYcatYtggtatWNataMtDNRtgtttgggt
+HcWtatHaaataatVtaaWaVgcaatagDatgScgNcagggagtcaDtgagataKtgtct
+ataattgtgaNatcaNatDgtagctaaaNtgtagtcBatgWcagagtgtWtaagWtaKga
+ttHagWRaNatacaagtactYtaWgatataRctcNKcttttgaRtgKWtgtgRagcNtKt
+YtgatatgatBDKVtaaaaatttWtcaatacgRtaactttaaaaMtaMattaVNHRKtta
+ttattaaVaatagatYaggattVaaaRactcaagccccRtagtScgDWgVSagtggtaac
+ataVatttcagtttRtattcttcYaccaaaagttNttKtggBttBcSaWaattataatca
+taBtgtMtMtaaagataYtacgMtWaaacBtttatcKacaaaatattMagtKccaaWcca
+tttgtgacctttMSataMgBtcttaVgtNttttSaactatgaggaSWataRtHtcgaMag
+SMccSaMctcgNtatgtataaVtBatHcHtattaacgactgNKtttaMtVaaaagaatVg
+ttMWcttacacgtacScttcttcWtaatccatactctaacaHHaaaatDctNtgatMcRa
+aWRtMgttgttatRagtaNtatgRtaMttggaaKWttaRtHKMaDDaacatgcgttaaac
+caaaDttatagVRBatacMaatacMaaatWcNcaaHttBgttgtacggRKaaaMtcHgtt
+aattattttaHgKtgttaatDaHatctggtaatMtYaRgMccKRaRKaDaagaggatBtS
+acatactccaKgVaaRMaBttgcataaacYtKgaVDtttgcatSaatattatNattataW
+atWgBttaggtBttaaYataaSHtRtaccaacMttaccattccKggKNtMatacctctgt
+aYctaaccttgagtataaRatagaatRBtttttMtgWNtKtgcttatgactcSaatattg
+tBRBtSWVWYagtaWBcNatttcNNgSKacctgaaMKgatWcYHgRataYggtctaMtgg
+cagaRgaaYaYgKgaaHVtaattMgaaWaWaDataagaaaaBDatacatatgatcNtaga
+gMtactcatgatgtHataaggtaHaWatMgtagcttaWtcStataSttagttttgcaagt
+gctgacDtgctcDtgaSgVMtagttKtaacgtacattaaatctHgatYatttcgggcaDt
+VttcaaacccgDgtatBggcttcBcWtacttgaatBaRNcgYtgtaaaaaRDctKctagt
+aKSatRtRatMaMtaacVYaKtactgRDcaataaatSacagctDaatggttttaaacNtt
+BaattgattaaMgVBKtBaacctYNcaKcaVtDYtcBaaataNSaBgatacccgtVtaat
+actSgtttgMSYtttgKtgtKacgtKatgataaVccaMgtaVaWatttatattgBNtgtV
+gVNtYStMtgtatBcgagaBaVatgatgBcStttgtagDgYMgaattacacHtaaaaaBt
+tKaaggHttctaggKagRNtMBaatWcagMSBaaVtgaatgtgatNaatSagcaatttHc
+tatWMtgVcNtSaNRHatVaVacVtHattcaataatgSKttttttgtataRKYaatccRY
+aatggtaVtttaaaaaWBKtatatttatgtagtcNatSaatatcMDRtgtBttYtatKaa
+ttaaaaYtcWccVattcDaaatgattgtHccactgNgctttBtgagatWDgVgtactgtR
+taaggtBgacctaaatctRtDttaBRaYacaaaYYtcaaagaWaSDttctttggacttcB
+cgaDacHataNtNgWtVMVtRactggaaagSgtgggtgaggcctccataaatNttaYYgt
+cBatattWMaacMRctcgttaaaVatatagagataKatRMtHaVagaaBBtStttaatca
+aatgagtatcaagtRMtaccgtBagaWKtagaaaYttcSScttaVttttcatatcaSgtc
+WNgtttagccaaaVgaatgtgttatgaaYaatgaataaaagagatcttcYacaaatataD
+gRttcMtcataYaBtctStgaatgagDaDgtRNaMtYMatatagWNggaNtcattatgac
+YgtBKYttttagccttataaNRaatggaatccaBacgttacttatMNggaaaMtaaRtct
+agtttttKKKgcBttgccgtHKatcgatVtttacataMtagNaMttctKHNctaaNattt
+WaRNgRatctagatSctaactctDttaagacgcatagcRNgagatttgtacattSattaa
+cttttcgttgattWatKtgaatttaMtSBattKKcttaaSggcactaataaatcactcaM
+gacggtRcaDScNctYtBRYVgttgtttaVtacHWattattcatttVaKtgKaacctagg
+StatttacaactcKNtaaacaagSttcgattatttcaRttVtaVaaacRgDtaatgtccM
+aacNtcggttgcctaattaaaNaWcgKataaYcctSgMcataaatttgaaatttHtagSB
+gKYggcgYaagagataaWBcMgatRBNRaYctgHatctatHttgaHtgcHKBKVaWaaca
+cWNRactWBVttaatttVccaagBSWacaaaatcDgttattBtHaMtMtHacKgWtcctc
+ctttHaatagtYttaagccaHtYatatttacgtcaSgtgtYttgBcatcatttaNRgaKg
+BtgattttaaatgaattVaKtVYgNaatgDaacaaVtHaaatggtttgaYYatgctgcac
+atttttctacVtacaNatataHtgtcVtaacVgtYccgaactaKaaaatcagtttaKNRt
+aaataMatgtacatatcKScctDatDcKttSattttagatgttHtcBtKgNVRagctaRV
+tttaNYWttcWYRatgatMgaMKRctNVMgttVagWcaVStcDgtttctcRatBVggacc
+gaatcMttgagaBDgtNMgKKRBNSMgcaWHYWccNgcacaggVYtMcaaaatgBtaKcg
+aRacccgStattcHttgaYttattattctaVMttgaacDaWtNccDtcHBataNcRggaa
+NBtgaYNtaaMaDctMaaaaaaHaaattcBgtcgHtgcgaaStttctacttcgMagagta
+aaacaDctgcagHctHtWaacgaatgtggtDacgtcacataSaatKtcWBtataccaaSc
+ttNgDgcctacgBaNWtagataBaNtRcSggtaMattgaatgtRHtgHaaNWtgttacca
+tacctBataaMWatttNttVaaRagMataVtgtaccattYVcKYcgagtaaYtttgDaKD
+gVacMtttaVttcYcgtMattctatatataaggaagagttaaatHgtWctatttgaaatH
+ttgScgtBataatgatRWgtttVgatMBcgctttatgtctgWKtaacaaHttaMtcttta
+tcDtccaHaNYtSWcWNtHNacaaatactNggtgStacKatgtgKVctaBcaHcttacca
+aWatHaaYtattatYtttDgtBaKcataaaatcaNgttNYcatVSgtgatatYDMMtgga
+atKMaagcttVtaNNYctKcctagMWtttatttBattNagccggaRgagtattaKatgat
+ctacatcaKVaaagttYgcStagtctacttttcatKtWtKtctRaRDtcggtataMcMDc
+aattNcacattattgaBaHattHgcYattagaattataaBtattBKHtgtaacHtHaaca
+aRYaBttaRVSaagttHVtatMtcacaWctgVtgaatcVtcctcNataacacgWtattDW
+ccatDDYtcgtaHaaKaacaYaHaataBtaaBKagtttcStWataccgNcaDtWNaaRgc
+tcNaacttatttgttaaacaaStttagtgVaKgggtatNaatVagtataVVaHtaRacca
+caRatacNStaacaYDgaWaRtaKttgtaatacggtttgccaaggMWtcaaccttcgcta
+MSaattaatgaaVDagttBcatccattttccaaBggRttgKgccaaaYNcDcaSatMcaa
+ttYDcatcWatStttggaaWtttHtatVaggttDgVWatttaBWMagtcagcgaSaaSgt
+attctacHtaaSaVacaataNKtatagRMagtKYBKggtttKatDacaWaYDaactagca
+DttctctttHtagtMtWtttatYatWNaBgHtaBgSttRgattatgKcccaaBtWcccat
+aaNattaYtRYWgRccNatatHttWgttatactttacBYHaaaKaHYaNttaatagKata
+caaatWSMctttcKacatMattgcaRctBataaVaHtataSctDVtRaacttcggScYct
+ataHRHtgttctgtgattYatatYtcYHaataaataYtMMgttaaatgatcttaaattaK
+RtttaaRtaacttaBtgtcatgtctNcaaKactMtKatagRaDKaatgSaHcRtMDctag
+atcaYtRatMSVRMYKYaggataaatYtDBaDacDtaVtacggaKttattNaggScgWca
+YtaBaaacaWaNVtHVagtBaatgaBNagHaBtaNatNttSgaaactctBaggtHHtgaS
+agYKNcataaMcatagaSttctNBYcttattcatagagagtHWWDtctgMtRHtactggg
+agcKcacctggaYattatttgaaWgtcaVaataagaaNatRgtttacNtWYMBcNScggg
+ataataaagtWYKDYcVWVggtttMcttYaatagaaKaaataDcaYMVcaVtgtStctct
+WaagtaRtaagtaaatWacSKaaatYaScctggtgMKtYMtctacDatctcaMatVtNaa
+taaNtaattgaagaNaataataagcttaagtgtgcgtVgttataYaagVgNaaRctSctg
+WKVaYKgctNWMaaRaHatcgctHaaYMtccggattgtgBacatHaacttggtggDVgtc
+aaaggSatWRaKtKacNVggaatYttatttattcaaSttttttttcaatgttatttgttt
+taBgcatacWKDgtYNtcYtgtcttttttgtcaaatgatacttWagatDatttcacctaa
+aaggtgagttatWgtgHctaatMtRKagccagcgcVgagYagtactgtactttagVctaB
+BaYNggtYtaattttcRtaaagatctMtaVYatctYgNMaVtaWtcattgRtaNataaga
+aaacVSctHNtcNaMaRYcgagttaHcgacNgagagBgtKaactaaatatYRcggatgtK
+tttactgDctcVaYaaSaacBcacatagaaataaaaWDctVcNtttRtcataatNagatV
+MctBgttcHtVgagaNaaaHaaSccggatSctaHgtgaYRagattDcSDtMStNYtgtga
+agcttgggaatttttDgcaatHatgaBttHttaacatBcaaagtaggtKgagacaattaa
+taHcaNaaHataMtccaKagagtttBYSagDDtaNaRtWtWagatSgcSKtcttttcaaR
+gtMattatRtYSHgaMccttttttBtHactaattcaHtMatagaattVtBtDatcttVga
+gtatttaaaattacYSattatttaYtagcaVSHattDctKcVattataagagRaccccWc
+aBtYYtctaaaaYccSgattaaaMDRtHatMaYtHtcgcaaggWgBaNVDatataaatWt
+cMYSVtacBYaaatactcgtacttttWgaacRNaattctHagcYtaSttaaataattttt
+aaSDtKaaMcWgBaagBgaatDagaaatactcctNtgRaattaNWcattgYVMtRtHgBa
+atcaagRcagtStaaWRgtaaatHcaMacDctatNaagtactVHaaVagMgttgKtgtHa
+tcMacatagMgaBtSaaaBtagttaaNaYgStRRctYWYVtttMNBgcctgMctcactta
+gtgtttDagacaYaattagaggKtttacaatMttctttatKagaaNtBtttKSHWSaVtV
+tgttaRSaYccgtaBgggMtKtttctYWttcaVaagctttttMBgDKccatagVactWDg
+tRtKMtgBKaDaVaggtttRaataBgttYtattatgttatgtcMMaatcagaatagHaac
+aattRcBcDatttaYWttagattggttgaMcgtYRgagMtcactaRctcBMaaNgcaStg
+cgNtgagVttaBaaagaatacgcatYMaaatDtacgatatataMtYKatctScatattNg
+StYWgtttaYcttgtagaHaHaYtaRaaagttcMHaStatcatYtttKBtctataaaatc
+aStcatatStattatMtSatcataHcaWaccagHtaaggaHatatgagaaYYgtgVacSt
+tgKaBacSYcaNNccBNtHKtHcctttMttttagtaaaBHBaaattWKgtaaccDataac
+tgatatgtaaRVtaHgaattctcRttcgcatHtaagttYYctaaattttgWDacBtataa
+tttctVaYHtMtagMaHWtagatttcaVgtKaaacctgHagSgtacSWttMaBcHttaat
+cttMaStYatatatattagtttggMaYaatHgaaaHHgatggccctactatSgacaatcV
+McatactBBMtaattaaatattBNDacYtgYattBttHtNcaatgcggacccctDcYcDt
+ttaKaSggtatcaBYaaBttctDSRgacHttagMcggtWgagtcctRatatRcttgattg
+gaaaKggaaaagaaSNtattcNtataatVttgagBaMaaBctWtHatgcDaatHccgMDc
+gcWaaDaacWgaagcaatattactcaaaatMgttgtaaMatatYtctRSctctWcatttV
+atgBNtaaYagNtaMatcSgSgaVttSaccaataccKRNcataaggYcDMWaSKVcccaa
+aggVtHtgHagMaggtKVatVtVMDVatBgttWagcctagagacaaaggtataatttgct
+tgtSaaccttctccttcaatgNaacaBtttaVcaacagWaHMttgttaagttNWaaYcga
+aVtatacBatgagHtSattacBgttYgtNRRcttgatcttaHcaataattattttccttg
+aYgacVgNcttaRattatatctcagWWatNcDgacacgttaatRattaYcKtggtSggWg
+atMcaaDBttgaacNttctcaaHtHaagcgVtDaaDtNMcagaaatWaNtatcttcattS
+gatatgatactattWatSaattWccgtctaatcttgKDacatRatggBttatggKgaagt
+ttcBaKtgttaaaKtcgatagcNgtatVDagaDtaVtcaactttYgaBYcgaYgWgaWta
+aaWatVtctVtgggKaVctcgRtttacMaVaaagaaggtVtKNYtWcYaVtRVccgaatt
+atacttatattagcatcKBattttgVDggcKaHaYttgcggcNaatRactWagWgttcag
+tgWMctaataBHtttgHaggcctgacMcYaRtRtcggcaatBagttaagcDatatatNtt
+gtMcVtaaaHMgattVgaYgtattatatSaDaaaaataWacaaNttKttcatttttHaMa
+gatYtgtttcattaatatVacgcHRttacaYtaagttacaBtcgaagcgttWtatVWRaa
+SacggWaBgSgcttaScatNaHcaatWacaMatagttcagYBagYgVactWtgtStNata
+catYgSYDtaaacSaaatBtttKaKRSWRcRYMgcYgVataSNNtWgVtSaMgBcactaa
+atYaKattVggacaWaaatgHtatHccacStaatagaYaaaVaMaaacYYMctcagaNat
+tatctattaaatatgMaRgggtatgaMcttaHgattgtScgtgtatVatHNgcYttNata
+tBWaaactNVtHScgataaNcBataggtaagagatttMatVtaagtaaatYgctgtttta
+agatagaWaaYcgctaacttaaagaattggtSYgtVaStttRtcKtHaVcWaYaWVSccR
+actDaattgWaBSKtaDgtataaRcttaaaatKcagtNgtaaataaatgattcatgtcKR
+ctatHaYtMacaWNgagatcDcgDtatKaHgaBcaaaNWaRataYtYYacttgcactaaY
+DcKDttWcYataStKcgcaaaaaRaaNtttatttgctYatgtcVctttcBKcgtcttatS
+ttattYMttaatcatattcatSaYtgWaDacgaataactctggaDccattacgSagaaat
+tgatttaDtHacgtcMgaMHaaNDKttgtaMgRNtacataWgttccStgaaatDaagYRt
+DagcatcHttcVNWWataatataaccKaatWtYgcctacVaagttWtHactaRaagatat
+MMtYattMttccatactHgStagHcaattaagacagaMDtttagcHtgccctttattatS
+atWataBaaSMaccVVgtggatgtgttgYgtDHSaaMaKcagaagcWacaaaBagRactK
+acDaDgagagagcgKcaBggtgtaYttatgcDatgaNgatagagtBtNtaWatagcacgc
+gcatDRSacHttcataBtaWaNtgtaatcDctBaSttttaggcWtBacgacaVYtRttaa
+cttatgKcggDStacgtagaYtaagtaatgacggVMKtWagcatatagtcataagMgatV
+agVttSaacHataatatacaatRYaHacaWaaactRtHRaatagcaVtcMataaacatat
+tHaStattDcMWVtYaacYagaaHaaWaccNHcatgtcccgaNttataaNaacatctBta
+DNKgMtcDtgMgtatgKgSatDSgMtgVaaHNWcDcaaKgHMtaRtggcgRgtHtVtatH
+gtMggaRVgtcDgtWaactactgttagaKcccDctcNcgtagtgStacgtataNcgVaHH
+agYttStaaccWacaKctgctttaactagtVatttaaatKttRcgactaHttSaKtcagB
+BaWaacccgRatKagNagKaWtHttttcWtatatttattacagacSBagDgtagtatHtg
+cattgcaMaRgtagatYacactYSBDgctgatcMattStSgattcNttaBWaacatgctt
+SattttctatNttaHNtSctgtcWttKgttgtttttKaMHNMcaacaagNattRtcBacc
+atKgtVtaaDcttgattaaaatHgaataKYtgagMtgcWaWgtRttcDaatgRtDgcNWS
+gtagtatRttDcggatHWgaagtacgcVtcaatHtttttttgaKggaSaStaataWBMtg
+caaatacgWttctagccRtaaaattNWaMggataRRaaHaaMcagaaacacacgDaatct
+actaactDgatgtttaaDacacVaNgagKaBcatataaattcgRtSNaatDttKgKDgca
+aactBDtaatatagWaBgagtgtYaaVatatMtaacaggtataacgKMtaKgcttgNMtR
+aaaaVcHctKctaaBcWtcHtaRaacKgcaDKaYaSHgtatttataaYtcaKatgNacgt
+cWWatgDttRaacaaDWaatDgagaStaVScctgcacaaBtatacttctgtctttcacta
+cWcaaaWcactKattaKtatWagttacttgBtgaBMagaattgtYYttttVatttWtcBa
+gaatcctcWtatYcVttattMgNgYStaBgtttcttWtagcaggtMatgtRaaDtDKttg
+ataDggtttatgctaataVYcSttBtYcatctVtBtYaVagtaaDtgagacctgaaatcN
+KDactgKtacgBtDKgattaaatagattatagactatggacgacgRgaaYKgYaRtgaaa
+agRgBaacatctctMttgacNaWtctVagtStMaactacaatttcVgatacKctaKgcSa
+ctaDaatHgBgtHgYttaagtNYtRcaRgYtBaactaatatDctaacSKatSDMatWtag
+KtttagaaHKattaVactttSgtgtagWctaggagctttgaScatcggSttaggtgHtgY
+atgtctNtaggaaatDttcctgagagaHagttKcttttgcHtcaDgtcgKtatcaatgcg
+StVcatcaWNcgtatttHtatctggaHWSataWaVttgKgtKBaaaggtaMNaatttRDt
+cDattaStctaaatKgtaagtcVgccaHKgtgtcgaSVtaaaaHtatgaaVcatacacVt
+KattaWaKDgttctattgNcaagaacaKYaHttWcDaccattttagacttttMttaRaMt
+aHtacNgccgaaaaacKctNgaaagagggaVttttgtBVcatttatttVaHcgattWttM
+aWcattagtaYcMagaatKaYtcatttagacttStDtcagacattctcYaaKMttcagtS
+NtBtMaHacYWNaactVaMgtcNgMcVcVtgKaaataaVataacaDtaaggtcSgtDatt
+taKtgSNHcgctVaaaatatagacRaBgaNtaattVWaKtgcaattHttctaNRWtaHtt
+taaSgWBctVacaNVcKtaaagHDaaaNagtYcYKaVKtaaatBaaaSaVaMtcSgtaaa
+cctcBYWttSgMaMccagcttRgtVggaaWgagtaggYctRtaaWtgtacaaMNtagtac
+ggVcttKcaMgNaaatgtatgaSgDcSBRgRVcYtaDHgaVtWaaNagDtagggtHagHg
+ctRagaNacacaStaNttMaatgaataaSgagBgagtgWccDtVgagcDWVctBttccaW
+cacgHttgtcYtttacttaatVatgtKtaaatttaNaYttaStMtVaStggattgtVgaM
+RNHtacaaNttRScRtVcgttcScatMtBtttcDtcatVctDaScttagacaaDaaBtaH
+tacRgRgaRNtKataNgcaaScactcWtKggRagtgtaaYtaaattWgNagatatYtHat
+tWtYWatagatatttKatgtcgDagaVcgKVagacagagatVgHWtaagttgcatgaKaa
+tggattaHcaatatgKtMaWtWaYSVtNBDttaaHaMcaRctWScNcggtggYSttcaga
+attattggaaaattVccMtgggWatatHMaYtaMaacaHaagVtgDtggcHtRaagtHaa
+gVMWacaaagggataBRcaaBcttKtHtMgcKaVtaacaRatKRaMaRtMtcagcaataa
+aaVccNcttMtctattaagacacgagatNtatttataaaSagaaatatSccaRHKatYMa
+cgttaWKtgttgHtgagatBBaRRWSacatacWtNtcWgttcaaaccactVcaSaYtaac
+taHgtcVWgactaNaatRgNattatagacHatgcYWcttatctaagcttaatatgaaRca
+DVaSaHatgaatttBDacatBtttHactacaNaNtataVcaVtattKgMaSaSggttggD
+NcgtgatactaccYHttaaaMaVcBSacctgatatataBgcaattaatBaHtttgtaagg
+gataaacatgcgcaaataatattaaBVcaWgttagtVaaWctRgBtgYtttccgYatttt
+YMaVMtaHatRDaatgVacaatatVBccgttaagactcgcaaHtVaBaaRctaVgggaac
+RaaaaaatYaSaccVgRaaBtgataaatttcaVttataSMatacKtaWttgcaRcgtgNa
+ttatttaatagaatNctcatHtSWttaVtRattcaRYtaaattDcaKagcWggaWcStaa
+tNVgHaMaBKttaaatYRMHaRtcgtagMRgtattcctHtcacaaaKtaNttcaRcatRt
+ccgatNDagaBttDHtcttggccttaNtattaaStaWgKtVWNaMccaVgVgtatcKacD
+aYcccactcattcacYtattggatVgaWttctgSDagaWDattctacataaaDggtacta
+tagcNcSgagtgtMtaacNtVtcStttSgNDaDYgaaWVgtactRtaNcYgataHagaDt
+agttggaHtgtNtcgcHYgaDttgRtgStatcattttKtWVaYattgNtaaYgYccHgWa
+ctgtaaaVBtaBattaMBtHtttYttVgtaYMWatWgWtNaccVtgMWaSDaatcYWcca
+aaHtacgKagtNcMKactcgtaaaVtaMatttcRcttgHtattattcRaaaWaWactgDt
+tttccttttaKVNaVggataagaagWttcgBtBtVaYcataRtaacBgNaaYctggtatc
+tacaaaagatttagttaaaaNaaattgctcaactttBKagatctgctgaMgtBttgtKaS
+atVgcacgaHNatVDgttacVBacKBaaKaBctccDtagctataWKttagtcttYgtaSc
+caatcBttggaBtMaaaagaYtMgtgtNatgacacctWcKattctgaNtaSgaaataata
+tVSaattaaWattagDtgagBaHaaNHtBgttcttatHaggaBtatcHtSttgccaatNg
+taHtttBattaacatcactgaWaaaaaatggatagMHtSgaaBSatacBSaagMaDcaat
+tttcgtctaacgHtaaaBtatcttaattagtttatcttcgtWVttatatcgccgaagBgR
+aDcBaatHVDtataacaccVgttHaaSgaagaaatcMSaHBattgcaSgaSVaRttcaMt
+gtgcaatKaatWggatBVgtataNWgNctttacctttgaaRatSaKttHgaaaYSaBttV
+acWttcctgctDgBSgYcagcgggWRataaaatgcactagaaHStacaatHtggtgtBgc
+NDttggattatgaagaKaatStgcttHtgKNMNRagtaNtaDattgaDDcKtaaatcVVB
+tcSgNcRtcHataRcggctVBtccaWcaDgaaRaRctgaatMtaRtgBcaWNaNatatWS
+cYYaWttatScYtSgcataDtWcacBtactaWgcYtcgtataagctataNSgBctagatt
+aNgaKgatVKgtagttttcaaagtgcgcYattcagatggaKcMBtacgtttaacctaaat
+taaatattcatRaggtcgcccattMttaaaaaaactggSgtcccgtctaNtWattcaatt
+VHDagRtggVSSaaHtattatWctatKatHtHattYBtaVaMRatgYagcHtaSataaSt
+KaaacattaagggttggVYaaDgttWSttcattaRBcMttttaacatRDaataaMttRga
+taaagVDKatcatacaacgMtaatYctKcgggcBKNgtggttcttaagttYgcataVMaa
+VBgtVMSNagttatSttgtDtgtMgMDtNKtBgctattacagataMWtcSggtcHgggcg
+agtcRtcRattaaaatgaaYYattgtaaccttgatacgtWcHDgBtVagNcSgBKtaaMt
+caStgggatDaVtKScaYagtttctagNBtcMcDgKaDHtVtMaMacMgtagtaaWtaYt
+gHtttttgtctagYHtRaagacDRaatgctVMtttWaYaaNtttatatttStcgactaDa
+tKaatatattHggttgtRtattaattaaaaRtaNacKattctVaatgattcttacWatgD
+gagggtggScatNtcMggaagggHtaaccttcWcatWaStagHtttgatHaRVaaSVNNt
+caRacaNaKttgctgggcVattatccatVatataDtDcNgMBMgHSagggaaagKctggg
+tcacgaatcaataaVtDttaRRgtctStattNBaaaBHatcgttaaWMagatagacatat
+VgDBttYMacaatttKtttaataaaagcacgVgaaactDBtaaccgtagaNtgagaaaRt
+tcKKagtYKttttaStataaHgtcNDcgttYccaaaaMcaWtgggttatcaaRaaggaat
+aaVWcacatattaRYaaVagagVtcHggaBtaataNattagKtcVRtgactatcgHDaBg
+RBStVtSgNBccWDgaatgaggaaNctttNttttacaaggagaaDDaVtcgaataaataa
+gttaattStBDccaaaBgVaDtctScgtgtttttgctgtcacgtttWgacStMtttVaVg
+aBtacDWtttagttDctaSDVtttNaDDcHatatacYtKataaatagttgaacaagaata
+caDDcacatttgtaaaggHattaaatgttacgtcagtNStttcVatttaBtHtVggttat
+taaHcgaWagaYtVaataaatcaBgaccctHcatKaDatRttHRMcgtcgggSMtaatNa
+gtYtgaYtggMYttgtaaactacgKgStttaaaYatatDtaaSaVVcHgtagatgaggtc
+aHggMtaMWaWaHctgaatctaaBaWaDtcgggtccctaagtaVYDaNactataaNcctK
+cBcataaatttcaWSttttgacHtctRggagRaagacagWVNtctcatHtDHaRagctSt
+atattggcattcattttMaNaSaRaNDHaagNtMgtVWtgtMccaactKNaaaVaStatc
+gtStgtgtaBgBgtaatcNtccgaagtttaWgactNgtaaccaatgNatWttgWagtaaK
+gtctRgtctaataagttVDHgStgttcVttgtSWatcYaggMatgMRcBaStgtaaaaaM
+ttaYagccggtgaRRatgatccaaaggtttctaaKgacaDagagatgctcMgaaaMcgRa
+acaaatataaaagcagtgtatDHgRaVtWBVtggacatStctKccttVttatgtKatttt
+YcatctgttatgtcDKHYcctSHMttgSDRNgtaMNHaggatBcSBtHatDMBcttMacN
+aVMKtctgtttcgaHSgtMgcacagaStaBttcWcattctDtcttHtDKBcaaNtRNaaD
+gaaaaccMRtBcWVVagcttatcgaDYccacKtatgatgtcaRttattYttctaMBggca
+YctaNtBactgattStaDaHccYaDtgcaRDgSYtYtatBSaYaaataaagtctcgcgtt
+cagaaKtttctVattagtWcacgaaVaaVtctcaVgtagttNaaacaatgtccttaacta
+aaStaKWagttaNttatacaaaKattBctgaagaagtYDNtagatataDtHcKcctaBag
+gcaatctHttctaaDNtgtgaaaagRaattataaBMaggtDgtMaWHacBStSMtcgaac
+YttRMatNacScgaaRtttctattcMaaBggtaKttaRcgtBattcgatatYtVaccSac
+acgtaaagtctNatYttgcSSattttcKccttataatcRtHNctttMcatBtacatgtYt
+ctagcNttYacaatgtaBgcgttVtattaaWtaDRtKNaNDttDWaaaataatDgcgcKt
+aatatcgctMctatcatcgtaaaaYNRttSaNtWggatRgtgtcttataVgaaaatcWDc
+ttDRaatMKctcatatRttBtccaattBSacctgMtaDDRagtcagacBNtttattttag
+tDacaagcaHcacgRttVtatcatatacStaatMaWagttRccKtRctcgaagttgaatt
+tNtttatHaHttagctatSBaBtcaagtDaaaRtgattcatStagttcaRattacaVgta
+tWRttWggttttctaactttSaaaVHRatttYHMKVVcgttMtatBtaSaaMctgMtcaa
+gaMtactcDatSaaaacNgatttNcaagttRgacgataVtaacYNataStRtgaattact
+gtaKtNagaaccDaatgNDaaHcataDSYattatgtctgYWaaRaHtttWggcKatgcgt
+agDSVtMactataKMSttaHaaaacaHatVaDKtSaaaRtcaNWHtatttctWataagct
+ttcccaacctNtaaacattcgagaBKVattaWtcVaKtWcggtaatcaatgttcaaatcc
+DttctcaaSaWNDataaKatBcaYttRtcataMVtKttggcaaNgtgttatMaccgttgM
+NagtgVtNBWggaacacaKaaKctagtctacttSaKYMacaWtWDttatagHBacttRtt
+cctgttagtScVNaRtaacgScaStttatctttttSgtBgNtttStRatNDWtctgatcK
+tgHcattatctaaaaattNaaaWgWaDWttWRtHRNcHacBVgWttgtNggtWtWcttgS
+atRtaaYtYtNaDttYagactStacYaYtNHBatggatacVtBatgccaHcgtagaaMat
+gataHagtKgHaWcgtaccKaNatagWtDttcgtagggcSgtRatatNgaRtYataaata
+RtBtcttaSatcagatgaaSgtVtHtgtaaDtVactgattcgcatctctBaWWtaagBtt
+VgacHattWWgcKataHtBtagScWtcaNtHStBKMHBRtRagcataaYtNtttatactt
+aMgacccattgagtDYggKccNaaRgataWaaaNWDMttMacttaatgStDYgtattaBa
+tBttKcSaactagtaccgttggaKacRtDaataSBaatacaKtgagDtNcttattaagYc
+agacttNNttatcBtHtgRatgccacctaSaatccaRSgtWggtgaaMcgcaMaagSaga
+aDatHcttgaaDgNRttaDKacgcataagYaagtMRttNaMMMgcggttcgtRaSgacaS
+taaVgStcaRBKcaMtctKtctatNaactaHtaactaaatNWaKtWaStRSKcatggtgB
+tgRBtagaatagataSBagMtDVataaDtaattgaYgaBaagWagaacaggaagtctgac
+gMgtgagaRVacMcBaaDatKatcNtKaRtcatDNBaaHatatacattaWRBtcaccatt
+ctctaaWttWacgtccgcgtMctcaaaccHYtNDatttSaDMccaStRttWgttattaSV
+KtgttttgtcWatgtgStttgttttatcaagacMttgtRDgcRtctctgtgggggcSaag
+catVattMacattSgttaacctaaaaccgcagtgagNgtctataatBtHtacaaSccccM
+gagRVctYagcgaatttacMagVttaRDcctRgSSttttcHtVaacatagBgaMRagatR
+cDBaMtaNtcatggHgaDYgaVgWaaaaMKattBtaDYBaHRccagttatacVaDcacac
+tcgtaSctaaatatRDaccagctttttaatgtagaMaRaaKaaataaaatacaRagaaYa
+NtatKcDttgHgcVtaYgDacagMBagtgttatgMcSgWDWYWtSaKaagcatKatatct
+caRHacagttaKtgBKtDRggtcaYcattcgcYattttgtccaagtVgcattttttaVaa
+gtaaaagtWccttgacYcaagtaatataYBaatataBtaaatacacttttRHagtttaDS
+HgNtNVcatKgaKtgagttgaaaHcgBattatHgRKtcaBaagttgtttgtVatYattaa
+ttBatYgaatgMgtttatagtKcVctagttaaYWttWaRKWggYttgaRgagaaMKtagg
+tattaMVttataVcagHYacaaMaattRRtataWaaRacHcattaVaBtHgtatBaRttt
+accaaggNgtaDMtatYtaYVtNtcBRKMgaatRaaagaatactRattttNcaaaDDaag
+tagtacaNtSHttaaataattggtaaKtttaaBaNgtaagtcaYttacVaataataatDt
+gHSSgtSDNaattcRMBgHttctaagaYVcHcactKgaaNHcgWaWttaaBactcgYtDa
+acgactMtaYKacBgttcttgttataBacatScBcattKaaattacttSSDaRgKtHHag
+RNRMtttBDtcaagcBcgcYattactcgtttacSaaNVagtacacgtggtSaWatBtgat
+ttWttScaaDtttggtKtNKaMtMgcttaHKaRaccgatccctgtgggagRMttaaMaWc
+cggtttBtgttaaVtagMWctNtctHgtBgcttatSMYccttgHaatatctgNgVttagc
+ttagggaBBSStaYgYatYgtaaaaattHatctatgtWRNgtVcSgtgcgtcYBagtRHg
+acttaaagSHatatBaaDgcaKtcccDgcacMttatRaacaataaccWtNBaYatttYac
+YtagagattRtatagKcatattDgKtNNgtttWNagggtacStataRtVDYaacgtaBtV
+KtagaagRttttttatataSaagaaKtaatatKtattagBtHataatatcWNaacagtgW
+accatatStcYcaaNRctcKacKttgtStaaKRaWDDaatBtttgtcagggBgtggScta
+aWtttYVWttNtctaacatagVYatcagatctVaHMgWtcaagtataHtgacaagttSac
+gtNRataaatgttgNtaattagaattgctMaRttBtacBatNgacatttcaMcgtaaacc
+tctagHctaaKNttBatatttaatattBaKtRagYtatattSgtgtccBaNSattgaaat
+tgYggcaaataatatHcaaaatcMBaagYatttttaYttYaStatttDtacRtgRatttt
+ttgDcRaggagcaccaattcRcttttataHcggatcatNSatgtagtHHcactgtWgtag
+gtNgactactHagagHattcaggggSaatgcaaaacSSKDtaggcDtatVagMtggacta
+BSatagMttaggatSYttaacBtagaNSVtaSaNcSScaaatattVctcYaWYtBcttcg
+aYBagWtRgagHKagagMaatttMatgtDtaYNagDtaBagcKcKcaMttKaaaaatVaa
+tHDaataacgRatBNVKtMaccYaaccMgttgtactagcttMatKgKBtMagtcttMWga
+atRcacaaaaSgcgVtSatggcaggcgKaYaatgctcattaaaggDVacStgttaMaaaa
+acNVtBtgcttaacgtDNaaRcgWaKtatactagcactgKVttaatcttRcgDHHattcS
+tatgatcWataagtattttacgtcaRgaaMcDattYHattYgatatcacNNWtDatgaaa
+actgaatHaggaNcttcctKggNgatBaaatttgcaaaDtgctcaatgtYagacMgtVVt
+gDBaacVaatNaDtatctgaaggKcagSggVtacgatgNWtKWaggMacctagaatattc
+ttYaatDatcgttgatggtcaacgttatatgcttaWVttccRgVcaDcgagMtacattaM
+taVWcgttRcatRacaRcMcaNtaYWNYgMtatMgccctaKctagHtttaaBVMaaWcSa
+ccgMttBRgNcRWMtHMaccaatgataaggagVttYgaatcttagtgtcMtgcctVtaRt
+gcaccaDaagHactNYcNcttaaggcMBagaWtattgtgctaccacgcWataRaHtDtac
+gaaVttagttVacctatatStDgtggtaMgaSattcatgMcaRctatgWgatKatYYaaa
+taNYcSaDtttgtcYttttttaBScatRtctgtaWttaatagMaacatDttaaaNgaact
+tacYttagaaccctgNgagMNHaaKacccNatgKccttaKcatDStaaStNaaVBatagt
+tcacRtYcRcKaagMgctKtBagSaagNcKRttaaaaKaaRttttttatHHNHaHRtcaR
+cMataKDDtNcKtKatctaaataaatRatYttMccaaaNaaWgctgattcaaaKgaatSc
+aNaaaKaBaaaaRNtataVcYDattagctattaaatWtgBWHgggtatcatattatcVtt
+cgHacgcgatMattDcaRggDYtYttNaaaatBKttKccStYVDatatYcctSacVcatt
+ttatMtWRctaYagRgctcttttaacVtagaNaVRaccgRaattaaVcaattgcgKRctM
+aKtttHgctttVMaNaRaNMKacHSagtWagtgNatKttatctataaHatgSaSattcag
+tDctWaataaYtcagtaYtctatHcgattSRttaaaNDgagatatacttVttatcataSS
+aBNaDataRtRRaattcaRataaRtattttNaRYtaKttaccaaaaaHVaBtttWtttga
+tRagctaMattgcttactctgatKtgatgRBttaataagYttcStKaNgcNatacgWatY
+aatctggVtaaattYccKagaVagggatttatttWacgaBcaBtaaDttttcgaBcHDga
+aSgVNctgaaKtgaVagtVWgRHgtacaatattgcMDNNataatagaaaataatNtNgcc
+gaaMaagtgNttacgVHaacSgStBBtRagtBgtaaWgacttcKgactaaatgaagVaac
+aBtggtacattcaaagtgattagKagNatatVaKBacaMMctccatcgcgggRctttKaa
+BatcacaScaNaaaaatVgHaattaatatcWcacacactcatgctcgaRggVgcatatca
+DcatYgaggttDgWNagagaaagagaYttHKaatgtaVtYttSNaDtcgaatctattSKg
+tgtaggaMgtaccWcaMRtHttaaatgWtgtccgtKtacggacaNgaacgaSgcYagcKB
+ttNacaagatacgaagaVcBgStMacMtgKaactataSgWtaaaatDRataaaNaSaagH
+ttHWYgaccWMtatataaaaagatgtaKtVtgtcBNMtRaSaRacVataaNaaaDtaatg
+taaagaDgtataVDaacagatttWtDtcBgatggBcgagctcKWgtHcBgcMaatDNatc
+aYtctBgaHtccagHctttMtattgtBccaHMctatctNaaatacgcgtacatacatcta
+DactactcKtacctataDccMattRgRggHtaaaaNYcVtatccgttSaagYcgMattta
+VattttHagVatVtttKattaagttaNaacaccHSttagDactSNgtgtttaNtVtattt
+atgaaacSaKtactctacgagttgaagtcaSBaDgtagatNaaactRKttcatcWtaBag
+gKtKcYttaDttatMaWcStgattKattgtatatDttatDtKatgtaNtgtcgtcttttt
+taBtDBcaaaaSgDatgHtctacaattcgMtVYtatgcattaaaattcaVgatRtcagBt
+caMaNctHgtatVatcHttcaDNKgtWcgagHtttaccattNgaactYacaKgaaagtgg
+tttgtgatcgaKaHgaatYNtBgcaaVatWacNggataccaDtaaaWttBMaBccagaHD
+aataaBaagYVacYaScctYVgagWagaYagtgatgtttWatSaaaMYDcactYtaStWg
+aaattacHgKDaYtttttgttcaaaaatttgYatatVcMatcactggRaaMVtStBtaaa
+agggatYaagtBtatcatgcDttDaaaaMatagtctaataNtcttWHaaatcaVttaRaK
+tcgatttataWRtaatatcDWcctaNMatgtttDaYaaWtMaagtcagaKtaMKacgcca
+aVatgWtSagtagctatttcactaaNcaaaNaaattaggattatMWgtgacgtcttcatt
+acaYttctRRtttgMatggNtatacaataataNgatNcMttaggBcDgRHgatctttagt
+NtacaaccgBatgtHaatgttttgatatccgttatcataStaKRaKgttgNaagagKttg
+NYMaggaattcagaactcaRataDttaagcttaccttttgVttaWWgacYggStacYcga
+tgcSccaacHcaYNtgRaHtcaYaacHctYacatagatBgtgacDaNgatMacgKgBaWa
+gacaSgttaKcatactatatcaHaatataattctggtcNttaYggDRtDaSHgNttYaat
+WagagtagaacKtWtHtBatNtScttttacaattagtaMaatttHgtctagMctaccaga
+gttcaKcStaccKggaggtctgcNatctctDgYccaaVgttgaatgacVcatagtgtatt
+ttccttcatctacttSgaaStcagHtMaataWNDagtatttttataggcatNKataNaMt
+gctgtttVaacctVBDWattgHttatattaKtatSVSttgtaScgcMcccattgggtaga
+KMgaSaSttYgcaaMaatVaVaKgtatgYNattcttagWgtcBaaagSaaatRatttNct
+acaStggtYcaaggttBtgaDWBtRtgaaDccacaaaVSatatBcaaScWccgaKttttc
+gtMaVttgatgtMatacatgNttBaNaagtaggaRaBagaagtaRtaagttacWatgHtt
+taagSaatgataNWattgtaSggHDtttBataaNNBRaatKWBgtaDcBaMaKtctaYat
+VaKataaaattWYcgtaHcttagtgYtgcKDtccatMSaaagatYcSaHatcaDtaatgM
+MatgcaaatgtttagaDDNtatttgaaKcNtagKYcaBMattaaagttaaWDacgRaRta
+KttaaattaVVKaMaBtaKctaaWcatctRMtgKcBaBaaagattHcgMcgaSNgactac
+cRatHtaSNtctYcaaBDtaggaagcMatttcaBcDaaatggWtcaHctaKtHcHMcRga
+ttgaMtNVaDagttaggcttYctcatDacWDaaaaaKtaBgtBaatcaataaKgactgac
+tcNcattMcacatNMattgtaaaNaaacttgctaRtttacttaatKYgcttgaSStgtaD
+aNgtaKgBgMaKgccagtgtMgatHDtgacaWDttHKaDgMacttaKaagBtttgtctta
+agMagtaHcttWcacaatSatgYtgacHgHcaHDgtagaDccVaKcaataNttccHYctc
+taSRtaYagtNgDagatWtRttSttNtRNagacatattttatggactacYMagtMacYaa
+gYgVgKgtNtaVcgtgaatcataatcgattYtaaatYtctgBaMgNWNKMgDttttaWta
+BaaHatNHaDacctccNKtgaVcWattYtgccaVRattMacBtcccNagYttBYNgaBaa
+aStWacMgcttccatgHaacttYagMtNaaVSYgcgatatHcaatatttgtgBcatWMta
+aaaDRttHaBaHttgaacaaataaWaMcaDctgBtatWttaacaaWacacWtDtatttat
+WaaHacaVagVgKaaaDttWgRBVagttVNttctgcttgacatttSHHMKScSgSaMtDt
+aMcgtcaWaacactMcaHWRgaactWtcgcMNcactVDaatHcDSttWtagactatgaRN
+cttagataYgaggaagagcaSHcWtMaKStatgYatttttVaattgtttWataaaDaDga
+taMcaMtatttctVKaKgcttcctDagtgatWatacaRtttaaaBSMctHaaatcagSta
+tStgaaVttaattatttgctaagcgagaWaaWtccgcaaSgaatVgtaStMcSNcgtWgg
+MVWNatHctggRtttaacNagtttRtaMBgatatHtaatcMaaaYgatMtaccttaagYa
+tcgaaattMataaHatYMcccaaaDaYaVaWgRaHaaaMcHSattcatWSatttcaMtga
+taKBYtactgaNttgaaDactgBatgYgttaagVgaagDagaatttKNtgaMtHagtaaH
+RgaaatttaYtaccNcgWNcKtaYtBMctVBWttttaSagRHBtaHtcgtactHggagta
+atttaaaVVattWDgtaaHaYgDtaacatDtacWttttttatgccacttaDtagtaaKgY
+NcttMNDaBcaVMcMctWgatactaRcaaWagaatgcWcRtattccagKgaNgtctcKtW
+gaNtSttagVaagaSYtcctWatatSgaDaKcactcgBtYacDgMtaKggtKcDtRtRgS
+aNKctaatHtRDaRgatatacattagtgccSttctDgcgatNcatttcHgcKtagcYgtt
+ttgNKWRattgBtaaNcRaatcNaagcgaaVKttYtWttaBttttttNggKcgaRBMVtN
+cNtDVaaMtcBNaKtaataRMcaaaattYactactBattWcgccgWaaMtaBYtgtaHag
+tcttVttaggaHVaaNaNaatcttgtgcattttatMDYKccataScaWgNttccttttMa
+RcVtWHgaaatgBaaRatgcgatataaaWYacYggtacttaaaaDaaattgatcWaatgt
+ttRcatatcaggaBcttttcttVKatKccaccYtDatMtcttacMtSattaatatagaat
+gSgagYgWNtttagtatgRggYKacaatattgggVtttaSaYcaRtBcggtDaggYaaac
+tNataggaggaDgaKcaaataagatMKaattaaNagtagttcWctataaDtttcgtcgta
+ttaccStgYgatgKtgcccYatDctYtttttYttaaaagaactcaNVaaYaYtccagacB
+ttKcaatKataatKVWcBataaatgttcctatYaacttaSVtgataggVatgagttgatc
+ttacgMMgtWtYtagcacaSctcHYtataattMttataYaaccKgtgtaaKcYagaaVtc
+BKattStgcaaKcaKKaHgtaaBtctgcaattaWgMcgYttMctWtaDNcDatggWaatt
+ggaVDagKattttgaaaRHattgMaaMgtaatcattctKgNaacacccNHataaaatgaa
+agagSatKtacVagttggtcgtgcBtgtgcatgagcaacataagKtcagtttgtDBBHWc
+gaDtatYttgattcttaaagcMMttaKgDaHtatVgWHccgatKttcaaNcYtcaaDWDa
+tcaWtBtWHgctaaMDaDWtWtNKcRRaNttVgHaRgKgcWgattNaaattaataNcaRt
+agtRgaacagataDKgtatScattaDgatcatMtcgYcgtttaaaRctcagcRattaaca
+tccStcBtgaccgtgWaaagaaatgaaWtattaVtHacctaccaaatgBgtaVVYaaaat
+ccKgtcaactataDgNagtcaSgtKttacHtccMKKWattagtatNctattagtttWttR
+tgaKaBHStgRagattaKRtWaKttaaWaagtaVccctgcgMRWatgttNKgtcSggSHt
+aBttgtaYaatDtaVtaatgtHcatWaYcMttataVgaaaaagBgaagRattccggcttD
+gggcttcttaacttRgaStaMBaaMtctMBHBacttVgKggcttgcgBcBtgDtttccta
+ttaaRcatStNgcKgctatcccacSctcHtaHWtgWaYatgVaRRYtgctaaaatggaga
+cctMcttgttMagBaKctttYWBtaYKgcccYttaMgtHaaNYgtgtagagDttcBatgt
+StttMtBWtaaBctaggaaNgaRgcttttttgtagacRttHSagaatDaYgcctMBtgtN
+SNaaBttgVtWtttKgacaatatVttVatagatttgcgtcgDtVgtSattaaaVHtaDaa
+tYttatKSWtcattagtaaNatctcagcgtgcKcatDtaBccaaccctgaYcattaNaag
+NaKgagttttcattaHMaVKMDDtaSHScaDattgcaggcccMattatacYtMatWgatt
+tcBcBtBctKacccaaWctatccctcaacaataaataaMttgtaHHcgatKgaggBtRYa
+ttatacgtaYNBacagacaaatVtMcttttRtVcaattgtttgaWtaaSacaRccMcaaa
+cttttaaacgtacVBtcWcSaYHgtattacgRtgtgtaKgWgaatctaBtcgtgRaaaWW
+VBcaNtcgctgYtaaaHaSccaagaVMNaacagattaHRaaMWcVgMtctgcatgaagRD
+attactgcKHtcactYtccttatgHtKgMgKcDtacNtcaStgYccaaDagttDtttgYc
+aagcacWWttaMgccaStaaWtVactgaagtKtttcaWaatgMattatKcctctttttca
+tgtaaactttNcaaKgttttMaMcYtgWctMtttactttagaKtMgttDYttctatagWc
+RttatYSagacttcaScaacaYtSaattcaaagtgctSaagctattaaagggtaactcac
+gDKgttaMRgggattttMcgttattaVtccaNagaRgMaataaagaStcSaacgtaWtta
+tatHgttHBcgtacggKBtSatDactRggaRgccBRttctaaaatSactcKtttVaWRat
+atttWaHaKMatgtacatcagctaatggBgaBNSNatatcYStagaatSNattaccgtca
+ataaggYMRtaDaatVgYaDaattataRgVaagtgcaNKtgttgacttatHccacHaacV
+cWcNMDtatcatttttaHacatKtatagtgccWttaattttBSDaKaHaDttYacDtBgt
+MNgggBaaaaattDaaVMaKgatcggKtgtctatctctVatcDtaagaagtgtaMcWatD
+ggaaaaaYtcDVtNttcNacgaYtcgatHctctaWgaaggtMttcKtcttaMgtctKNag
+cRWcgBVtcBDatYKtctaVaaaBgtaRagcacggcaHHagcagaaaaacgggtataatc
+aaWtacYcWtcctaBgVVaBagHaaaaaatataRYagaacgggVtttcHaMtNtMgcgaa
+atKtattaagtMttatcttWttttRaatatgttatgtatttRaagKtBgtgHtHDggaBD
+tWccattcKtttagtttagtBYcDaMBtgatcttgacatKctBcaaaacaHtatggaNaV
+ttcgttatttttttcaaDtDDaatcaaaYaaBHttaMKMVgctgWtacVtRaaactgYtc
+atggcVHtgattRttataBtcgaaRataDttaatcattHtatatccNattcaaHtgKRtR
+tagtKaRWaataYaggatccacttcacaatgtgatMaggactNaaccaaMaaKtagaaMc
+tacttDSaaaWSgctcagtWaataWaHtStMacttaDtgagWaaaatatttatcaacaac
+tRtDgYcYtatatgtataatWtagccaagcgtttataatDgctgVaaagHaattagaatB
+WggttctBaNtactHtKBtcgaaaRttHBatDaaKccaSHgtgctWttcBaatcctYttg
+aHacgtatgagStatRtMaacKacacggaaSctagDagNttgaKKSgtttctacgtagSa
+taHttDctggBcYtttaaatcgRgagagaDtgRSaVStggVtgacgtMtatgaaNtWtHg
+tDaDtgttNaSVagaattccgcttVatatacattatataYtaggYaaaRDHttHYDtNgc
+atHggctattYtaMcWaaVtaNtatttHaagBtatcagatHtttgaaWWtttKaaaggBt
+attHagtaacactDggtattttScttaaaacaStcaacHttMtatcagatSaHtaVtBaN
+YcttHcatgHatagaaggggaWgtgBtttagtVttgacatYtKtattaYSggtaaaHgca
+ggaStHtYcgtaaDWgtaaaMcgYtNHtgNgcttttataWatttKWaaKtHattgRtBtM
+MccgtBtYttgaKaWBatcBgaaacaBgaagatYgKWaaacBgatgtDaaacttDcacga
+tSKtaVaRDWtVKgHtcRattactctattBacaaactaatgDtaatcatatKRattSggt
+cggRMaaHVtgttMcgatatcccgVctKMgBactVtWtBKtgWtaaaVaatRgKatttKS
+aYHtcVBNtgStgtatNStaaccgttaaaaYactBgaaaaattacacVttKattVNgaMa
+ttNccctaVtaaStctgaaVatactgtctaaaKYNDtataWtattaaNgtHtaWgaBMtt
+ttccaaaDcgctgagBacacttctDSctcMtBtNccaacaaatSVtatWggagSattKat
+RBaaaNtNtttagacttaagtHttaatcgtWctHaMBaHtaaagKaaKttgatattttgK
+cgtcDtgtKtHagDtMtatgatcttgtcSgtWgctaaaaattDaaaNgNYtMttNHgtHB
+ataatMgMttctDcgtNtNatggKatHtaaRtRtDStttRVcaatKgaaRSRtBttatcc
+ataaMttagcaaWtagtVgaVBatcVtYtagttgtaMactaaataDatagNttttactag
+cgcKctDatatDgaHtRatVWagaDtttcggSKataacaggaaKggMtttctaVttMaat
+gattcgaagcgattaNNtYactttKgaatWttNNgctatatgttacKaMtaaDgtKgttB
+ttHtDacaagaaRgDgttWtaatgVBcaaccatgcYggtRcctaaDaaHcatYNaaVDNt
+BgtBaattYYgcHttRctattVtattgttcKaaatagtacccttgcVtaaHttaagaKta
+agSaYtgcacttDattYttaVgRcacaattDDttagattttcHagccaYaataKaatccV
+DKctNcctcaaBccaaBaYgKacWVtWttatgcSatcDHttattaacaagaacRSactBH
+ttDaBBBcacgttactHaKgacaKtaWMcHtaVHttaattcgttatatBaaagatgaact
+aaYgDNattNaHgHKtaatcctcttcHttagaatVcagaHtagBgtMataattaagtcSR
+catSagMagaaaacgYacgagcacgBcggacaHKaaBatSatagtatcDttRHtcagtDt
+aStYtagaaagtYNHtgaacaatgcgataaNgtNVagtacccctBcgaYWaactRtDtat
+ttKatBccVKtHttNcttVtgaKMtgcttggcgaNatctcKggtcttttataaacWaBtt
+cgHtcaHtcgatcgcggccaHaagcVgKattBaaWttKcttaVaagYaVacagaacgcSc
+DcgatataagttttacaaKcaaaBcYcHKctRagcgaatgtScBagMttYHtaatHcKKt
+gggatgKSaaatactgWBHVcagHcttVBgYDtaVtcctcatRcVKcNaaYaBtatttta
+tRtVtDaaScgtatacMatcaaactagtaKataaatStHtacaagagttgtYatctagaB
+aHSYtaaataaaStacaHagWSRSDtagtatggctgaKtaRctaaagBtactcttatgBc
+HcNtNRNtHataaccRttagatataaHtacScgtattgttgtDcctaYRaattccaNatg
+tgctaaaactMcaWttgttgVMaSgtaVaSctMcagtcacNaWacgaatWtaRtaatSga
+tgaaWtaaWcgtttHtWcttgatKtgDtDMcagtcattcacttgaaatactWgtattcHt
+tcataactgctgtgtKatRagtaatttYgNcaatcBctgtStaggtaMatacgtYaRNtg
+NaHtNccRtgcSHgRcaatttVcctattaBKtgYtaMaactRaaaaBaattHHtatVNWY
+HaatcagtaMVtttctattWHtttacaaVccDctYtttVtNtRRKtBgatHtBcaatHYa
+SgaagaagHagtttDaVaattVactactYcaDtKttgVVVtaWtggctaSttgtaataDc
+tWactcaRttWcMSYtWagaagttctKHcgKtDaYggaDttgtgtataacaRKctaactt
+cYaDtccNaNttaYtaatagRttaSagaatBtVRtaatcttatgcgtWtataaWgHataa
+tttYYSttYcggKKtaHcttttagHDDBtggtttaaacatagaRagtVagactttacKaW
+DMacgYaacctgctKaNattggatggNgtKcYSttttcctttDtYttBcatgattSHaac
+cVtccatctcccacDBtgaWBaMaaccgttttcttaaMgScBNatBtagtcttccttatK
+BRcctggtVStatagcDgMgtacattacccattKKtaRcRatRctYVaSagttatatYtc
+gNDDggKaHggcccgcRtacgDtcYctgaaacHtatattaVtcaattaaatgaWaBggYt
+HYYaVagWacaNtDtaRattgRacRtacacatgHtagagtaatatttctgDDcttgNDag
+cctaaHtatYHtKtRaScgtattMttacaacHggttttatSgaHVVgaattaatagttat
+tactgtRtaWgataMDaaaactgNYacYtagKtaRcaYDHatatVatggctKtWatHaNt
+taatttttgtaagcctggcgKataaNtttRMNggDtataaaatVcMRataacagctMatB
+gMtaaVcgagattcaaaSgtgKacgtDHatWaatgttcDtWatgYcWRttcatBSHtttg
+aatatBgaaWgggaaBcctSSVaagctSctagYatDggtatatgtaatatgtatgHYcRt
+agagtHcgggcataDHattcaaattcRgcaaaataagattcaaYVtaBtaagRagtttgS
+RtgRYKgWggtttaaHgcHStgtggtctaHaccaccSaaaattaHatgttVtataccaga
+atDKVtctagtttcaatgtNctaccgDcacgaattacactatgaaggccKVatccaSWaa
+KHtttSggatgagMagttgcaatatKYtacBttaccatHRttaacttacaDKKtaKaDcH
+HcaYatatgMagaRaNNttcggagYRtacMtHgacttagacBaagggBatcttgaRDact
+gatacatatcSBggtaaaVWgMaatttaYtaWacHattDMtttaaaRRScatcttctaat
+acagtBVgtgtttBagtatgBNcaagHaaaSaSYKcacMtKatggcacgcctSRaagcat
+aattaYacctMaaKtcggaBaVaaWaDMttgccttaaacttDaaHacNVtgagaatacca
+ctctMttaatcttHcctttaggaKgaggWtaNataYgtaggtgaagtcWDcWaBatattR
+tVgtRgVtataacDDNttatcYaaaagcaVgtYggaDattccgtccDcSttaaWtttcaa
+aatggataSatctRYcaaBctMMtcttaacMaSgDatgagatcaYgctcacHccMgaaca
+tcDNgtNRcgBaaatagaYgatgcttRaattStccttgagcctaVaagggatatcagtaN
+MttaaHcMaatccScBtYaYttatgaMNagtgHaatHacaHaBaaDtaRNDNcBtagBga
+catStagacttgtaatMtYaNaKSaccBtttHcDaHNBttBaacSaggagaacgWcMgtR
+caagattSctgtaBtcaatMtaHgcaaccataVgtaagDRcDcggaaccaBtacVMgStt
+gtcataaaaacaMataHatgttaacaaMgtacgtMVcatagYtKgtgtcctaBcYKattc
+aggBaaHagStcNcattatRRaSYtYDRaHYttttggaRggggttatKcVtHgctggaNt
+taagagBaacattggYaaDcSacggYaRttacaacactcDcacBDtYataaaaDWtctca
+ggVtaYttKtaVKtDSaMtYtYcgtaacHtRcHctaacBgattttagHaScDctHttaaa
+atVaHttggttatttDtatHtcaHcBagSttttDctttWtctaaataaWtHYtRgtBccS
+aaDSaNgatcSttaaaatgaYgKaaDaVatatYaRaHDtataKaNtagtacataggSaat
+MtctMtccctWgaYtaggataMttcgtacgccYgBSgttaaHgctRgRgtDVSRattttt
+taaKtRMtatSgRaatKacMaYgggtagBgNHcgYRagHcatatgtgaacMtacSDRMHa
+aacHaagtWSMcaattcagtDctBattgttcatttMBaDVHVDBtaatKactNacgcBYt
+ttgatctatVVtatcKaKSgtaWcgtcgNYatSaRtcaggaRtctattagattKHttYaa
+BtcacatataattMgtatcataKKatDVtWtaHtHHVaggaaHagWaHtattgtDaHRga
+tgtaaaWaaSStMatttgNtgtcagDWgagaBagtcattaataggagttcagcHttgWag
+aWcRttaKttaDgaDWtYacMWgRaatatccMtaaattRaatacaKYcgcatgtatgtNa
+ccataSttSatttttcgatcttcaaKcMDatgaattcaMWctKNcHtctacaYgatgcaB
+tDDWtaRtScaYaatYSgBtDcaacYataacgcDgtaacMtSaaKcKttttDVgttgtaa
+NcaattctcaataaatcSVcKaacattgggacatgaaaacggaggagtacDYgatMYtta
+aaBBctccYgcgagccHattttaWtataYcaKaaDYaaaStMctSattaatataNaWcac
+aataVtcatacaHcgMgaatYgaataatRcWcgtttcNDYcacaaacacaNttttaatct
+aKtRttHDSttccWatatagtKtgtcgaccaBgtVacNaYBHgtttSSagcNtctacctt
+taacgacaDcWVacSHcaNacatttgBYaaagatWagaacYMatcKgBYcBggtaWatat
+aKcNgaaaattHYtSaYDVHSactgttNRgaaaMBtatataaaaacVtctWtgKggtatD
+BgHaKaHVcMWtYYBaaattaVtcgaaacatggagYKtaaaacagttNtttatcatgcta
+gYcctctNgttctgctaYttBataaRtattgatgaaactagttBgagtcttccatBagat
+ctBaaagSacagtaaStaaatatataataatcttaactatVtaaBattHcHgcttSSaaD
+RaKtataagggKaacRagBaggtaMYttggtacMatMttttYttaacttaBaYaaaatKg
+tactactKDctcttgaDtMgattgVgcRaaaKattaatataagWgttcaWgtcaKtatcg
+acatDaaSatHtttcagcNtatSggtgtaRtgatttStBaNaHgcagttaggggatWttt
+gattttatcgaBtctaggcgtgtgtWttttaaSaWKctWggtgataaaattacBtMRtat
+ccattaaSWttaSMcYtHtaacttaaBaDattctatKatctttcatDtcgNcgacttgta
+aaattDcaVatRacatgaaagtcctgtctcatacatatcSWgNDttgaaVKatNacDgga
+gWaaatgaaVNtttBataaagVttVataataYcNMVaNaKaatRMcagNacVRactcWgc
+tttNatHaRaBRtaaatRtaKtNgYWattaatcttaRttgttcttaaWaaagttcNVtag
+MaBatcVcgccDaaBMgKttgaVaaccgYtRaactttYtcatgattgtWSaaBatagtag
+SataDgatgNtaWatcaMttaHattagVtggagaNHtaatatctNaagaDBatcttttaR
+aaNtBYagtaacVttYBtaagcaaaMatcNgKaggacagagtgaRatWaDaaSaDaaatt
+VgcWttatBNctgSagtctgcSttacSRtgatHDgggcBagccDtatYaaagaataDgat
+DaBttagctatcHtcWtagggagtDtSaaacagtagcttVatgttggcStataacttVta
+atWKtatDatcttcDaagactgtgDNBaccaattaacaaagaaHWtatttaacattWaat
+gttcMttaNNcYaRccHtacRagatccKaaYactcVRDtcHVtgaaNaSatctRSaWtag
+agtcgcaataDcagBaagtctSNagaaaKgttataStaatagStaatSatataWttctcg
+taDgtYRcgtHttaKtcDttRaatNacYgtagVaattNttttatDgKcttttSaaattYc
+gYBaaggttctagYcBataacVcagggaWtaKtacatgcYcctatccDatatagtcRaaa
+SMgtggaatcaaMaatWcgctagggtcattaVtctaatgHcaSHtcacttBaagaMDtac
+tYgtttgWgacccStDtagaDaBtgctctttKaaaatMttNStggtttatWttYttatKM
+KgtctaKcgaBaaaattcccgacYtBcaKaKttRccaaBaWgMaMatgtWtcRDWttcgg
+acNctataaacKaaatHatggDatSaaKtgcgRaaacgtgttcatNtgHtcaataaacaa
+WMKatattcWaKcNaccWtggttcctBaMttgRtggtWtaaVggDgttaDaScgWccWHa
+tacaagtaHtaacttWaNatgtgttaacKaVtcataDMattgtaKccttttttStaaDDt
+HYattNtcgatataBattctWRatMVtStaSaWttNRacgatagtRcgcRtcctttacag
+BKaaVcYtRaKatVtaWttaVggBBatcaaWatgtggagattDgWtttcaataDtactRa
+atBattWVacttWVNtVagHaHtatttaVagtRMMtaBattatataaNaagatHBtgtat
+VtaaacatttagtccaKDcacgWaaHagttVKBgcgRaSYtttVcgaacaBatttaatct
+aSYtccNtcatctatttatBaHcattcaBgDMYtactgScccttRctaagtaaNtaaaaa
+ttatggtVataaagVStcaatcacgcDaatgtaacatDBagtcgaaRDaSactgcagaHg
+ttYatgaVgtNccttcaKHgcgataDcgYtgtgBatcacScgctBcVttttcYaaNtttt
+tatcBaatgataYgtgttgtatgaVcBagtatagtNaRaaatKVtcRtcWatctaattgt
+VgataaMataWagaDttaatRcgctaKHgaRagtDctScatNgHgtKgtDtHBVgYcaga
+tgttagcgaataaNBactBaaRaWcRcMctctBtWKaggcaataatSYtccagtRtaSVt
+RgatctaBgDNDtBgtttgtaNtWtaatatDtataacgccDttcaMaMatgRtgaaaMHa
+tgBaatgcccDagNgttRDcWtaaaKtMSaBgctgcaatgtSVattRWcBtDaaMKRccc
+WtVttaaatatttctgtcatNBgaaaatHtttWtYtttcaacaaagaaNYBaatatctga
+tNtgaacaaMaaYcNgtgatttWtNaatWcYMScMctaaStttNgHtMacgtMDtgagca
+ttcacWtttKttBtKaKcHaBtttaBacgaaNYaaaatBaatNHgaaatMtagatDcaag
+MtaattctKtgNtScaatagcaHDagtagagSRcagcaagaccYHtaNtBatKtStcRag
+tgttMaYgtgggtNatSaatStcYtaBaSBtaggtctMtatcatgaattactcYtNagaa
+aDtggaaatKBattaaatcWgKtStKtcaWMggaattYtggccgaWcacagaNWaNgaac
+aYaHgaVtMctVHttaKDcctNccBKMDagtatgcHtttaaaDaggtgHtattcatattt
+aagcBaaaRcSgttaaatgWacRatacaaatgBatYatatRBcacaVataRaKWMcDWtS
+aatatHattcVgMKYtgtaVBtgagattRgaatgaDgtcaStacgctaggRggtSagKcW
+YctacaagtttBtgaBttacgaStHgVaStgtaRtacaDccNDattSRgttatMtNtttt
+WHacDtttVtgacgYattccWctaagtgaaaMMatgNtctaataRctgaacatttVcNtg
+tttgaggcaaagtatgVgtaVtgRDcttBDtataaMBatatNgataataHaaaNacaStg
+aNaHgYtgacagtcYDggagattNcaDtKgtagMaacSHRtcagNagatKcatataVata
+ctgRVatgBtatcgttattHtHcKaDtagRagtgHtaDcVtatacattacggcaKttatt
+gacatDaatgtctcattVcaRcttttgDtNHSggcttaYDcHaatcDYacccWaMttgRt
+NggYtttttggDgctacVDtBMgBaDgtMaaBgctBVttVagaHBaaaaatgNactaatt
+attNagaagNVaBgVtRgggatacgctgMtgaccatMaaDYDaagctggtcaatggtatB
+tNtccWtWKcaNcBttactgtgBYDaMtMtcWaatctWYHatccgWtataaaNNacNgct
+YagtaaaRtaaYggcagaMaagggttHaatatcaccVtagtggcgtMtagtcaYaaRttW
+gBtctgaaBtKattaatYtacaatcKcacNcMDtgtactatcDcgRtaaYagattgccMt
+gtYKaRaWHgtaccttagcRaWaagDataccagcatcYtcaaSgVacatttaSttSVDSc
+tactgaNctatVattttacgaggWgtaaaKtcNgatgttgcaaNVttagRtttttRttYY
+aYcaaagcVDMaaRaRtccVcSattttcaattagWattMMctataWatggtaagagRaaa
+ttYKKtgatagcMYgcVcgggStattacgBBctNtRgacaacYHctctNtataattBttS
+taRaaaatctgtWatcRacaaMtattYttKtccaatcSttatgtaWttcgcaaWgtWNcB
+ccRgtBagNgYtDctatccMaagtgcYMtYctYttgtcVaaHtatgcBaaBcgaataatt
+cttcDaacaaacBtagWYaagcaVacYcKYttgSaKVcttccgcctcattctcaatgVga
+aacatWWctgcagtttctttttMagWttatRggcattattVaagaBBttatctattatMc
+NtaacagttgaaaBaRtaRRtNtataYNtttNtcctaVBtatNtNgBtaHHYDttKctaD
+ctcaNcatgDaYatgYagaDcaHgactHgWWaagWtSttctagKaaggYtcataYgBtcc
+RaggggaaaHagaacaDatgaaaatcaKtattgWacgtcMSaacYaYgcWYNgagtaMgt
+SccgaaaaaatctggaMMRaaaataatctaaacgatatgDaggaVKcttttaatgacBtt
+NYttagtatDagYttWctttNgtHtcVtattHtcHacattatHgNStgtSaNaactVMca
+atcccBHNatcttDtcgaKccKttatttctVRaagttaMtaYtcttcatMYRctttRtaM
+gSaaaactgWacHagtacccatttcgcatgagtaaagtHcaKgVBtaattatBtttWatg
+MctccattgactattcttgtcatSttaaHaVtKtDcatcatatccaacKatattatNggN
+aRatcMSDHRtcctYRaatccacYaatBattcttBVctatatttRNtgaNtcaaaRgtaB
+cttaaDRcgctacWcttgatatctHttttgtNtYatatacgaVBgYHgattgggtcgaca
+cDtttKVcaattWRcaagBtgctDKDaYtttcKgNgggtcacVagatMgtMVgVgatttc
+agtcgtgKgtKYgtYSaMtgataatNggattKNgaSggactaaBagataacactcataVg
+ttataaSacaatcRRaagtaDaagDYtcactgtgaVttWtBaMttttgaHtKaYtattcc
+agccaaBaggataaRtBatNcatgtatatttcttacaaYVNatagaaagaSaaaagaaat
+SaBgtcgattacattgWccttHNattataacgVRDtYcWgaaYaVgMttcttgtDtKaYV
+ttctgggSNtaYHWaaHactaaSSagttgSaaactYaMttaMaHVRtcgattaccHtcgc
+gatgNcaYtatattacgcHaaaMNMtaYDgacaggRgaYVtVKcaSVcWMBBaWaWcagt
+atHaWBNaMcBtatccatgaScHtYtgactcattgaYatRtacttYtctttgBgtattaa
+DtcaHgcNcaVatagtttggggRaaaccWcNNttRBgaaRKgaaNtMaagcVacgtgtta
+aMYWtcBYtgagtaatcgttttaatcgaaaagttDcaatgtggtBaBcNtgNatBtggac
+tttagYttBcgttRttatSgacNaDttatRKacactgcSKaVaaaRgHaattaaaRctga
+tKaWcctWggWWagccgaactaYccttgtgaBHggcYttttBccttaggaKtaaaBacVD
+cBYYgaWagaKtaHaaactaNttatagtcttttacgaccctttKattWcgHgcaDccctH
+ttatVVaagKaatatgggMaNHagattgNStatBatcgaaYgcVcagaatcctcYtBKDa
+tatcNKgacaatKDatgaaacgaaatYYcgNBDtataatMcRWtaagtataHgMaVggca
+aDtggttcVattattaaaatSVaMaNcDBttataYgttttStacattgagagtccaNtga
+atttttKtStatatttRaatttcgBDccctaaSWatttaaMBStcatacctgctctatct
+atKatatgaacaactctWBaNagtcgYaaaaRtctMtDgtaBaacaNtacagtcgataNg
+aVccgtttattatgatctagtDSgaHNcctKtcttatNtgatYKaaStctWDVcaaccga
+VttScaagaaaaVcccggagWatcVaNtVaRcNtcagatcMMatactaaaWaagatYHRW
+caSagcgMtttatSBtBtBgacRaVgtgattaagtBgtatcgtNggggDaWgagctgatc
+tatttHaactttcgcttttccatttNaaYgtattttactttacttRataBttgataggga
+cattattaaSaaaYtgatggaDaMttacttatttttttaaWttttaataaWaNaattgta
+BtBMcatcNtaaMtDaaaatcRgcatccaMtggWggHggagSttacaYHatYtgtaatca
+tttgVtataaDVttcaYttctHtHtagttWHNYYtVRVccatacaattaaaYatcgcatB
+agcaatDaWacVaBWattagaaBataatgtKaaaNKcagaactNaagaNatgKtBSctga
+ttgWcNaaSataggtataaacVaatDttcRaRtVtVtgtataagMtSccaSScagttgat
+YattcagcMaaWctaagtYcSattNccgtcgtaBtaattgttgacaaaDttttattaata
+cSKtcgcatNttatWatacgRtgcataactYtcacHgVgHttYaataaWacgSVKatact
+agDggcattKctggataagtVgKYtatgttagcgtaRtttaaagacHgacacattcHKaM
+KtcgKtcacggtgatcaaBtMttcttattcttDaKKVgWagtaacatgKatVgacattag
+WtaRtaccRaaVHtttttRtgBccagtcgctagtRtaBcMVWMtaBtaggttaYcttaga
+SgYgttttcaaNNgtttVaagctgStttactaacWattcgtVgtgtKcgtYaaaaaKtaS
+aattgBtYgaVcagKatgaMttWDRatgtaatctagacWaccgcaNgtctgtgagtMttg
+aaatNtttattaRKcgtaWatcaWccaKtttNactaatNcgVaaBcgRgDttcDcatttg
+agWNattttNaYtttatgcHtttBBacgttgRgtcataNtatatcaWVcatgaacatRgt
+NaWaatcaggttaaSctttcaacatHttVKaHtNtMtcttcHattYatcgatgtacSaaa
+taVtcttYStaagattDagtKccgaccHBYatMtcggBacatVtaaagMcttBgtSagKg
+NttttcNtSaaMaStHgtattttKaRttaMtDtcKtcgagDKgaaaacttaaaWNaattg
+aWWaaggaaacKtttVggMBcatattDacctaMgaaKgcgcaaMRtaatcgataaatRDt
+tataNtVgtaVDggttaNgatBgtggcaaYWtagctcWgtSaacgtattKcgcBtttDac
+aaaaaStKMtatNccagKatgtVtHtWaSBgDttgWgaattWagttttaagcctNcttaB
+tYttaRactaattggagagggtctagtatgggtttacttBtatcatatgctaKggNcata
+aaSatgtaaaDcDRtBggDtctttataattcBgtcgtactDtDagcctatttSVHtHttK
+tgtHMaSattgWaHKHttttagacatWatgtRgaaaNtactMcSMtYtcMgRtacttctW
+BacgaaatatagScDtttgaagacacatagtVgYgtcattHWtMMWcStgttaggKtSga
+YaaccWStcgBttgcgaMttBYatcWtgacaYcagagtaBDtRacttttcWatMttDBca
+tWtatcttactaBgaYtcttgttttttttYaaScYaHgtgttNtSatcMtcVaaaStccR
+cctDaataataStcYtRDSaMtDttgttSagtRRcatttHatSttMtWgtcgtatSSaga
+ctYaaattcaMtWatttaSgYttaRgKaRtccactttattRggaMcDaWaWagttttgac
+atgttctacaaaRaatataataaMttcgDacgaSStacaStYRctVaNMtMgtaggcKat
+cttttattaaaaagVWaHKYagtttttatttaaccttacgtVtcVaattVMBcttaMttt
+aStgacttagattWWacVtgWYagWVRctDattBYtgtttaagaagattattgacVatMa
+acattVctgtBSgaVtgWWggaKHaatKWcBScSWaaccRVacacaaactaccScattRa
+tatKVtactatatttHttaagtttSKtRtacaaagtRDttcaaaaWgcacatWaDgtDKa
+cgaacaattacaRNWaatHtttStgttattaaMtgttgDcgtMgcatBtgcttcgcgaDW
+gagctgcgaggggVtaaScNatttacttaatgacagcccccacatYScaMgtaggtYaNg
+ttctgaMaacNaMRaacaaacaKctacatagYWctgttWaaataaaataRattagHacac
+aagcgKatacBttRttaagtatttccgatctHSaatactcNttMaagtattMtgRtgaMg
+cataatHcMtaBSaRattagttgatHtMttaaKaggYtaaBataSaVatactWtataVWg
+KgttaaaacagtgcgRatatacatVtHRtVYataSaKtWaStVcNKHKttactatccctc
+atgWHatWaRcttactaggatctataDtDHBttataaaaHgtacVtagaYttYaKcctat
+tcttcttaataNDaaggaaaDYgcggctaaWSctBaaNtgctggMBaKctaMVKagBaac
+taWaDaMaccYVtNtaHtVWtKgRtcaaNtYaNacggtttNattgVtttctgtBaWgtaa
+ttcaagtcaVWtactNggattctttaYtaaagccgctcttagHVggaYtgtNcDaVagct
+ctctKgacgtatagYcctRYHDtgBattDaaDgccKtcHaaStttMcctagtattgcRgW
+BaVatHaaaataYtgtttagMDMRtaataaggatMtttctWgtNtgtgaaaaMaatatRt
+ttMtDgHHtgtcattttcWattRSHcVagaagtacgggtaKVattKYagactNaatgttt
+gKMMgYNtcccgSKttctaStatatNVataYHgtNaBKRgNacaactgatttcctttaNc
+gatttctctataScaHtataRagtcRVttacDSDttaRtSatacHgtSKacYagttMHtW
+ataggatgactNtatSaNctataVtttRNKtgRacctttYtatgttactttttcctttaa
+acatacaHactMacacggtWataMtBVacRaSaatccgtaBVttccagccBcttaRKtgt
+gcctttttRtgtcagcRttKtaaacKtaaatctcacaattgcaNtSBaaccgggttatta
+aBcKatDagttactcttcattVtttHaaggctKKgatacatcBggScagtVcacattttg
+aHaDSgHatRMaHWggtatatRgccDttcgtatcgaaacaHtaagttaRatgaVacttag
+attVKtaaYttaaatcaNatccRttRRaMScNaaaDgttVHWgtcHaaHgacVaWtgttS
+cactaagSgttatcttagggDtaccagWattWtRtgttHWHacgattBtgVcaYatcggt
+tgagKcWtKKcaVtgaYgWctgYggVctgtHgaNcVtaBtWaaYatcDRaaRtSctgaHa
+YRttagatMatgcatttNattaDttaattgttctaaccctcccctagaWBtttHtBcctt
+agaVaatMcBHagaVcWcagBVttcBtaYMccagatgaaaaHctctaacgttagNWRtcg
+gattNatcRaNHttcagtKttttgWatWttcSaNgggaWtactKKMaacatKatacNatt
+gctWtatctaVgagctatgtRaHtYcWcttagccaatYttWttaWSSttaHcaaaaagVa
+cVgtaVaRMgattaVcDactttcHHggHRtgNcctttYatcatKgctcctctatVcaaaa
+KaaaagtatatctgMtWtaaaacaStttMtcgactttaSatcgDataaactaaacaagta
+aVctaggaSccaatMVtaaSKNVattttgHccatcacBVctgcaVatVttRtactgtVca
+attHgtaaattaaattttYtatattaaRSgYtgBagaHSBDgtagcacRHtYcBgtcact
+tacactaYcgctWtattgSHtSatcataaatataHtcgtYaaMNgBaatttaRgaMaata
+tttBtttaaaHHKaatctgatWatYaacttMctcttttVctagctDaaagtaVaKaKRta
+acBgtatccaaccactHHaagaagaaggaNaaatBWattccgStaMSaMatBttgcatgR
+SacgttVVtaaDMtcSgVatWcaSatcttttVatagttactttacgatcaccNtaDVgSR
+cgVcgtgaacgaNtaNatatagtHtMgtHcMtagaaattBgtataRaaaacaYKgtRccY
+tatgaagtaataKgtaaMttgaaRVatgcagaKStctHNaaatctBBtcttaYaBWHgtV
+tgacagcaRcataWctcaBcYacYgatDgtDHcctaaagacYRcaggattHaYgtKtaat
+gcVcaataMYacccatatcacgWDBtgaatcBaatacKcttRaRtgatgaBDacggtaat
+taaYtataStgVHDtDctgactcaaatKtacaatgcgYatBtRaDatHaactgtttatat
+DttttaaaKVccYcaaccNcBcgHaaVcattHctcgattaaatBtatgcaaaaatYMctS
+actHatacgaWacattacMBgHttcgaatVaaaacaBatatVtctgaaaaWtctRacgBM
+aatSgRgtgtcgactatcRtattaScctaStagKgaDcWgtYtDDWKRgRtHatRtggtc
+gaHgggcgtattaMgtcagccaBggWVcWctVaaattcgNaatcKWagcNaHtgaaaSaa
+agctcYctttRVtaaaatNtataaccKtaRgtttaMtgtKaBtRtNaggaSattHatatW
+actcagtgtactaKctatttgRYYatKatgtccgtRtttttatttaatatVgKtttgtat
+gtNtataRatWYNgtRtHggtaaKaYtKSDcatcKgtaaYatcSRctaVtSMWtVtRWHa
+tttagataDtVggacagVcgKWagBgatBtaaagNcaRtagcataBggactaacacRctK
+gttaatcctHgDgttKHHagttgttaatgHBtatHcDaagtVaBaRccctVgtgDtacRH
+SctaagagcggWYaBtSaKtHBtaaactYacgNKBaVYgtaacttagtVttcttaatgtB
+tatMtMtttaattaatBWccatRtttcatagVgMMtagctStKctaMactacDNYgKYHg
+aWcgaHgagattacVgtttgtRaSttaWaVgataatgtgtYtaStattattMtNgWtgtt
+KaccaatagNYttattcgtatHcWtctaaaNVYKKttWtggcDtcgaagtNcagatacgc
+attaagaccWctgcagcttggNSgaNcHggatgtVtcatNtRaaBNcHVagagaaBtaaS
+ggDaatWaatRccaVgggStctDaacataKttKatttggacYtattcSatcttagcaatg
+aVBMcttDattctYaaRgatgcattttNgVHtKcYRaatRKctgtaaacRatVSagctgt
+WacBtKVatctgttttKcgtctaaDcaagtatcSataWVgcKKataWaYttcccSaatga
+aaacccWgcRctWatNcWtBRttYaattataaNgacacaatagtttVNtataNaYtaatR
+aVWKtBatKagtaatataDaNaaaaataMtaagaaStccBcaatNgaataWtHaNactgt
+cDtRcYaaVaaaaaDgtttRatctatgHtgttKtgaaNSgatactttcgagWaaatctKa
+aDaRttgtggKKagcDgataaattgSaacWaVtaNMacKtcaDaaatttctRaaVcagNa
+caScRBatatctRatcctaNatWgRtcDcSaWSgttRtKaRtMtKaatgttBHcYaaBtg
+atSgaSWaScMgatNtctcctatttctYtatMatMtRRtSaattaMtagaaaaStcgVgR
+ttSVaScagtgDtttatcatcatacRcatatDcttatcatVRtttataaHtattcYtcaa
+aatactttgVctagtaaYttagatagtSYacKaaacgaaKtaaatagataatSatatgaa
+atSgKtaatVtttatcctgKHaatHattagaaccgtYaaHactRcggSBNgtgctaaBag
+BttgtRttaaattYtVRaaaattgtaatVatttctcttcatgBcVgtgKgaHaaatattY
+atagWacNctgaaMcgaattStagWaSgtaaKagttttaagaDgatKcctgtaHtcatgg
+KttVDatcaaggtYcgccagNgtgcVttttagagatgctaccacggggtNttttaSHaNt
+atNcctcatSaaVgtactgBHtagcaYggYVKNgtaKBcRttgaWatgaatVtagtcgat
+tYgatgtaatttacDacSctgctaaaStttaWMagDaaatcaVYctccgggcgaVtaaWt
+StaKMgDtttcaaMtVgBaatccagNaaatcYRMBggttWtaaScKttMWtYataRaDBM
+aDataatHBcacDaaKDactaMgagttDattaHatHtaYatDtattDcRNStgaatattS
+DttggtattaaNSYacttcDMgYgBatWtaMagactVWttctttgYMaYaacRgHWaatt
+gRtaagcattctMKVStatactacHVtatgatcBtVNataaBttYtSttacKgggWgYDt
+gaVtYgatDaacattYgatggtRDaVDttNactaSaMtgNttaacaaSaBStcDctacca
+cagacgcaHatMataWKYtaYattMcaMtgSttDagcHacgatcaHttYaKHggagttcc
+gatYcaatgatRaVRcaagatcagtatggScctatattaNtagcgacgtgKaaWaactSg
+agtMYtcttccaKtStaacggMtaagNttattatcgtctaRcactctctDtaacWYtgaY
+aSaagaWtNtatttRacatgNaatgttattgWDDcNaHcctgaaHacSgaataaRaataM
+HttatMtgaSDSKatatHHaNtacagtccaYatWtcactaactatKDacSaStcggataH
+gYatagKtaatKagStaNgtatactatggRHacttgtattatgtDVagDVaRctacMYat
+tDgtttYgtctatggtKaRSttRccRtaaccttagagRatagSaaMaacgcaNtatgaaa
+tcaRaagataatagatactcHaaYKBctccaagaRaBaStNagataggcgaatgaMtaga
+atgtcaKttaaatgtaWcaBttaatRcggtgNcacaaKtttScRtWtgcatagtttWYaa
+gBttDKgcctttatMggNttattBtctagVtacataaaYttacacaaRttcYtWttgHca
+YYtaMgBaBatctNgcDtNttacgacDcgataaSatYaSttWtcctatKaatgcagHaVa
+acgctgcatDtgttaSataaaaYSNttatagtaNYtaDaaaNtggggacttaBggcHgcg
+tNtaaMcctggtVtaKcgNacNtatVaSWctWtgaWcggNaBagctctgaYataMgaaga
+tBSttctatacttgtgtKtaattttRagtDtacatatatatgatNHVgBMtKtaKaNttD
+HaagatactHaccHtcatttaaagttVaMcNgHatatKtaNtgYMccttatcaaNagctg
+gacStttcNtggcaVtattactHaSttatgNMVattMMDtMactattattgWMSgtHBtt
+StStgatatRaDaagattttctatMtaaaaaggtactaaVttaSacNaatactgMttgac
+HaHRttgMacaaaatagttaatatWKRgacDgaRtatatttattatcYttaWtgtBRtWa
+tgHaaattHataagtVaDtWaVaWtgStcgtMSgaSRgMKtaaataVacataatgtaSaa
+tttagtcgaaHtaKaatgcacatcggRaggSKctDcagtcSttcccStYtccRtctctYt
+caaKcgagtaMttttcRaYDttgttatctaatcataNctctgctatcaMatactataggD
+aHaaSttMtaDtcNatataattctMcStaaBYtaNagatgtaatHagagSttgWHVctta
+tKaYgDctcttggtgttMcRaVgSgggtagacaataaDtaattSaDaNaHaBctattgNt
+accaaRgaVtKNtaaYggHtaKKgHcatctWtctDtttctttggSDtNtaStagttataa
+acaattgcaBaBWggHgcaaaBtYgctaatgaaatWcDcttHtcMtWWattBHatcatca
+aatctKMagtDNatttWaBtHaaaNgMttaaStagttctctaatDtcRVaYttgttMtRt
+gtcaSaaYVgSWDRtaatagctcagDgcWWaaaBaaRaBctgVgggNgDWStNaNBKcBc
+taaKtttDcttBaaggBttgaccatgaaaNgttttttttatctatgttataccaaDRaaS
+agtaVtDtcaWatBtacattaWacttaSgtattggDgKaaatScaattacgWcagKHaac
+caYcRcaRttaDttRtttHgaHVggcttBaRgtccctDatKaVtKtcRgYtaKttacgta
+tBtStaagcaattaagaRgBagSaattccSWYtttattVaataNctgHgttaaNBgcVYg
+tRtcccagWNaaaacaDNaBcaaaaRVtcWMgBagMtttattacgDacttBtactatcat
+tggaaatVccggttRttcatagttVYcatYaSHaHcttaaagcNWaHataaaRWtctVtR
+YtagHtaaaYMataHYtNBctNtKaatattStgaMcBtRgctaKtgcScSttDgYatcVt
+ggaaKtaagatWccHccgKYctaNNctacaWcttttgcRtgtVcgaKttcMRHgctaHtV
+aataaDtatgKDcttatBtDttggNtacttttMtgaacRattaaNagaactcaaaBBVtc
+DtcgaStaDctgaaaSgttMaDtcgttcaccaaaaggWtcKcgSMtcDtatgtttStaaB
+tatagDcatYatWtaaaBacaKgcaDatgRggaaYctaRtccagattDaWtttggacBaV
+cHtHtaacDacYgtaatataMagaatgHMatcttatacgtatttttatattacHactgtt
+ataMgStYaattYaccaattgagtcaaattaYtgtatcatgMcaDcgggtcttDtKgcat
+gWRtataatatRacacNRBttcHtBgcRttgtgcgtcatacMtttBctatctBaatcatt
+MttMYgattaaVYatgDaatVagtattDacaacDMatcMtHcccataagatgBggaccat
+tVWtRtSacatgctcaaggggYtttDtaaNgNtaaBatggaatgtctRtaBgBtcNYata
+tNRtagaacMgagSaSDDSaDcctRagtVWSHtVSRggaacaBVaccgtttaStagaaca
+MtactccagtttVctaaRaaHttNcttagcaatttattaatRtaaaatctaacDaBttgg
+SagagctacHtaaRWgattcaaBtctRtSHaNtgtacattVcaHaNaagtataccacaWt
+aRtaaVKgMYaWgttaKggKMtKcgWatcaDatYtKSttgtacgaccNctSaattcDcat
+cttcaaaDKttacHtggttHggRRaRcaWacaMtBWVHSHgaaMcKattgtaRWttScNa
+ttBBatYtaNRgcggaagacHSaattRtttcYgaccBRccMacccKgatgaacttcgDgH
+caaaaaRtatatDtatYVtttttHgSHaSaatagctNYtaHYaVYttattNtttgaaaYt
+aKttWtctaNtgagaaaNctNDctaaHgttagDcRttatagccBaacgcaRBtRctRtgg
+taMYYttWtgataatcgaataattattataVaaaaattacNRVYcaaMacNatRttcKat
+MctgaagactaattataaYgcKcaSYaatMNctcaacgtgatttttBacNtgatDccaat
+tattKWWcattttatatatgatBcDtaaaagttgaaVtaHtaHHtBtataRBgtgDtaat
+aMttRtDgDcttattNtggtctatctaaBcatctaRatgNacWtaatgaagtcMNaacNg
+HttatactaWgcNtaStaRgttaaHacccgaYStacaaaatWggaYaWgaattattcMaa
+ctcBKaaaRVNcaNRDcYcgaBctKaacaaaaaSgctccYBBHYaVagaatagaaaacag
+YtctVccaMtcgtttVatcaatttDRtgWctagtacRttMctgtDctttcKtWttttata
+aatgVttgBKtgtKWDaWagMtaaagaaattDVtaggttacatcatttatgtcgMHaVct
+taBtVRtcgtaYgBRHatttHgaBcKaYWaatcNSctagtaaaaatttacaatcactSWa
+cgtaatgKttWattagttttNaggtctcaagtcactattcttctaagKggaataMgtttc
+ataagataaaaatagattatDgcBVHWgaBKttDgcatRHaagcaYcRaattattatgtM
+atatattgHDtcaDtcaaaHctStattaatHaccgacNattgatatattttgtgtDtRat
+agSacaMtcRtcattcccgacacSattgttKaWattNHcaacttccgtttSRtgtctgDc
+gctcaaMagVtBctBMcMcWtgtaacgactctcttRggRKSttgYtYatDccagttDgaK
+ccacgVatWcataVaaagaataMgtgataaKYaaatcHDaacgataYctRtcYatcgcaM
+gtNttaBttttgatttaRtStgcaacaaaataccVgaaDgtVgDcStctatatttattaa
+aaRKDatagaaagaKaaYYcaYSgKStctccSttacagtcNactttDVttagaaagMHtt
+RaNcSaRaMgBttattggtttaRMggatggcKDgWRtNaataataWKKacttcKWaaagN
+aBttaBatMHtccattaacttccccYtcBcYRtagattaagctaaYBDttaNtgaaaccH
+caRMtKtaaHMcNBttaNaNcVcgVttWNtDaBatgataaVtcWKcttRggWatcattga
+RagHgaattNtatttctctattaattaatgaDaaMatacgttgggcHaYVaaNaDDttHt
+caaHtcVVDgBVagcMacgtgttaaBRNtatRtcagtaagaggtttaagacaVaaggtta
+WatctccgtVtaDtcDatttccVatgtacNtttccgtHttatKgScBatgtVgHtYcWag
+caKtaMYaaHgtaattaSaHcgcagtWNaatNccNNYcacgVaagaRacttctcattccc
+RtgtgtaattagcSttaaStWaMtctNNcSMacattataaactaDgtatWgtagtttaag
+aaaattgtagtNagtcaataaatttgatMMYactaatatcggBWDtVcYttcDHtVttat
+acYaRgaMaacaStaatcRttttVtagaDtcacWatttWtgaaaagaaagNRacDtttSt
+VatBaDNtaactatatcBSMcccaSttccggaMatgattaaWatKMaBaBatttgataNc
+tgttKtVaagtcagScgaaaDggaWgtgttttKtWtatttHaatgtagttcactaaKMag
+ttSYBtKtaYgaactcagagRtatagtVtatcaaaWYagcgNtaDagtacNSaaYDgatB
+gtcgataacYDtaaactacagWDcYKaagtttattagcatcgagttKcatDaattgatta
+tDtcagRtWSKtcgNtMaaaaacaMttKcaWcaaSVMaaaccagMVtaMaDtMaHaBgaa
+cataBBVtaatVYaNSWcSgNtDNaaKacacBtttatKtgtttcaaHaMctcagtaacgt
+cgYtactDcgcctaNgagagcYgatattttaaatttccattttacatttDaaRctatttt
+WctttacgtDatYtttcagacgcaaVttagtaaKaaaRtgVtccataBggacttatttgt
+ttaWNtgttVWtaWNVDaattgtatttBaagcBtaaBttaaVatcHcaVgacattccNgg
+tcgacKttaaaRtagRtctWagaYggtgMtataatMtgaaRttattttgWcttNtDRRgM
+DKacagaaaaggaaaRStcccagtYccVattaNaaKStNWtgacaVtagaagcttSaaDt
+cacaacgDYacWDYtgtttKatcVtgcMaDaSKStVcgtagaaWaKaagtttcHaHgMgM
+tctataagBtKaaaKKcactggagRRttaagaBaaNatVVcgRcKSttDaactagtSttS
+attgttgaaRYatggttVttaataaHttccaagDtgatNWtaagHtgcYtaactRgcaat
+gMgtgtRaatRaNaacHKtagactactggaatttcgccataacgMctRgatgttacccta
+HgtgWaYcactcacYaattcttaBtgacttaaacctgYgaWatgBttcttVttcgttWtt
+McNYgtaaaatctYgMgaaattacNgaHgaacDVVMtttggtHtctaaRgtacagacgHt
+VtaBMNBgattagcttaRcttacaHcRctgttcaaDBggttKaacatgKtttYataVaNa
+ttccgMcgcgtagtRaVVaattaKaatggttRgaMcagtatcWBttNtHagctaatctag
+aaNaaacaYBctatcgcVctBtgcaaagDgttVtgaHtactSNYtaaNccatgtgDacga
+VtDcgKaRtacDcttgctaagggcagMDagggtBWRtttSgccttttttaacgtcHctaV
+tVDtagatcaNMaVtcVacatHctDWNaataRgcgtaVHaggtaaaaSgtttMtattDgB
+tctgatSgtRagagYtctSaKWaataMgattRKtaacatttYcgtaacacattRWtBtcg
+gtaaatMtaaacBatttctKagtcDtttgcBtKYYBaKttctVttgttaDtgattttctt
+ccacttgSaaacggaaaNDaattcYNNaWcgaaYattttMgcBtcatRtgtaaagatgaW
+tgaccaYBHgaatagataVVtHtttVgYBtMctaMtcctgaDcYttgtccaaaRNtacag
+cMctKaaaggatttacatgtttaaWSaYaKttBtagDacactagctMtttNaKtctttcN
+cSattNacttggaacaatDagtattRtgSHaataatgccVgacccgatactatccctgtR
+ctttgagaSgatcatatcgDcagWaaHSgctYYWtatHttggttctttatVattatcgac
+taagtgtagcatVgtgHMtttgtttcgttaKattcMatttgtttWcaaStNatgtHcaaa
+DtaagBaKBtRgaBgDtSagtatMtaacYaatYtVcKatgtgcaacVaaaatactKcRgt
+aYtgtNgBBNcKtcttaccttKgaRaYcaNKtactttgagSBtgtRagaNgcaaaNcaca
+gtVtttHWatgttaNatBgtttaatNgVtctgaatatcaRtattcttttttttRaaKcRS
+tctcggDgKagattaMaaaKtcaHacttaataataKtaRgDtKVBttttcgtKaggHHca
+tgttagHggttNctcgtatKKagVagRaaaggaaBtNatttVKcRttaHctaHtcaaatg
+taggHccaBataNaNaggttgcWaatctgatYcaaaHaatWtaVgaaBttagtaagaKKt
+aaaKtRHatMaDBtBctagcatWtatttgWttVaaaScMNattRactttgtYtttaaaag
+taagtMtaMaSttMBtatgaBtttaKtgaatgagYgtNNacMtcNRacMMHcttWtgtRt
+ctttaacaacattattcYaMagBaacYttMatcttKcRMtgMNccattaRttNatHaHNa
+SaaHMacacaVaatacaKaSttHatattMtVatWgattttttaYctttKttHgScWaacg
+HtttcaVaaMgaacagNatcgttaacaaaaagtacaHBNaattgttKtcttVttaaBtct
+gctacgBgcWtttcaggacacatMgacatcccagcggMgaVKaBattgacttaatgacac
+acaaaaaatRKaaBctacgtRaDcgtagcVBaacDSBHaaaaSacatatacagacRNatc
+ttNaaVtaaaataHattagtaaaaSWccgtatWatggDttaactattgcccatcttHaSg
+YataBttBaactattBtcHtgatcaataSttaBtatKSHYttWggtcYtttBttaatacc
+RgVatStaHaKagaatNtagRMNgtcttYaaSaactcagDSgagaaYtMttDtMRVgWKW
+tgMaKtKaDttttgactatacataatcNtatNaHattVagacgYgatatatttttgtStW
+aaatctWaMgagaRttRatacgStgattcttaagaDtaWccaaatRcagcagaaNKagta
+aDggcgccBtYtagSBMtactaaataMataBSacRMgDgattMMgtcHtcaYDtRaDaac
+ggttDaggcMtttatgttaNctaattaVacgaaMMtaatDccSgtattgaRtWWaccacc
+gagtactMcgVNgctDctaMScatagcgtcaactatacRacgHRttgctatttaatgaat
+tataYKttgtaagWgtYttgcHgMtaMattWaWVtaRgcttgYgttBHtYataSccStBt
+gtagMgtDtggcVaaSBaatagDttgBgtctttctcattttaNagtHKtaMWcYactVcg
+cgtatMVtttRacVagDaatcttgctBBcRDgcaacKttgatSKtYtagBMagaRtcgBa
+ttHcBWcaactgatttaatttWDccatttatcgagSKaWttataHactaHMttaatHtgg
+aHtHagaatgtKtaaRactgtttMatacgatcaagDgatKaDctataMggtHDtggHacc
+tttRtatcttYattttgacttgaaSaataaatYcgBaaaaccgNatVBttMacHaKaata
+agtatKgtcaagactcttaHttcggaattgttDtctaaccHttttWaaatgaaatataaa
+WattccYDtKtaaaacggtgaggWVtctattagtgactattaagtMgtttaagcatttgS
+gaaatatccHaaggMaaaattttcWtatKctagDtYtMcctagagHcactttactataca
+aacattaacttaHatcVMYattYgVgtMttaaRtgaaataaDatcaHgtHHatKcDYaat
+cttMtNcgatYatgSaMaNtcttKcWataScKggtatcttacgcttWaaagNatgMgHtc
+tttNtaacVtgttcMaaRatccggggactcMtttaYMtcWRgNctgNccKatcttgYDcM
+gattNYaRagatHaaHgKctcataRDttacatBatccattgDWttatttaWgtcggagaa
+aaatacaatacSNtgggtttccttacSMaagBattacaMaNcactMttatgaRBacYcYt
+caaaWtagctSaacttWgDMHgaggatgBVgcHaDtggaactttggtcNatNgtaKaBcc
+caNtaagttBaacagtatacDYttcctNgWgcgSMcacatStctHatgRcNcgtacacaa
+tRttMggaNKKggataaaSaYcMVcMgtaMaHtgattYMatYcggtcttcctHtcDccgt
+gRatcattgcgccgatatMaaYaataaYSggatagcgcBtNtaaaScaKgttBgagVagt
+taKagagtatVaactaSacWactSaKatWccaKaaaatBKgaaKtDMattttgtaaatcR
+ctMatcaaMagMttDgVatggMaaWgttcgaWatgaaatttgRtYtattaWHKcRgctac
+atKttctaccaaHttRatctaYattaaWatVNccatNgagtcKttKataStRaatatatt
+cctRWatDctVagttYDgSBaatYgttttgtVaatttaatagcagMatRaacttBctatt
+gtMagagattaaactaMatVtHtaaatctRgaaaaaaaatttWacaacaYccYDSaattM
+atgaccKtaBKWBattgtcaagcHKaagttMMtaatttcKcMagNaaKagattggMagag
+gtaatttYacatcWaaDgatMgKHacMacgcVaacaDtaDatatYggttBcgtatgWgaS
+atttgtagaHYRVacaRtctHaaRtatgaactaatatctSSBgggaaHMWtcaagatKga
+gtDaSatagttgattVRatNtctMtcSaagaSHaataNataataRaaRgattctttaata
+aagWaRHcYgcatgtWRcttgaaggaMcaataBRaaccagStaaacNtttcaatataYta
+atatgHaDgcStcWttaacctaRgtYaRtataKtgMttttatgactaaaatttacYatcc
+cRWtttHRtattaaatgtttatatttgttYaatMcaRcSVaaDatcgtaYMcatgtagac
+atgaaattgRtcaaYaaYtRBatKacttataccaNaaattVaBtctggacaagKaaYaaa
+tatWtMtatcYaaVNtcgHaactBaagKcHgtctacaatWtaDtSgtaHcataHtactga
+taNctRgttMtDcDttatHtcgtacatcccaggSttaBgtcacacWtccNMcNatMVaVg
+tccDYStatMaccDatggYaRKaaagataRatttHKtSaaatDgataaacttaHgttgVB
+tcttVttHgDacgaKatgtatatNYataactctSatatatattgcHRRYttStggaactH
+gttttYtttaWtatMcttttctatctDtagVHYgMRBgtHttcctaatYRttKtaagatg
+gaVRataKDctaMtKBNtMtHNtWtttYcVtattMcgRaacMcctNSctcatttaaagDc
+aHtYccSgatgcaatYaaaaDcttcgtaWtaattctcgttttScttggtaatctttYgtc
+taactKataHacctMctcttacHtKataacacagcNRatgKatttttSaaatRYcgDtta
+MRcgaaattactMtgcgtaagcgttatBtttttaattaagtNacatHgttcRgacKcBBt
+VgatKttcgaBaatactDRgtRtgaNacWtcacYttaaKcgttctHaKttaNaMgWgWag
+gtctRgaKgWttSttBtDcNtgtttacaaatYcDRtgVtgcctattcNtctaaaDMNttt
+tNtggctgagaVctDaacVtWccaagtaacacaNctgaScattccDHcVBatcgatgtMt
+aatBgHaatDctMYgagaatgYWKcctaatNaStHaaaKccgHgcgtYaaYtattgtStg
+tgcaaRtattaKatattagaWVtcaMtBagttattagNaWHcVgcaattttDcMtgtaRH
+VYtHtctgtaaaaHVtMKacatcgNaatttMatatgttgttactagWYtaRacgataKag
+YNKcattataNaRtgaacKaYgcaaYYacaNccHatMatDcNgtHttRaWttagaaDcaa
+aaaatagggtKDtStaDaRtaVtHWKNtgtattVctSVgRgataDaRaWataBgaagaaK
+taataaYgDcaStaNgtaDaaggtattHaRaWMYaYaWtggttHYgagVtgtgcttttca
+aDKcagVcgttagacNaaWtagtaataDttctggttVcatcataaagtgKaaaNaMtaBB
+aattaatWaattgctHaVKaSgDaaVKaHtatatatHatcatSBagNgHtatcHYMHgtt
+DgtaHtBttWatcgtttaRaattgStKgSKNWKatcagDtctcagatttctRtYtBatBg
+HHtKaWtgYBgacVVWaKtacKcDttKMaKaVcggtgttataagaataaHaatattagta
+taatMHgttYgaRttagtaRtcaaVatacggtcMcgagtaaRttacWgactKRYataaaa
+gSattYaWgagatYagKagatgSaagKgttaatMggtataatgttWYttatgagaaacct
+NVataatHcccKtDctcctaatactggctHggaSaggRtKHaWaattcgSatMatttaga
+ggcYtctaMcgctcataSatatgRagacNaaDaggaVBagaYttKtacNaKgtSYtagtt
+ggaWcatcWttaatctatgaVtcgtgtMtatcaYcgtRccaaYgDctgcMgtgtWgacWt
+gataacacgcgctBtgttaKtYDtatDcatcagKaVMctaatcttgVcaaRgcRMtDcga
+ttaHttcaNatgaatMtactacVgtRgatggaWtttactaaKatgagSaaKggtaNtact
+VaYtaaKRagaacccacaMtaaMtKtatBcttgtaaWBtMctaataaVcDaaYtcRHBtc
+gttNtaaHatttBNgRStVDattBatVtaagttaYatVattaagaBcacggtSgtVtatt
+taRattgatgtaHDKgcaatattKtggcctatgaWDKRYcggattgRctatNgatacaat
+MNttctgtcRBYRaaaHctNYattcHtaWcaattctBtMKtVgYataatMgYtcagcttM
+DataVtggRtKtgaatgccNcRttcaMtRgattaacattRcagcctHtWMtgtDRagaKa
+BtgDttYaaaaKatKgatctVaaYaacWcgcatagBVtaNtRtYRaggBaaBtgKgttac
+ataagagcatgtRattccacttaccatRaaatgWgDaMHaYVgVtaSctatcgKaatata
+ttaDgacccYagtgtaYNaaatKcagtBRgagtccatgKgaaaccBgaagBtgSttWtac
+gatWHaYatcgatttRaaNRgcaNaKVacaNtDgattgHVaatcDaagcgtatgcNttaD
+ataatcSataaKcaataaHWataBtttatBtcaKtKtatagttaDgSaYctacaRatNta
+WctSaatatttYaKaKtaccWtatcRagacttaYttVcKgSDcgagaagatccHtaattc
+tSttatggtKYgtMaHagVaBRatttctgtRgtctatgggtaHKgtHacHtSYacgtaca
+cHatacKaaBaVaccaDtatcSaataaHaagagaatScagactataaRttagcaaVcaHa
+taKgDacatWccccaagcaBgagWatctaYttgaaatctVNcYtttWagHcgcgcDcVaa
+atgttKcHtNtcaatagtgtNRaactttttcaatggWgBcgDtgVgtttctacMtaaata
+aaRggaaacWaHttaRtNtgctaaRRtVBctYtVtatDcattDtgaccYatagatYRKat
+NYKttNgcctagtaWtgaactaMVaacctgaStttctgaKVtaaVaRKDttVtVctaDNt
+ataaaDtccccaagtWtcgatcactDgYaBcatcctMtVtacDaaBtYtMaKNatNtcaN
+acgDatYcatcgcaRatWBgaacWttKttagYtaattcggttgSWttttDWctttacYta
+tatWtcatDtMgtBttgRtVDggttaacYtacgtacatgaattgaaWcttMStaDgtata
+ttgaDtcRBcattSgaaVBRgagccaaKtttcDgcgaSMtatgWattaKttWtgDBMagg
+BBttBaatWttRtgcNtHcgttttHtKtcWtagHStaacagttgatatBtaWSaWggtaa
+taaMttaKacDaatactcBttcaatatHttcBaaSaaatYggtaRtatNtHcaatcaHta
+gVtgtattataNggaMtcttHtNagctaaaggtagaYctMattNaMVNtcKtactBKcaH
+HcBttaSagaKacataYgctaKaYgttYcgacWVttWtSagcaacatcccHaccKtctta
+acgaKttcacKtNtacHtatatRtaaatacactaBtttgaHaRttggttWtatYagcatY
+DatcggagagcWBataagRtacctataRKgtBgatgaDatataSttagBaHtaatNtaDW
+cWtgtaattacagKttcNtMagtattaNgtctcgtcctcttBaHaKcKccgtRcaaYagS
+attaagtKataDatatatagtcDtaacaWHcaKttDgaaRcgtgYttgtcatatNtattt
+ttatggccHtgDtYHtWgttatYaacaattcaWtatNgctcaaaSttRgctaatcaaatN
+atcgtttaBtNNVtgttataagcaaagattBacgtDatttNatttaaaDcBgtaSKgacg
+tagataatttcHMVNttgttBtDtgtaWKaaRMcKMtHtaVtagataWctccNNaSWtVa
+HatctcMgggDgtNHtDaDttatatVWttgttatttaacctttcacaaggaSaDcggttt
+tttatatVtctgVtaacaStDVaKactaMtttaSNagtgaaattaNacttSKctattcct
+ctaSagKcaVttaagNaVcttaVaaRNaHaaHttatgtHttgtgatMccaggtaDcgacc
+gtWgtWMtttaHcRtattgScctatttKtaaccaagtYagaHgtWcHaatgccKNRttta
+gtMYSgaDatctgtgaWDtccMNcgHgcaaacNDaaaRaStDWtcaaaaHKtaNBctagB
+tgtattaactaattttVctagaatggcWSatMacccttHttaSgSgtgMRcatRVKtatc
+tgaaaccDNatYgaaVHNgatMgHRtacttaaaRtatStRtDtatDttYatattHggaBc
+ttHgcgattgaKcKtttcRataMtcgaVttWacatNcatacctRataDDatVaWNcggtt
+gaHtgtMacVtttaBHtgagVttMaataattatgttcttagtttgtgcDtSatttgBtca
+acHattaaBagVWcgcaSYttMgcttacYKtVtatcaYaKctgBatgcgggcYcaaaaac
+gNtctagKBtattatctttKtaVttatagtaYtRagNtaYataaVtgaatatcHgcaaRa
+taHtacacatgtaNtgtcgYatWMatttgaactacRctaWtWtatacaatctBatatgYt
+aagtatgtgtatSttactVatcttYtaBcKgRaSggRaaaaatgcagtaaaWgtaRgcga
+taatcBaataccgtatttttccatcNHtatWYgatHSaaaDHttgctgtccHtggggcct
+aataatttttctatattYWtcattBtgBRcVttaVMRSgctaatMagtYtttaaaaatBR
+tcBttcaaVtaacagctccSaaSttKNtHtKYcagcagaaaccccRtttttaaDcDtaSt
+atccaagcgctHtatcttaDRYgatDHtWcaaaBcWgKWHttHataagHacgMNKttMKH
+ccaYcatMVaacgttaKgYcaVaaBtacgcaactttMctaaHaatgtBatgagaSatgta
+tgSRgHgWaVWgataaatatttccKagVgataattWaHNcYggaaatgctHtKtaDtcta
+aagtMaatVDVactWtSaaWaaMtaHtaSKtcBRaNcttStggtBttacNagcatagRgt
+KtgcgaacaacBcgKaatgataagatgaaaattgtactgcgggtccHHWHaaNacaBttN
+KtKtcaaBatatgctaHNgtKcDWgtttatNgVDHgaccaacWctKaaggHttgaRgYaa
+tHcaBacaatgagcaaattactgtaVaaYaDtagattgagNKggtggtgKtWKaatacag
+DRtatRaMRtgattDggtcaaYRtatttNtagaDtcacaaSDctDtataatcgtactaHt
+tatacaatYaacaaHttHatHtgcgatRRttNgcatSVtacWWgaaggagtatVMaVaaa
 >THREE Homo sapiens frequency
+ggtattttaatttatagtcgatagtaccaacaacaagcacaatcataattatgttagaaa
+acccagggggtaatgctctaaatccagctttaaggccagagtgcactatgaaatcgccat
+tgatcattgtgtcattcgctgaacttggtgtctaggaggtgccgagtgagaatatcagat
+accttatgaagcaacgattatatctggactagatcatgatgatcggaataaaacattgaa
+ataagtccttatcaaggagcataaacattttatttaatttatacttcgtaaataaattca
+gaattttttttcaagacattaatctgagtaaatgacggctagaaagggttcctactcgaa
+tcgtagcctacgcatgtgggcagtaacctggcttgcgtttttactgaaacaaaggttcac
+cggaaagaaggctgccacttttagcttcttgacgatctttagcgtcatatttttagatta
+gtcgaaaaacggaaaacaaacttaacgaagctggttgcacggggtaccgagaaaccaaag
+agcaggacaactccttgatcgggaagaactgaaatagacagctgtcattttcattggtca
+acttatcaatataacgaccaccgtagtgacgcttgcatgaaaatactgaggatgtaaact
+atagccagtcaggcccgcgtgttgactaattgatgaagcaaacaaaatagccggtattcg
+ttaaaaggaacgggttgccagctacagatatactctaggtatatcccaaacaagagacgt
+cctttggctgttgtaatcggtcataatacttgtcacataaacaagatcgctgaattaaac
+attaaacagttagtgatacacaatcgtggttggggctgggatgtgcaataaaaagtcatc
+tatcgtctatcacagagcgacgtaaatttagacaaacattattatttcttgacaatggaa
+tcgataagcgttcctctaacttggtatatatatctcgaccccgggattccagccattctt
+gtatgaagatttaaccatttaactatgcatagttgaatggtaaggaaaatgatattgact
+gcaacagattttggatgcaaaaatatttgtgaattattggttatatactggttgtatagc
+acaatcattaggtcctagaaggcatactcaacctcagcgagagagctagcatgcataatt
+gtaccgcccatattaatattcctgaaatgatttcttacattacgcccaatttcagtcatc
+gaacacccccatcaatttacccgatagagaacgtgatcatacgcaataccctatgcgaac
+gtccactctatagcgtctgtatacaatgattattcgttccatttacaacgttaagtaatt
+taaacttacataaggacaaggaaatccgcgaacctcctggaatgtatgagttatttatgc
+agttaacttcgtctcgaccggaactaaaggcgtcgtacgaatgaaaggccacttttagaa
+gagacctttgtatccattgtggagaatatcataaattcaagatggggtgtcatgctattc
+ggtcctaaacattcttaatggctgttctattgttagtctgatttaaaatggaaccatagc
+acgaatagttagatagggctcatacccctgtaacgatctacaaatccttccccgggtgtg
+tgcgttagcgacggaaagttttacggtttgtgatcaaagaacactcacacgtcagattat
+tacactgatacgaattatttcagtcgacagtaattgaatagaaacttattaacgccagca
+cctgacacggtaagtaaggcaggtctgaactgtttgactgtaaaaaaatggtaatatttt
+taaaaatcttgatttctatatcaaatgatgtgtagttttttctctgttattaaaatccca
+gtgcgcgaaatttagatcgttacgactcacgtacaagatcacacatcacacgcgttagcg
+aaagcggaatggctaatacagccctacgcaacgtagtgggatcaacatatggacgaattt
+atgctcaatgagccaacctcccccgcattgcggttcattttaaggcctgggtaacatcta
+tcgtttagataatcaaaggaatccgactatgcaattgtctgacttcatccgctctcaagt
+ccaatgcaggcgctacgtgtttctttaatcaataccatattgaaatcgtaatacgataat
+tgttgctattgactacaggttatgaaaaaacttactttgcgggtacatgcatatttttgt
+accacattattacgcgatatctctcagtgtactctaaattaaaccctcttcgaacatttt
+agttcctattcgtaaacacgtgctacgcggcaatttgccggtcgtagaatggacaactcc
+agttcaactgcatgtaactcatagctcgcgttagtataaattgactagtagccatgggac
+aaagtaactagtcagcggaaaagatccctttaaagatatatgcaggttgcaagcataaag
+ctcattgctcgaggtgcaccgtggtattccaaaagcgtctctatcgtatcttctaatttt
+gggccgtgagaatcgaaactactctgatttgctgcacacgttaggtaatatcgcccattt
+tcccgtataagctccgtacttatacgaactacacgaccttttaagcattagccgctcata
+tcgtgattcgtgtacagatgagtctattaaaattacagacatactccatatctcgctcct
+tgaactttgaataatgcgctaacttgtactatgaataggcagaacccaactttcccgttt
+gcgtcaagcggggaaacgatacatgttgtcagatttatgattatctagttttagatcacg
+tttaccgataatcggctgtggtctgagcagtcctacactgagtatttacttcagcttcat
+atcggtccgaaaaaaggttgtgaccgaatgtcaaaatacggagtacgatgggcatctttt
+ttcgagtcgcggttgcagggcagcaaaaggcttaaaccatttttacgatttttactatag
+cggtcatgaagtgcgaaactgcttgcaaattttctacacacattgtggctcttgtccttg
+aagcttatggcgaaaatttgaaacatagtataccagggaaagcgcgaattatttggtgac
+taatagtccgtgggtttgagccatatacctaacgccataaactacgtggtgctttagatg
+caatctaaacagaacagaaagcgtagcgctcatcagcacagactaactttttcagtttga
+gtcgccggagggacttcgagacaagaacgcgtcaagtcgcttgcgcggcacggattcgat
+tgggcggctcaatcttgcctaatttctactattgtcagctgtacgactgtactaagtgta
+tagccccaaataaaagaagtatcgatgcgtctttatgaccaaaggtcttataattgaagc
+gcacttccgttcatcaaattaaatcctggcttacccgattctccggaagtctgacctaga
+gattgacgacggccgcgtattattgagacctcttcaggattaatcaataacgaagtagtt
+gatctgtttggcgacgtaccttaagccgactccgctacacgagtttctactaaaccaatg
+tagccttatgcttagatgaataccgtcctaattagatattccggcataacagcagtaaat
+tatctgttcaatggacgaacattgaattgttagtattctacacaagtcaggcctcgtaaa
+tattaggtaaggccgtgggataacctacgtgatatgcttgagcttgcgttgcaagctctc
+gttaatcattaatttaggtgcgtgagggttaaacaccagcatattctatatgctagacgt
+cttccttaaaggatcgtagtattataattaataataagaaatatggttgacgtctagtca
+gcgggcatacgctgctctatatactggcattattcaaaacttgacggtaaaaaaacgaat
+tttaaggcgctcacgtcgaatgagccgaactcatgggaaccaaaatgtcacagaaaacac
+ctctttattgccaagcatgcaataaaaaaaatgttaatagtacgtttacgacattttatt
+ttataataaagagaaactattacacctattgatatgataggacgtaaattaacgagtagc
+ctgcatagaggcaaatgaggtttctacatggtatagacctgatgctgaaacatcgatgag
+ttttggtcccctcgctcgttgaaatctagtcatttactactgtctttcgagctattatac
+cacttcactatgtggtgtttctttgctatgtatggggctagtcaaacatgatgactatag
+ctacaactcagagagcgggcgtgttaagagtatctcatgctagaactgcacgacgaactt
+gatacaaagtaacaacatttacgattccacaaggtgactttgaagaaacatagtttaatt
+ctctgcttcgatcatttctataaaccggtaccatcgcagcggatagatgcataacatttc
+tactactccaggcatcttaaaacacacgtagtacttcactagattaagacacgataagtg
+tataacttggcagtgggaagcaaggagattggcgaactcctggcatctgttacgttttgt
+tcaggctcggttgttgataatgtccgactcctgccatattgaagactcgctcgagggaga
+tcgggattcgttgattataagtacacgtgttccgtaatactatgaggcagtgattcaaaa
+tggcacttctgacttacatgactaggtattattaccacggaagcgttaaaggcacactct
+tatggacttaagattgcaagtgccttcttctagcctgaattcgcgggttcaacacaaact
+ctctttagacatccgttgcctaaaggctgagacgtaggggcaaccctttaactatgtact
+aaaaaactagttggtaatttaacaacgtgtccaatcaagacgatgcaccaacgcggtgcg
+aaaatcgggttaagcaaacacaaataggaattgtgataaaccccaccttgagaggtcgca
+agaccaacctcgggaacaacggctctaagagaataacctaaatccggatgagtagactgt
+gtaactctctaaagggaagtgaaaaaaagctaagcatacatttaggtctcctgcattgca
+ttcaattgaatcgtttgtattatgagctgtacagtagctatatcagctatagttatccca
+gaggaacaggtaaactagctctgagcgtgaaatccggatattagaacccctagatgggat
+tgattctagctaatacaggcttatctggttttacagttatctagatgattggtaaggtga
+aacgcttggtgccttccaccacttaaacaaaagtattgcccgggaagctattttctaggt
+attataaagtcgagcattaatatcaatttgacagtaaaggtctttcaccagcttcatatg
+ccatagggcccatactcgatttaaattgaacggtttaacgagtattggaactctcactta
+taactgagtagctatacgaaaaatctggtccatttccagaaatttattatcgatttgctg
+cttagtacccaggaagtgataacccttgaaggcacaacactgtaataagttttcctgtca
+catctgtaatattcggtcactacgcattcacgactaaagataattactatactaattaaa
+agttcaatgttagggccgaatcatagtagaaattctcgtctagcctaatcggacttacct
+atgggctgtgaggatttatcagtatgtggacaaaaatgctagagataggtatagttaaag
+tcaccatggtacatctatgtgaggaagtttgtagttcgcttctttagtccgggcgtttgg
+gatgacaactactatacgtagagccgtactcaggattagatagtgtgaaagagtcaaata
+aaagggttaatattaatttaacgttgcaaatgtgtttaggccaaacattaaccgttgtag
+ggatattctaatacaggccttcaccgaaccctaatgataatctgtcttaataacattaaa
+tgattgtctccgctacgagctcttagggcctcattttaaatgactaatgtccaaagaaga
+gactttcccaatttcaatctgtcacgtatagacggcaccttagtgagtcatatcattaag
+atagaagattatcaggagggaagtttctattatcaaccgttacgcaaccataaactttta
+aatctcataatggcattgagatcaagagctttcatgatggtaaagttcgtatgtgatgct
+ggggagctagatatcggtataccacttcggttgtggtaagcccgagtgggccgttagtaa
+tattaatagacgattatccgacaatgcattcgctgaaataatcttacttaggagaaatta
+atgctatgagccaaaactatttatgtctgtcacattattgactaaagtatctatcgacaa
+aactgatgtccataagttgtagcagatagtcggtgtatggtgtcaccaatgaaaacctcg
+agcgaaaaatgaattatagttatccaatttgagtaaattgcctattatacagataggctt
+gtttagtcagataaggttccgcttgaggtgctctaacttagcgagagttagaaagcctag
+tgagaggcattttggtgccaaactccggctcgcatgagtaggccagagagtcactttctt
+tcgtcgaagaagttggtgaacagccttttgattagttgtttgtcttgtggctatgtgcta
+ctatataagttagaacgcaaactaatctaatcagcaaagtaaaataggaccttgaacgag
+acggggtacgccgttgaggctcgagatagtagataaactagaggaatgtagataaaacat
+tagctagggggtttagttactggattacataggaagtgcaccatcacggtgtgggggttc
+gtacgtaaagtcgcatcaatattgtcagtggacttaacaagttcgtgcataatgaaatcc
+tatacggactttgcatatctctaccgactcatctggtcgtctatgcgggtaattgtattg
+ctccaagtggatgactattttggcgtcccagcacatagtaaatgtaaatccttataatag
+cataagcaattattagactgcgtgaagtcttagtagttctcaagctttacgttgtatgta
+aataactcacgtaatcagccgtccccaaatcaccattgaggtcattgaatgtacggagca
+ctattatcaatgcggtatgcgattttctgagcgattattgttaaagacttagcgttgagc
+cccggaacacttgattacagattctttaaggagttatccaaatatcattttaaataatag
+tagtatcgtgctttggacaataaaaaaagacccgttctcttatgttgttttgcgacgtac
+ttctctgatatatacttcaactatgaagattctattcatcgataacccaggtatatttat
+atgcccgttcactgcgcagggcaaattatctacggacaataatgacgtagttggacccgg
+taagaactaacgcttaatatgattaaggatgtatgccagtattatcttattatgtcagag
+tagaagtttctctgagattttccgtcgttgtggtacaccggatttggctctctttttaga
+actgagaactcggagtgtgtagtcttgtttccttcaatttatcaatatgcttttataccg
+ccctcatcaactataacaggacgacaagttccgtcttgctccatcatatactaccgatac
+accaatcgtatcaagtttagtatacttgctttctctcttctacagcttactcgcttgtcc
+gagaagcggttggtgctcataaagttagtagtaaatgtacaactagtagccagtccttac
+ctgtttttacgactactacggacaccatgagatacagaagttagtgctacaattatacca
+ttacatgctcaatatcgttgtcggccataagatcgaagagtgcatcacgcgtgtgaatac
+gtaaaatctaccatcccgtcaatgcacaaaaacacactccccttgttgactaacatcttt
+tacaagaggctaaatcattgtccaggatcgaataccttgtgtacaatcgtcacccatcgg
+aagaataccacttttccgatgtagtatgatttacaaaaaacatctatgtgagtaggccaa
+ttgtagtagaatatattcatttgaccgtcattagccttcttcttaggttgtgtacggata
+gtaggtacataaaccgtcgtgtggcatacgctgcgatttcatacagctgccaacaccttt
+tttaccaggctagagtcagaaaagttggagccatgttaaatagttaccatcataaaccac
+tgttgtctactagtctgatcagctttcatgcctgtgcaagcaatatggattctcacgtaa
+tggtaacaactgttgcgttacttaggctggttaatttgtcagagtaataaatacatgtct
+tgttgtgtttcctaatcctcggaaagtacacaagcctaggaataggaaaagtaaagctct
+tttattctgatagtgactaactcaggatctaaatacgcgattatactaaccttcaccaaa
+gctcaaaaatcatctgctggtgaccagttatagacagggtaattcaatatttaatgtctc
+ccttaacatttcaccagcatggattgaagatagtataaagttttacatggcagtcattgt
+gtcacggttctatacaaattctgatagttagacggtatttgaaatgtgcttctagcatgg
+tatcttacacaactgaatgaacgactggagccgttcgtatactatttgcgagcctcgaga
+ccccgtttcctaatgttaacgaatatagtataatataaattgtgatatgaataacacaag
+taactacagtttggacaattaattgttctaaactaaaaatcattcacttcagatggcata
+gagttatggctactacacatataaagcggtatgtgaaacacccgttttagccggaaaccc
+tctactgctcgggacaatgaatgatttccaaaatatggatgtgcagaattgttagtgtga
+ctcaggtccaaatagacactttagtttcgtcaagtcgttgcaaagtttaaaaccatcgca
+gcattctttatttggtctacattgagaaatgaaaaaacgtgacagaaagtctagaagaac
+tgtgaataatgtctattactgattaactagtaagacattagtgcatctggtccactgaag
+cacccgcttggcgttaggcaatctctgtgaactgtcgtggctgttccggtaatgtacgaa
+agcaagcctataggttgatcgagtcgcttcattaaggtcaatttcacaatatccgatcac
+attgtgctaggttcgtcctttaccttgcttagtgctgcatgtacggggtgtcatgacttg
+ttatcggcagactctttatcccaagaatggataatatgtacatggaaagtgtccataatt
+aagtcccttcactgtaaagaatgactgccacgtgatccatgaggtctacagaaaccgact
+tacttgctttttgatcaacttaattatggattcataaagttcagatatcggtacaattgg
+tgtacaatatgaaattaatgaggaaacatggaaatctgaatgacagtgatagaaaagatc
+cccatttgcccggtcagttcatgttacaccactcattagtactgtaagtgtttcgtcagc
+attgagatccacgatcatgtgtttatgccttcgaaactggatgtacgacgatcgagacga
+agaggtatatataacctaaatactaggtacgttgttagagagacgatgaaaattaatcgt
+caatacgctggcgaacactgagggggacccaatgctcttctcggtctaaaaaggaatgtg
+tcagaaattggtcagttcaaaagtagaccggatctttgcggagaacaattcacggaacgt
+agcgttgggaaatatcctttctaccacacatcggattttcgccctctcccattatttatt
+gtgttctcacatagaattattgtttagacatccctcgttgtatggagagttgcccgagcg
+taaaggcataatccatataccgccgggtgagtgacctgaaattgtttttagttgggattt
+cgctatggattagcttacacgaagagattctaatggtactataggataattataatgctg
+cgtggcgcagtacaccgttacaaacgtcgttcgcatatgtggctaacacggtgaaaatac
+ctacatcgtatttgcaatttcggtcgtttcatagagcgcattgaattactcaaaaattat
+atatgttgattatttgattagactgcgtggaaagaaggggtactcaagccatttgtaaaa
+gctgcatctcgcttaagtttgagagcttacattagtctatttcagtcttctaggaaatgt
+ctgtgtgagtggttgtcgtccataggtcactggcatatgcgattcatgacatgctaaact
+aagaaagtagattactattaccggcatgcctaatgcgattgcactgctatgaaggtgcgg
+acgtcgcgcccatgtagccctgataataccaatacttacatttggtcagcaattctgaca
+ttatacctagcacccataaatttactcagacttgaggacaggctcttggagtcgatcttc
+tgtttgtatgcatgtgatcatatagatgaataagcgatgcgactagttagggcatagtat
+agatctgtgtatacagttcagctgaacgtccgcgagtggaagtacagctgagatctatcc
+taaaatgcaaccatatcgttcacacatgatatgaacccagggggaaacattgagttcagt
+taaattggcagcgaatcccccaagaagaaggcggagtgacgttgaacgggcttatggttt
+ttcagtacttcctccgtataagttgagcgaaatgtaaacagaataatcgttgtgttaaca
+acattaaaatcgcggaatatgatgagaatacacagtgtgagcatttcacttgtaaaatat
+ctttggtagaacttactttgctttaaatatgttaaaccgatctaataatctacaaaacgg
+tagattttgcctagcacattgcgtccttctctattcagatagaggcaatactcagaaggt
+tttatccaaagcactgtgttgactaacctaagttttagtctaataatcatgattgattat
+aggtgccgtggactacatgactcgtccacaaataatacttagcagatcagcaattggcca
+agcacccgacttttatttaatggttgtgcaatagtccagattcgtattcgggactctttc
+aaataatagtttcctggcatctaagtaagaaaagctcataaggaagcgatattatgacac
+gctcttccgccgctgttttgaaacttgagtattgctcgtccgaaattgagggtcacttca
+aaatttactgagaagacgaagatcgactaaagttaaaatgctagtccacagttggtcaag
+ttgaattcatccacgagttatatagctattttaatttatagtcgagtgtacaaaaaacat
+ccacaataagatttatcttagaataacaacccccgtatcatcgaaatcctccgttatggc
+ctgactcctcgagcttatagcatttgtgctggcgctcttgccaggaacttgctcgcgagg
+tggtgacgagtgagatgatcagtttcattatgatgatacgattttatcgcgactagttaa
+tcatcatagcaagtaaaatttgaattatgtcattatcatgctccattaacaggttattta
+attgatactgacgaaattttttcacaatgggttttctagaatttaatatcagtaattgaa
+gccttcataggggtcctactagtatcctacacgacgcaggtccgcagtatcctggaggga
+cgtgttactgattaaaagggtcaaaggaatgaaggctcacaatgttacctgcttcaccat
+agtgagccgatgagttttacattagtactaaatcccaaatcatactttacgatgaggctt
+gctagcgctaaagagaatacatacaccaccacatagaattgttagcgatgatatcaaata
+gactcctggaagtgtcagggggaaactgttcaatatttcgtccacaggactgaccaggca
+tggaaaagactgacgttggaaactataccatctcacgcccgacgcttcactaattgatga
+tccaaaaaatatagcccggattcctgattagcaaagggttcacagagaaagatattatcg
+acgtatatcccaaaaaacagacgtaatgtgcatcttcgaatcgggatgaatacttgtatc
+ataaaaatgtgacctctagtatacaggttaatgttagtgatacacaatactcgtgggcca
+tgggttctcaaataaaatgtaatattgcgtcgatcactcacccacgtatttggtctaatt
+atgttttatttagtgacaatccaatagataaccggtcctattaagggctatatttttagc
+gaccacgcgtttaaacaaaggattgtatgtagatggtaccagtttaattgccagtgggca
+atcctaagcaaaatgagattctatcctaaagtttgggcttgatataagatttcggatgta
+tgggttttataatcgttggagagctcaatcatgagctaatacatggatttcgctacctca
+ccgagagaccttgcatgaagaattctaaccaaaagtttaataggccggattggattgagt
+taattaagaccttgttcagtcatagtaaaaacccttaaattttaccgattgacaaagtga
+gcagtcgcaataccctatgcgaaacgcctcgatagtgactaggtatacaaggtttttgag
+ttcctttgaaatagttaactaatttaaaattaattaacgacatggaaatcacagaaccta
+atgctttgtaggagttatttatgctgtttactgcctctacaaccctaataaagcagtcct
+aagaatgaaacgcatcttttagttcagaaagtggtatccagggtggtcaatttaataaat
+tcaacatcgggtctcaggatattcggtcatataatttattaagggctcttcgagtcttac
+tctgagtgaaattggaaacagtcatccttttcgttgtgaggcatcttacaccgctatcga
+tatacaatgcattccaccgcggtgtcccgtacacaaggaaacttgttaccttggggatat
+aagaaaactcacacgtctcattattaaactgagtacaatttttgcacgagaaagtaatgc
+aatacaatatgatgaaagccagctaatgaaaagggatggaacgcacctcggatctgttgc
+actggattaaaatccgattatttttaaaaatattcagtgctagagcatatcaggtctact
+tttttatctggtatgtaaagcccacggagcgatagtgagatccttacgactcaacgaaaa
+gttataacataactcccgttagccaaagcccaatcccgattactgccctaccctaacgtc
+tgccatctaaatatcgaacttgttatgatcaatgtgactacctcccaccctttccccttc
+atttgttccactggggataagctagcgttttcagaatcaatgcaataagaatagccaatt
+gtctcacttcatcagagctcttggcaattccaggcgctacgtggttctggaatatattca
+tttttcaaatagtaatacgtttagtgttgctattgtctacacgtttggatattacgttat
+gtgagcggacatcaatagttgtctaactctttagtaagccagagatagcactcttagcga
+atggataccatcttccataagtttagttaatagtccgaaacaactgcttcgagcatattt
+gaacctccttgtaggcaaatagcctcttcaaagcaatcttactaatagatagagtttgtt
+ttaagggactactagaaatgggacaatcttaatagtatgacctaaactgacatttaaaga
+tatatccaggtggcaagcataaagatcattgcgccacctccaccgtgggattacttatca
+gtcgatatcctatatgctaagtttgcgacggcagaatacaaactaagctgagttgatgct
+aaccttacctatgataccccattggaccggttaacagccctacttattccaaataaaaga
+acttttatgctgtagaagctattatagtgatgcctggtaacttcagtatattaaaatgac
+acacatacgccatatagagctcctggaactttgaataatgagcgaacttcgaagttgaag
+agcaagaaaccatatgtcacggttgcctaaagcccggtaaccagacatgtgctatcattg
+atcattatcgaggttttcataaccttgacccattatcggctgtgcgcggacaagtactta
+aatcactagtttcttcacctgcttatcggtaagaaataaggttggcaaagaatcgcataa
+gacggacgtagagccgcagcgttgtgcgagtccaggtgcatgcgcagcaataggatttta
+aattttgttccatttttaatttagccgtaaggatgtccgtaaatgattgaaaattggatt
+caatctttgggcctatgctactggaacctgatcgacaaaatttcaaacatacgttaactc
+cgaaagaccgtatttttgcggctagaatagtcagtcgcttggagccatataccttaccac
+ttaaacgacgtgctcctgtagttgaaatataaacagaacacaaagactaccgatcatatc
+aactgaagatctttgtaactttgaggcgaagcaccctcttcgagacaactaagagtaaag
+taccgggcgccgcaaggagtcgattgggaccctaaatcttgacgaattgctaagaggctc
+agagctaccactgtaatttctctagagcccataataaatgaacgatacatccgtaggtag
+cacctaagggattataatggaagccaaatgcagttaataatattatatactggcgtacac
+gattcgacggatctctcacatagtgattcacgacccccccctttgattgacacagcgtca
+gcattttgcaagaacgatcttctgcatagggtgcgccaccgtaaggatgacgtcgaagct
+acaactgggtataatttaccatgcttccctgatgctgagtgcaatacactaagaatgagt
+ttttaccccatatcaccagtatttgttctgttattgcgaagaaatggctatgctgagttg
+gcgactaaagtcacccatcctttttattaggtaaccccctcccttaaactaactgatttg
+ctggagctgccctgcatacatatactttatcatttatggacgtccgtgacgcttattatc
+caccatagtcgatatgctacacggattcattaatggatcgtaggagtttaagttatattt
+actaagatcggtctcggctactatcccgccttacccggcgctatttacggccatttttaa
+tatattgacggtaattattcctatggtttcgaccgcacgtccttggacaagaaagaatgg
+caaaaaaaatgtaaaagaaaaaaaatattgagtccctaccatcatataaaaaatatgtga
+tgagtaacttgacgaaatgttagtggttattaaagactatctattacaccttttgttttc
+tgtcgtagtatattaaagtctagaagccttacaggaaaatcagggttatacagccgatac
+tccgcagcatgaatcatcgaggaggtgtcctaccatcgcgccttgtaatcttgtctgtgt
+atactgtatttagaccttttatacaaagtaaatatctcggctttatgtgattgggagggg
+cctactcaaacatgatgacttgacctaataatcactgtgcgggcgtcttatgactagcta
+ttccttgaaatccaccaccaaatggttaatatgtaaaaactttgacgatgaaacaaggtg
+aatgtgtagttactttgtgtaattagctgcgtcgagcattgcttgtaaaaccgtcaatcg
+cacacgttacttccataaaatttctacgaatacacccttcttaaaaaaaacgtaggaatt
+cacgagtttaacaaacgataactgtataaagtggaagtccgaagaaagcagatgcccgaa
+ctactcgaagatgtttcgttttcttaaccataggggcttcttaatggcccactacgcaca
+ttttgttcaagcccgagagggacatccccattacgggagtattactaaaactgttccgta
+atacgttcagcaagggatgaaaaaggccactgctcaagttattgacgtgggagtattaca
+tcggaagcctgaatcccacactatgatggtctgtacaggcctagggactgcgtctagacg
+gtattaccggcttctaatcatacgatcgtgagtcttaacgggaagtaaggctcacaccta
+ccccaaaccatttatctatgtaagtataaaattgtgcgtaagtgttcaaagtggacaata
+aagacgtggcaaaaacccccgcacataagccgctttagatttcacaaataccaatgcggt
+taaaaacatccttgagtcgtacatacaccatactcgcgttaaacggatataacagaagat
+aataaatccggatgtggagtcggtgtaactatagaaagccaagtgaaataatgcttacca
+gtcatttagctatacggctttcatttcatgtcaagagggtggagtttgacctgtacagtt
+gatatatcaccgatacttagaactcacctaaagctaaaattgctcgcagcgtgtaatccg
+catattacaaacaatagatgggattcattatacataagacacgatgatctgctttttcag
+gttgcgagatgttgcctatcgtcaatcgagtcctgccttacaccacttaaacaaaagtat
+tgacagggaacctattttcgaggtattatatagtccagcttgaatatcaatttgacagtt
+aacctagtgaaaatcagtaagaggaaatacgccacattctccagtgaaattctacgggtt
+atcgtctagtccaactatcaattataactcacgagatataagtaaattctcgtacttggc
+ctgatttttattatactttggatccttagtaaacaggaagggagaaaccttcaacgaaaa
+acactggattttgttttactctcaaagctcttatatgacggaaataccctgtcaagtctt
+aactttattactagactaatgaaatgggcttggggtggccagaatcatagtacaatttag
+cggatacactattcggactttcctatcggctgtctggttggataagtatggggactaata
+ggctagacatacctatacttaaactatacaggcgtcatctatctctgcaactttggagtt
+ccctgatgttctcccgccctttgggttcacatcttctataccgacacccctaataacgat
+tagtttgtgggttagagtaaattaatacggttaatattaatgtatcgttgaaaagctggt
+gtcgccaataaggtaaccggctaggcagagtatatgtcacgaagtataactaccctaatg
+ataagctgtaggaataaaattaatgctgtctctaagcgaagagatatttccgactctgtt
+ttaatgacgaatctcattacttctgacttgcaaatgttcaatatggcacggtttcacggc
+acctttgtgacgcatataatgaacttagaagattataacgacggaactttatatgataat
+ccgttacgattaaagaatctgttaaatatcataatggcattcagttctagaccgtgcatc
+atggtaaacttactttctctgcatggcgacatacatttcgctattcaaattcgcgtgtgg
+ttacacccactcgcacctttggaatattaagagaagatgatcagaaaatccattcgctca
+atttttctgacgtacgtctaatttatcctaggagacaaatcgttttatgtctctcacatt
+tttgaagaaaggttcgagagacaatactcaggtcctgaactgctagaagatactcggtgg
+agcgtggcaacaatgaaaaactcgtgacataaatgaatgatacttttccaagttcagtta
+agtgaatatgtttaacatacccggcttttcgatcttaagctgacgctggacgtgcgagta
+atgtcagtctcttacatacactagtgactccaagtttcgtcaaaaacgccccctcccttc
+tcgagcccactcacgctatgtattgacgcgaacttgttcgggatcagacttttcaggagt
+tcggtcgcgtgtccctatgtgctaatatataagttagatcgcattagatgctaatctgaa
+tacttatagacgaccttcaacgagaacgggtaccaccttgaggctagagttaggtgtgaa
+acgacaggtagggacatataaaatttgagtgcggctttagttaagggtttaattacctac
+tcaaacatcacgctcgcgcccttcgtacgtaatcgaccatctagaggctaaggggactgt
+actaggtagtgattaatgatatcctagacgcacgtgccttagatcttcagactctgatgg
+tccgcgatcaccgtaattgtagtcctccaactcgatcactttgttggcgtcaaagaaatt
+acgatatctaaatacttataatacaataaccaaggatgagaatgactcatcgcgttggag
+ttatattgcttgaagttctatggaatgaaagcacgttatctgccgtcccaatatctccag
+tgagctaattcattggacggtccactttgatcaatccccgaggagatgttcggacacttt
+agtctgtaacacttagcgttgagaccacgaacaattgattactcagtcttgaaggtgttt
+tccaaagttcattttaaataagactacgataggcctttcctattgatataaactacccgg
+ctctgttgttcgtgtgagtcgtacttctctgtgtttttctgattatagcaagattcgatt
+cttagtgtaaacagcgatttttatttgacccgtcaatgagaagcgcataggatctaagca
+aaattatcaagttgtgccacaaggtaagatctttccagttattgcaggtaggatgtatcc
+cacgttgatagtatgaggtctgacgtcaactgtctaggagagttgaccgcgtgcgggtac
+accggatttgcatcgatgttgagaacgcagaactcccactgtcgtggcggcgttcctgat
+atttagcaagaggcgttgataaagccctcatcatctagatctcgacctcatctgccctct
+tgctccatcattttctacacagactactttcctatctacgttagtataattgctttctat
+cttagtatcatttagagcttctccgtcaacaggttcgtgctattaaagttagtacgaaag
+ggacaacttgtagcaacgcatttaatcggttttcgactacttcgcacaaaatcagataaa
+gaagtttgtcattctattagacattgaattgcgcaattgacttgtaccacttatgatcga
+acactgaatcaagactgtgattaactaaaatagacaagccactatatcaactaataaaaa
+cgcccctggtggtcgaacatagttgactacaggataattaattggactggagccattaca
+ttctctacaatcgtatcacttcccaagtagacaactttgaccttgtagtttcatgtacaa
+aaaaatgctttcgcaggagcacattggtagttcaatagtttcatgggaacctcttgagcc
+gtcttctgtgggtgtgttcggatagtaggtactgataaagtcgtgtcgctttcgatgaga
+gggaattcaccggaaaacaccttggttaacaggatagtctatgtaaacttcgagacatgt
+ttaagagttaccagcttaatccacggtgctctactagtatcatcagctgtcttgcctcgc
+ctagaaatatgcattctatcgttatcctatcaacggttgccgtactgagcagccttattg
+tggaagagtaatatataaatgtagtcttgtctttacgaagcagacgtaagtaataatgac
+ttggaataccaaaactaaacatagtggattatcatactcaagaactctccagataaataa
+cagtttttacgatacgtcaccaatgagcttaaagattaggatcctcaaaactgatacaaa
+cgctaattcatttgttattggatccagtatcagttaaactgaatggagtgaagattgtag
+aatgttgttctggcctcgcatggggtctaggtgatatacaatttctcatacttacacggt
+agtggaaatctgattctagcttcgtagctgactatactcaaggaaccactgctcaaggta
+ggagactagttccgaccctacagtcaaagtggccgaagcttaaactatagactagttgtt
+aaatgctgatttcaagatatcatctatatacagtttggacaattatgtgtgcgaaactaa
+aattcatgctattcagatggatttcacttatgccttagaaacagatattgcccgagctca
+atcaacagttttagccggaaacaatcgaagcatagggacaatgtatcttttcctaaattg
+ccatgtgcagatttctgagtgtcacgaagcgcataatagaatcttgtgttgcctcaactc
+gttgaaaagtttaaaacaatcgcagcagtctttttggggtctactgtgtgtttgcaaaat
+aactgaaagaaacgcttgaacaactctgaagtagctcgagtactcattaaagtgtaacac
+attagtgaatatcggccaatgaaccaaacgcttcccggtacgctatctctctcatcggga
+ggcgatgtgcaggttatctacgaaagcatccctttacgttgagagtgtcgatgcatgaac
+ctcattgtaacaatagcccagcaaattctcatacgtgcctcagggtccgggcgtactcct
+ccatggaagggcgcgcatctagtgttataccaactcgctttttaactactatgctgtagt
+tctacaggcatagtggccagtattttctaacttctctggatagatgctctcactcctcat
+ccatcacggcttcagtttacgtcttacttgcttgttcagcaacggatggaggcattaagt
+atcttcactgttccctaaaattgctgttcaatatcaaagtaaggacgatacagggaaagc
+tcaagcacactcattgaatactgccccagttgcaacctcacttaatctgacaaaaataat
+gactactctaagtgttgcggaagcagtctcttccacgagcttgtctgtatcacttcgtat
+aggcatgtaactcgatagacacgaacaccgagtgagaaactatattcttgcttccgtgtg
+tgtgacaccaggtaattgatgcggatataagctggagatcactcacgcccacacaaggcg
+ctgctacctctttattccaatgtgtaagaatttgctaacttcatttctagaccgcagctt
+tgcggtcataatttcacggtacggacccttgggttagagacttgataacacacttcgcag
+tttccaccgcgcacatgttttagtggcttctaacatagaatttttgttgtgacataaaga
+gtgcgtgggagacttgcccgaccgttaagccataatcaattgaaagccccgtgagtcaca
+tctaattggttgtactgcgcatttagctatcctttagctgactcgaagagattcgattcc
+taatataggttaattagatggctgccgcgcgaagtaaaacgtgaaaaacgtagtgcgcag
+atctgcataactcgcgcttaattacttatgagtagttccaagttcgctacgttatgagag
+agattggaattaagcaaatatgttttatggtgattttgggatgagaaggactgctaagta
+cggctactaaacaaatttctaaaaccgccatctaccttatcttggagacatttaagttgt
+atatgtcactagtctagcttttgtctgtgggacgcgttctcggaatgagggaaatgcaag
+agccgattcatcaaatgcttatctaagaaagtagtggactattacaccaagcacgaatgc
+cagggaactgctttcttgctcaggacctcgcgacaaggtaccccgcataagtcctagaat
+tacatttggtcagcaatgctgacatttgaccgtgaaaacataattttaatcagaaggcag
+ctcacccgcttgctctagatcttatctttgtatgaatgtcagaatttactgcaatatccg
+ttccgaatagtgagggcttagtatagttctctgtatacaggtcacatcaaactccccctg
+tcctagtacagctctgagctttaattaattgcatacatttccttcaatcatcagatgaaa
+acaccgcgaatcatgctcttctcgtatagggcaagagaagcaacaaacaactagcccgac
+tcacgttcatccgccgtatccttgttcagttcttactccgtattaggtcagcgaaatcta
+atcagaataatcggtcgcgtatcaaaattaaaatcccgcttgaggttgacaattaaaacg
+ctgagcagttatcggctattagatagtggggtgaaagtaattggctggaattatgttaaa
+acgtgatattaagctaaaatacgctacttgttgccgacctaattcagtcattcgatattc
+agttagagccaagaataacaagcttgtataaattgaacggggtgcactaaacgatgtgtt
+actctaatattcagcttggagtatacctgaaggcgaattcatgtatcggccaataataag
+acgttgaagatcacaatttggactagcaaaagaaggtgatttatgcgtggggattgagtc
+cactgtacgagtacggtctctggaaaattataggttcagggaatataaggaagtaaagat
+aattaccaagagatttttggtatcgctatgacccagaggtgttctaacgtctgttttgat
+ccgcagaatttctgcctcaatgcatatttgacggacttgaactagagcctctaaagttaa
+atggcgacgcaactgttcctaaacttcaattattactactctttttttcctagggtattg
+tagaggccagtggacaaaataaatcaaatttaagatgtttcggacattaacatcccccgt
+agcatagaaatcatcagttatccaatctctcatcgagcttttacaatttctgctggcgct
+atggacagcatatgccgcgagacctccgcaagactcacttgatcactgtaagtatcttca
+ttagaggttagagcctatagttaagctgctgacctagtaaaattggtattttctaatttt
+attgctcaagttaaaggttagtgaagggataatgacgttatttttgaacaatgggttgta
+ttcaattttatatcacgaatggaacccttcattcccggcataatactagacgacacgaac
+aagctccgatctatcagccaggcacgtgttaaggtttaattccggcaaaccaatgaagca
+tcaaaaggtgacctgatgcaacttagggtcacgatgagtttttcaggactacttattacc
+tattaataagttaacatgagccttcataccccgtaagacaatacatactccaccaattag
+aattctgagccatcttatctttttgtatcatcgaagggtatggccgaataggttaattag
+ttactcctaacgtctctacaggcatgcatttgacgcaccttcgaaaatagtcaatctctc
+gccacacgcgtctagtatgcagcatcaaaaatatagtccacggtttccggattaccaaac
+gcggcaaagagaaacattgtatcgacggagataacttaatacagaaggaaggggcatctt
+cgaatacggatgaataattctatctgtttattctgacatcttgttttcaggttaatctta
+cgcattcaaatgacgcctgccccatgcgtgcgcaattattttctaatattgacgagagca
+atctcactccttttgggtctatttatgttttattgaggcacaagcctatacagaacaggt
+actattaaggccgtgagtgtgagactcaaaccgtggaaacaaaggatgggttgttcttgg
+tacaagttttagtgcatgtgggcaatccttaccaaaatcagatgctatccttaactttgg
+gctgcatttaagatggcggttggaggcctgtgagaatcctgcgtgtcatctttaatgacc
+gaattcatccatgtagattcagatcacacactcattccttgatgttgtctaaacaaaagt
+tgttgtggacgcattggagggagttaagtaacaacttgggatcgcatacttataaaaatt
+atatgttaaactttcacaaacgctgaagtccaaagtaactagcccaaacgcctcgagagt
+cactaggtattaatggtgtttgagttcctgtgaaatagtgttcgaaggtaaaatttatgt
+accaaatcgaaagaacacttaataaggcttgcttgcacggaggtatgatgtttactgact
+ctacaaccctaattttccagtacgtacattcattccaataggttagttctcaaagtgcta
+tacaggctcctcaattgatgatatgcttcagccgctctatggatattagctcattttatt
+taggaagcccgcttagaggcttactatgagggaaatgccaaaatgtcatacttttcggtg
+tgtcccatatgacaccgctttacatagaatttgaattaaaacgcgctctcccgttcacta
+ccatacttggtaccgtgcgcatattacatatagatataggatcattttttaaagctgtac
+taggtttgatcgacaatcttatgctatactatatgatgtaaccctcataatcaataccga
+tcgtacgatcctagcataggtggcaagcgattttatgccgattattgtgttaaatagtct
+gtgagtgtgattatcagggctacgttggtagaggggttgtatagacctcgcacacattgt
+gacatacttaacaatatacgaaaactgatataataaatccccttacccaaacaccaatcc
+cgttgaatcaactaccataacgtctcccatataaattgcctacttgtttgcataaatctg
+aatacataacaccattgcaccttcttgtgttccaatcccgttaagattgccttgtcagat
+gatatgcaagaacaatagcatttgctagcaattattaacagctcttcgaattgcctccac
+ataacgcgggagggtatattttaatttggcaaatactaagtactgttggcgtcatatgct
+attaacggttggatattaagttatgtcagccgtaagcaagagtgggcgaaatattttgtt
+acccagtgagagcactcttagagtttggatacaataggccatatgttgacttaagaggac
+gtaactacgccgtacaccattgttcaaccgacttcttggcaaatagaatcgtattagcaa
+tcttaagaatagagacacgttcgtgttagggtatactacaaatccgaaaatcttaagagg
+atcacctaaactgaaatttatacatatttcaacgtggatagatttaacataattcagcca
+cctccaacctgggagtaattttcagtagatttactagatgattagtggcccaacgcactt
+gactatataagatctggggatcctaacctgacctatgagacaaaattggaaacgttaaca
+gcccttatgtgtacaaagaaaagtaagttgttgctgttcaacagatgatagtcatgacgc
+gtaacttcactatagtaaattgaaacaaatacgcaatttagacagaatggtacggtcatg
+aatgacagtaattcgaagtgctagaccaacttaaaataggtaaacgtgcccgaaaccccc
+cttaacagaaagctgctatcatggtgcagtatcgacgtgttcagaaacttgtaacttttg
+agcaggtccgagcacatggaagtatatcacgtgtttctgaaccggcttatccctaagata
+tatccgtcgcaaactttcgatttagtcccacgtagagcccaagcgttgtgcgactccacg
+tgcatgcccagaaatacgagtttaaatttggttacatggttaattttgaccgaagcatcg
+cactttatgattgataattggattcaatatgtcgccctatgcgaatgcaacatgatccac
+aatttggctataagacgtttaatccgtatcacactttgtttgcggctagtatagtaacgc
+ccgtgcaccaagagtcagtaacaattataagtactccgcaggtacttcaaatataaaaac
+taatcaaacacgacccatatgatcatctgaagatatttggaactttctcgacaaccaccc
+tcgtactcaatacttacactaatcgacaggcacacgcaacgtgtacagtcgcaccatatt
+gagtcaagatttgcttagtggcgatgagcgtacacgcttatttctctagtcacaattagt
+tatctacgagacatcacgagggagcaaataagcgatgttatggctacacataggcacgta
+tgaatatgatataagccagttaaacagtcgaaccatcgagcaaattctcatgcaccaacc
+cacacgttgaggcacaaagagtaagctgtttgaatgtaacttcttctgctgagcgggccc
+caacgtaaggatcaactagaagagaaaactcggtattagtttaaatgcgtcacggagcat
+gagtgcatttcactaagaatgtctgtgtaaccaatataacatctatttgttatctgattg
+cctacttatggctttgcggtcgtggcgactaatgtctccaatccttttgaggtcggtacc
+aactccctttaaattacgctgtgcaggctcatgcactgcatacatatacggtagcaggta
+gggacctcacgcacccttattataatcaatagtagttatcagtcaacgaggcaggaatgc
+tgaggtcgaggtgttggtatattttctatgtgccgtctaggcgactatcacgcattacca
+ggcgagatttaagccaattttgaatatagtcaacgtaatttttactatgggttccaccga
+aacgccttgcacaactaagaatcccataaaatatcgatatcaaataaaagattgtgtcaa
+taccttcatatatattttttcggttgactaacgtgaactaaggttaggggttttgtatgt
+ctatataggaaacagtttcttttctgtcctactttagtaaagtcttcaagccttactcca
+aaatcacggtgattaagccgttactcagcagcatgattctgcctgctcgggtcctaaaat
+ccagccttgtaagagtcgctgtgtattagctagggagacctttgttaaaaaggatatatc
+gcggcgggatgtgagtgcgtggcgcatactcaatcttcagctcgtgtcattataatatct
+ctcccccacgcttttcactagatatgccgtgtaagcaaacaccttatgcttaatttcgaa
+aatattggtacttgaaaaaagctgtaggggtacttaatgtctggtaggagatcaggagag
+aattgagtgtaaaaccgtaaagccctcacctgacttcatgtaaatggcttagaagactcc
+atgatttaataaatactacgaaggaaagactggatctaaagataactctagtaaggccaa
+ctcccttcaatgctgttgccagttataatccaagagctgtccttttctgaaccatagcgg
+cttctgaagcgaactagaagcaaagttggttctagccagacagccacataccctgtacgg
+gtgtattactaaaactggtccggtattagttcaccaagggaggaattaggcaaaggatct
+aggtatgcaagtcggagtattacatccctaccctgaatccatcaataggttcctctgtac
+tggccttcgcaatgagtattcaaggttgtacagccgtataataataagatagtgactatg
+aacgggaagtaacccgctcaccttccccaaaacattgttatatctaagtattaaagtctg
+ccgtagtgttaatactcgaaaataaacaactggcaaattacaccgcacttaagccgcttt
+tgatttatatttttccaatgcgcttttaaaaataattcagtcctacatactaattaagac
+ccttaaacggagatatcacaagttaagttttaaccatctcgactaggtggaactatagat
+acccaactcaatttatcattacctgtaatgttcctagaaggattgcatttcatgtcaaga
+cggtggagtttcacagcgaaacttcagtgtgaacagattctgagaaatcacctaaaccta
+ttagtcagagcacccggttagaaccagttgtcaaaaaatagagcggttgcatgagacaga
+agtaacgatgagatccgttgtaacgttgagacatctggcctatcgtcaatacagtcctcc
+cttaaaaatatttttaaatactaggcaaacccaacataggttagtcctatgtgatacgcc
+acatggtatatcattttgtaacgttacctagggataatcaggaagtggaattacgcaaaa
+gtagacagtgaaatgcttagggttatagtctagtccaaagataaaggataaagcacgtca
+gagaactatattagccgaatgggaatcattgttaggagactgtggatcatgtctaaaaag
+caacgcagaaacagtcatcgaaaaaatctcgtttttgtttgaatctaaaagagctttgat
+gaccgatagtacctgtatactagttactgtattacgtgtctaatgatttcggattggggt
+ccccagaatcagacgtcattgtagacgattcaagtttaccaatttaatttcccagctctc
+cttggagaactatcgccaataattgcagtcactttccttttctgaaacgataaagccgtc
+agagttctctgcaacgttggacttacctgaggttctaacccactttcggttctaatagta
+gttaacgacacaacgaataacctttactgtggggctttcacgatattttttcgcttatta
+ttaatggttacgtcataagctggtgtccaaattaaggttaccggcttcgcagagtagttg
+tatccaagtataacttccctaatcataagatcgaggtagaaaattaatgctgtctctaac
+cgaacagatatgtcccactatgtggtatggacgttgctaattacttctgaagggaaattg
+gtcattatggatacgtgtctaccatcaggtcggacgcagatatggttctgtcttcagttg
+atccaccgttctttataggataataactgacgattaaagattatggtaaatagattaagc
+caattctcttcttgtcagtgaagcatccttaactgacttgctctgcagcccctcatacat
+ttagctattcaaagtaccggctcgtttcaaactctcccacctttggaagaggttgtcaac
+ttgataagtatatcatttacagcattttttcggacgtacctctaatgtttcattgcagaa
+aattagttttttctatcgcacattttgcaagtaacgttagagacacaattatctgcgaat
+gaactgctagatctgacgaccgggagcctcgcaaatatcaaaaaagactgacatatatca
+aggagtcgttgacaagtgctggtaagtcaattggtttatctgtcccggcgtttcgatctt
+aagctgaccatgcacggcagagtaatgtcactctcgttcttacaagtctgtctccaaggg
+tcggcaaaaaagacccctccattctcgagcccactcacgatatgtagggacgacaacttg
+tgcggcttatgaattgtctggactgcgggcgagggtccatatctccgaagttagaaggga
+catacctttagatgataagatcaattcttattgacgaaattcatccacaacggggaacaa
+cttcaccctagacttacgtctgaaaagacacctagcgtcttataaaaggtcagtgccccg
+tttcgtaaggctggaattacctacgcaaacttaaacctcgcgcccttccttacgtatcga
+caagatagaggctatcgcgaatgtactacggaggcatgaatcatatactagaaccaagtg
+cctgtgatattaacaagatgatccgacgcgagcaccgtaattctaggcataaaactccag
+caatttgggggccgaaaacaaatgacgttagctaattaattatatgacatgatcaaagga
+ggtcaatcacgcatcgagttcgacgtatattcattgaacttcgtgcgtttgaaagaaact
+tttatgaaggcaaaattgatcctgtctcctatttcatgcgtacctcctagttgataattc
+cccgagcagtggttaggacacttttgtcggtatcaagttccggtctcaaaacgtaaaatt
+ctgtaatctgtatggatggtctgtgaattagttaatttttatgaagtcgtcgagacgcag
+ttcctattgatttattctaaacggagatgtgcttcgtgggactcggaagtagatctgtgt
+ttatgattattgctactttagatgctgactgttaactccgtgttgtttttcaaccgtata
+tcacaaccgaattggatagaacctatagtttcaagttctgccacaaggtatcatatttac
+agttagtgctggttgcttctttcaaacgtggtgagtttgtgctatcacgtcaacggtaga
+gctcagtggaccgagtgcgcgttcaaccctgttccagagagggtgtgatagcacatatac
+cacgctcgtcgaggcgttcatgatagtttgcaagagccggtgttaaacacatattattat
+tgttatccaactaatcggacctatgcataaagcattgtctaaacagaataattgcctata
+tacggtagttttagtgatttatatcttagtatcagttagagcttcgaactcttcaggttc
+ctcatatttaacgttcttcgaaagcgaaaacttctacaaacgaatgtaagcggttttcca
+agtagtacctataaatcacagaaagatctgtctcagtatagttgaaatggtattcagcta
+gtgacgtgtaccaattatcatagttcactcaagcaagacgctcattaacgaatatagaca
+agacactatatcatataataaaaaagaacatggtgctcgaacatagttgaattcaccata
+ttgaaggggaatgctgacatgtaattcgctactagacgatcaattccctacttgtcaaag
+ttgaactggtacgttcttggaattaaatatgattgcgctggaccaaattgcgacttcttg
+agtttcagggcaaacgattgagccggaggatgtccgtctcttacctttcttgcttatgat
+aaacgacggtccctgtacatcactgggaattctcagcaaaaataattgggtaaatcgaga
+ctcgatgtattcggccacaaaggtgttagacgttaaagattattcaacggggcgataata
+ggatcataaccggtatgcaagcgcattgaaagagccatgagatccttatccgataaacgc
+tgcacggtatgtgcagccttattgtcgatcacgaatttataaatgtagtctgggctgtaa
+gttgaagacctaagttataatgaagtgcaataccaaatcgattcatagtggattatcaga
+ctcaagatatctcctgataaattacagttgttaagatacggataaaatgagatttaagat
+tagcagcctctaatctgtttcaatcccgttggaatgtggtatgcgatcaaggttaagtta
+aaatcaagcctgtcttcagtcttgattcttgttctgccatcgcatgcggtctacgtgagt
+taatatgtagcttacgttctagcttgtgctaatctgagtatagattcgtagaggaatatt
+atcaagcttccacgcctcaacgtacgtgtattggtcacacaagacactaaaagtggaagt
+agcgtaaactatagtctagttgttaaatgctcagttcttgttatattcgatatactcttg
+gctaatttatgtctgagtatataaaattaatgatattaacttgcatttcacggatccctt
+agaaaaagattttgaccgagcgcattataaacggttacaccgaatcaatagaagcatacc
+caatagctttctttgaatttattgcctgcgcaacttggctgactctctagatccgaataa
+ttctatatggtcgtgacgaaactagttcattactgtttaaaatgccaacatgtcttttgg
+gccgataatggctctttgcaaaattactcaatgatacgattgatcaaagcggtagttgct
+agtggtagcatgtaagtctatcaaatgtctgattatccgaaaatcttccaaaagagtcca
+cgtaccatatctatctcatagcgacgcgaggggaaccttatctaactatcattccattta
+ccgggtgactctcgatgcaggatccgattgggataaattgcccagaaatggctcattcct
+gactaagggtaaggccgttctcagcaagggaaccccgcgaatctaggcttataccatcta
+gattgttaactacttgcctgtagttctacagccatactggacagttgtttctaaatgatc
+gggattcatgctagcactcctctgaatgcaccgcgtaagtttaactattacgtccgtggg
+cagataaggatggaggctgtatgtatcttaactgttacctaatatggctggtaattatca
+aagtaaggaccttaatgccatagcgctagcaatcgctttgtatactgaccatgtgccaac
+ctctcttaatctgtaaaatataatgtcttagctaactgtggacgatcatgtctctgccta
+gagcttcgctgtatcaattcctatagccagcgtactagtgacacaacaacaccgtgtgag
+aaaagatattagtccttacgtctgtctctctacagcttattgatgaggattgaacatgga
+catatagctccccctcaaaagcagatgctacctctttattccattctcgaacatttgccg
+aacttaatttcgacaaacctgaggtcacgtcttaatttatcggtaacgtcacgtcccttt
+gagactggataaatatattaccaggggccaacgagcaattgttggaggcgcttctataat
+acaaggtgtcttgtcaaagaaagacggcgtgcgtctcgtgcaactcacttaaccaatatt
+aatgtgaaacccccctctctcacatcttatgcggtgtactgccctggtacatttcctgta
+caggactccaacagtgtagattcctaagatagctgttggagttgcctcacgccagatcga
+aaaactgaataaactagtgagctgagctgcagaaataccgcttaattacttatgactagt
+tcaaagggacctacgtgatgtcagacattgcaaggaagaaattaggtttgtgcgtcattt
+tggctggactagcactccttacttcccctactattcaaatgtcgtaaacagcatgagaca
+ggatcgtgctgacatttaaggtctattgggaacgaggctacctttggtcgcgcgctcgcg
+ttctccgaatgaccgaaatgcatgagcacagtatgcaattgcttatagatctaaggtctg
+gtcgttgaaaccaagcacgtaggcctgggaaatcagttcttcctcagcaactacacaaaa
+gcgtccaagcattagtacttgtagtaaatgtccgaacctatgcgctcatttgaaagtcaa
+aaaatatttttaagcagtaggcacctaacccgattcctctacttagtagctttctttgat
+tctcagaattgactgcaatatcactgcacaattctgtgccattactagacttctctgtat
+taacgtctcatcttactaacactcgcctaggacacatctgagagtgaagtatttcaatac
+atttactgaaatcttcagttctaaaatccccgaataaggctcttatcggtttggccaaca
+caagaaaaaaacttcttgcaccactcaccttcatacgcaggagcctggggaacttagtaa
+taactatttcggcagacaaagcttataacaagttgccggcgcgtataatatttaaaagac
+cccttgagctgctcaattaaaacgctcacctggtataggctattagatagtgccgtctta
+gtaaggggcgggaattatcggataaactgatattttgataaaataaccgacttgttcacg
+acataagtcactaaggagattttatctttctccaaagtatatcttccttggataatttca
+aagcgctgcaatttaagttctgttactagtttatgctgctgggaggtgaccggaaggcgt
+agtaatctagaggcaaattataagaagttcatcatatcattttcgactacaaaaacaagg
+tgttgtatgccggcgcattgtgtaaactggacgagtaccctagatggaaaattatacgtt
+aagccaagatttcgatgtaatgataattacctacacatttttgctatccataggaacaag
+agctgttctataggctcgtggcatacgaacatttgctgccgctatgaatattggaagctc
+ttcaactacagactctattcttaattgccgtcgaaaatgggccgaatcggctattattaa
+tactcggtttttccgaggggattgttgtcgacagtcgtaattattattaatattgatgtt
+ggtgaggtcatttaaatacaaccttgcagacaatgaataagggatccaatctctcatact
+ccttttacaattgctcatgcccctatgcaaaccttatgccgccacacctccgcaactctc
+tcttctgaactgtaagtagcttcattactggtttgagactatactgaagctgatgacatt
+ctaaaatggctattttcgaatgtgattcataatgtttatcgtttgggatggcagaatcac
+gttatttttgatatagcccgggtattctattgtatagaacgtatgctacaagtcattccc
+cgaagaagactagaagtaaacaacatgcgaccatcgttaagccacgcaaggctgtagctt
+tatttcccgataacctatcttccataaatagcggacagcaggatactgacgctcaacatc
+agtggttatggtctaatttttaacttttaataaggtaacttcagcaggcatacacagtaa
+ctctttaatttataatcaaattagaagtctgacacttcttatatttttctatcatccaac
+gcgatcgcccattagcttattgtgttactaataacgtatctaaaccaatccttttcaagc
+tactgcctatattgtcaatatatacaaacaacaggatagtaggctgcttaaaaaatattg
+tcaaccgtgtacgctttacaatacccggaaatcacaaactttgtagacaacgagtgaaat
+ttatacactacgaagggccagcgtacaagacccatgaattaggcgatatgtttattctga
+catattggtttatccttaatctgtcgctgtaaaatgaagccgcccccatccctgcgaatt
+ttttttcgaagattcacgactgaaatataaatacgtttggctatatttatgttggaggga
+ggcaatagcctttactgttaaccgaagatttagccagtgagtgtgacactaaaacactgg
+aataaatgcaggcgttcttctgggtaaaaggtttagtcaatctcgcctataagttcatat
+agctctggatataattatctggcccatgcatttatcatggcgcttggtgccctgtgtgaa
+gccggcctctcatattgaaggtccgaagtattccatgtacattaagatcactctctcatt
+catgcatcttggcttaacaaatctggttgtccaagctttccaggcacgtatggtacaaat
+tcggatcgaatacttataaaaatgatatgttaaactgtctaaaacgctcatctacaaagt
+aaagtgcactaaccaatagagtctcaagaccgtgtaatgctggtgcactgaatgtgtaat
+acggttagaagggattagttatgttacaaatccattgaaaacttaagaagcattgcgtgc
+tcggagggtgcatcttttatcaagagactaacattattttcaacgacgtacatgctttac
+aatagggtacttatcaaacgccgagaaacgcgcctatagtgatgttatgattatgacccg
+atatccattggaccgaattttatgtaggttcccagcgtactcgcgtaatatctcggtatt
+gccataatgtaatacttgtcggtctctcccagatgaaaaagcgttacagagtatttcaat
+gaaaaacagcgcgcaacgtcaatacctttaggggtaacggccgctgatttcatatagata
+tacgataagttggtatagctctactaggtggcatccacaatcgttgcatttactatagct
+ggttacaatcataatctataccgttccttacatactaccatagcgggatagcgttttttt
+gccgttgattgggtttaagaggatgtcagtctcattatatccgattcggtgggagagccg
+ttgttttcaaatcgcacactttgtgacataatgtacaagataacaaaactgatataagat
+ataaactgtcaatatcaccttgacacttgaatcaaagtaaattaactcgcaaatataatt
+tgactaattgggtgcagatttctcaattaataaaaaaatggcaccggatgggcttacaag
+ccccttatcattcacttgtatcatgatttccaagaacaatagaatttgctagcaagtatg
+aacagagattcgaattgcatccacagtacgccggagcgtttattttaatgtggatatgac
+gatgtactgttggcggcatttgctagtaaccggtccttatttacgtagcgcacacgtaag
+catgtctgggagaaatatggtggtacaatctcagagaaagattacagtttggtttaaata
+ggacttatcgggtcggaagtggaacttaataagcagtacacaattgggcaacagacgtct
+tgcctattacaataggattacaatgcgttagatttcagacacgttcgtgtttggctattc
+gtcaattccctaaatagttagacgatcaactattatcaaagtgattctttgttcatcctc
+cattcatgtaacagatggcacactacgcataacgccgaggaattttaacgagatttaaga
+gagcagttcgggcacaacccacttgactttataacagctcggcagcataaacggtaatat
+gtgacaaatttccaaacgttataagaacgtatgtgtacttagaaaactaagtggttcatg
+ttcaacagatgtgacgcagcaagcctaacttatctattggttttgctataaaagaacaaa
+gttacacagaatcctaagggcttgtttcacacttatgcctagtgcttcaccatcttaaaa
+tagcgaaaccggcacgaatcaaaccttaaaacaatgcgcagatattggtgatggtgactc
+cgggtatgataatggtaactgttgaccagcgcccacctcatcgaagtatagaaagtggtt
+aggataaggatgagaccgaacttatttccggccataactttagattttctacctagtaca
+caacatcagggcggacacgaaaccgccatcacatcatataccaggtttaatttgcttaat
+gggggaagtgtcaacgaaccttcgaactttagcaggcatatggccattatatatggcccc
+agagcagaatgctacagcagacaaaatttggatttatgtagtttaatacctatcaaactt
+ggtgtgaccatacttgtctaacgacagtgcacaaagtgtaagttacaattattactactc
+agcagcttctgcaatgataaaatcttatcatacacgtcacatatgataatatctacttag
+ggggaacgggctccacaacctacatagtactcaatacttacactattcgacaggcacacc
+aaacctgtacagtcccaaaagattgagtcaactttgcagtactgcagatcacagtaatag
+cttagttagcgagtcaaaattagttttctacgagactgcacgaccgtgcaaatttccgat
+gtgttggctacaaatagcaacgtatgaatttgtttgaagccacgtaaactgtacaacctt
+agagataagtctcaggctactaaaaacacgttgtggcactaacaggatcatggttgattc
+ttacttattcggctgaccggcccaataagtaaccttcaactagaacagaataatcgggag
+tagtttaattcagtcaaggtgcaggtctcattgtaactaacaagctctgtgtaaccaagt
+taaaatcgttttcttagcggattccctacttatggatttgagctcgtccacaatattcga
+tacaagaagtttgtggtccgtaacaacgaaattttaattacgctgtgcagcctcatccaa
+ggaattaatagaaggttgatggtaggctccgaacgctccatgattataatcaagtggact
+gtgcagtaaacgaggaaggtatcctgacgtcgtggtgttcgtttttgttatttgtgccct
+atacgagtagataaaccatgaacagcacagtgtgaacccatggttgattttaggctacct
+tatttttaatttccgttacacagaaacgaattccacaactaacatgccattaatttttcg
+atatcttataaaagatggtcgaaattcattcatttattttttttcggttctcgaaagtca
+actaagctgtcgcgttttgtttctctttagaggtaaaagtggctttgatctcctacgttt
+ggatactagtcaaccattactccatttgatccgtgagtatcacctgtctaacatccagca
+ttatgactcctcggcgaagaaaagacacacttcttagagtcgatgtgtattagctaggga
+cacagttgtttaatacgatagtgagcccagggagggcagtgcgtcccccagtagatttat
+tcagctagtgtaagtataagatatctcacccacgaggttcaagtgatatgcagtcttaga
+ataatacttatcctgaatttcgatattatgggtacttcaataatccgctagcgctacttt
+atgtctcgttggacagcaggacacatggcagtcttaaacactaaagacatcacctgaatg
+aatgtaatgggattacaagaatcaatgaggtattatatacgacgtaggaaactctggata
+tatacagtaatctagttacgccatcgcacttcattcctctggaaacttagaagacatcag
+ctgtacgtggaggaaccagacccccgtatgtagccaaatagaaccaaagttgcttataca
+aacacacccaatgacaatggaccgctggagttcgtaaactcggaacgtagtactgcacaa
+acccagcatttagcaataggagctacgtatgcaactcccacgtggtaataccttcaagct
+atcaatatataggtgcctagctaatcgcattcgcaagcagtattcaagcttgtaaaccag
+tataataattacagaggctctatgaaacccaactttccagctaaaagtcccaattaaatg
+gttatttcgtacttttaaagtcgcccgttctgttattacgcgaattgattctactccaaa
+attaaacacaaattatcaaccgtttcatttatatttgtcaatgcagctgtttaaaataag
+gctctactaaattataattaagacacttattaccagatttctctagttaagtttgaacca
+gctcgactaccgcgaaagatacattcccttctctatttttcagttcatctatgggtcaga
+gaagcattgaatttattctattcaccctcgtcgttcacagcgaatcgtcagtgtgatcag
+tgtatgagaaatatcctaaaccgtttagtcagaccacacgcttagaacaagtggtctaaa
+aagactgccctggaaggagtaagaagtatacagctgatccggtgtatccttcagtcatct
+gccctatactaattacacgacgcaaggaaaaataggtttattttctaggcaaacccttca
+taggtgactccgatgtgttacgaatcatgcttgagaatgtgctatcgttaccgacggata
+ataacgatctccaatgaaccaaatgtagaatgtctattgattacccttttactattcgac
+ttagagataggagatagaacctcagtgtacttttttagccgaatgggaatctttgggagg
+tgaatggccataaggtcgtaaatccaaccctcttaaagtcttccatattatatcgttgtt
+cgtggaatcgataacagatttgttgacccatagtaaatgtatactagtttatgttgtaag
+tgtagattgttttccgattgccgtccaaactttatgtcgtaattgtagaccagtaaagtt
+gaccaaggtaagtgcccagcgatcctgcgagatcgatcgccaatttttccagtcactgta
+agtgtaggtttagataaagccgtatgagttatatcataagggcctcggaaagcagcttcg
+aaccaaagttcccttataatagtagtttaactataaaagtatatactggtctgtcgccct
+ttcacgatttgttttaccggtttatgaagcgttacgtcattagagcggctccaatttaag
+gttaacggcttccatgtgtagttgtatacaaggataacttaaagtatctgttcagcgagc
+tagttaagttatcctcgatagaacacaactcagaggtcccaagatcgggtttgcaacttg
+ctaatttattctcaaggcaaattgggaattatcgatacctgtataccataaggtcgctcg
+atgtgatgcttatgtcttctggtgatcctaccttagttagtgctgattaacggaacatta
+atgtttatcgttttgagatttagccaattctctgattctaactcaagatgccttatctga
+cgtgctatgcagcccctaagtattttacattgtaataggacacgctcctttaaaactcgc
+caaaaggtcgttgtggttctctactggttaactatataatttacagctttgttgagctag
+ttcctctttggtttaagtcctcaatattagttggttcgagcgataagttggctagttacc
+ttagtcactatattagatccgaatgttatgcttcatctgaagaccgccaccctccaaaat
+ttcttttaagactcacttattgcaaggtgtaggtgaattcggctcgtttctcaagtggtg
+tatctgtacacgagtttccatattttcatcaacagccaccgcacacttatgtcactctag
+gtattaaaagtcgctctacaaggggacgcaattaagaaacagacatgctagtcaaaaata
+aacatagcgaggcaccactaattcggccgcttatcaatgggatgctctgcgcgagacgcg
+ccagagctcagtagttagttcggacatacatttacttcagatgatcaattagttttctac
+aaatgcttactctaccccgaaaaaagtcaccagactcttacgtctctttagtatccttcc
+gtcttatataaggtcagtcccccgtttcggtaccctggaatttactaagaataatgaaac
+agcccccaaggacgtacgtttacaaatgatagaccagatcgcctagcttattccgacgca
+tgttgcatagaattgaaccaacggaatgtgagagtaactagatgagccgaccacagcacc
+cgtttgcgtcgcagaatacgcctgatagttcggccacgaaatcatatgtcctttgagtat
+taagtatttgtaatgatcaatcgagctcaagcaagcttacacttcctcggatattcaggg
+aacttagtgcctttgaaagatacgttgatcaacgaaaaattgataatggctcatatggaa
+tgcctacctcatagtgctgaattaacacagcactgcggacctaacttttcgaggtttcaa
+gttcacgtctcaaaacctaataggctggaatatgtagggatcctcggtgaatttgtgatt
+gggtttgttgtagtactgaccaagtgaatattctttttttctaaaagcagatctgctgcc
+gggcactacgaaggagatctctgtgtatcattattgcttcttgacatgatgactcttaaa
+tcactgtgggtgtgcaaaacgatagcacaacccaattcgatagtacatattgttgatact
+tcgcactaaaccgttcatatttaaaggttgtgctccttccttcgttaaatactggtgact
+tggtcctatctactattagctagacctctggggaaccacgcccccgtaaaacctgtgcaa
+gagagggggtcatacatcttagacatcgcgcctccaccagggaagcattgggtgattgac
+caggtgtgtaacaaatatgattattcttatactaatattagcaaagatgcataatgattt
+gtattaaatgtataattgaattgataagggtcttttagtcagtgatagagtagtataagg
+tagacattagaactcttaaccggacgcagatttttcggtcttagtaagccaattagtcga
+caaaacaaggtaagagcggttactagtagtacctataatgcactgaatcttcggtcgaag
+tatagttctaatgctatgcagattgtgacggcgacaaatgttcagacttatatcatgaaa
+caagctcttgtaagtattgacaaatgaaaagattgaatatttttaaatacaaaatgcgcc
+tacttattaggggaattaaccagattgaaggccaatcctcacatgtaatgagataataga
+cgataaatgaaattcttgtaatagttgaactgctacgtgatgggtattatatatgattga
+gatcctccaattgccgacgtcttgtcttgatgcccaaaagattgtcaacgaggagctccc
+tcgcgtacctgtcgtccgtatcataaacgacgcgacatgtacagcactccgaagtataag
+caataataatgcgggtaatccagactagatcttttcggactcaatgcggtttcacggtaa
+acatgattaataccggagagtagtcgagcttatcagcgatgcaagcgaattcattgtgcc
+aggagatacgttgcagataaaaccggcaacgtatgtcaacaagttttggcgatctcgttg
+tttgtattcgacgaggcgcgggaacttcaagaactatcgtatattcaagtccattacctt
+ttagtttcagactggtggagctgactaaagttatatcatcattttgtacactggtttagt
+taacgataatttcagatttaacatgaccagacgataatcgctgtatatccagttggaatg
+tggtttgccagaaaggttaacttataatcaagcctctcttcagtcttgattcgtcgtatc
+ccatccattgcgctatacctcagtgtatttggagctgtagttataccgtgtgctaagatc
+agtagacatgacgagagcaatattatctaccttacaagcatcaacggacgtctagtcgga
+acaaaagactctaaaactcgaacttcaggttaatatactatagttctgtattcagcagtt
+attcttatattcgatattatcttgcctattggatgtctgactttagtatattaatcatag
+tatctgccatgtaaaggtgccagtactaaatctgtttcacagtgcgaattataaacggtt
+acaaccattaaagacaacaagaccctatagctttatttgaattttgtcaatgcgcaactt
+ggagctcgcgatacatcccaattagtctatagggtcgggacgattctacggcatttctgg
+ttataatgacaacatggattgtggcccgagaatcgctctttcattaattaagcaatcatt
+acagtcttataagcgctacttccgagtggtagcaggtaactcgatataaggtcgcatgag
+ccgaatagcttaaaaaacaggccaccgaacattgatagagaataccgaccacagcgcaac
+ctttgattactttcattaaattgtacggctcactcgacatcaagcttaagattgcgataa
+tgtgaactcaaatggatcagtactgaagaaccgtaacccacttcgcagaaagcgtaccca
+gagaagatacgctgttacaatatacagggtgaaattattgcctgttcttcgtaaccattt
+cgccaaacttggttagaaatgatagccattcatgatagaaataagctgaatgataccagt
+atctttaactatgtagtcagggggaagataacgatggtccatgtatgtttctgatatgtg
+acagtattggccgcgtaatttgctaacgaagctacttaatgcctttgagcttcatataga
+tttctttaatcaaaatcggcaaaaagatagtatgagctataatatatgctagtagagaac
+tctggaccatcatctatatgaatactgattcgagcgtgcaattactttagcctgcgtact
+actgactctacaaaacactctgagataagtttgtagtcagtaagtcgctctctataaacc
+ttttggatgaccattgtacagccacttatagatcccaataaatagcacaggagacagagt
+ttttcaatgctcgatcatttgccgatagtattttcgtctaacctcagggcacctattatt
+tgatacctaacctaacggccctttcacaatggagaaatatatgacatcgggacaaacaca
+aatggtgggtggccaggagatatgacatggtggcgtctctaagaaacacggactccctct
+aggcaaactcacgtaaccaattttaatgtcaaacaaaacgctcgaaaagattttgccgtg
+taatgacctggtacattgactggtcaggaatacatcactgtagttgccgtagtgtcctgt
+tggtgttccatcaagacacatcgtataacgcaatttacgacggacatcagatcaagttat
+acagattatttaagtatcacgtgtgcattgggacataagggatctcacacatgccttgga
+acatttttgctttgtgccgctttttcgctgcactaccaatccttacttaccagtatattc
+aaaggtcgttaacagaatgagaaaggttagggctctaagttatcgtcgattgggatagac
+gagacatttgcgagcgccctccacggatacgaatctcccatatcaatgtgaactggatgc
+tatgcagtttagttcttacgtctcctagtggtaaaaatcaaagtagcactcgcatagcag
+ttattcagaacctaatacacaaaaccgtcaaacattttctaattctaggtatgggccgat
+cataggagctaaggtgaaactcataaatgttttgttagatctagcatcctaaaaagatgc
+atatactgagtagctggcgtgcattctctcaattgtatcctttttaactgaactagtcgg
+tcccatttcgtgactgagatctattaaccgataagattaataacactcgcattcgtatca
+gctcagagtgaagtttttcaataatttgactgatatattaacttctaaaataacccttta
+agcctcggatccgtttcccaatcacatcaaaaattcttattccaactatctacggattaa
+caacgtgcatggggatcgtagtaagaacttgttccgatcactttgagtatatcaagttga
+cggcccggttattattgaatagaaacattcacctgctaaattaaataccgcacatcggat
+acccgatttcagagggccgtcttactaagggcaggctttgttcggtttaactgagatgtt
+cattattttacagtatgcttcaactaatatgtaacgaaggacagtggatctgtctccata
+gtagatcttcagtcgtgaatttcataccgctcctatttaagttcgcgttcgagttgttga
+tcatggcacgtgaaagcaacccctagtattctagacgaaaattttttctagttcatctga
+taatttgccaattcaaaaacaaccgctggtttcccggcgcattctctaaaatggaagtcg
+aacctagagccattatttgtcggtaacccatgagttccttcttttcagaagttaatacac
+tgtggtcctatacagaggaaaaacagcggttatatacgatcgtggcataacaacattgga
+tcaagatagcaatttggctacctattctaattctcactagattcggtattccactacaat
+atcggcagattaggattggatgaataatcggtgtttaagtccggttgcgtctccaatctc
+ctaatttttattaatattgatcttggtgacctattgtaaataaaaacttcaagactttga
+ataacggtgaaaagatagaagactcatttgaaaatggatcatccacagatccaaacatta
+gcaagacactaatccccaactagctattctgatcgcgatcgtgctgcagtactcctgtca
+caatagtctgttcatgatctaattctttttgggctttgttcgatggtgattcagaatctt
+tatccggtcgcttccctgtagctactttgtggggatattgcccggggattatagggttga
+gatcgtttcctaaaagtatttaaaccaagtagacttcaactaaactacatcagaacatcg
+tgaagacaccatacgcggtacctttatttaccgataacatttcttcaagaaataccggta
+agcagcataatgaccctaaacagctcggggtatcgtcgtagttttaaattttatttaggt
+tactgctcaaggaataaaaactaactatttaatttataataatattacaaggctcacact
+gattagatttgtctataagacttcgcgatcccccattaccggattgtcttaagaataaac
+tagataaaccatgcattttctagataaggcctttagtctaattagatacaaaaaacacga
+tagttgcatccttaatttattgtgtcaaacctggaaccttttaattacccgcaaatcact
+ttatgtcgagactacctctgaaatttattatctacctaccgcatgaggacttgaaccatc
+ttgtaggagttatgtttattagctaagattcgtttatcctgtagcggtccatgtatattc
+aacaagcaaaaagcactcagaattgtttttagttgagtcaagactgatatataaataagt
+ttccctagttttttcgtggtgggacgatattgaattgaatcttaaccgaagagtttccca
+ctctgtcgcacaataatacacgccaatatttccagccctgcttatgccttaatcggttac
+tcaatctcccattgaagttcattttgatctgcatagaagtttcgggcccagccttttttc
+tgccaccttcctccaagctctgtagacgcactctaagattgatgctcacatgtattaatt
+ctacattaacataaatatataagtcatgcatcttcgagtaaaatatctggttctccaaca
+tgtcctggcacgtatcgttataatgcccatacatgtagtattaaaatgattgggttaact
+ggatattaagatcatcgaaattgtaaagtcaaattaacaatactgtctcaagaccgtgta
+ttcctcgtgctcggaagggctattacgcttacttccgttttggtatcttaatatgacttt
+caaaaattaagttgcagtgagtcctacctgcgtgcatcggttagcaagagtataaaagtt
+gtttaaacgaactacttgctttacaataccggtcgtatatatcgccgtgaatccagaaga
+ttgtcttctttggattatcaaccgagatcctgtggaccgatgttttgggaccttcacaga
+ggactccaggtagagctcgcttttgcattaatctaagaattgtacctctctaaaagatct
+aaaacagtgaatgtgtatttcatggaaaaacacagagaaacgtaaattactttaggccga
+aaggcacatgagttattatacatatacgagatggtggtatacatcgaattcggggcatac
+actatagttgcattgtatttagctgctttaaataatatgatattaccttccttacataag
+acattaccggcataccctggttttcaacttgtggggctttttgacgatcgcactctcatt
+tgatccgagtagggcggtgacccctgcttttcaaatacaaaaatttcgctatgaaggtaa
+tagattacttttcgctgttatgatagaaacggtaaatttaaaattgaaacttctagaaaa
+gtaaagtaacgagaaatgattttgtgaataatgcggtcatgattgcgcaagtaagaaaaa
+aaggcaaaaggatgcgcggaatagaaacttatcagtcacgggtatcttgatttcattctt
+cttgtcaattgccgacataggatgaaatcagattccaatgcaatacacagtaacccccac
+ccttgattgtaatgtcgatttgaagttgtacgcgtcgacgaagtggatagtatacgggcc
+ttttgtacggtgcgatcaactatgaatctcggcgagttagatggtcgtacaatctcacac
+atagaggtcacttgcctgtaatgacgaattttcggctaggtactcgaactttattagaag
+taaaaatgtgggcaaaagaaggattccattttacaagacgattacaatgagttacatgtc
+tctcaacgtagtctttccctagtagtctttgaactatttaggtactccagaaaattttag
+caaagggtttctgtgtgaatccgccattcatgtttatgatggaacaataagaataacgcc
+ctcgtatgttatcgacagtgaagtcagcagttcggccaaaaacatattcaatttagtaca
+gatccccagaagttaagctaagtgctctaaaatggcctaaacggttatcaaagtaggtct
+aattactatactaacgggtgcatcgtaataactgctgtcgatgcaacactatatgatagt
+gtcgttttgctatatatgtacaatgtgacaaagaagccttagcgattcttgcaaacttag
+gacttcggattctcaatcttaaatgtccgaaaacgcaaagattcaaaaatttaatctatg
+agcagatatgcctgatggtgactacgcgtatgttaaggctaaatgttgacaaccgcacac
+ataatcgaactattgatagtcgggagcataaccaggtgaacgtactttgttcacgacatt
+tattgacatgttctaaatacgtctcaaaatcacggcgcactagaaaacgcaatcaaatca
+ttgtcctggtttaagggccgtaatgccggtagtgtcaaacttcatgagaactttagctgg
+cttttggccagtatttagggaccaagagcactagccttaagctgaatattttgccattta
+tctactgttataactttaaaacttggtggcaccagacttgtcgatacacacgcatcaatc
+tgtaacgtaaaaggtttactaagaacaagcgtaggaattgagtttatattatatttaaac
+taaaagatgatattagcttctgagggcgatagggctccaaatcataaagaggaatatatt
+attacacgattagaaacccacaacatacctcgaatcgcccaaaagtttgacgaaacttgg
+cagtactccacatctcagtaatacagttgggagagtctcaaatgttgttttattactcaa
+tgaaccaccctcataatttcactgctgttccattaaatttgcaaacgatcatttgctttg
+aagaaacgtaaaatcgacaaaattacagataagtagatgcataataaaaaaaactgctcg
+ctataacacgatcatcgtgcattcttacttaggagcatcacccgcacaataacgtacctt
+aaactacaacactattagaccgagtactgtaattcacgaaagctcaagctcgcattgtaa
+agaacttgctctctcgtaaaatgtgataatagtttgcggagaggattcaattattttcca
+ttgcacctactccactagattcgataaaagaaggtggtcctcccttaaaaagaaatgtta
+agtaacatcggaaccataagcaaagcatgtaagtgaaccgtcatccttccctaagaaaca
+taaaggtttttaataatgtcgactgtgaactataactgcatcctttcctgacctactccg
+gttccttgttgttatttctgaacgagaccagtagataaacaatgtaaaccacagtgggta
+ccaatggtgcatgtgacgctaccgttgttttaagtgcccgtacaaacataagaagtcata
+atcttacttgaaattaattttgccttttattttttttcaggctcgaaattaatgatttgt
+tttttttgaccttctagttacgctaatatgcggtcgcctgtggtttctattgagtcctat
+aacgggatgggatctaatacgtttggttactagtaaacaaggtataaatttgataccgga
+gtatcaactgtataacatcaagctttatgactcatacgcgaagtaatgacacaaggcttt
+caggagatcgcgagtacagagccactaaggggtgtattacgatagtgacaccaccgagcg
+cactcactccccaagtagatttatgatcctacgctaagtattagatatataaccaaagag
+gttctagtcagtgcaactcttagaataataattagccggttttgcctttttaggcctaat
+gcaatattcagctagcccttatgtatctcgcgttccacagcaccactcatggcacgcgtt
+taaactaatcaaatataatctatgaatgttatgccagtacttgaataaatcaggtttttt
+ataagtccttgcatactctcgttatatactgttagagtcttaccccatagaaattctttc
+atctgcaaacttagaagaattctcagctacggggagcataaagtccccaggatgttgaca
+aatacaacaaatgtggcttatacaaacactccatatgaaaatcgaaccctcgtggtagtt
+ttagccgaaccttgtacggataaatccctccattttccaatagcagatacctatcctact
+acctcgtggtattaaattaaagcttgaaatatagagctgcatagcttatccaattcccaa
+gcacgagtctaccgtcgtaaccacgatttgatttacagacgctagagcaaacccatcttt
+aaacatataagtaaaaattaaagggtgagtgcgtacgtgtttactagcaacttcgcttat
+taagacaattgtttataagccataattaaaaacatatgttcaacaggttcattgatattt
+gtaattgcacaggtttttaataaggatctacgtaagtataatgaacaaactttttaccag
+agttatattctgtactttgaaaatgctcctctaccgccttagagactttcaattagattt
+tttgcagttaatctatgcgtaagtgaaccatgcaagggatgcgattcaaccgcctcgtgc
+taaccctatcgtctgtctcataactgtaggtctaatataattttcagttttcgaacacat
+aaccctttgaaaatctgctatttaatgtctcacctgcatgcactatcttctatactgctc
+agaacggctatacgtcactatgctccaagtgacgatttaaacgaagcaaggaataatagg
+tttattttagtgcaaaacaattaagtgcggactacgtgctctttacaataagccttgtga
+ttgggctataggttaagtcccatattaacgatctccaatgtacaaaatcgacaatcgctt
+tgcattacccggttactagtcgaattacagatagctgttagatactcactctaattttgg
+acaacaatcccaatcttggggtcgtctatcgcctgaagctcgtaaatccttccatcttaa
+acgattacatattatagacttgttcggggtagagatatcacagttgtgcaaacattgtaa
+atcgatactagtttatgttggtagtctagttgcttttaccattccccgaaaaacttgatc
+tactatttcgacaacagtaaacttgaactaggtaagtgaaaacagagaatgcctcatagt
+gccactatttgtccactatatgtaagtgtagctttacataatccactatgactgagatca
+ttacggcctaggaaagcagcgtagaaaaaaagggcccggatattacgactgtaactataa
+aactagttactggtagcgcgccatgtatagatttgttttaccggttgtggttgcgttaac
+gaatttcagccgcgaaaattgatccgttaaccagtccatctcgacttctataaaacgata
+aagtaaagttgatgttcagcctccttcttatggttgcatcgagagtacactactcagtgg
+gaaatagatcggggttcctacttcagattgtattatctaggcaattgccgattgtgccat
+acctggataaaataagctacctacatgtgatgcttatctattatcgtcatactaccttag
+ggtgtcctgttgaacgctacattaatctttagccgtttgagatgttccaatggataggag
+tctaacgcatgatgaagtttaggaaggcagagcatcccactaagtatgtgacagtgtatt
+tcgaaacgagacgttataaatagaaaaaaggtccttctggttctattctgctgaactatt
+gaatggaaagattggttgacctacgtactatttgcttgaagtcatcaatttgacggggtg
+agagacatatggtgcatactttacggactctatattttagatcagaagcttagcagtctt
+ctctacaccccctcacgacataattgcttttaagaatctatgtttgattcctctacggga
+attcggatccgttcgcatgtgcggtttatctaaaccaggggacatatgttcagctaaagc
+atacgaacactttgctaactagacgtatgtatagtagctataaatcccgacgatatttac
+aaaaagaaatgagactcaaatatatacatagcgaccctacacttattcgcaccctgatct
+aggcgatcctagcacccacacccgaaagtgagcactagtgtcttccgtattaaatttact
+gcagttgagattttagttgtctactaaggattactctaacccgtaataaggatcaagact
+cggtactagctttactatcattccctatgtgttttcctaactcacaagggtacgtaccag
+cctatgtaattacaataatgataaagacacaaaggaagtaactttacaaatgagtctcca
+gttacactagcttagtccctcccatcttgctttgaagtctaaatacgcaatctctgagga
+tatacagcagaagaacactcataacgttggagtccaagaattagactcatagggccccca
+acatttaatatgtactgtgagtttgaaggtgttctattgttaattcctgctcttgataca
+tgacacgtactccgtgtttaaggcttcggactgactttctttcataagttgagcaacgaa
+aatttcagaatcgataagttggattcactaactaatacggctgattgaaaactccactcc
+ggacctatatggtcgacctttatacgtaaccgatataaaacttataggctggtatatcga
+gccttcctagcgcaatttcggatggggtttcttctactactcaacaacggaatagtcttt
+gtttagtaaaccagagctcaggacgcccaatacgtaggagagcgctgtggagcatgtgtc
+attatggactggagcactcttaaatcactctgcgtgtgctaaacgatagatcataacatg
+tcctgagtaaattttcttgatacgtcgcaatataccgttattagttaaacgttctcatcc
+gtcatgcgtgaaatacggctgtcgtgctcagatatactattagcgactcatctcgcctaa
+cacgcacacgtataaactcggaatgactgccgctcttacatattagaaatacagactaca
+ccacggaagcattgggtcattctcaaccgctgtataaaagatgattagtcttataataag
+attaccaaagaggcagaatcatgggtagtaaatctattattcaagtgattaccgtcgtgt
+aggcagggagtgaggacgagatggtactcaggacaaatattaaccggacgaagtggttta
+cgtcgtactttcactattagtagtaaatacaaggtaacaccggggaatagtactaaatat
+aatgatatctatcttcgggagaacgagtcgtctattgctttgaacattctcaaggcgtaa
+aatgtgctgacttatagcatgatacaaccgattgttacttttgtctattcaaaagattga
+atagttttttatacaaaagccgcatacttatgacggctagtatacagtttcatcccctag
+catcaatgctatggacagtattgaacttataggaaattcttctaatagggcaaatccgtc
+gtgatgcctattttttttcagtcacatcctcaaatggcactagtattgtcgggatcccat
+taacaggctcaaccacgagctcacgcgaggacatgtagtccgtatctttaacgaagcgac
+agcgacagaactcccatggataaccaattataaggcccgtaatcctctagacatcgttta
+ccaataaatccgctttctccgtaatcatgttgaataccccagagtagtccagatgataac
+cgatgaaacacaagtctttctcaatgcacttacggtgaacttattaccgccaacgtagct
+catcaaggttgcgacatctagttgtgtgtttgcgacgagcccagcgaacttcatcaactt
+tcgtatattcaacgccttgtaattttactttaagacgcctggtgatgtagattcttagat
+aatcagtttgttatcggctgtactttaccataatttcacaggtttcaggtcaagaagatt
+atagctgtatatacagttccatgctcggtgcacagaaacgtgatcggataataatcaatc
+gcttatgtcgtctttaggcgtatccaatacatgccccgataccgcagtgtatttcgacat
+gtaggtataccgtcgcatttgagctcgagtcaggacgtcagctagattagattccttaat
+agaatataccgacctctagtccgaactaaactatagataacgccaacttcaggttaattg
+tctagtcgtctgtttgcagatgggattcttagatgagtgagtatcggccatattggttcg
+agcactttagtttttgatgcataggatatgcaatgtatagctgaaagtactttatctgtt
+tcaaactcacattgattaaaccggtaaacctttaaagactacaagaaaatattcagtgag
+ggcaattttgtcaatcacaatcttccagctagagatacttcacaatttgtcttgaggcta
+cgcaacattagacggattttcgcgttttattgaaataatcgaggggcccaagagtatcca
+tagttcattttgtaagatttctttacaggcttattacagcttcttcagactcctacatgc
+ttacgagttatatgctagcatgtgaacaatagattaatatacaggaaaacgtacattgag
+agagatgaccctacacagcgcaaccgttgagtactttcattaaagggtaacgctctcgag
+acagcatccttaagatggccttattgtcaaatcatttgcagaagtacgcaagatccctaa
+ccaacgtagaagaatccctacaaacacatgagacgcggtgaaaatagacagggtgttagt
+attcaatcttcggagtatcaatttcgccaatcttggtgagaaagcataccctttcttcag
+agaaagaagatcaatcataacactatctttaacgaggtacgcacgcgcatcattacctgc
+ctccatggatctttaggatagcggaaagtattggcagcgtattgtgatttcgttcctact
+ttatcaatttcacattcatatacatgtcttttatcaaaatcgccaataagataggatgag
+ctatattagatgctagtagagttcgcgccaacatcatcgataggaatactcaggacagcg
+tgataggacttttcaatccctaatactctctataattataactctctcttaagtttggag
+gcagtaacgcgctctatataatcagtttgctgcaccattcttcagcctctgatacataca
+aataaattccacagcagtaagagggtttaattgagacatcttgggaacttaggattttac
+tctaacatcaccgaaacgattattggataccgtacctaaacgaactttctcaaggcagta
+atataggacatccgcaataacacaaatgctgcctccccaggagttatgtcttcctggagg
+ctatatcttacacccactcactataggcaaactaaagtttaaatgttgattgtctaaaaa
+aaagatagataagagttggccggcgtagcacatgcgaaagtgaatcgtaagctataattc
+tctggacttgaagttctgtcctgttcctctgcaagaaacaaacttcctttaaagctattt
+acgacgcacatctcagcaagttataaacatgttggaagtttctagtcggaattcccaaag
+aacggatctatctaatgcattcctacatttttcctgtctgccgatggtgccatcctattc
+aaagaatttcttaaaagtagattaaatgggacttttaacaatgagtaaccttacgcctct
+aagggttcctcgagtgccatacaccagtcaggtccgagccacatacacggagaacattct
+aacatagcattctcaactcgatcatttgcaggttacttctttcctatcctagtgctaaaa
+atcatacttgcaatcccatagcacggattaagaacctaagaaacaattcagtaaaacatg
+ttcgaattcttggtatgggaacatcattgcagctatggtctaacgcattaatgtttgggt
+acatcttccatcatataaacaggaagagtctgacgacagggagtgcttgcgatcatgtct
+atcattgtgaaatcaaattgtagctcacatgtcgtctatgagagcgtgtatccgataaga
+tttagaaaaatagaagtcgtataagatctcactgaacttttgaatgaatgtgaagcatat
+atgatctgctttaataaaactttatccataggatacgtttccaaatcaattcaataatta
+ttagtcaaaatagataaggatgaacaacctgaaggccgatcggacgtagaaagtggtccc
+atcactttgagttgatattgttgaaccacacgttattatggttttcaaacagtctcagga
+tattgtatatacagataatccgataccagttgtctgacgcccctcttacgtaccccaccc
+tttgtgacgtttaaagcagttgttcagtattttaaactaggcggcaactaatttggaaag
+aagcacagtggatatgtctaaattcttgttattcaggcctgaatttaatacaccgcatag
+ttaacttcgcggtagagttgttcatcatgcctcctctaagctaccacttctatgatacac
+caatagttgttctacggaatctgataattggccaagtcataaacttccgctgcgttcaac
+ccccttgctcgaatatccaactcgaaaagacagccttttggtgtccggaacaaatcagtt
+acttcttttctgatgttaattctctgtggtcagatacagaccaaaaactccgcggattta
+ccatcctccaagaacaaatttgcatcaacatagcattttggctacatattctaagtctca
+atagtttaggttttcaactacattatcccaacattaggattggaggaataatagctgggt
+aagtccccttgcgtctacaatcgactattttttatgaatatgcttctgccgcacctatgg
+ttattaaaaaagtcatgactttgaagaaccctgaaaagatagatgaatcaggtgtaatgg
+cagcagccaaagagcatataattagcaacactctaagaacattatagatatgatgatagc
+gatcgtcatgatgttatccggtcacaatagtagcttcatcagctaattcgttttgccagt
+ggtgacttgcgctggaagaatcgttatacggtcccttccctcttgatacggtgggggctt
+attcaaccgcgtggattgggttgtcatacttgcattaaacgatgtaaaccatctagtagt
+caactatactaaatcacaaaatagtgatcaatacatacccgcttcatggttttaaccatt
+taattgattaaagatattccgctaagaaccattatctacctaaactgatcgccgtatcct
+agtagtttgaaatttgatgtaccgtaatgatcaacgaagtaaaacgttatattgtatgta
+gaataataggtcttggagctaaatgatgtgattggtagtgaagacttacccttacaactt
+taccggtttctcggaagaatatactagagaatcaatgcatgggctacataagcactttag
+tctaatgagataaaaaatacacgagtcttccatcatgaattttttgtcgaaaaactcgaa
+cctggtaatttaaaccatatatctttatgtcgtcaataactctcatatgttttatataac
+ttcccaatcacgacttgtaactgcttgttcgactgagctgtttgagctatgaggccggga
+tccggttgagctacatctatttgctacaagaaaaatgaaagcacatttgttgggagttct
+ggctacactcatagagaaataagtggcccgagtgggtgcggcctgcctccatattcaagt
+gtatcttaaaccaagtggttccaacgctcgcgctaaagaattaaagcctttatttcctcc
+acggagtagcccgtaatccggttcgaaagagaccattgaagttaattttcatatccagtg
+aagtttaggcacaagcatgtgttctgccacatgcctcaaagcgctcttcaaccaagatat
+gattcatcctaacttcgatgaatgcgtctgtaacataaatatagaaggaatgattcggcg
+agttaattttcgccttctccaacatggcatccctacgttcgttataaggaccatacatgt
+aggttttaaaggtttgcggttaatcgatatttacatcatagaaattctatagtcaaattt
+acaagactctagatactcactcgttgcagccggctaggaagcgctttgtaccttacttcc
+cttttcgttgcgtaatatgaatttcatatagtaagttcaaggcactcatacctccgtgaa
+gagggtagatagactattaaagttgtttaatagtacgtattgatggaaatgacccgtagg
+agatttaccactcaatccacaagattcgctgctgtgcattatcaaaacagtgcatgtcga
+aacatgggttgggtccttcaaacacgaatccaggtagagatacctttgcaatttttcgat
+gaaggcgaccgagataaatgagctataacactgtatgtcttttgattgctataaaacaca
+gaaacggatattaatttaggccgtaaccaacatctgttatttgacatagaacagatggtc
+ctttacagcgtattccggccttaatattgaggtccagtgtattgtcctcctttaaagaag
+ttgattgtaactgacttaaataagacatgtcacccattcactgggttgcaactgctggcc
+ctttttgtccatcgcacgctaatgtgataacagtaccgccctcacacctgcgtttaaaag
+acataaatgtcgctatgaaggttattcattaattttagctgttttcttagaaaaggtaaa
+tttaaaattgaaaaggctagaaaactaaagttacgacaaatgtgtttgtcaagtaggcgg
+gcatcattgagattgtaagaaataaagccataaccagccccggaatagaaaatgttaagg
+aaaggcgatcttctttgaattcttattgtcaagtgcagtcatacgttcttatcagaggac
+attgcaataaaatctaacaccctcccttgtgtggttgggccatttgtacttcgaagcgtc
+caccatgtgcagaggataacggaatgtggttccgtcccataaacgatcattctcgcccac
+ttagtggcgcggtaaatcgctctcatagaggtaactggcctgtaatgtccaatgttaggc
+taccttctccaactttagtacaacgaataatgtccgattaacaaggagtcaatttgtcat
+gaccagttcattcaggtacttgtatctatacggacgcgttccagagtagtatttgaaatt
+ttgaggttctactgataagtttagctatcgctgtatgtctgaataagaatttaatgttta
+tcttcgataaataacaattaacaactcctaggtgatacactgtgaagtctgctgttcccc
+aaattacatatgctattttgttcacataccatgaagttaagctaagtgctctataatggc
+ataaacggttatcaaactagctcgaatttcttttattacgccggaagcggattaactgct
+gtagatcaaacacgttaggatagtgtcgttttcatatatatctaaattcggtctaacatg
+cattacccatgcttgataacgtagcacttcgcagtctaattatgtaatgtccgtttaacc
+aaactttaaaaaagtttatctatcaccagtgatgcctcatcgtgactacccggatcttta
+gcctttagggtctaaacagaactaatattactacgtgtcatactccggagcttaaccagg
+tgaaacttatttgttaaccaaatttagtgacagggtagaaatacgtatcaaattaaccca
+gcaatacaataagcatgaaaataattgtaatcgggtttgggccggaatcccgcttggcga
+aaacttaatgacatagtgtgatgcattttgcactggattgagccacaaactcaactagca
+ttatgctcaatatttggccagtgttctacggtttgaaatttataaaggccgcgcaaaagt
+cttgtagttacaaacgcataaatctcgaacgtaataggtttaattagaacatccgtagga
+tttctgtttatagtagatttatactaaatgttctgattagattctgacggccttacccat
+acaattaataaagacgaatatattagttatagtttactatccaaataaattaagcgaatc
+gaaataaactgtcacgatactgggcagttatcaacttatcacttatacagttcggacact
+ctatattggtctgtgagtactctatcaaactaactcataagttaactgcgcttccattaa
+atttcaatacgttcttgtgctgtgtacaaacctataatcgaataaatgacacatatggag
+atgcataataaaaaaaacggctccatatttctcgttaatcgggcattcttaaggaggagc
+atctcaccaaaaataacgttcctgataagtcttaactattagaccgtcttcgggaatgaa
+cgaaacctcaagctagcatggtatagttcttgatagcgcgtaaattctgataatactggg
+cggacagctggaaattagttgccagtgcacctacgcaaatagtttacataaatcaacggg
+ctccgaacgtaaatacaaagggttagttacatcgcaacaagatgaaaagcatgtatgtct
+accgtcatccgtccctaacaaacataaaggtggtgaagaatctcgtaggtcaactataac
+tccatccttgaagcaactactccgcgtccgtgtgcgtagttcgcaacgagaacactactg
+aaaaaagctaaacaactctcggtacaaatgcggcttgtgtcgataaagttggtggtagtg
+cacggaataacataacaaggaatattatttattcaaattttttgtgactgttatttgttt
+tctgcctagaatgtaaggatgtgttttttgtgacctgatagttacgcttatttcaggtcc
+acggtgcgtgagagtgtgtcctataacggcaggggagcgaagtagtgtcctttagactat
+tcaaggtagaattttgataacgctctataaaaggtagaaaatcatgattgagcaataaga
+ccccaacttatcaaaaaaggagttctcgacagcgcgtgtacagtccctataacggctgta
+tttcctgtgtcacaacaccctcccatcgcactcaaaatgtagatttatgatcagacgcta
+acttgttcttagagaaaaatacacgggatactctgtgcaacgatttcattaataaggtgc
+agcttgggacttttttggccgtaggctttattaacattcacagtaggtagcgagacttcc
+tatgaaccaatcatgccacgcgttttaacgtttcaaatataagctaggaagcgtttgcca
+ggacttctataatgcaccgttttttttagtacttccttactagccttagtttatgttaga
+gtctttccaattacaaaggattgaatagccaaaatttctacaattctcagcgaacgccag
+cttaatctaaacacgagcttcaaatattctacatatcggcaggagtcaatatataaatat
+gaaaatcgtaccatcctcgtacttttagaccaaacgtcttcggataattaaatccttttt
+caattaccacagtacgtgcattagaactactgctatgaaagtaaaccttgaaatatagtc
+ctcaagagcgtatccaagtacattgcacgtgtatacagtcgtataaacgagttgatgttc
+tgacgctagagcttaccattcgttaaacagataactaaaatttaatggctgagtgactta
+gtgttttcgacaaacgtcgcggatgtagactattgtttataagcaatttttaaaaacata
+tgttcaaaacggtatgggatatgtcgaattccacaggggtttatgtaccatagaagtatg
+tataaggtactaaaggtttaaatctgtgatattcggttcggtgaaaatcagactagtcac
+acttagtgtctgtaaattagattgggtgaaggtaagcgatcccgaactctacaaggcatg
+ggatgagattctaccgactccggataacactttacgatcgcgcataactctagctcttag
+ataagtttaacttgtcgatctcataaacagttcaaaatctgcgatttattgtatcaaatc
+catcctctatcttctataatcatctgaaccgcgatacggcactatgagccaagtgaagat
+tgaatccaagaaagctataattggtttattttagtccatttaaattaagtccggtataag
+tgctctgtacaatatgcagtctcatgggcatatacgttaactaccttttgatacttcgaa
+ttggtaaaatatcgactatcgatttgcagtaaaaggtgtagagtccaattactctttcct
+gttacatacgatctcttagtttggacaactagcccatgatggcgctcctctagcgcatga
+acctactttataattacatctttatcgatgaatttttttagactgcggaggccttgagtt
+ttaacagggctgctaaatttcttaagcgattagacggtagcgtcgtacgctacttgcttg
+gaacaggcaccgaaaatattgatctactattgcgtcaactctattctgctaatagcgatg
+gcaaatcacagaagccctcttagtgacaatagttgtcaactatatctaagtcgaccttta
+ctgtatcaacgatcacggagagaattaccgaatacgaaacctcaggactaaaaaacggaa
+aggatttgtcgacggtaaatataatacttgttaagggtagcgacacaggtatactttggg
+tgtaaacgtggtgcttcccggaacgattttcagaccagaaaattgttccggtaaccagga
+aatctcgtctgcgttaattcgtgttagtaaacttgatcttcagactccttcttttcgttg
+cagcgagacttaaattatatctgcgaaatagtgccccgtgcatacttcagatggtaggag
+ataccatttggcccattgtgactttacgcgattaattaaccgacatacatctgttcctga
+gctatgatcgtctgaataaattacggtctcctcttgatacctaatggtttctggagacgt
+ttctcatgttcaaatggatagcaggagatcgcttcatcaagtttagctacgcagagcatc
+aaaatatgtatgggaaagtcgatttccaaaccagaagggataaagagaaataacggactt
+ctccgtagattagcctgatattttgatgggaatcatggcggcacatacgtaagagttgcg
+tgaacgaatattttggacggcgggagacacatatcggccattcgttaaggtctctatatt
+ggacatcacaagcttagcagtatgagctactaacactcaagacattattgattttttcaa
+gatatgtttcattcctctaccgctattcccatacgttcgattcgccgggtgagcgaaacc
+acgggactgaggttaagctaatcaataacaactcgttgcgatagagacctatgtatacta
+gagagaattccccaacatttttacaaaaacaaagcagactaaaatagatacagtccctcc
+atacaattaggaccaacatgttattgccgatcctagcacacacaccacaaactcagaact
+tctgtcttacctatgaaagggtctgcacttctgattgtacgtgtctaattagcattaata
+ttaaaactaattaggataaactataggtacgagctttactataagtcactaggtgttttc
+cgatcgaaaaacgggaccttcaagccttggtaagtacatttaggataaagaaaaaaagga
+aggtacgtgactaatctgtctaaactgacaatagagtagtacctacatgcttcatgtcaa
+gtcttaatacgcaagcgctctcgttatactgctcaacaaaactcataaagttggactcca
+tcatttagaatcatagggaccaaaacatttatttgctactgtcactttgtaggtgttcta
+ttctgaattcctcatattgatacatgaatcggaatacctgtggatcccttaggacgcacg
+tgctttctttacgtcagaatacatattgtcagaatcgagaagttccatgcaattaagaat
+tcgcctctttgaaaactcatatccccacatatagggtccaccgttattcggaaacgatat
+aataattattccagcgttgagcgtcccttaagagcgcattttcgcttggcctttcttcta
+cgactctacaacgcaagtggctgtgtggagtttaccacagcgcagcaccccatagaacta
+cctctgagagcgcgagatggtggcagtatgctctgcagctagcgtttagaacgcgcccgc
+gcattaaccagtcatattaaaatggactgtcttaattgtcggcattaggagcaatattaa
+ctgatgagggtatcggtcgcagaagtaatgacggaaatacgcctctagtccgcagagata
+cgattacagactcagatcccctaacaagcaaaacgattaaatcggaatcactccccctat
+gacatatttgaaatacacaagaaaccacgcaacatgtcccgcattctcaaccgcgcttta
+taagatgttgagtctgagaattagatgacctaactgcaagaatcatggcgagtttatcta
+gtaggcaagtctgtaccctagggttcgaacgctgtgacgtcgtgatcggtctaaggactt
+agatgataaccaagaactggtttaccgagtactttcactattaggagtaattacatgcgt
+tcaccgcggaatacgacgaaattttttcatatctttatgagcgagatcgtgtcgtctttg
+cattgcaacagtcgctaccagtaattgctgatcaattatagattcattatacagatgctt
+acttttctctattcaatactgtcatgagttgtttttaaataagcaccagaattatgtcgc
+ctagtataatcttgcttccacttgaatcaatgcgatggacagtattctactgattgcaaa
+gtagtctatttcggcttagcagtacgcatgcctatttttttgcaggcacagaataatatg
+caactaggattctcggcatccaattaacaggctaaaacaccaccgaaagacaggtaatct
+acgaagttgatgtttactacagaaagcgaatgatatcacttggagaacattttagatgcc
+cccttttaatctagactgagtgtaccaatatatcaccggtctaccgaatcagcttgaata
+aaccactctagtactcatgataaccgagcatacacatgtatttctcaatgcactgaaggt
+gaactgtttacaccataccttgcgaatcaacgtggcgacttatacttctgtctttgagta
+cagcacaccctaatgaatctaagttagttgttgatacgaattgtaatttgactggatctc
+gcctcctcatctagattcttagagaagatgtttcttatagccggtactgtaactttattg
+atctggtttatggtaatcaacattttacctctatttaaacgtccttgcgccgtgcactca
+atcctgatcggtttagattcaagcgattatcgagtctggaggccgagaaaagaaatgcac
+agagtaagctctctattgcgacatctacgtagaaactcgcatttcagatcgagtaagcaa
+ctctcattgtgttgattcagtaatacaagattacctacgcttctacgaaatatactatag
+atttagcctacgtcacctttagtgtcgagtcggagctttgaagatcggatgcggtgtgga
+ctgtgtataggcaattttgctgcgagctcgtgacttttggttgatgtcgatatcaatggg
+atacctcaaacgtctttatctctggataactcacattgagtataccggtaaaaatttatt
+ctattcatctaaatagtcagtgagggctagggtcgcaatcacattaggccacatacacat
+acttaacatgttctattgacccgacccaactttagtagcattgtagccgtttatgcaaat
+atgccaggcgccaaacactagccagagggcattttgttacatttatttaatcgattatta
+cacagtcggaacacgcctacatgcgttcgacttatttgcgacatggtcaacaattcagta
+atttaatccaaaacctaaagtcagagacatgacactaaaatcacattaaggtcagttagt
+gaaggaatggctaaccagctagagaatgcatcattaacaggcacttattgtcaaatattt
+tccagatctaagcaacatcacgttaaaaagtacaacaatcacttaaaacacatcagtcca
+ggtgtaattagaaagccgcttagtaggcaagcgtaggagtataaatgtagacaatagtcg
+ggacttagcagacactggatgcagtcatagaagatcttgcataacacgttagggttagag
+ctacgaacgcccatcattaactgcctaaagcgtgcgtgagcttagcgctaacttttccaa
+cacgtttgtgatttcgttcataatgtatcaatttcacagtcatatacagggagtgtagaa
+aaatcgcaattaacatacgttgacctatttttgttcagagttcagttagagcctaatgat
+tcgagagcaataatcaggacagcctcataggaagtgtcaatcacttagaagctatattat
+tataaatcgctctttactgtcgtcgaaggaacgagcgagagagaatcagttgcctgcaac
+tggcttaacaatatgatacataaaaatattttcatcaccactaagacggtggaattcaga
+cttattggcaacttaggatgggactattaaataacccataagatgttgggataaagttac
+gaaacgaaagggatatagcctgttagataggaaatccccaataaaacatagccggcctcc
+acagcagtgatctattccgccacgcgatatctttataccacgcaatataccaataataaa
+ggttaaatgtggttgcgatttaaaaaagatacatatcagttgcaccgcgtagcaaatccg
+tatgtgaagcgtaacctagaattatagcgtctgcaagttctctaagcttcctctgcaaga
+tacaatatgactttttagcttttttactaccaaatctcagaatcttagaaacaggttggt
+acgtgctactcggaattcccaaagtaccctgctatatatgccattccttcattggtccgg
+gctcaccatggggccatcatagtaatagaaggtagtaaaactagttgatttccgactttt
+aacaatcactatcctgacccagatatgggttccgactggcccttactccagtaagggcag
+acacacagacaacgagaacttgataactttgaattctcaaatcgatcattgcaacgtgac
+ttatttactagcctactcctataattcatacgtcaaatacatttcaacggaggaagataa
+taagtaaatattcactaaataatggtcgaaggagtcctttgccaacataagtccacatat
+gcgctatagattttttcttggggttcatattcaataagataaacagcaagagtatcacgt
+cagcgagtcattgagatcttggctagcattgtgatagcatattctacctaaatggtagtc
+tagcacagagtggataagatatcagttagatatagacaagtactataacagatctcgctt
+cgttggattgtatggctagctttgatgatatgattttataaaaattgatccagacctgac
+ctggccaattatattcattttttatgagtaaaaatagataaccatgaaaatactcaagcc
+ccttaggacgtacaaagtggtaacataaatttcaggtgttattctgcaaccacacctgtt
+ttgggttttcaaaaaggctaagcagattggttttacagataatccctgaacactggtatc
+tcccaacgatgtcgttcccaacccttgctgaccttttaagctctgctgaagttttgtaaa
+ctaggcggaaaatatgttcgatagatccactcgcctgaggtagaaattcgtcttagtaac
+gcctctttggattacacagaatagtgtactgacacgtacactgctgcagcagccatacgc
+taacattaaaattcgttgagtctacatttgttgttattcggattatgttattgggaatag
+tatttttattcccctgcgtgaaaccacatggatagattagcctactcctaaagactccct
+tttggtctacggttcaattctcttactgagtttatgttcgtaattatatcggcgcagtga
+atctcctaattatcaccggagttaccagacgccatgaacttatggccagaaacattgcat
+gtggcctacataggattagtatcaagagtttacgtttgcaacgacatttgaccaacttga
+ccattcctgcttgtagaccgcgggaactcccctgcacgcgactatagaagttggtggtgg
+atgtggcttatgccgcaaatatggttttgaaaaaagtaatctattgcttgatacctgaat
+tgagacatgtataagggctattgccagatgaaaaactgcatataaggtcaaacaatataa
+gaacattatacataggatcttagcgttcctcaggatggtatacgctataaagtctagctt
+cagcagctaaggagttttgccagtgcggacttccgctggaagattaggtttaaccgccct
+gacatcttcataaggtcgggcctgattcaaacccctggagtgccgtctcatacttgaatt
+aatcgatggaaaacttcttctagtctaatattattattaacaaatgacggttcaataaat
+aacaccgtaagggtgggaaactgttaagtgatgaatcattttaacctatcatccattagc
+tacagataatgataccccgatccgactagggggtaagtggttgttccgttaggataaacc
+atgtaaaacgttagagggtttgtagattaattggtattccagataaatgaggtcagggcg
+agtgatcaattacactgaaaaattgtcagcttgcgcggtagttgttaagacagtataaat
+gaaggggattcagaagcaagtttctcgattgactgaatttataaaccagtcgtcaatcat
+gatttttgtgtcgattaaagcctaaatggtaatttaaaccattgatatttatcgagtcta
+taaatatctttggttgtatattacttcacaatcaccaattctaaatgattcttccactgt
+gcgggtggagatatcaggacgggttaaggttgacctacatcgttttgatacaacaaaaat
+caaagcacatggctggggacttctcgatactatctttgagatagtacgggcaagagtggg
+tgacgcctccctacattttcaagtctatcggataacttctcggtaaaacgctcgcgatat
+agttttaaagcattgatttaatccacgcaggagcaagttttaccggtcgaatgagaaaat
+tcaacgtaagtgtcatatccagtcatggttagccaaaagcatgggttatccaaaaggaat
+aaaacagctcttcaacaaagagatgaggcttcataacttcgatgaatgcgtatggttctg
+atatatagatcgatgcatgaggacactttattttagccggcgaattaatggaatccatac
+gttacttatttggacatgacttctaggtgtttttgctgtcccgtttagcgatatttacag
+attagtatttcgtttctcatagttaattgtatctagatactaactcgttgaagacgcata
+ccttgccatttgtacaggacttaactgttccgtgcgtaatttgaatttcttataggttct
+tcaaggcacgaatacctcactcatgaccgttcatactctagttaaggtcgggaatactac
+gtatgcagggaattgtaacctaggagatttacaactctttaaacaagagtcgctgaggtc
+caggatcaaaacactgaatctcctaacttcgggtgcctccgtaaatcacctagaaaccta
+ctcatacatttgcaattttgagatgtaggcgaaagagagaaatctgctttttaacggtat
+ctcttgggattccttttaaaaacacataacgatagtaatgtaccaagtaaccaaaagctg
+ggatgtgtctgtgtactgatccgccgtgtcagagtagtccgccatgaatattgacgtcaa
+ggctagtgtcatcaggtattgatgttcattgtaaatgaaggaatgaactaatgtcaccaa
+gtaaagggggtgaaaatgctccccagggttctacagacatagagatggtcagaacacgac
+ccccctctcaacgcagtgtatttgaaatatatggacatatctaccttattctgtaatttt
+agatgtgttctgtgtataccgatattgataagtcaataggcttgattacgtatcttaaga
+caaatctgtttcgcaagtaggaccgcatctttcagattgtttctttttatgccataacct
+gcccaggaattcaaaaggttatcgatacccgatatgctgtgaattattattctaatggcc
+actcattcctgcttatatctggaattggcatgaatatcttacaacctaaagtctggcgtt
+gcgccagttctacttcgtaccggacaccatctccagtcgttaaccgaaggtgggtacgtc
+acataaaagttcattagaccacactttgtgccgacgtatatagatatattacacgtatag
+ggaatgttttctcctaggtgacccgaccttctactaaggttgtacatcgtataatggccc
+attaactacgaggaaagtggtattgacctggtaatgcacgttcttcgatatataccgacg
+aggtaaagtctactattgcaaagtttgacgttatactgataagtttagatttccctggat
+cgcgcatgaacaatgtatgcgttatctgccatatataacatgttacaaatccttggggat
+actatcgctactatcatcggaccaaaattaaataggctagtgtcttatcagaacatcatg
+tttaccgaactgatctattttccaatttaagctgatattacgtccgcgtatttattttag
+ttccccggatgacgattatctgagctacatcatacaagttagcatactcgccggtgcatt
+gatttcttatttcgctatatcttcaagttcacaggcttcatatagttccaattagcagta
+taattaggttttgtaactttaaccatactttataaaaggttatattgcacaactgatcaa
+gcatccgctataacccgagctttaccagttagcggctaataacaaataagatgacttcgt
+gtcatacgaccgtcatgatcatgctctaacttaggtgggaaccaaatttaggcaatgggt
+agtaataagtataaaatgataccacatatactataacaatgaaattatttgtaatccggt
+ttgccaacgtatcccccttcgcgataaattaatgacatagggtcatccatgtgccaatcg
+tgtgtgccaaaatctcaaattcaattatcatcaatattggccaagtgttataagcgttga
+aagtgatataggccgccaaaaagtagtctacttaaaaaccaatatttatcgttcgttatt
+gctggtagtacaacatcacgagcatttctcttttgagttgatttatactatatctgctga
+tgtgattatgtcccacttacccagaatattaagaaagtcctagattgtaggtatacttga
+ctataaatataatttaagactatacaaataatctggctacattatgccatcgtagaaact
+gataacgtagtaacgtcggacactagattttggtcggggagtaatctagcatactaacga
+atttgttaaatccgctgaaagtatatgtcattacctgcttggcctgtcttcaatacgttt
+agactattaaggactcatttcgagatccagtattaattatacgcatccatatttatactg
+aagacggattgagttaggacgacaagctaaacaaatattaagttaaggattagtattata
+ttgtagaaactcgtcgggttggaacgattcatcatcatagaatgcgttacttattcagag
+agacttaattcggttatgactggcagctcacctggaaagtaggtgaaaggcaacagaaga
+atattgttgactgaattctacgggctacgaacgtaattacaaagcggttcgtaaagagca
+taaagatcaatacaatggatctctacagtattacgtaaataacatacataaacctggtgt
+tgattcgactagctcatagattaatcattaattgaagctacgaagacgcggaagtctgcg
+gagtgagcaaacagtaatcgactgataaatgcttataatatcgcgcttaaatgccgcatg
+gtgtacattaacgtgggggtagtcaaaggaatatatttactaggaatattagttatgcaa
+atgttgtgtcaatgtgatgtgttttatccagacattggatgcatggctgtgggggcacag
+gatacttaccattagttcacctacaagcggcgtgagagggtctcagttttagccagcgca
+gagaagtacgggcctttagacgattaatgctagaattgtcataaacctcgtgaaaagcta
+gttaataatcatggtgctagaagaacacaacttttctataaaccagttctcgactgacag
+tcgtaactcactatatcgccgctttgtactgtcgcaaaaaaacctcacatagaaagaaaa
+atctactgggtgcatcagtagagatcgtgttctgagagataaatacaccggatacgatct
+gcatcgagttcatgtattaggtcaagcttgggactgttgtgccagtagcattttttaaca
+gtcaaagtagggtgagacacgtcatatcataatatatgccatcgaggtttaaagtttata
+tgataagctagcatgcgttgcaatcgtattcttgaatgctccgtggtttgtactaattcc
+tttatagactgagtgtatcgtacactcggtacaattacaaaggatggaagagcaaatagg
+tcttcaattataacagtaccccaccttaatctaaaaaccagcttcaattagtattaattt
+cgccaggagtatatatataaatatctaaagactaaaagactcgtacttttacaacttacg
+tcgtagcataattaaatcatgggtaaatgtcatcagtaagtgcattagaaatactccttt
+gtaaggatacagtgaatgtgtctcagcaagtcagtagaaatggaaattcatactcgatta
+aggcctataaaactgttgttggtatctacagagtgattaaaattagtgaatcagattacg
+aaaatgttttcccgctcgcacttacgcgtttagacaaaagtacaggtggtacaattggct
+gtagtagaattttggtataaaataggtgataaaccggatgggtgtgggcgaattcaaaag
+cggtttttgttccatagaactatgtagttggttataaaggttgtaatctcggagattagg
+ttagggcttaatcagaatagtaacaatttctctatgtaaagtacagtgggtgatcgtatg
+agttcacgaactcttaatgccatgcctggacaggataaacaatacgcatataacttgacg
+atcgagcttatatcgacctatttgagaagtttaacgggtcgatataatatacaggtctta
+atagccgattttttctagaaaagcaatcctatatcttagttaatcagatcaaccccgtga
+acgatatatcagcaaactgaacattgtatacaacattcctttttgtccgggtggggactc
+catttaaagtatctcacctagaactcagcggtaatagatgcagtctcttgcccagttacg
+gtaactaaatgttgatacttagaattgctaaattttagtctagacatttccaggtaaacc
+ggtagacgacaatttctctgtcatctgtcataagatcgcttagtgtgctcaaattgcaat
+tgagggccctactatagacaatcatcagactttttaattaaatagttttccatgaatgtg
+ttgtcaaggcggaccccttcacttttatcacggctcataaatgtcgtatgactgtagtcg
+gtagcggccttcgagtcttcaggggaaatggaaaagaaattaggcttctaagatggacta
+taatcgattaggctaattccgttcgcaaatcacagaagcaatcttactcaaaattgttgg
+aatcgatagcgaacgcgaccgtgaatgtttaaaagtgctcgcacagaattacccaatacc
+tatcatcacgacttaaatacccaaagcagttgtagtcgcgtaatagattaagtctgaagc
+ctagagacaaagggatactgggcggggaaacctgctccttcacggtaacatggtaacaac
+agaatttggttaaggttaaaacgaaatatactcggagtgaattactgttaggtttcgtca
+tcggatcaataagtagtttccgtgaagacactcttatattagatctccgaaattctgacc
+cgtgcattaggcacttggtaggagattccatttggaacttgctcaatgtaagccagtaat
+gttccgaaataattcgctgcaggagcgaggagccgctgaataaaggaccctcgcatcttg
+ttaccttatggttgagggtcaccgttctctgcgtcaattccagagctggagatacattca
+tcaacgttacctacgcacagaataaaaagatcgagcgctaactcgttttcctaaacacaa
+cggatttagacaaattaccgaatgcgccggagagtagcatcttagtgtcatgcctatcat
+ggcggctcagtacgaagagttcaggcatcgaatattgtggtagcccgcactcaaagttcc
+gccattaggtaagctatatattgtggtcagaacttgaggacaactatgagctactaaaaa
+taaacaattttgtcatttgttctagatatgtggcattcatcgaacgcttgtaccagaagt
+tacattcgcagcgtgagcgaataaacccgaatgagcgtaacattatcaataacatatagt
+tcagatagagaacgaggtattcgacagagaattacccaacattggttattaatctatgca
+gaataatttagataatgtcactacataatattaggaccaaaaggtgattccccagaagac
+aaaacaataaacaatctcacatattcgctagtacctatgtatgggtatgatcttctgatt
+ggacggggataatttccaggtatattaaaacttattaccataatctagacctaagagagg
+ttatataagtaaagagctgtgttccgatagaaaaacccgaccttaaagacttgcgaagta
+aattttgctttaacaaaaaaacctacgtaagggaatattctgtataaactgaaaagtcag
+gtgtaactacatgagtcatgtcttcgattaattacaatgcgatctcgttattctgatcaa
+ctaatatcataaactgccactacatcttgtacaatcattcgcaacaatacttttatgtgc
+taaggtcacgtgcttcctctgctatgctgatttaatcagattcataaaggaatacgaata
+actctggatccattaccacgcaagggatttatttacggctgattactttttggctgttga
+cagaactgccatgaaagtaagatgtcgcatcttgcataaataatagcacctaatatagcc
+gacaaagtgattccgataacagattttaagttgtccagccttgagactccatgaagaccg
+cttgggagcttccccgtgattagaagaatctaaatcccaagtggatggggggagtttaaa
+tctcagcaccaacaaatagtacttcctctcagagcgcgtcatggtcgaaggagcctatcc
+tgatagaggtttgaaagcgcacgcgcatttaactgtcatattaaattggaatctcgtaag
+tgtcggcagtacgacaaattttaactgatgtcggtatacggagaagaaggaagcacgcat
+tgaagcagctacgcagaactgagaagatgacactctaagatacaattaatacaaaaacgt
+tttaagcccaatctatcaacagatgtaagatgtctaatacacaagaataaaaccttcatg
+tcccgatgtataataacagctttatttctgctggtcgaggtgaagtagtggaaattactc
+catcttgctgcgcgtctttatagtgttggctactctgtaaccgacgcgtccatccctctc
+tcctagtgatccgtatatccaattagaggataaccaacatctgcgttaccgacgaattta
+aatttttcgactatttaattccgttcaaacccgtattcgtagtaagtgtttcatagattt
+atgaccgacatcgtgtacgagttgcagtgcatatgtagataccactaattgctgatctag
+gatacatgctttataaacatgcttacttggctattttatttactgtcatgtgggggtttt
+tattttcaacaagtatgtgctaccattggataatctggcttcaaattgaagatatgcgtt
+ccaaacttgtctactgtttgctaagtaggagttgtcccattagaactacgcagcacgtgg
+tttgtgatcgaaaagaataattggcaaatacgaggctagccttcaaatttaatgcagatt
+actcctcagaaacacacgtaagcgacgaacgtgatgtttactacacaatgcgtatcatag
+aaattcgtgataatttttgttccaacctttgaatctagactgagtggaaaaagatttcac
+cgggataccgtttatgctggttttaaaaactcgtcgaatcatcttataactgcattcaaa
+tggatttctcaatcatctgtacgtcaactgttttaacaataacgtcagaataaaccggca
+caatgagacggcggtctttcactacaccacacccttaggattataagtgacgtgtggatt
+cgaattctaaggtgacgggatctacaagcctcagctacattaggtctgaagatctttcgt
+atagccgcgtatgttactgtttggatatgggttatgctaatcaacagttgacagcgagtg
+aaacggccttgcgacctgaaatctttacggttaccttttgattcaagacaggatcgacga
+tggaccacgtgaaatgaattcaaaactgtaacatcgcttgtgcctcagcgaccgagtaac
+gacaagttcacatcctctatgcaactatcattgtggtcattaaggtattcaagattaact
+aagagtcgaccatatattctagagttttacaattaggaaccgttagtctagactaggagc
+gtgcaacatcgcaggaggtgtggactgtcttgacccaagttgcctgacacatagtgtctt
+ttgcttcatgtccttagcaatgcgatacctcaatcgtagttttatcgggataaataacat
+ggtgtttaaccctattaatggtttctattaatctaaattgtaaggcagcccttgggtcga
+aagcacattaggccacatacacagtatgaaattgttcgagtgtccagaccataattgact
+accatggtacacggtgttgctattatgactcccgcaaaactcttgacagagggaattttg
+gtacattgatgtaatcgatgatttaacagtaggaactagacgtcatccgttagactgagt
+tccgacatgctcaaattgtcaggatttttatccaataactaatggctctcacatgtaaat
+aaaatcacattaacgtcacttagtgatggattcgctaaacagatagactatcattcatga
+actggcactgtttcgattatatttgcaacatcgaacatacttaaagttaaatacgacatc
+attcaattaaaaaaattcagtacacctctaatgagtatcccgctttggaggaaagagtag
+cactttaaatggacaatttaggccggactttcctgtaaatggatgaagtcattgtacagc
+ttgaataaatcgttagggttagtccttacatccaccatatgttaatgaataaagcctgag
+ggaccttagagctaacttgtccaacacgttgctcatttacttaataaggttgaaatgtat
+cagtaagtgacagcgagtgtagattttgaccatttaactgaccttcacagttttgtcttc
+agacgtcacttacaccataatgatgacagagcttgtagatgcacacactcattcctagtg
+taaatcaagtagtagctagattattataaagagatattttctggcgtcgaacgtaacaca
+gagagagtataaggggcatgataatggcttatcaatatgtgtaagaaaaagtttttaata
+tcatctaactcggtggaatgcacacttatggccaactgaccttgggacgagttaagatac
+cataagaggttgcctgtaagttaagataacaaagggatattccatctttgtgtgctaaga
+acctatttatatttgcagccataaaaacctctgtgctatgcagccaccagagttatttat
+acaaagaaagagaccatttagatacgttaattctgcttgcgatttattaaacagacattt
+cacgtccaaccactacaaaagccctatcgcaagacgatcattgtattatagcctatgcaa
+cgtagctaagcggccgaggaatcataaaatatgaattgttacattgtttactacatatga
+tcacaatctttgtaaaaggttcgttcgtgatactaccatgtacctaactaacctgagata
+tatgcaatgacttatggggtcagcgcgcaacatccgcaaagcatagtaatacaaggtagg
+aaaacttctggatttcccaaggttataatgctctatactgaccaagagatccgttacgac
+tcgcaatgaatactctaagggcactcacaaagaaaaccactaattgataaatttcaatga
+taatatcctgaattgcatcgtgtatgagttacgagaagtcgcatttaatgaattagtcat
+agaaatgtcatagcaggaacataattactatattttaacgatttaatcgtagttggagtc
+ctttcccaaattatgtcatcagttccgatttagatgttttcgggcccttcttagtaaaga
+agttaatatccaagactagctcctcacccacgcatgcacatattcgcgagaagtctgata
+gaatattcgacagaaatgcgactctagctcacactcgttaactgatcaggtacttataga
+caagtacgttatcagatatcgcttcggggcattgttgcgctacctttgtgcatagcagtt
+ttgaaaaattgttcaagacctgaacgggaaaatgatattatttttttaggaggaataata
+cagtaccatgtaaatactcaaccaccttacgtacttcttacgccgaacatatatggcacg
+tgttattcggctaacaaaactgttgtgccttttctataaggataagcagattcgttttaa
+acatatgacctgtaaactgggatctacaaaagaggtacttaaaataaattgcgcaacggt
+ttagatctgcggatctttggttaaagagcaccattagatgtgccatacttcctatcgcct
+gagcgagaatttagtctgaggaaccactcttgggatttaaaacaattcggttaggacacc
+tactcggcggatgaagcaatacgataacattaaaagtcgttcagtctaattttggtcgta
+gtacgatgagctgatggccaattgtatttttattaacagcactgaaacaaaatggagact
+ttagactaatactaaagtctcaatgttcgtcgaaccttaaatgctcggaatgaggggatc
+ttcggaagtatagcgccgaagtgtatctcattattataacaccagtgtacagacgacatc
+taattatggccagaaactgtcattgtgccattaagaggattagtagatagtctggaccgt
+ggaatagaattttgaccaaattgaccagtcctgcttgtagacagcgcgatctaaactgca
+cgagaatatacaagttggtggtgcttgtggctgagcacgctaagatgcgtttgtttttac
+gattctagtgcttcttaacgcaattcagtcttctagatccgctattccaacatcaatatc
+tcaatttaaggtcaatatatataacaaaattagacagagcagctgacacttacgaagcat
+cgtagaaccgatatagtcgaccttatgatgatatggacgtgtccaagtccgcacttccga
+tgcatcttgacggtgaaccgaaatgaaatcttcattagggcccccatgtgtcaaaccact
+cgagtcccgtctctgaagtcaagtattactgcgaaaaattcgtctactattagtttatta
+tgaacttatgacgcttaaataaattaaacagtaagcctgggaaaatgttaaggcaggaat
+ctttgtaacagttcataatgttgctaaagattatcagaccccgtgaagacttcgggcttt
+gggcttcgtaccgtagcataatacatctatatagttagaggcttgcgtgttgttgtgcta
+ttccacatatagcagctctgggcgactcttcaatgaaaatgaaaaatggtaacctggcga
+cctacttgttaagtcagtttaattcaaggggattaagtaccaagggtcgagtttctctgt
+atttattatactgtaggcaagaagcttttttggcgagatttaagacttaagcctatggta
+aaaatttgatagtgagcgactatagtaagagatttgggtggttagtaattaaaattctcc
+tatgctaaatcaggcgtacaatctgagggtgcacatttctcgacgcgtgaaccttcaccg
+aaagcgtgtggattatacaaatttcaaacatattggcggggcacttatccataatagatt
+tctgtttgtacgccaaactctgcctcacccctccataaattgtattggctagaggttaaa
+ttctccgtaaatagagacacatatagttttatacaattgtttgaatcaaagcacgagaaa
+cttttaaccgtacattgacaaatgtcttcggatggggcagagcatctcttcgtgacccaa
+atcaatcgctgagcaataagcaagaaaacacagattatacaaagagatctggatgaagat
+attcgtgcaatcactatcgttatgttagagagttccatgcatgaggactcgttttttgac
+caggagaattaagccaagaaataactgacgtatttccaaatgaattctacgtgtttttcc
+tgtcacctttagccagtgttaaagatgactatggagtttcgaataggttattctatagac
+attataacgagtggaacacccataccttcacagtgctaaaggtaggaacgggtacgtcag
+gtagttcaagggattttaggttcttaatccaacgaagaaataacgcatcacccgtcattc
+tattgttttcgtcgggattacttagtaggcagggtattctaacctacctgagttacaaat
+ctttaaaaaactggccatgaggtcatggtgataaaatctgaatcgcctaaattcgcgtcc
+ctaaggaaatatactagaatccgtctcagaaagtgcaaaggttgacttcttcccctaaca
+cagaattctcagttttatagctatctagtggcattcctttttataaaactttacgtttgt
+aagggtccaactttacaaaagctcggatgtgtatgtgtaatcttccgccgtgtaagactt
+ggaacccatgtatattgacggcatggcgtggctaagcaggtattgatcttcagtgtaaag
+caaggtatgttctaatctaacaatgtaaagccggggattagccgccaaaggggtctaatg
+acatagagatgctctgaaatcgtaccaactataaaagcacgggatttgaaatatagcgac
+agatcttccgtattctgttagttgacatctgtgctgtctttaccgattgtgatttggctt
+tagcagtcatttagtttcgttactcattgctcgtgcgatagttccaccgaatatggcaca
+ttcgttctttttttccattttactgcaaaccttttcaaaagctgatcgataccactgatg
+atggcattgattagtcgattggcaactatgtcctgcttatatctccaattgcattgaata
+tagtaaaaaataaaggctcgccttcccaatgggctacggagtacacgaaaaaatcgcaac
+tcgtttaaccaagcgccgtacctaacatataagtgattgagacaaatagttctccagacg
+tattgagatatatgtctcctataggcaagcgtttctaattgctgaccagaaattagaatt
+aggttgttaatactatattcgaccattttattccacgaatgtgctattctactggtattg
+ctccgtatgcgatatataaccaacacggaaagtcgtcgattgcaaagtggctccgtagaa
+tcatttctggtcatttaccgggagcgcgcttgaacaatggatgcggtatctgccatattg
+ttattgttaaaaagacttccgcttactatcgcttcgatcatcggaaaaatattaatgagg
+attgggtcgtataagaaaatcatcttttcagttcgcagatttttgccaatttaaccggtt
+atttcgtcagacttggtagtgtagttacaagcatcacgattatatcagctacagaattaa
+actgtcctgactcgacggggcagtgtgtgagtattgcgctatatattcaaggtaacagga
+ggcatataggtcatagtacaaggataatgaggtttgctaactttaaaaattattgattta
+acggttgattgaaaatctctgcaagatgacgctagaacacctgatgttcaagtttgccga
+taataacatataagatgaattactgtctttagaccctcatgttaatccgctaacttaggg
+cggaaacaatgttaggctatgcggagtaagtactatattatgataccacatagaatttaa
+cattcatatgatgtctaatacccgttcccaaccttgcaaccgtcccgattaattaagcaa
+ttacggtcatcaatgggccaatcctgtctcaaaaattatcatattcaaggttcagctatt
+ttggcaatgggtgagtaccgttcttagtgatttacgaacccataatctaggcgacttaat
+atacaagatttagagttacgttttccgggtagtacatattaacgaccatggatcgggtga
+ggtgttgtattagttatctgatcttgtcagtagctcccaatgtcccagaatattatgttt
+ctactagagtgttcgtatactggaatttaaatattatgtaagactagacaaattttatgg
+atacattaggccatcgtagaatatgatatagttgtaacgtccctctatagattttcggag
+ggcaggtatattgcttaataaagatgttcggaaatcagcggaaaggatttgtaattaact
+gatgcgcagcgcttaaataagtttagactattaagctatatgttcgacagcatgtagttt
+tttttaccagaaagtgttatactgatgacccatggaggtagctcctcatgataaaaatat
+tgttacttaagcattactattatagtgttcaaactagtaccgttgcatactttaagaatc
+agacatggcgtttcttatgcagacacacttttttagctgttgacgcccacctcacatcca
+tagtaggtcaatcgcataagaacaatattctggactgttttattacccagaagaaagttt
+tttctttccggttcgttaagacaataaagatcatttcattcgttctcttaacgatgaact
+aaagtacttaaagtatccgcctcttgtttcgactagcgcatagtgtaataattaaggcaa
+gataagaagaacaggaacgcgcacgtcggagataactctaatagtctctttattccgttt
+aatatagcccgtaattgcaccatgcgctacagtaacggccgccttcgcaaacctatttat
+gtaattccaagtttaggtatgcaatggttggggcaatgtgaggggttttatcaagacttt
+cgttgcttcgcggggggcgcaaagcagactttacagtagttaaccgaaaaccgcagggag
+tcgctctaagtgttaccaacccctcactactacgcgaaggtactcgattattccttgaat
+gggctgaaacatcgtgattagcgtcttatgattcaggctgatagaagaaaacttattttc
+tatattccacgtatacaatcacactcgtaactaaatagttcccagcgttgtaatgtcgct
+ataataaataaaatacaaagaaaattcgtctgggtgcataagtacagttagtcgtctgtc
+acataaataatccgcagtcgatctcattacaggtattgttgttggtcaaccttcgcaagg
+tggtccaagtagcattgttgaacagtaaaactaccgtcacacaaggaatatcataataga
+tgccatacacggttttacttgatatgtttacagtccttgagttgcaatcgtagtattgtt
+tcatccggggtgtgtacgaagtaatttagacaaggtgtgtagcggtcactaggtaaaatg
+acttaggatggatgagcatttaggtattctatgataacactaaccatcatgtttctaaaa
+tcctcaggaaatttgtattattttaccaacctgtatttatagaaagtgcttttgacttaa
+agaagccgaagtgttcaaattaaggagtacctgattgaaagaatggggaattgtaatctg
+taactcaattacaaataagccgttctaaggattaaggctttgtgtctaagcaactcacgt
+gaattcgaaattcatactcgattaacgactttaatactcttctgcgtatctacagactca
+tttaaattacggaatatgttttcgtttttggtttccagctcgcacgtacgcgtttacaaa
+taaggacacctggtacaattggctggagtacaatgttggtttttatttgctgattatccc
+gatccctgtgggcgttggcataaccgggttttcttcaagactactttcgtgttgcttata
+tacctggtaatatcggtgagtagcttagggcttaatcacaatactaacaagttctctatg
+gattggacagggcggcatccgttgactgaacgatctattaatccattccctgcactggat
+aaacaagacccatttaaattgaccatagagatgttagcgtcatatttctgttcgtgatag
+ggtacatatattataaacggattatgagcagtggttttctagaaaagcattcatagttag
+gagtgtatcagatcataccactgaaccatagagcacaattctctactggctatacttcat
+tcctttttgtccgggtggggacgaaatttaaaggttctaacctagaacgcagagcgaatt
+gatcaaggcgctggccaagtgaacggttctaaatgttcttaatgagaattgcgtattttg
+actattgacagggcatcgtaaaccgctactcgacttggtatctgtaatctgtatgtagat
+agagtacgggcctataattcaaattcagccaccgaagattcacaatcttcagacgtttga
+aggaaagaggtttactggtatgtggtgtcaagccccacccattctctgttatatccgagc
+attaatgtagtttcactgtactacggtcacgccgtagagtcggcagggcaaatccaaaac
+aatttaggctgagaagtggcactataatagtttagcctaagtcccttcgctaataactca
+acaaagatgacgcaaaagtcggcgaatagattgcgttcgcgtaagggtatcttgaatact
+gatagctctcatggtaccaagaactttcataacctctttatttaccaaacctgttctact
+agcgttagtgttttagtctgtagccgacacaaaaaccgagaatggccggcgtaaccggcg
+cctgcaagctaacatgggatcaaaactattggcttaacgtttaatcgaatgagactagca
+ctgtattactctttcgtttcggcagcggatcaataaggaggtgacggcatcactctctta
+tagtagatatcacttattctcacaacggaagtaggatcttccgtcctcattaaatttgca
+actggctcaatgtaacactgtaatgttaacaaagtatgagctgaaggtcagagcagacga
+tgtagtaaggtccctcgaagctgcttacagtatccttgaggctcaacgggctatgcggaa
+attccagacctcgagttacattatgaaacgtgtcattccatctcattaaatagttcgtgc
+cctatcgccttgtaatataaacaaccgtttttgtctattttcccaaggagaaggagagta
+gcagcttagtggcttgcctatatggccccctaagtacgtactcggcacgcttagaagatt
+gggctaccccgcactatatgttcccaaagtaggtaacctagatagtgtcgtatgaaattc
+aggtcatcgatgagagtataaaaatatacaattttggcaggggttatacattgcgggcat
+gaagagtaacattggacatgaacggacattcgaaccctgtgagtttaataccctatctcc
+ggatcattataaagtaaatatacgtcacttactctacgtgcgtttagacagtctttgaaa
+ctaaattggttatttttctttcatctagatttgtctgtatctaactaaattatagttcca
+cataaagctgattcaactgaagacataaatataaactttctaacatagtagcgaggaaag
+agctatgcctagcatcggatcatgcgtccgcgagtagttcctggtagagttaaaagtttt
+tccagaatctagaccgaacacagggtagtgaacgaaagtgcgcggtgaacatacataata
+ccgaacgtaaacaattccgttcgtattgttgctgtatctatatttcctacgtaaggctat
+ttgatctataatatgaaaagtcacgtcgaaataaatcaggaagcgcttcgagtatgtaca
+ttcagatctccttagtatcatcaaattatagattttacggccacgaattattggtctaga
+tgtcccaaaaataatttgatgtcagtagcgatcgtgcttcctcggagttgaggttggaag
+aagagtcattatgctataccaagaactctccatccagtacctagaaaggcaggtatgtac
+cgctcattaattttgcgatcttgacagatctgcatgcaaagtaacttgtaccagatggct
+tttataatagaaactaagtttcccgaataacggtgtacgataacagatttttaggtgtac
+agacgtctgactcaatgaacacacattgggacctgccccgggaggagtagtagataatta
+ccttctccagcgcgggtcttttaatatcacaacataaaaatactaattaatatcacacac
+cctcatcctcgatggagcctagcatcatacacgtttgatagacaacgccaattttactgt
+aatatgatattcgaatctagtatgtggacgctgtaccacattgtttaaaggagctccctt
+taccgacatgaacgaagcaagctttgtacaagatacgaagaactcagtactggtaactat
+aagagacaatttatacataaaagtgttaagaccattatataaaaagaggtatgaggtctt
+tgtaactacaataatacattcatcgaacgatggagaataacagagttatttctgctgctc
+gagctctagttctgctaatttctcaatcttgatgccactcgtttgagtcttccattcgct
+cttaacgacgcgtacatccctctctcctactcttacctatatcctattactggttaacct
+acatctccgggaaagacgtaggtaaagtggtccacgattgtattcacttataacacctag
+tagtactatgtgttgctgagagtgaggacacacttactctacgagttcaagtccatatgg
+acattacactttttcagcatctaggtgtcatgatgtattaacagccgttaggggctattt
+gattttatcgattgtcggcgtgtgtattttcaacaactaggtgctacaattcgtgaatag
+gcatgaaaattcaagattgcagttcctatcttgtataatctttcctttggacgagttgta
+ccatttcaactaacctgcaagtggggggtcatccatatgaagatttgccaaatacctgga
+gaccctgaaaagtttatccagattaataataacaaacaaacctaagcgaagaacgtcagc
+tttaataaactatcactatcatagaaattcctgttaattgttcttccaaacgttgaatag
+actatcacgggtaatagattgaacacggagaacgtttatccggcttgtaaaatatcgtcg
+aatctgctgataactcaattatattcgatggagaattcatatctaccgcttagcttttaa
+aaattaagtcagattattccgccacaatgagaaggcgcgagtgcactaatcaaatcactt
+aggattattacggacgtctgcattacaatgctttggggtagggttatacaagcatatgat
+tctttaggtctcttgatcgggcgtttaccaccgtagcttaatgttggcatatccgtgatc
+ctaatattctgttgtcagcgtgtgtataggaatgcacaacgcaaatctttaagctgacct
+gttcatgaaagacaggagacacgaggcaccacctcaattctatgcaaaactctaacatag
+cgtggcactatgagtacgtgtaacgacaaggtctcatactcgatcctaagataattctcg
+tctggaaggttttaatctttaactaagagtagaacttagtttattgacttttacaattag
+gatacggttcgcgactctaccacagggcatcatacctggagctctgctatctcgtgacca
+aagtggcagcacacatagggtcgggtcctgcatctactgagcaatccctttaagcattcc
+tagtttgagagccatttagatattgctgtttaaaccgattaatggtttctattattataa
+agtgtaacgctcccattcgggacattgaaaattagcaataagacaatgtatgatattcgg
+cgagtctcaacaacattatggtctaccatgggacaaggggttgatatgatgaatccacaa
+aaaatagtcaaacacccatggttcgttaagtgagggtatccaggtgttataaggacgatc
+tagaagtattcaggtacacggtgttcagacatgctctaattgtcaggttgtttataattt
+aacgtatcgctctctattctaaataatataaaattaaccgctcgtagggatgctttccag
+taaaagatacactatcattaaggttatgcaaatgtggcgatttgatttgaatcttagtac
+attcttaaacttaaatacgtattatttaaagtaaatatattatctaaaccgcttttgtct
+atccacatttcgtcgaatcacgacctcgttaatgcgacaatttacgaccctctttcatct
+aaagcgatcatctatttcttctgattgatgtaatactgacccttactccgtacatacaaa
+tgatggtaagcaagaatgactgacgctcctgtcacctttcgtggcaatcaactggcgctg
+gtactgaagtagcttgaaagggatatggatgtgtatgccaggcttcattttgacaatttt
+tctgtcctgctcagtgttgtctgaagtcgtatcgtacacaataatgatgactctcattgt
+agatccaatcacgctttcctacgctaatgaaagttctagatagtgtaggtgttagacaga
+ggttagcgcctacatccttacacacacagtgttgaacggcaagcataatcgagtatcaat
+agctgtatgtatttgtttggaatatcatatttctcccgcctttgaacaatgatgccaaaa
+tgtcctgccctagagttatgataaaataactgctgccctgtaacttaagtttacaaaccg
+atattcaatcgttgtgtcctatgaaaatatttatatttgcaccaagaaaatcatctgtgc
+gatgaacaaaacacagtgatttataaatacaaagagtacatttagttaccggattgcggc
+ttgacatttattttacagaattttatcggcaaaacacttcatatgaactatcgcttcacg
+ataagtctatgatagactagcattcgtagagaacaggaagagcaatcattatatatgaag
+tgttacagtgggtactacatatgagatcattaggtctatatccggccttcctcataagac
+cttggaaatatcttacatcagagatatcaaaggaagtatgggcgaacccagaaaaagccc
+caaagaatagtaattcatcggacgtaatagtctggttttaactaggggttattgatattt
+aagctaaaagagttccctgaacactcgaaatgtataatctatcccaactaaaaaagtata
+cctctaattcagaaatgtcattgagattagactgatgtcaatacgctaggaggtaagaca
+agtagaagtttttgatttaggaattgaaatgtaatacctccatcttaagttctatatttt
+aaagttttatgcggacttcgagtaagtgcacaaatgatggcataagtgcccagttacatg
+tttgcggccccgtatgagtaatgatctgtttatcaatctctagctactatcccacgaatg
+cactgatgccagtcatggcgcttacattagtcgacagaaatccgacgatacctatcacgc
+gtgaactgttctggttcttattcaattcgaagtgatctcagatacattacggccatgctt
+gcccttcatgtctgctgagcagttttgttataggctgaatctcctctaagcgaaattgat
+aggatttttggtggtcgatttagtctgtacctgcttattaagattcaaaatgacctactt
+cttacgccgaaatgatagggatcggctgaggaggataaatatacgctggtgcctggtatt
+tatccagaacaagttgcctgtgtatcagatgaactctaatctccgagataaaaaacaggt
+acgtaaaataaaggccgcaaagggttacatctcaggatcgtggcgtatagtccaccatta
+gttctgacttacttaatatagactgaccgagattgtagtatgtggatccaagcttgccat
+gtaaaacatgtcggttagcaaaacgtataggagcatgatcaaagaagagttaattaatag
+tactgcactataattgtcggcggagtaccatgagctgttgcccaattcgatgtttattaa
+cagcacgcataaaaaatccagacttttcaattagaattaactataaatggtccgcgaacc
+ttaaatgatcggaaggacgggatctgccgttgtatagaccccaactctatctaattttta
+taacacctctgtaatcaacaaatcttattatgccatcattatgtcattcgccaagtaagt
+ccagttcgagattctctggaccgtgcaatagtattgtcaaattatggtaatggaatcctt
+cttctaacacccttagaaaagccacgagaattgacaagttgggcgtgcttgtccaggagc
+aacataagtgccgtttctttttacgatgatagggattcttaaagcttttctctattctag
+atcccagttgccatcatcaatatctcaattgatgctcattatatagttcttatttagtat
+gtccagatgtcactgaagatcctgcctagaaccgatattctcgacaggatcatcagttcg
+acggggcaaacgcacctatgcacatccatcttgaccgtgaaacgaaaggaaagagtcagt
+accgacccaatgtggaaaaaaactcctgtccacgatatgtaggcaagttttactgccttt
+aattagtagtcgattagtgtagtttgatattatctaccttatagaatgtaaacagtaacc
+cggccttaatggtttggcaggattctttgtaaaagttaataatgttcataaactttatca
+gaaaacctgaagtagtccgcctttcgcctgcgtaacgttgcagattaattcgttttacgg
+agtggcttgcgtcttgttgtccgagtacacatattgctcctctcccccactcttctagga
+aaatcaattatgctaacctgcagaccttcttctttactatctttaatgcatgcccagtat
+gttcatagggtagacttgctatctattttgtataatctacgaatgatgcttggggcgcga
+cttttaacaattaagccgttgggtataatttgagagggtgccacgatagtaagagatttc
+cggcgtgagtaaggaaaatgataataggattaagcaggcgtaatagctcaccctcctcag
+ttctccaaccctgaaccggctaagtatgactgtgcagtattaattttgaatacatattgc
+agcccctaggatacattatagatgtctctttcttacccaaactcgcccgcaccaagaaag
+aatgtggattcgattgaggttaaattagccggaattacagacacagattcttgtttacaa
+ttgtgggaagaaaaccacctcaaacgttgaaacctacattcacaaatggattacgttggg
+gatgagaatcgattccggtcaaaaatcatgcccggagcaataaccaagaattcacagagg
+attaatacacttctccatgaagataggactgcttgcactatccttatctttgtgtcttcc
+ttcaagcaccaatcgtttggggacaaccacaattatgccaagaaataacggaaggtgttc
+caaatctatgagtccgcggtttcatcgcaacgtttcactgtgggtatcatgactttggac
+tttagatttgggtattctagagactgtagaaagactgcaacaacaagacattcacagggc
+gaaacctaggaaaggggaccgcacgttgtgctagggatgtttccttaggaatccatacat
+gtaagaaagaatcaaccgtaattatagtgttttcggccccttgaattacgtgcatgcctt
+tgctaaaagacctctgggaaatagattgaatattctggacagcagcgaatcctgattata
+tctcaagcgaatatatgacccgcaagaaggatttatactagaataagtctaagaaagggc
+attgggtcacttcttccactaacacacttttatcagttttataccttgagagtcccatgc
+atttttatatatatttaactttcgttgcgtaaaactttaaatatgatccgtgctctatct
+ctaatctgaacaacggtatcacgtcgaacaaatctagtggctacgaatcgcgtcgctaag
+aacggtttcttctgctggcgttagctacgtatcttctatgctaaaaatgtatagccccgc
+attagcagcaaaaccgggagaatcaaatacacatccgatgaaatcgtaacaaagataaaa
+caacgcgatttctatgtttgccaaagtgattaagttgtatcgtaggggtcagcgctgatg
+tcttttcagtttgggttttggatttaccagtcttttagtttcggtactatttgatcggga
+cattcgtccaaacatgatggctcattcgttctttttttcaattttaatcaaaaccttgta
+tttacctgatacattaaactgagcatcgcatggaggtggagattcccatatatgtaatca
+tttgatatcctattccattctttttagttataaataaacgctccactgcacaatgggagt
+aggacttcaccaataattagcatctactgtaaacaagcgccgtaacgaaatgattactga
+ttgagaaaaataggtctcaacaacttttgacagatatgtatccgatacccaagcgttgct
+aattgcgcaaaagtaagtagaattacggtcgtattacttgttgccaaatggttattactc
+caatgggctattctaatccgatggatacgtaggagagagtgtacctacaccgaaactcgt
+agtgggcttagtggctacgtagaagctgttcgggtcagttacagcgtgcgaccttgtaaa
+atcgatcacggtgatgaattattgttattgtttaaaagaagtcccctgaatagcccttag
+ataatacgaaaatttgttatgtccagtcgctcgtatatcaaaagattcggttaagttcgc
+agagttttgccaagtttacaggtgatttactaacacttgggagggtacgtacaaccatca
+cctggttagcagagaatgaattatacggtcatgtcgcgaagggcaagtgtgtgagtattg
+accgagttattaaacgtaaatgcaggcatttacgtcataggacatcgagtttgtcctttg
+cgaaatgttaaatttatggttttttccgttgagtgataatagctgcaacatgaagatagt
+aaaactgaggttaaactttcaccatattaaattatatgttcaattacgcgatgtacaaac
+taatgttaatcagatttaggagcgcgcttaatatgggtccctatcccgactttgtacgag
+attttgataaaaaatagtattgtaaattcatttgatggcgtagaaccgggcaaaaccttg
+aaaaaggacacatttaggatgctatttccctaagaaagcggaaaatcctggctcaatatt
+tataatagtaatggttaagattgtggcccaatcgctgagtacccgtcttacgctttttcc
+aacacataatcgacgagaatgtatttaaatgtttgagacttacgttttccgcgtacttat
+tattaaagtcattggagagggtgtcgtctgggtgtagttttctcatctgctcaggagcta
+aaaatgtaaatctattggttgtttctaattctgtcgtccgtgtaggctatttaattttta
+tggtacacttgaatatgtttagccataatgtagccaatactacaatatcagatacttgta
+tacgacctatagacttttgccgaccgctcgtagagtgatttagaaagatgttcggatagc
+acagcaatcgtttgcgaatgtaagcatgcgaagcgagtatttaactgttgactattttgc
+tatatgttactctgaatgttgttttttttaccagaatgtgttataatgatcaaccatgca
+cgttcctactaatcatataaattttgttacgtaagcttttctatgatagtggtctaaaga
+ctacccttgcatactttaagattaagacatgcactttaggaggaactcacacgttttgag
+ctgttctagcccacctataagccattcgtccgcaatcccataactacaatagtcggcaat
+cttttattacccagaactaacgtttttatttcccggtacgtatcacattaatcttaattt
+aatgcgtgagagtaacgatgaacgaaagttatttatgtttaagccgcttcttgagaatac
+agattactgttagaatgaaggcatcataactagaacaccaacgcgcacctcgcacattac
+tctaatagtagctttattcagtttaatatagacagtatttgaaccaggcgctaatgttaa
+ggcccccttcgaaaaccttgttatgttattccatgtggtcggaggatttgcggggcgata
+gcgctgggcggggatcaacaatttcgttcatgcgagcgcccccataaccagtaggtacag
+ttcggaaaagaaaaccccacgcactcgctagaagtgttacaatcacatcacttcgtaccg
+aagggactactgtattccgtcttggggatgtaacagactgattacagtcttatgatgaag
+cctcattcatctaaaattagttgatttattccacggatactatcacactcctatagaaag
+agttaccaccgtgggaagctagatataataaataaaagacatacaatattagtatggctc
+atgatctacacttactcggatctctctttttttataaccagtagatcgcattacacgtat
+tgttgttccgcatcaggccctaggggctcaaacttccatggtggataactaaaacgtccg
+tcactaaacgaagatattaatagatgaaatacacgggtttacttgatttctgttcagtca
+ttcacgggaaatcctaggagtctttcataacggcggtcttagtaggaatgtagtcaagct
+ctgtagaggtctcgacggaattggtatttcctggcatcacaatttacctagtattggaga
+tcacttaaaataatgttgagataataatcaggatatttctagtatgtgacaaacctctat
+ttagtgattgtgattttcaattaaacaagacgtaggggtcaaattaacgactacatgttg
+gaaagaaggccgaattgtaatatctaactcatgtactaagaagaagtgctttcgtttaag
+gctttctgtctaacattctaacgtcaattcctatgtaatactactgtaaccaagttatta
+ctcggctgcgtagataaagtctcatgtaaatgacggtttatctgttacttttgggtttca
+acctagctaggacgccggtactaattacgacacctgcgtatagtgcagggtgttcaatgt
+gcctttttatgtccggattataaccatccctctcccacttggaatatcaccgggttctta
+atgacttagttcgtcttccttattttccgggtaagatcgctgtggaccggacccattttg
+atctagtctaaaaaggtatatagcgtttcgtctggcccgcttacgttcactgaaacttag
+attaatcaatgcactgcactggattaacaagaacatgttatagtgtactgacacatgtta
+gactaagaggtctgttcgggttagccgacttatatgtttaaccgattttgacaactgggt
+tgagagataacaatgaagagtgaggactgtagaagatcttaaaactgtaccatagtgctc
+aattcgctaatggcttgaattatttaattgttctaaccctggcgtcgaatttttttggtt
+cgaaaatacttagcacagcgtattgttcaacgagatgcacaactgtaccgttagaaagcg
+gcttaatgacaaggcagtattgtgactattgacagggaatcctaaaaagctactcgaatt
+ggtatatggaagaggtatgtactgagaggtcgcgcctattagtcaaattctgccaaagaa
+gagtcaaaagcttaactagtttgatggtatgaggtttaatgctaggtggtctataccacc
+aaaaagtatatgggatatcccagaatttatcgactttcaatcgtctaccgtcacgacgta
+cactaggcagccctaatccaaaacttttgaggatgagtactgccactattatactgtacc
+atttgtaacttacattttatatcttcaaagaggtagatattgtcggccattactgtcact
+tacactaagggtagcttgattactgatacctctcatggtaaaaagtaatttaagaaccta
+tttttttacataacctctgctactaccgttagtgttttagtcggttcaagtcacaaaatc
+cctgtagcgcacccctataagcagaaggaaaccttaatgcggataaaaacttttgccgga
+accgttaatcctatgagaataccactcttggaatcggtcctttaggctgaggatatagaa
+cgaggggaacgcatcaatctaggttaggtgagagaactttgtatcaaaacgcaagtacca
+tatgccgtcctcagtaaattgccaaatgcagaaatcttacactcttttcttaactaagta
+tgagagcaacctcactcctgaacagcttgttacctaacgagaagaggctttaagtagcct
+ggagcctcaaccggatatccggatttgactctcatccacttacatgatgattacggtcat
+tacatctcatgattttctgagtgccctatagactgggaatttaatctaccctgtttctat
+ttgttaacaaggagaaccactggtcaagatgacgcgcttccatttatgccaccataagta
+agttctcggaacccttacatgattggcctaccaacctatatatgtgaccaatgtacggta
+catagagtgtggcctatcatattcaggtcatcgagctcagtatttaaagattatatggtc
+gctgggggtattcagtgcgcgatggaagactaacattggaaatcaacggaattgacaaca
+cgctcactttaataacctatctcaggataagtttaatgtaattagacggaactttctcta
+actccgtgtactaactctttgaaaataatgtgggtatttttatttcatctagatttgtct
+gtatcgaaagaaagtattggtccaaataatcctcagtaaaatcaagtcataaatataaaa
+tttagatcttaggacagaggaaagtgctttcccgagcataggatctggcctacgccagta
+gttcatgcttgtgttaaaagttgttactgtttatagtccgtactcagggtagtgttcgat
+actcagcggggaactgacatattacactaaggaatcaaggcccttcgtatgggtcatgtt
+tatatatttaattacttacgctatttgatcgagaatagctatagtaacgtcgtaagaatg
+caggatgcgattcgagtttgtaaattcacagatactgtgtatcatattattatagatgtt
+aaggcatagaattattggtattgatgtacaaaaaattatgggtgggcagtaccgataggc
+attacgagcagtgcagcttggaagaactggatgtatcctataactagtaagagccttaaa
+ggtactacatacccagggatgttaccatcattaatttggccatcttcaatcttcgcaatg
+catactttcttctacaagatgccttttagaagacaaaataagtgtcaacaataacgctgt
+aacttaactctgttgtacgtggaatcaagtctcactaaagcaactaacattccgacatgc
+aaacgcaggactactagattattaaattcgccagcccgcctcgtttaatataacatcata
+aaaattctaagtaatatctcacacactaatccgccatcgtccatagcatcagtcacctgt
+cttacacaaacacatgtttaatcgatgttgttatgccaagctagtttcgcgaccatgtaa
+ctaattgtggaaagctgctaccttgaacgacatcaaccatcctacctttgtacaacagac
+caacatctctgtactggtaaatagatctgaaaagttataaatataactgttttcacattg
+atagaaaaacagctatgtgctatttgtatatactataataaattaagcgaaacatggaga
+ttaaaacagtgttttctcatcctccacctcttgttctgctaatttataattcttgatgcc
+actcgtgtgagtcgtccattcgatcgtaaagaacccgacataaatagatacgacgctgaa
+cgagatcctatttctcctgaaaattattagcacggtaactcctagggatagtggtactag
+ttggtatgaacgtataaaaacttgtactactttctcgggatgtgagggagcaaactatta
+ctcgaccagtgcaacgcattatcgacagtaaaagttttcagctgatacctgtctggatgg
+attatatgcaggtaggcgagagtggattgtagcgatgctcggcgggggtattttaaaaat
+ctaggtgataaaagtcctgtttagccaggaaaagtcatcattgcactgcatatcgtcgat
+tagctgtcatttcgtccactggtaccagttcaacgtacatcaaagtccgggcgcatccat
+atcaagttttgcaatagtactccagaccatgaaatggttatccagattaataataactta
+atatactttcactacatactcagcgggtattaaatttcactttatgtcaaaggactctta
+tgtggtcttcaaaaaggtctagagtctatcacgcctaattgtgtgaaaaccgagtaactt
+gatcagccttgtaaaatatagtagaatatgatgttaaatcatttatattccagggagatt
+gaatagcttacgattagctggtataatttaactcacatgattaagcaaatatctgtagga
+ccgagggaaagaataaaataaagtaccatgagttcggaacgctgcattacatggcgttgg
+gctagcctgatacaagaagatgagtatggagctctcttcatcgggacgtgacaaccctag
+cgtaatcttggcagatcccggagcagatgattatcgtctaacactgtctttaccaatgca
+caacgcatagatttaacctgaactgttctggattcactcctgactacagcctacaactca
+tttctatgcataactcttaaagacagtcgcaatatcagtacctctatacacatcggatca
+gactagatcataagataagtctcctctggatccttgtattctgttaagtacactacaaat
+ttgtttagtgtctgggacaattacgataagggtcgcgactagaccacagggcatatgacc
+tccaccgctcctagcgagtctccaatctgcaagcactcatacgctaggggcatgaatcga
+ctgtcaatgcactgtaagatttacgagggtgagacccatttagatatgcctcgtttaacc
+gttttaggcttgataggatgagtttgtcgatccatcaaattcccgacattcatattgtcc
+aataagtatatctagcttattcggactcgctaaactaaattatggtataaatgccgtcaa
+ccggtgcatttgttcaatcaacaaattatagtcaatctcccatggggccttatggcagcg
+tatacagctggtataacgaccatatacaactatgaacggactagctgtgaactaagcaga
+ttattggatccttgtgtataattttaagtttcgatctatatgctatagtatagaaaatgt
+tccgatcgtacgcttcctttacagttaaacagtctatatcatgaagcttatccaaagctg
+gacatttgatggcaatcttacttaattatgaaacttaattacctattattgaaagtattt
+atatgatcgaataagatttgctctataaacaggtcgtccattcacgacctagtgattgcg
+taaattgaccaacctaggtaatctaaagcctgcatctatttcttatcattcatgttatac
+tgacccgttctcagtacttaaaaatgatcgtaagcaagaatcactcacgctcatgtcaca
+tttagtcgaaataaactgccgatgggaaggaagttccgtcattgcgatatcgatgtctat
+cccacgcgtcattttcaaattggttatctacggataactgtgcgatgaactactataggt
+caaaattatcttcaatctcattctagatcatataaagatgtccttcgcgattgatacgtc
+tacagtgtgttggtgttacacagagggtagcgactacttacttactaactctctcttgat
+ccgcaagcataagccaggttaaagtgctctatctttttctgtggattataatagttatac
+cgccttgcatctaggtgcccattaggtaatgccctagtgttttcataaatttactcctgc
+catctaacgttactttaatttcccagattcaataggtctctcatttgaaaattgttatat
+gtcaacaaagaatataatagctgagtggaacaatacactgtgagggagtaatacatactc
+taaattttctttacggtttgcgcctgcacagttttttttatctatgtgatccgcataaaa
+agtaatttcaacgttccattcaagttaagtcttggtgacactagcattaggagagatcac
+caagaccattatttatttagctagggtttaagtcggttagaaatatcagataatgaggtc
+tttatccggccttacgcagtagaaattggaaatttcgtaaagcactgagttcaatggaag
+tatggccgaacccacataatgcacaaatcaagtcgatttcttccgtccttttagtctcct
+gggaactacgggttattcatagttaagctaaatcagttaacggaactagacaaatgtata
+atagttcccaaatatatatctataaatcttatgcagttagggaatgcagatttgaatcat
+ggcaatacgctagctcggaactcaactacaagtgttggatgtacgaattcaaaggtatta
+catccttatgatgttcttttttggatacttttatgacgacttccacgaagtgaaattatg
+ttcgaatatctgaacagttacttggttgagcccaaggatgacgaatgttctgtttataat
+tctcgtcataatataaatacaagcatatgaggccagtcatggagctttcatttggactaa
+catttccgtagagtcatatcacgcctgtaatctgatccgtctttttctattcgaagtgtt
+atcagatacatgacgcccttgcgtgacattcatggctcctgacatcgggtcttttaggct
+gaatctaatctaacccaatttgtttggattgtgggtcctccattttgtctgttaatgctt
+attaagattaaaaatgtactacgtatttagacctaatgattgcgatacgctgtggaccat
+taatataagctgcgccaggggatttttccagatcatctggcctgtgtatatgttcaaatc
+taatagccgagagaaattactccgacggaaaataaaggcagataagcgtttcagagcacc
+atcgtggcgtttagtcaacctttagttcggaatttattaatatacaatctcactctttgg
+acgagctccttaaaagatgcccttgtatatcatgtcccgtacctaaaagtataccagcat
+catcaaagaacagttaaggaatacgactgctctataattgtccgaggagtaccttctcat
+ctgccaatagtcgttgggttggaaaacaacgcattaatatgccacacttgtcaattagaa
+gtttctataaaggggacgagtaactgatttgagacctagcacggcagaggacgttcgtgt
+gacaacatctctttataagtttgagataaaatcgctaatctacaatgattatttgccaat
+cattatcgaatgcgcaaagtatctcctgttcgtgattctagcctaaggccattactatgg
+tcaaattatgctaatcgaagcagtcttctaacacccttagaaaagcaaacactattgaat
+actgccgccgcattcgccagcaccaacataactgcacgtgcttttttccatgattggcat
+tatgaaagatttgatctatgattcttaccagttgcaatattcaatttagcatgtgttcct
+aattattgtgttattatggtctatctcatcatgtaaatgaagatcatgacgtcaacacag
+attctagtcaggatcatcagttcctcggggaaatcgcacctaggaacagccttatgcaac
+cgctaaacaaagcaatgaggatgtaccgacaaaagctcgatttaaaagcctcgaaacgag
+atgtacgaatcgtttactgccttttatgaggagtcgagtactgttggttcatatttgcta
+catgattgtatgtaataacgatcccgccctttatcggttcgatcctttatggcgataagt
+tatgaatcgtcagtatctttagatcaaaaactcaactagtacccagttccccggaggaac
+ggtcatgattaatgcgttttacggtctcccgtccctcttcttgtcagaggaatcagtttc
+atccgatcccactcgatgattggtatagctatttgccgaaaagccacaacgtattcggta
+ctatcttgtttgattcccctgtatcttaattcgcgacacttgatatcttttgtgtttaat
+cgacgaatcatcctgggggcgacacttgttacaattatccagttgcgtttaatggctgtg
+ggtcacaagattgttagacaggtcccgcgtgtcgtaggaaattgataattggagtttgca
+ggacgaatagctcacccgcctaagtgatccaaccctcatcaggataactatcactgggca
+gtattatttttgatttcatatgccaccccctaggagactgtagtcatgtatctttcttac
+ccaatctagcccgaaacaagaaagaatgtcgattccagtcaccttttattagaccgattt
+acacacaaagtgtcttggtttaaaggctggcatgaatacatactcaaaagttgaaaacga
+cttgctctattcgattaccttcgcgatctcaatcgattacgctaaattttaatgcccgct
+gaaatatccaacatttaaaacaggattaattctctgatccatgaacttaggactcattgc
+acgtgacttatctttctctcttaattcatgctccaatacggtgggctaaaccacttttat
+cacatgaatgtacgcaacgtgttaataagctatgagtacgcgggggcagcgaaacgggtc
+aatctgggtatcttctattgggacggtacatttcggttttatagactatgtagttacacg
+gcatcaacatgtaattaaaacggcgtaacctaggaaagccgaacgcaccttgggattgcc
+atgtgtccggaggattacatacatctaagaaacattctaaactatgtatagtcgtttacg
+acccttgtagtacgtgcatcccttggcgaaaagtactctgggtattagagtgtatattat
+cgacagcaccgaatcctcattttatagcttgacaatttatgacccgaaagaaccttttat
+aagtctataagtatatctaacgcaattgcggcactgagtccactaactatctttgagcag
+tgttatacagtgagacgccatggaaggggtttatatattttactgtcgttccctaaaaag
+ttaattatcagacctgcgcgatctcgtagatgaacaacgcgatctagtcgaaaaatgctt
+gtggctaccattccagtcgagatcaaccgtttctgcggatcgcgttacattccttgctta
+tttgcgataaatcgatacaaccccattaccagaaaaacccggagaatcaattactctgca
+gatcttatactaaaaaagagattacaacccctgttctatgtgtcccaaagtgagtaacgt
+ggagcgttggggtaagagcggagcgattttaactttcgcttttccattttccagtattgt
+actttacgttatatttgagcggcacattcgtcaaaacatgatccatatggactgaggtgt
+ttaaatgttaatcaaataattgtattttcagctgactttaaaatctgcagccattggagg
+tggagattccaatagatgtaagcaggtgatatcatatgcaattcttgtgacttattaaga
+taccagacacggcacaatcgcagtagcacgtaaacaataatgacaatcgacggttaaatt
+ccgaacgtaagatatgtttacggatgcactaaaataggtagcaacaacgtttctctgaga
+tgtataagttaccaaacactggagaattccgctaaactaaggacaatttccgtcgtatta
+attgttgacaaatggttagtaatacattcgcagtggataatccgttgcatacctagcact
+gagtgtaaataaaaccaatcgactactggcatttcgggctaacgactagatgttagccta
+tgtgaaagcctcacacatgcttattgccttcacggtgagcaatgtttcttattcgttatt
+agaagtcacctgtagagacagtagagatgacctaaatttggtttgtccagtcccgaggtg
+atctaatgattaggttaacttagaacagtggtcaattggttaaagctgatttacgaacac
+ttccgaggggtcgtaaaacattaaactggtgagaacagtatgatgtattcggtcatctag
+acaaccccatcgctgggagtttggacagtgttatgattcgtaaatccaccatgtgtccga
+attcgaaatcctgttgctccggggagatagggttaatttaggcttttttacggtgtggca
+tattagctcaaacatcaacattcttaaaatcagcgtaaacggtcaccagttgatatttgt
+tctgctaggaagcgatgtacaaaataagcttaataagatttaggtccgaccttaatttcg
+gtccatagcacctctttctaagtgttttgcttaaataattgtattgttattgattttctg
+cgagttgaacacggaaaataagtcaaaaaggacacttttaggttcatatgtaccgatgaa
+tgcgcaatagaatcgagaaatttttagattagtaatcgtgatgattgtggccaaatcccg
+cactaaacggctttcgctgtttccaaaaaattttagtccactaggtatttaaatgttgga
+cactgaacgtggaagccgtcgtattatgaaactaatggcagaggggctcctctgcgtgta
+ctttgagcagatgctatcgtcagaaaaaggtaaatcttttggttctttataattctggcg
+tccgtgtagcctagtgaatgtgtttggttcaagtgaatttgtttagccagaatggaccaa
+ttacgtcattagctgttacgtctatacgaaatatagactgtggacgacccatcgtagagt
+catgtagttacatgtgaccttagaacaccaatcgtgtgcgattgtaagcaggacaacaca
+gtattgtactggtcaattggttcatagatctgactatgaatcttcgtttttgtacaacaa
+tctcggtgaagcttcaaaaagcctccttcctaataatcagttaatttttcgtaaggttcc
+tgttcgaggttagtcgtataaagacgaaacggccttaatgtaacattaactattccactg
+taggtggatctaacaaggttggacatgtgctaccaataagataagaatttcgtccgcaat
+acaatatctacttttgtagcctatcttggattaacaacaacttacgttggtatttcaccg
+gacgtatcaaatgattctgattttaatgactgagagtaaacatcaacgaatcttatgtat
+ctttaagccgctgcttgacaagtcacattactgttagaatgaacgcttcattactacaaa
+acctaccaccaactcccacattaatattatactagatgtttgaagtttatttgacaaagg
+ttttcaaaaagcacagaatcgttacgaacacgtacattaaattgttagggtattaattgt
+ggtcggtgcatttccggccccatagcgctccgcggggagaaactatggccttcatgacag
+cccccccataacatctaggtaatggtcggataactataaacaaccctctccagagaactg
+tgaaaataaaatctcttagtacacaagcgtatactggtttaagtcttgcccatcttaaag
+actcttttcactattttcttgatgcctcattcttctaatattaggtgattttttaatccg
+agaatataaaaagacgatagaaagtgttaaaacacggcgtagcgacatattttaaagaaa
+tgaaatactttttgactatccctcatgatctaaacttacgcggagctatctttttgtata
+acatgtacagagaattaatccgatgcttcttccgattaaggacatagcgccgaaaacgtc
+atggcggcttatcgatatcgtaacgcactataccaagtgattaagtgatcaatgaatacg
+ggtttcgggatttctgttaagtcatgcacggcaaatacttggagtcttgaataacgccgc
+gcgtagtacgaaggttctcaagctcgcgtgacgtatagaccgtattgctatttcctgcct
+tctcaattgtccgaggattgctgataacttaaaataaggttgagtttttaataacgattt
+gtcgagtttgggaaaatcctcgtttgtgtgtttgtcattttcaagttatcaagaactacg
+ggtataatttacgacgtaatgttggtttgatgcccgattgcgaatatcgtacgaatggta
+tttgtacaactgctttcctttatcgattgctcgagaacattataaagtctattactatgg
+attaagactgtatacaagtgtttaagcggagcccgtgataatctataaggttttggtacc
+tttatctgttacttttgccttgaaacatacatacgtacacgggaatatttacctaaacgc
+cgtatagtccagcctcgtatttgggccgtgttttgtcagcattttaaactgaaagcgccc
+acttgcattataacccggtgcggaatctcttagtgactcgtcaggagtttacgcctttga
+gacctctcgacaggacccattttgatctagtcgttataggtagagtgcctttcctatcgc
+accattaccttctagcaaacttagagtattcaatgaaatcatatcctgtttatactaaat
+gttataggctaatgacacagctgacactaagaggtctcttcgggttacccgaatgagttg
+tttatacgatgttgacaactcgggggagtcatttcaatgaagactgaggactcttgatca
+gattaaaacgcttaatgactgataatttagattatgccgtgtattatttaagtgggcgaa
+ccctcccctagaatgggtttcctgagaaaagtcttagaacacagtattctgaatccagat
+gcaaatcgctaacgttagtaagcggctgtagctcttggcagtttggtcaatagtcaatcg
+caatccgtttaaccgtctactattcctagagcgaagagctatgttctgacacgtccccaa
+tattaggcaaaggctccaaaagaacagtcaattgattaactacgggcttggtttctccgt
+gaatccttgcgccgctataccacataaaaggatagcggtgataccacaagtttgcgacgt
+taaagcgtcgaccctcaacaagtacactagcaaccccttagcaattaattttgtccatca
+ctactgccaagagttgactggaccagttggaaatgacatttgatatattaatagagctac
+atattgtaccactttactgtcacttacactaaccctagcgtgattactcatacatatatt
+cgtaaattctaagttatgatactagttttgtaaatttaatcggcgaagacacgttctctt
+gtacgagcttcaactaaatatttcactgtagccaaccactttaaccagaaggatacctta
+atgccgatataatattgtccaggaaacgttaatactttcacaagacaaagcttggaagag
+gtactttacgatcacctgatagatcgaccggaacgattctatataggtttggtctgagaa
+atttgtagctaaaaccatgttccataggaactcctctgtaatgggcaaaatgcagatagc
+gttcaatcgttgcttaactatctatcacagcatcctaactcctcaacagcttctttccta
+aagacatcagcaggtaagttgacggcacccgataacccagagcacgattggaatctaata
+ctctgtatggatcattacgctaagtaaatataatgattttctgactcaaagttacactgc
+gaattttatattaactggttctatttgttaaataccacaacctctcgtcaacaggtcgcg
+atgcaagtgatccaaaaatatctaacttataccaaccattacttctggcgcagaaaaaca
+tagatatctgaacaatcgaccgttaagactgtctcgccgatcttaggaacctaatactgc
+tcagtagttattgtttatttgggccatccccggattatgtcagccatggaacactaaaag
+tcctaatctaacctatggacaaaaagctcacttttataaaattgctcaccttatgttgat
+tgttatttgtccgaaatgtctataactcagtgtactatctattggaaaattatggccgga
+gttttattgaatatacttttgtatgttgagaaagaatgttgtcgtaataattatcagctg
+gaaaatcatctaatatatattatattgagatattacgacagacctaagtgctttcccgtc
+atgagcagatggactaacactcttggtaatccttctcgttttagttggtaatgtttagtc
+taagtaatatcccgactcttacttactcagagcggaaatgactttttaaactaacgttta
+aaggcacttagtatgcgtcagggttatttttttaattacgtacccttgtgcagagagttt
+agctattcgatcctacttagtatgaaccatgagagtacaggttggtaattcacagagaag
+gtcgagaagattatttttgatgtttaccaatactatgaggcgtattcatcgaaataattt
+tatggctgcgcacttcacatacgcaggaagaccactgcagcttgctagatctggatgtat
+cattgtacttctaagagcctgaaaggtaatacattcccagcgagcgtaacagattgtatg
+gggacatattcaatcttagcaatgcattcgttcttcgaaatcaggcatttttgatgtcat
+aagttctgtcaactataaccctggaactttaatctgttgttcgtcgaatcaaggatcaag
+aaagcttctaaaaggcccaaagcaaaacccaccactacttcagttttaaattagaatcac
+accctagggtattagataataattaaatgtcttaggaagagatatcaaaagatgcagaca
+tcctcaagtgaataagtctccggtctttcacaaacacatggttaagcgatgtggttttga
+ctagagacgttcgccaccatcgtaatatttctggttacctgcgaacgtgaaccaaatctt
+acttcatacattgcttaaacagtacaacttatctcttatcctatagagatctcaaaagtt
+tgtatttttactggtttcaaattgagagaaaaactgcgttctccgatttctatattattg
+tttaaatgatgccaaacatccagtttaaaacacggtgtgatcagccgactcagattcgta
+tcctatgttagaatgagtcatcaaactacggtcacgcgtacattacagagtaaactacac
+gaatgaaagagataagaagatgaaagagttaataggtctcctgttaattatgagaaccct
+aactactacggattggcctactagtgggttggaacggatataaaattcgactaagttcgc
+ggcatgtcaggctcctaaatatgaagagaactcggcatcgaattatccacagtaatagtt
+ggaacatgattcctctatgcatggtgtatatccacgtacgccagtgtgcagtgtagccat
+gcgaccacgggcgttgtgaatattcttcctcagaaaaggactgttgagcaaggaattgga
+ttctgtgaacggaatatagtcgagtagatggaatttcctacactgcgaaaaggtcatagt
+aaatcaaacgccgcgcgcagacatatcttcttggcaattagtactccactaaatcaattg
+gttataaacttttagaatatctttatataagttcactacttacgctgcgggtagtatatt
+taaagtgatgtcttaggaatcttatggcggcggaataaacggcttgactatagataccct
+aattctggcataaccctgtaacgtgtgaagcatgctttaatagacgactagatcagctta
+tagaatggatatgactgccacattgaagagattaacattagcgggtataatgttacgaac
+ttgtttaacaaaatagctctaccacacacgcatagtataatataaaggtcctggagttcg
+ctacgagcctggaattgcagttcccctaccctgagtaaacaagatcagtatggacctatc
+ttctgacccacgtgtaaaaactaccgttagcggccctgagaacggtgaagttgattatcg
+gctaacactcgctttaccaaggaacaaacaattgatggaacaggtaagcggctggattct
+atcctgaatacagcataataatatttgctttcaatatatagttatgacactcccaatatc
+actaactctttacaaatcggatatgaagagtgaattagagatggagccgatcgttccttg
+tattctggtaagtactcgactaatgtgtgtagtctaggggtaaaggtccttaaccgtcga
+gtctagaactcacgcattatgaaatcctccgagcatagagactctaaattcgccaagcaa
+taagtcccgacgcgaaggatgagaagctcattgaactgtaacatttacgtcgggctcacc
+atgttacatatgcagcgggtaaaagtttttgcctggagtggttgagtttcgcgatacata
+aaaggccccactttcatatggtcaaatatctatatcgtgctttggacgactcgataaact
+aaagtagcctagtaatgccctaaaccgctgcatttgtgcaataaaaaatttagagtatat
+ataacttccggacgtatggctgccttgaatcctcggatatcgtccttatacaacgatgaa
+cggtatagctcggaactatgcagattaggcgatccttgggttgaatttttagtttccata
+gatatgagttagttttgatatggttaccatacgtccctgcattgaaacttaatctgtata
+ttgattgatccttagcaatagcggcacatttctgggcaatatgacttaattaggttacgg
+tttttactatgatggatacgttttatatgatagaataacagttgctatttaaacaggtac
+tacattcaactaatactgtttcactattgtgtccaacatagggaatatattgcctgaata
+gatgtattatcaggcatcttttacgctccaggtagaactaattaaaaatgatccttagaa
+actttcaagcaacataagctaaaagttacgccaattataagccacatcggtaggatcttc
+aggcattcccatatccttctctatcaatcccgtctgttgctaattggttatctaagcata
+tcgcggcgagcatctacgataggtataaagttgctgctatctaattcgtcataatatata
+catggaattacagattcatacgtcttcagtctcgtggtgtttctaagagcggacccaaga
+attacgtaatatctctctcgtgttacccaagaagttgacacgtgattgtcagctatcttt
+ttctggcgatgttaatagttataaacaattgcatatagctgcaaattagctaatcaaata
+ctcgtttcttaaatgttatcagcaaagctttaggttctgtaatttcactgtgtaaagagg
+gcgctaagttcaaaattggtttttggcaacaaacaatttaatagcgcagtgcaaaaataa
+tatctcagggtgtaattatttctctaattggtctttacggttggaccaggcaatgggttt
+tttatctatgtgataccaattaaaagtaatttcaaagtgacattaaacttaagtattgct
+gtcaagaccattacgacacttcaccaacacatttatgtattgtgctacgcggtatggccc
+gtagtaatttctgatattgaccgcgttatcagcaagtacgctgtacaaatgccaaattta
+gtaaagctctgtgtgcattccaaggtgcccacatcacacattatcaacatatcatgtcgt
+tgtattacgtccttttactagcctgggaaataccggtgattcagagtgaacataaatctc
+tgaaagctactagacaaagctagtatagttaaaatatatatttcttttaatattaggatc
+tttgcgattgcacatttcaagcatcgcattaacctacctccgtactcttctacaacggtt
+gcatgtacgatttctatgcgatgaaatacttatgttcttagtttggggttactttgttca
+cctagtcctcgaacgcaaattagcttcgaatatctgaaaagtgtatgcgggcaccaaaac
+gatctcgattcttaggtttataattatagtcagaagataaatacatgcatatctggacac
+tcttccacatgtcatgtcgactaactttgaactacagtcatatatagactgttatctgat
+ccgtatgtgtctattactactcttatctgagaaaggacccaatggagtcacagtaagcga
+tcatgtcatcggggctttttccctgattataagattacactattgctgtgcttggggcct
+cctactttttctatcttaatcattttgtacattaaaaagctaagaagtaggtacaactta
+tctttcccatacgagctggaccattaatttaacagccgcaaggcgagttttaatgttaat
+ctggaagggctttatgttctaagcttttagcactgagaaattaatccgtaggaaattaat
+cccacataacccggtaagagaaccttacgccccgttactaataatgttctgcgcaatgta
+ggaagtgacaagctcactcttgcgacgagctccttaatacaggccctgcgttatattcga
+ccgtacctataactagaccaccatcttaaatgtacagttatggttttcgacgcatagagt
+atgggaccacctcgaaatgctcagctgcaaattgtactgggggtggttatcaaacattta
+atatgaatctatggtaaagtactagtttatagatagccgaacactaaaggtttgcagacc
+ttcctcccctgaggaacttcgtgtcacaaattagattgagaaggtggtgataaaatcgcg
+tatctacaatgatttggtgcaaatatttatcgattgcccaatcgttctactcgtactctt
+tatagcctaacgccttttcttggcgctaattagcctaatccaagaaggagtctaacaaaa
+ttacttaaccatactcttgtctattcggcccacgcatgcgcaagctcaaaaagttctcaa
+cgggcgtttttacttgagtcccaggaggtaacattggatctatgagtcttaacagtggaa
+atatgatttttagattgtgttcagatttattgtcttattttggtctatctcatcagctat
+agctacataatgacgtcttaactgtttcgactaaccttcagatctgactaccccaaatac
+aacatagcaaaagaatgatgctaacgcttaactatcctttcacgatcttaacaaaaaagc
+tccatttaaaagaatcgaaaacagatctaccattcgtggaatcaatttttggacgagtac
+tggtcgggtcgtgcttatttgctacaggattgtttcgtataacgttcaagcactttagcg
+gttccatccttgatggcgttaactgatgatgcgtaagtttatggtgatctaaaactctac
+tacgaaccaggtcccagcacgaaacgtcatctttaatgagtttttaggtctccaggcact
+aggctgcgaagtggaatatgtgtcatcagagacaaatagatgattcctatagctttttgc
+agttaagccactaagtaggcggttctatagggtttcattcaaatcgatcgtaattcccga
+ctctgcatagcgtgggtcttgtatagaccattcttcaggcccgccacaatggtttcaagt
+ttcaacttccgtttattggctgtccctcaatagagtcgttctcagggcacgactctcgtt
+cgttattcataagtccagtttgatccacgaatacagaacacgcatatctgataataaaag
+cttaacgataactttcacgcgcatggtttatttttgatttattaggcaaccaaataccag
+aatgtagtcagcgatatgtagtaaaatttagacaaacataaaacaaagtatcgccattac
+agtctcctgttaggagaacctttttatcaatatgtgtaggcgtgtattggcgcccttgat
+ttaataataattacggctaaacgtattgatattttccaggaactgccccatctcatgaga
+tgaccctaaattttattcacacctcatttttaattcttttatatcacgattatttatctg
+agcaagcatctttgcaagcattcatagtgacggtgctgtctctatgaatgcatgctaata
+tacggtgcgctaaacatattggttcaattcaatgtaagctacctcggaatttgcttgcac
+taagacggggaagccaaaacggtaaatcgccgtatatgctagtgccaagggacttgtccg
+ttggagtcactatggagttacaagcattataaatctaaggaaatcgcagtatcagtcctt
+accccaaagatacttcgcattccctggggtacggaccatgaaatacttctttcatacatg
+ataaacgatggagactcggttaccaccctggtagttactccatcaattggagttaactaa
+gatcgctattacaggctttattagccaatcatcacaagcctctttttagagattcacaag
+ttagcaaaccaaagttcctttgataagtctttaacgagatctatcccaattccggctagg
+agtaaaatttatatatttgagatcggggttaaagtcacacgcaatgcaaggggtttttat
+atggtaatgtccttccctaattaggtaattttcagacctccgagagagagtagatcaaca
+acgcgttatactcctaaaatgcttgtcgataacatgacactacagatcatccctggatga
+gcatcgactttcattacttgattagttcagttaattcgtttcaaaccattttcaacaaaa
+tcccccagtagatatgtatatgcacatcttagactaaataacagttttcataccctggga
+tttgtgtcactatctcaggaacgtcgagacgtcccctatcaccgcagcgagggtaactgg
+ccctgttccattgtaatcgatgggacgggacgttatattgcagacccaaagtagtaataa
+attcagccatatggacggagggggggaattgttaagaatataattcgattttcagctgaa
+tgtaaaagctccagccattcctcctccacttgacattagttcgaagaaggtctgagaatt
+ggaattgcttgtgacgttttttgtttccagacaaggaaatagcccagtaccaagtataat
+attatgacaatagaagcttaaattcacaacgtaacatatctgttagcatgctctaataga
+ccgagaaaataagtgtctatgtgtgcgagaactgtcaattcacggcagtagtcacctaat
+ctaacgtctagttcccgactatgaagtcttcacaaatggttagtaataatttcccagtgg
+agtagaagtggcataacgtgcactctctgttaataatacctttagactactcccatttcg
+ccagaacgtcttgatggtaccctatgggaaacactcacacatgcttattgcctgcaacct
+cagcaatgtgtcgtatgcggtatttctacgaacagctagtgaaaggactgatgacctaat
+tttggtttctcaagtccagacgtgatattttgatgaccgtatctgacatctctgggcaat
+tcggttaacctctggtacgaaatagtccgtcgcgtaggtaaaaatgataatgctgtcatc
+actatcatgttttagctaagctacactaccccatcgctcgcacgtggcaaagtgtgagga
+ttccgatatcatccatgtgtacgaattcctaatactcttgctcagggcacttagggttat
+tgtagcctgtgttaccgtctcgcatattagatcattaatcaacagtcttataatcaccgt
+aatcggtaaacagttgttatttgttctgataggtagacagctaataaagatgctgttgaa
+cagttacgtcccacctttattgccctacagtgaaactagttcttactctgttgctgtaat
+atgtctagggttattgatttgctgccacttcaaaacggaaattaagtcattaacgaaaat
+ggttccttcataggtaaagatcaatccccaattgaagccagaaattttgagatgtcgatt
+cctgatcattcgccaaatttacagctcgtaaacgagttccatgtgtaaaaaaatgttgag
+tccactagcttgtttattctggctcaaggtacgtggaacacgtagtattttgatactaat
+gccagacccgctacgatccctgtactgtgagcagagccgatcctcagaaatagctaaatc
+ttgtgcttcgttagaagtctcgactacgtgtagcctagtgtttgtgttgcgttatagtct
+atttgtggacacagtatggtcaaatgacgtcttttgatctgacggcgttaacaaagatac
+tctgggcaacacacatacttctctcatgttgtttcttcggacctttcataacctttcctg
+gcacatggttagctgcacatcacaggattgtaagggtctagtggttcagtgagcggaata
+tcattcgtcggtggtgttaatctatctcggtgtagcttataaatgcatccgtaagaatat
+tatgtttatttgtcggtacgttcatggtagtggtgtcgccgatttagacgtaaaggcatg
+tatggatcttgatctatgcaaaggtaggtccatctatatacgttgcacagcggatacaaa
+taagataagaatttactaacatttaaattttcttattgtcgagcatagattggaggaaaa
+acttatttacttggtatttaaacggaagtttctaatgtttatgattggatgcacggacag
+tttactgcttactttcttaggtttcttgaacaacaggatgcactagtaacatgtctcgtt
+catgcttccattaagttcttcttaaacttacacaaactacctaatttagagttgacgaga
+tggttgaacgtgttgtgacaaacgtttgcaaaatgcacagtatcgttaccaaaaagtaca
+tttaagtgtgtgcgtaggaattctgctacgtccattgcaggccacattcacatcccaccc
+ctgaatatatggactgaatcacacacaccaaatttcatctaccttatcgtagcataacta
+ttaacaaacatatacagacttcgcggtaaataaaatatattagtacacaaccgtatactg
+gttgaactattgcccagctttaagacgcttttaactaggtgcttgatcaagaagtattat
+tatatgacggcagtgtgtaatacctgaatagatatagacgttagattgtctgaaaacacg
+ccgtagagacatttttgttagatatgtatttctttttgacgagccagcatcttagtatct
+gaagacgagctatatgtttgtagaaaatcgactgacattgtatacgaggcggcgtaagat
+taaccaaattccccagaattagtaatggcgccttatcgatttactaacgatatataactt
+gtgatgttgtctgcaatgtatacccgtgtaggctgtgctcttatcgaaggaaacgcattg
+aagtccaggctggatgaaaccaccgcgtacttccatgcgtctatacatagcgtcaccgat
+actacgttttgctatgtaatccattctaatgggtaagaggattcctcttatagtaaaata
+tgcttgactttttaagaaccattgggagtggttggcaaaataatagtgggtgtctttctc
+agtgtatagttttctacaactacccctattaggttacaagtaatctggctttcttgccac
+ttggcgatgatagttagattcgtatttctacaacgcagttactgtatccatggcgcgaga
+taattagatacgatttgaatttggatgtagactcgttactactgttgtagaccagcacgt
+gagtatctagatgggtttgctaccttgttagcggacttttgccgggaaaaagacatacgt
+acaaccgtatattttactataagcagtattggccaccctcgtattgcggcagggtgtgct
+cacctggttaaaatgaaagagaaaaattccattttaaaacccggaggaatctattactga
+cgaggaaggtgtttaacccgttgagacatctcctaacgtaaaaggttcatattctagtta
+ttccgagagtcactttcctatccaaacatgaactgatagcataatgacaggttgaatgga
+aagcatatcctgtttattctaaatctgtttcgctaatcaatatgctgtcacgaactcgga
+gcttacccttacaactatgtgttctgtttaccaggtgctaatatcccggcactcttttca
+tgcatgtcgctcctagcgtcatctgatttaatagcttaatgtctcatattttacagtagc
+cagtgtagtatggaaggcggcgaaccagcccctacattgggtttcctgacataagtatta
+catatcacttgtctgattacacagcaaaatcgctaaccttactttgcgcatgtagctatt
+ggaactttgggctagtgtctatcccattaagtttaacagtagactagtccgtgagcgatc
+accgagcttatgtctcgtacccaagttttggatttggatcaaaaactactcgatattcat
+gatctacgggcttcctttctccgggtatcattgcgccgagattaaaaataaaacgatagc
+gctgtgaaaacatgtttgacacgggatagcgtagaaactaaacaacgaatagaccatcca
+atttgaattttattgggtccagcacttcgccatagtgttgaatggtaaagttcgaaagga
+aatttgttatattaattctgctacattttcgaccacttgtatctcaaggacaatatccct
+tgaggcttttagcagaaagagatgccgtaattctaagggatgataataggttgggaaatt
+taagagcagtagtaacggtcgcgggttcgaccttaaactatatatttaaatctagccaaa
+caagttaacaacaaccataaagttatgaccttattatattggcaagcttaacgttttaat
+tgctctagtaatagagtggtagaggtaagggaccatcacctgattcttcctccgcaacca
+ttatatagacgtgtcgtctgacaaatttcgagataaaacattcgtccttagcaacgaata
+tcgaatggcaattagccacattgagttaaatagttgaggatatttcttgcacagaatcag
+atctaatctaatgattcgttactaaacacttcaccaggtatcgtgaaggctcaagattac
+ccagagaacctttgcaatataagaatatgtatgcagcattaccctaagtaattatattct
+ttttctgactcaaagtgacaagccctagtgtatattaaatcggtatatttgggaaattcc
+tcaaactatcctaatcaggtagccatgaaagtgatcaaaaaagttcgtacttataccata
+catgaattctggccaagtaaaaaatagattgcgcaaaattcgtaccttaagtctctcgcc
+aagatattaggatcctattactcatatcgtgtttttctttattgccgccatccccggagt
+atctcacccatccttctcttaaaggcctaatattacctatgcaaataaacatatattgtt
+gaaaattgagaacctgatcgtgattcttatgtgtaccatatgtatagtaatcacgcgact
+atatagtgctttagtatcgcccgtgggtgagtgaatattctgggctagcgtgagatagtt
+tcttgtcctaatatttttcagatcgaatagcttctatttttgtgtttattgacatatgtc
+gaaactccttactcagtgaaagtcatgaccagatccacgaacaatcttcggaatcagtct
+cgttttacggcggaatcttgagtctaacttatatcccgtcgcttactttctaacacccct
+tatgtatttttaaaattacgtttattcgaacgtacttggcggaagcgttattttttgaag
+taagttacattgggcagactcttgacattttcgatacgactttctttcatccatcacagg
+actcgttcgtattgatatcagaagctcgtgatgattagttgtcttctttaccaatacttt
+gaggcctattctgcgaaatttttgttgccctgcgaacttcacataccaaggaacacctcg
+caacatgccttcatatccatcgttcattgtaattcttacacaatgaatcctaagtaatta
+catccctgcgtaaaagatggtaggggcactgaggatatattaccaagcatttagttatga
+gtaatcagcaatgtttcttgtattaagttctctaaaatagttacatcgtaatgttatctc
+gggttccgcgaataaacgagatagattcattatatatggccctaagcaaaaacctcctcg
+tattctgttggtaattagaatcacacaatacgggttgagatattaattatttgtagtacg
+aagagatataaaaagatgaacaattactcaagtcaagatgtatacgggatttataataaa
+aatcgggtagagatctgctttgcaattcagacgtgccactaaatcgtaatatgtcgcgtt
+acatcagaaagggtaactattattaattaataaagggcttaatcactacatattagatct
+tatccgatagtcttatctattcgttgtatttttaagcggttctaattcagtcattatatc
+agtgctccgagttctttattattgttttaaggatgacaaaatgcctcttgttataacgct
+gggagaagcagactaagagtcggagcagttggtagaatgaggctgcaaaagacggtctcg
+acgaatggacagactttactaaaccaatgaaagacagaagtagagcaaagtctgaagtgg
+tatcagcttaattatgacaacccttaatacttccctttcgccgaatactggcgtggaaag
+gttttaaaagtcgaagtagttagaggcatctctcgctcataaataggtagactactcgca
+atccaatgtgactatgtaatactgggaacatcagtccgcgatgcagcgtgtttatcaacc
+gtccccactcgcctggggagacatgagaccacccccgtggggattattagtccgcagtaa
+tcgactcttgacaatccttttcgattatgtcatagcaatttacgacagttcagcgaagtg
+actactcggcgaaatggtattactaaagcattcgaacccacatgaatgtgattcttggca
+atttctaatccactaaagcttttccgttgaatctggttgtagatatttatataagttcac
+taattaagatcacggtagtatattgatagtgatgtctttgcaagaggttggccgaggaat
+ttacggattctctattgatacaatttgtctggcttataactcttaaggctgaaccaggcg
+tttttagacgacttgatcagctgttagaatggtttggactccctctttcatgtcagtaac
+atttcagccgttattgttacgatatgcttgaacaatattgatctaccacacacccatagt
+atattttataggtcatgctgttacctacgagcatggtattccacttcccattcaatgagt
+attcaacatcactagcctcagagatgatgacccacctctaataacgtcacgttgcggcca
+tgtgaaacctgaacttgagtagacgatatcaagcgctttaaattgcatataacatttgag
+ggtaaagctaagcggatgctttatataatcaatactcaataataagatttgattgcattt
+tagagttatgacacgacatagttcactaacgagttactattcccagatctagactgaagt
+actgatcgagacgatccttacgtcgatgatcgttagttatcgacttaggtcgggtctcta
+gcggtattggtacttaaccggacactatactaataacccatgatcaaagcataacagaat
+acagacgataatttcgccaacatatatgtacagaccccaagcatgagaagctcattgaaa
+gctatcattgaagtcccgctcacaatgtgtcttttccagacggtttaactggttcccggg
+agtcctggagtttcgacttacataaatggaaacaatgtattttgctaatttatctatagc
+gtcatttggaccaatacagaatattatgttgcctagtaatccactataacccgcaagtgc
+tgatagaaaatttttagacgatttataaatgccccaagtatccctcccgtgaatcctccg
+ttatactaattagtattcgttcatacgtataccgcgcatatatgaacatttggcgataag
+gcgcgtgaattgttacgtgacagagatagcagtttcttgtgatatggttaacagacgtac
+atgaagggaaactttatatctatagtgatgcttccgtagaaataccgccactggtctgcc
+aatgatgaagtatgtagctttaggtttgtactatgaggctttcgtttgtttgcagagtat
+aacagttgcgagtgaaaaaccgacgaatttatactaatacgctttcactattggctacaa
+aatagggaagagtttcaatcatgagagggagtatatggatgctttgtagctaaaggtaga
+acgtatgtatatgctgccgttcattcttgaaagatacataagcgataagttacgacaatt
+ataagcaacatccctaccttcgtaacgatttcactgttactgcgcttgaaatacactatg
+gggctattggcggagagaagcagatcgcgccgagcatatacgagacctataatgttgatg
+atagagaaggcgtctgaattgatacatcgaagtacactttctttcgtagtatctctcgtc
+ctctttctatctccggacacaagaattaagttatatatatagagtcttaccaatcatgtt
+gaatcctgattctcagagttctttggcgggccttgtgatgactgagaaacaatgcaatat
+tgctccaaatttcctaagcaaattctcggttatgttatgttatcagcaaagcgttacgtt
+atgttatttaaatctggaatgacggagcgaagttcttatgtcggtgtgggaataattctt
+ttgaagacagcactccttaaataatatcgctccgtgtttgtatttatcgaatgggtctgt
+aaccttgcacaagcaaatcggtggtgtatatatcggataacaattaatacgatgttcata
+gtgacagtatactgatcgagtcctctaaagtcaattacctcacttaacaatctcattgat
+gttgtgtcattcccggtatcgcccgtagtatgtgctctgattgaccgagtgtgaaccaag
+gaacatctactaatgcctttgttaggtaagatctctctgaattccttcgtgccaacttaa
+aacattatcaaaatttcttctacttggattaactacttttacgagcatggcaaattcccc
+tgtggaagacggttcattattatcggaaaccttatagaaattgcgtgttgactgaaatta
+gatttttattgtaagagttgcatctttgcgattcctctggtctagcttccaatgaacagt
+cctcccttctattcgacatcgggtccttcgtacatgtctttgcgatgtaataattaggtt
+cggagtgtggccttaatgggtgcaactaggaatacaacgcaaatttgctgacatgatagc
+aaatcggtatgccggcaccaaaacgtgctccttgcttagcttgtgaatgagactcagtag
+ttaaataaatccatatctgcaatcgattccacaggtattgtccactatctttgaactact
+ctaagagatacaagcttagctgagaccgaggtgtatatgactacgctgatatctgtaagg
+taccaatgcaggcaaagtatgcgagaagctaataccggctgtttccagctttataagatt
+aaaatttggctgtcctggcggcctcagaattgttctatcgtaatcagttggttcattaat
+tagctaagtacgaggtacaacttatctgtcccagaacagctccacaagtttttttacagc
+cgaaacccctgtgtgaatcttaatatccaagcgcgttatctgattagagtttacaactca
+gtattttatcagtacgttttgtttccaacattacccggtatgacaaaatgacgccacgtg
+tcgaataatggtctgaccaatgtaggaagtgaaaagataaatattgcctacacatactga
+attcaggcaatgcgttttattcgaaaggtcatataactagaaaacatgatgaattcttat
+cggatccttttactagcatagtgttggcgaacacctcgtaatgctcagcggcaaattgga
+ctgcgggtccttatcatacattttttttcaatataggcgattggtctaggttagtgattc
+cccaacacttaaggtttgctgacattcataccctcagcaacttcctctcaaaaattagag
+tgagttggtggtcttataagaccgttgattatttgaggtggtcaaatgatggtgcgatgc
+acaaatcgttataatcgtactctgtagacaataacccattgtagtgccgattttgtgcat
+aatacaagaaggaggatataaaaatgacttttcaataatattggctattagcaacaagaa
+ggagaatcctcattaagttagcaaccgcagggggtactgcagtccaaggaggtttcattg
+gagagagcagtatgaaaacggcaattatgattgtgagattcgctgaagattgtgtctctg
+attttcctagatagaataagctatagctacttaatcaactcttaactgtggagactatcc
+tgatgatctgaataccccatttacaaaattccatatcaatgaggctaacgcttaaatttc
+atttctccatcgtaacaaaaatcagcctttttatacaagacaaaacactgcttccattac
+gggtagcaatggttgctcgactactggtagcgtcgtgatgtggtgataaagctgtcttgc
+gtttatacttaaacaaattttgacctgacataatggagcgacttatcggatgttgccgat
+ctttagggtcatctattaagcttatacgaaaaagggacaagcacgttacgtaatctggta
+ggactgggtacctagaaacgcaagaggaggcgaactccaatatctgtaagaacagaaaaa
+tacaggagtccttttcatttttcaagttaacaatataagtaggagcttagagaggcttgc
+atgaaaatcgttaggaattacagaataggcagagagtggggcgtgtagactacattcttc
+aggccccacaatatgggttataggttaaactgcactttttgcgatctcccgaaatactgt
+cgttctctgcgaaccacgctcgttccttttgctgtagtccacgttcatccaactattcag
+ataaacaagatcgcagaattaaagcttaaccatatcttgatagcccatcgtgtatggggc
+atgtatgtgcaaacaaaagacctcaatcttgtctgcgagagggaggaaaatttagacaaa
+cataattcattctttcgactggacacgctaaggtttggacaaactttgtatctatatctg
+gaggcctgtattccagcccttcttttaataagatttacggcttaaactatggatatttgc
+caggaaatgacactgctattgacaggaacataattttgattcaaacctcattgttaatta
+ttttatatctcctgtttttatatcagaatgcttctgtcctagaaggcatactcaaggtga
+gggctcgaggaatgaatcataatagaccggcccctattaatattggttcaattctttctt
+acataacgcggaatttgattgcacgaacaccgggaacacataaccgtatagcgcccgtta
+tgctagtgcctagcgactgggaccgtggagtctatatcgtctttctaccattattaatct
+aaggatataccactttaagtcctttcaactaacataaggcgcattccatgcgctaaggac
+cttgaatttattatttcttacatgataaaagatcgagtcgacgggaacaaaaggctacgt
+actcaataaagtgcagtttactaagagccctttttctggcttgtggagactatcataaca
+tgaagatgttttgacattcaatagtttgcaaaacaaacttactttgtgtagtattgaacg
+agatctttccaattgccccatagcaggaatagttatatattgcagatcgcggtgtaacgc
+actccaaatccatcgcggtgtgtgagggtaagcgacttaaagaattacggtttttgatca
+aagcacagtgagagttgagcaaattacagttatacgacttaattcagtctccataaattg
+aaacgacacttcttaacgggaggaccagacacgttcattaagtgaggagtgcactttttg
+actttaaaaacatggtaatcaatttaaaccacttgatatgtatatgaacagatttgaagt
+tatttctgttttaatacactgggagttctgtcaatatcgcaggaaccgcctgacgtcccc
+tatcacacctcagagggtaaagggacaggggaaagggtaatcgaggggtagggaacgtag
+ttggcacacccaatggacgaataaatgctgccatatccacggagggcgggattgcggttg
+attttaaggcgatggtaacctgaatgtaatagatcatcaaatgcctcctccactggaaat
+tactgcgtacatccgctgagaattgcaatggagtgtctcggtttttctttaaacaaaacc
+aaattgacaacttcatagtataatttttgcacattacaagcgttaattaacaaacttact
+ttgctgttagctgcctatatttgtccgacaatataactggatatctctgcgagaactgta
+aattaacggcacttggaacataatagttcctattggtaacgacgttgtaggcggcaatta
+tccggtggaagaattgacaactgcagttgaactgcatgaaagtcaaatctctcgtaagta
+taactttagaagactccaaggtacccagaacctcttcagcggacacgatcgctatcaatc
+aataaggattattcactgaaaccgctcatatctggaggtggacgtttttcttcgaaaagc
+ttgtcaaaggactcatcaaatttttggccgtgctaatcgacacacctgttattttcatga
+ccggataggacatctcgcggaaattcgggtaacagctgggtagatataggacctccccta
+cgtattaatgataagcctgtcataactagcttggtttaccgaagagacaataaacattcg
+agcgctcgtgccaaactcggtgcattacgtttgaataaatcggtaacatgtactattact
+ctgcctaacggcacttacccgtttgggtccatggggtaaccgctcgatgttgacagaatt
+atgctaaagtcgtttaagatcccgattaccgaaaatctggttatgtctgagcattcgtac
+actgcgtattaagatcaggttgaacaggttcctaacaaattttgtgacctaaagtgaaac
+taggtcgtactctgggcatgttttatgtcgtggcgtatgcatgtgctgacacttctaaaa
+ccaaattaaggctttatccaatatgggtccttaagtgctaaacatcattcacaatttcaa
+gacagattgttggtcttgtcgattccgcatctgtcgccaaattgacacatcgtaaaccag
+gtacatcggtaattatatgttgactaaactaccgtgtgtattctggctctaggtacggcg
+aacaagtacgatgtgcttaagaagccctcaccccagacgagcccgcgtaggtcacatcag
+cagatcctaagtaattccgttttattgtcctgagggagtaggatcgacgaactctacaag
+tcgctttgtcgtgccttataggctatttcgggtcaatgtagcgtcaaatgaactattgtc
+atctgtacgagttaactaagtgtctatcgccaactaaaagacgtctcgatggttctttat
+gcggacctgtcatatcattgactggcacttgcttacatccaaataacacgtttgttagcg
+gatagtcgttaagtgtgcgcaagatcatgaggcggggggggtaatatttcgccctctaca
+tgataaatgaataagtaagaagatgatctttttgtggcggtaccttaagcgtactcctgt
+cgacgagttactactaaaggaatgtagggttctggatctatgaaaagcgacctccatata
+tatacgggcctaagcggagtaaaataagtgatcaatggactaacattgaaatgttagtat
+tgtcgaccattgagggctggtaaatcttatttacgggcgtgggaaaacgaacgtgatatg
+gtttagcatgggatgcaagcactcgttaatgcttactttagttggttgcgggaacaacag
+gaggctatactaactggtagcgttcttgcttccattatgttattattataattaaaaata
+agacatatggtagagttgtagtcagggtggatcgggttgtctataacgttggaataatca
+aaactatcgttaacaaaaacgaaatttaagtcggtgcggtggaatgcgcctacctcatgt
+gcaccacacattcacagcacacccctcattataggcaaggaagcaaacaaaaaaaagtta
+atcgaccgtatccgaccttaaattttaaaataaatagaaacacttagcggtaatgaaaag
+ataggactaaaattcactagtatcctggaacgaggcaacagagttatctagatggtaacg
+aggtgctgcatcaagatgtatgatttttggtccgctgtgtggaatacctctattgatata
+caagtgactttctcggtaataacgcacttcacaatgtgttgtttcttttctatgtatttt
+gcaagagaaagaagcttagtataggtacacctcagagatgtttcgtgtaaatcgtatcac
+atggtataactgcaggaggaacattatccaaattcaccacaattactaatccaccctttt
+acttttactaaagatatattaattctcatgttgtctgaattgtataacccggtaccctgg
+gagcgtatcgaaggataccaattgaagtcctcgaggcatgttacaacacacgacttcctt
+ccgtctattcagacactcaacgagactaacttttcctaggtaatcaatgatattgggtaa
+ctcgtggcatcttatagttattgatccggctcttttgtagatcctgtgcgactcgtgcgc
+taattaagactggctctcttgcgcaggggatacgtttattctacgtacccgatttggtta
+ctactaagcggcctttcttcaaacttgcagttgtgacttacattcctatttcttcaaagc
+agggaagggttacagggagagacttattgagatacgattggaatttccatgtacaatcgt
+taatacgcttgtagaccagcaactcagtatagagatccgtttcctaaagggtgagcggta
+ggggcaaggcaataagaaattactaaaaccctagttgttaatataagaacgattcgaaac
+aataggattgcccaagggggtgcgaacatggtgtaaatcaaagagaaataggcattgtta
+aaacccgcacgtttctagtacgcaagaggaacgtcggtaaccagttctcaaagatcctaa
+cctaaaaggggcttattctactttttccgacactcaatggacgagacaaacatgaacgga
+tagctttaggtctcgttgaatgcaaagaatagaatcgttattattaatcggtttccatta
+tctatatgcggtatagatctccgagaggaccctgtaaactagctctgcggtttaactggt
+gctaatagaccgccactatgttattgcttctagctcctagcgtcttatcatgttatacat
+taatgtcgcatattggacagtagccaggcttggatggatcgccgacaaaaagaaaagact
+ttccctgtaaggacttaactattacatataacttggatcattaatctgcaaattagagta
+acggtctttcaccagcttcatattccaacgtggcgctagtcgatatcccatgaagtttaa
+aactagaattggcagtctcacttcacagtgcgtatctatacgacaaaagtggtcgatttg
+cataaatatcttatcgatattcaggttattaccgattccttgctaacgctagaagtcaca
+ccagagtaataataattccagacacctgtgaaataatcggtcactacggatagactagta
+acgataatacgtatagtccataaaagttgaattttaggggctaaagatattagcaatact
+ggtctagcctaatcgtcgatagcaaagggctgtgaggatttctcctacattttcgaccaa
+ttgtatcgataggaatagttacagtcacgcttgtagatgtaagagatgacgttattctta
+gggttcttaagtcggggggtaatttaagaccactagtaaaggtagaggcgtacacagtaa
+acgatattttgaaatcgtcaaaaaaaagtttacaacatcctttaagttagcaactgattt
+tagtggcaaccttaacggttgaattgatctactaatacaggcctacaccgaagggtacag
+ataatgattcttactaccctaacatgatagagtcctgtcctatctcataggtcgacattt
+taaattcgtaatgagcaacgaagatcgtttcccaatttgcaacattcacttatagacttc
+aggttatttcgtgctaacattaagatagaatataatcagtcgttaagaaactattatcca
+gctttcgtcaaccataaagattaaaaactgaaacttggcaagatatgaatagctatcctg
+ctttaaccgatcgtatgagatgctttgtagcaagaaaagtgactagcacttgtgtttagt
+aaagcgggagagtgcggtaattaatattaatatactattaagctacacagcaaaggctgc
+aataatgttagtaagtagaacataaaggtattctccacaagtaataaatagtgtgagcta
+attgactaacttaactctcgcgacaagtgatgtggataagatgactcatatcgtcttttt
+ctgtagtgccgacatcccacctggatcgaacaattccttctagttatcgactttgattac
+ctatcctattaaacagatagggttgtaaagtcagaaaatgatcggcttgcgttggtctac
+catagctagagttagaacgcgtagatagaggccttttgttgccaacgtgggggtgggatg
+agtctgggcgagcgtgactttctttcgtgtccgaatttgtttaacatccattagattaga
+tgtttgtgttttgggtctgatgtcctaactactttctcagtgaaactaatgtcatcatcc
+aagtaaaatagtccgatgaagtctccgttttcggccgaagcttgtctataacgtatataa
+agtcgctgaatttagaacacaccttatctatgttgtaaagttactttattccaaaggacg
+tgcacgaagcgtgagtgtgggaaggaacttaaagtcggatcactcttgtcagtgtagata
+agaatttctttcatacttcactggaatccggcgtatggatatctctaccgcgtcatctgg
+tggtgtctgcggtaaaaagtcttgctgcacgagtctgagaaatttttggtgccatcacat
+cgtaactgtacaacgaacaaatagcatcaggccttcttatccagcgtgaagtctaattat
+ttcacaagctttcctaagtatgtaaatccctcacttaatgatgcttgcgccaatgaggat
+agaggacattgcatgtacgtaggactattctccaaggggtcttctattttgttagcgaaa
+attgttacagcctaatgttagagcggcgtacgactttataccagatactttcattagata
+tgcaaatatccaattaaatcatagtagtatcgtggtatggacaatcaaaaaagacccgtt
+gtgatatgatgtttttctagttcgttctcatatatatagatcaacaatgaataatctcat
+gatctataaccgatgtatatttatattccggttgactgctccggtgcaattcactacgga
+cactaatgactaatatggcgcctttcatcagaaacgctaaatatgattaatgaattaagg
+gagtattatctaattattagagagtagcagttagtctgatattttcggtgtatgtgttag
+ccgttataatgctgtctttttatcagtgagaacagggagtgtgtagtgttgtatgcttca
+ctttatgactctggttatatccctcggagaacaagaataagagtacgagaagttcggtca
+ttgaggatgaaatagaaccgctagacgaatggactcacgtttataaaactatgtatcaca
+gtactacagctaactctgaagtccgagaagcttttgtaggacaaaacgttataagtacct
+ttcgcagaatacggccgtgcatacctgttataaggcgtagtagggacaccatgctatccc
+tcatatagagctacactaataccattacatggtgactatcgtttacggccatcatctgta
+agcgatcatgcctcgttagcatccgtacaatctcgcatggcgtcactgcagaaaaacccc
+gtgcggattttgagtcagaactattcgaagcttctcaatccttttccattatggcatagc
+aagtgacgactcgtcagccatgggaataatagcactaatccgattacttatgaattagaa
+cccacatgaatgtgattctgcgaattgtctaagaatctaatgattttccggtgaatatgg
+ttgttgttatttattgaacttatattattaacatcacccttcgttagtgatagtcagcta
+tttccaagaggttccccgagcatttttaccattctctagtcatacaagttggagcgcttt
+taaatctttaggctgatcaaggcgttttgtctagaattctgcagatgttagattcgtgtg
+caatccctcttgcatgtcagtaacaggtcacccgtttttcgttacatatgctggtaaaat
+attcatagtaataactacaatacttgatttgttacgtaatgctcgtacataacacaatcg
+tattccacggaacagtaaagctctattattctgatcgagcctaagagaggatcacactac
+gctattaaagtcacgttcacgaaatctcaaacctcaactgctggtgaccagttatagaca
+gtgtaattccatattacatgtcaggcttaagctaacccgagcctttatataagctataat
+caagaattagattggagtgcattttagacttatctatcgaaatagtgatagtaagagttt
+atatgacctgatctagactgatgttctcttccacaacagccttaaggcgtggagcctttc
+ttatactattaggtcgcgtcgagagccctattcgtaatgttaacgacactagactaatat
+acaatgagctaagaataacacaagtcacaagataatttacaaatcatatatctacagtcc
+acaaccatcactagcgattgcaaagcgttattggtactaccgctctaaatcggtatgtgc
+aagacgcgttaactggttcaagcctctcctgctcgtgagactgaaagaaatcgaaaatat
+ggatgtgcctaattgttcttgtgagtcatgtgcaactatacagtttagtttggtcaagac
+tatgcaactattaacagcatgtgcgcattgaatatttggtgtcgattgataaatgcccca
+acgttccatcacgtctataagccgtgttactaatgtgtattagtgcatacctattcagac
+catagttcaactgttggactgaaggcccgtcttggggttcgtgaatgagagtgcagtttc
+ttgtcttttccttaactgacctaaatgaaggcaatcggtttatctagagtcatgcttaag
+gtgaatttcagccaatgggctcccattgagctagtatggtgctttacctttgtaagtggt
+ggctttccttggtgtgctgactttaacacggcagagtgattatccgaagaatggataata
+agacgctggcaatattggctaataaagtccgatgagtttcaatcatgactgcgaggagat
+ccatgcggtgtacctaaacctacatcgtatgtatttgctgacgttcattcttgatacata
+aagatccgatatcggtccactttgtttaccaaaagccctaccttcgtaacgatggaaatg
+tgaatgagagtgaaatacacgatggggatattgccggtgagtacaagttagaccacacat
+tagaactgacctatattcgtcatcatagagatggagtatgaattgattctgcgaagtaca
+ctggctttacgagtatctagacgccgcggtatatctcccgtcaatactatgaaggtatat
+atatagaggctgaaaattcatgttcaatcctctttctaagagtgagtgggagccccttct
+gttgtcggagtaaaaaggcattattcctcaaattgtcagaagcaaagtatacgtgatgtt
+tgcttagaacaaaagagttaccttagggtaggtaaatctcgattcaccgagagaagtgat
+tttggcggtgtgcgattaattcttttgatgacagatctcattattttatatagctccctc
+tttgtatttagagtttgcgtaggtaacctggcaaaaccatatcccggggggagagtgcgc
+tgaacattttatacgatgtgattactcaaaggataaggttcgaggcctctatactcatgg
+aactatcttataattataatggatcgtggctcattccacctatccaaacttctttgtgat
+ctgatgctacgagtgtgaacaaacgtacatcttctaaggaatttgggacgtttcatagct
+cgcatttcattcctgaaaacttaaatatttttaaaaattgattctactgcgaggaactaa
+ggtgtagacaagcccttagtaaccggtggatgtcgcttcagttttatagcaaacattatt
+caatttcagtcttgactgaaattagtttgttagtgttagaggtccatatgtcacatgcat
+atggtctagatgccattgtacagtaataccttagattagtattagcggcatgcgtacttg
+gatttcacttgtaagaatgagcttaggacggtcgcctgtagggctgcaaataggaatact
+tacaatttttgatgacttgttagcatatcgctatcacccataaaaaacctgatacttgat
+gagcgggtgattgagactatgtactgatataattcaatagctccaatagatgaaacagct
+atgcgcctatttatgtcaaataatcgatgtgatacaagcttagagctgaacgagcgcgag
+tggaattagcggtgatctctatcctaaaaagccacgaaatcgatcccagaagctaatacc
+cgaggtgtcaagcttgagttcagttaaatttgcatctcatgccccacgaagaatgggtag
+agagtttgaaggtgcttctggattttcctaagtacgtggtaaaaatttgatgtaaatgaa
+cacctcctaatggttgtgttaaccacaaacccctgggtgaatctgattagccaacccagt
+gatctgatttcagttgtcaaatctcttttttataactaccttttgtttccataatttaac
+cggatctcataatgaacaaacgggtagaataatggtagcacatagcgagcttgtctattc
+agaaatatggcctactcagaatgtattctccaaatcagtgttatgcgaaacgtaatttta
+cgtgtaataatgatgatttcttatcggttccttgtactacaatactcttgcccaacaaat
+actaagcataacagcaaaattcgaatccccctccttttaataaatggtttttcaatatag
+ccgattcgtattcgttagtctttcaccaactattaacctggcatctaattaataaaatca
+ccaaaggactctataatatgacagtcacttcggcctcttttaagacagttgattattgca
+ggtccgcaattgatggtgacatgcacaattagttagaatccgactatggagacaattaac
+aattgtagtgcccatttggtccagttgacttcaaccacgagttataaaggtattttaatt
+tatagtcgatagtaccaacaacaagcacaatcataattatgttagaaaacccagggggta
+atgctctaaatccagctttaaggccagagtgcactatgaaatcgccattgatcattgtgt
+cattcgctgaacttggtgtctaggaggtgccgagtgagaatatcagataccttatgaagc
+aacgattatatctggactagatcatgatgatcggaataaaacattgaaataagtccttat
+caaggagcataaacattttatttaatttatacttcgtaaataaattcagaattttttttc
+aagacattaatctgagtaaatgacggctagaaagggttcctactcgaatcgtagcctacg
+catgtgggcagtaacctggcttgcgtttttactgaaacaaaggttcaccggaaagaaggc
+tgccacttttagcttcttgacgatctttagcgtcatatttttagattagtcgaaaaacgg
+aaaacaaacttaacgaagctggttgcacggggtaccgagaaaccaaagagcaggacaact
+ccttgatcgggaagaactgaaatagacagctgtcattttcattggtcaacttatcaatat
+aacgaccaccgtagtgacgcttgcatgaaaatactgaggatgtaaactatagccagtcag
+gcccgcgtgttgactaattgatgaagcaaacaaaatagccggtattcgttaaaaggaacg
+ggttgccagctacagatatactctaggtatatcccaaacaagagacgtcctttggctgtt
+gtaatcggtcataatacttgtcacataaacaagatcgctgaattaaacattaaacagtta
+gtgatacacaatcgtggttggggctgggatgtgcaataaaaagtcatctatcgtctatca
+cagagcgacgtaaatttagacaaacattattatttcttgacaatggaatcgataagcgtt
+cctctaacttggtatatatatctcgaccccgggattccagccattcttgtatgaagattt
+aaccatttaactatgcatagttgaatggtaaggaaaatgatattgactgcaacagatttt
+ggatgcaaaaatatttgtgaattattggttatatactggttgtatagcacaatcattagg
+tcctagaaggcatactcaacctcagcgagagagctagcatgcataattgtaccgcccata
+ttaatattcctgaaatgatttcttacattacgcccaatttcagtcatcgaacacccccat
+caatttacccgatagagaacgtgatcatacgcaataccctatgcgaacgtccactctata
+gcgtctgtatacaatgattattcgttccatttacaacgttaagtaatttaaacttacata
+aggacaaggaaatccgcgaacctcctggaatgtatgagttatttatgcagttaacttcgt
+ctcgaccggaactaaaggcgtcgtacgaatgaaaggccacttttagaagagacctttgta
+tccattgtggagaatatcataaattcaagatggggtgtcatgctattcggtcctaaacat
+tcttaatggctgttctattgttagtctgatttaaaatggaaccatagcacgaatagttag
+atagggctcatacccctgtaacgatctacaaatccttccccgggtgtgtgcgttagcgac
+ggaaagttttacggtttgtgatcaaagaacactcacacgtcagattattacactgatacg
+aattatttcagtcgacagtaattgaatagaaacttattaacgccagcacctgacacggta
+agtaaggcaggtctgaactgtttgactgtaaaaaaatggtaatatttttaaaaatcttga
+tttctatatcaaatgatgtgtagttttttctctgttattaaaatcccagtgcgcgaaatt
+tagatcgttacgactcacgtacaagatcacacatcacacgcgttagcgaaagcggaatgg
+ctaatacagccctacgcaacgtagtgggatcaacatatggacgaatttatgctcaatgag
+ccaacctcccccgcattgcggttcattttaaggcctgggtaacatctatcgtttagataa
+tcaaaggaatccgactatgcaattgtctgacttcatccgctctcaagtccaatgcaggcg
+ctacgtgtttctttaatcaataccatattgaaatcgtaatacgataattgttgctattga
+ctacaggttatgaaaaaacttactttgcgggtacatgcatatttttgtaccacattatta
+cgcgatatctctcagtgtactctaaattaaaccctcttcgaacattttagttcctattcg
+taaacacgtgctacgcggcaatttgccggtcgtagaatggacaactccagttcaactgca
+tgtaactcatagctcgcgttagtataaattgactagtagccatgggacaaagtaactagt
+cagcggaaaagatccctttaaagatatatgcaggttgcaagcataaagctcattgctcga
+ggtgcaccgtggtattccaaaagcgtctctatcgtatcttctaattttgggccgtgagaa
+tcgaaactactctgatttgctgcacacgttaggtaatatcgcccattttcccgtataagc
+tccgtacttatacgaactacacgaccttttaagcattagccgctcatatcgtgattcgtg
+tacagatgagtctattaaaattacagacatactccatatctcgctccttgaactttgaat
+aatgcgctaacttgtactatgaataggcagaacccaactttcccgtttgcgtcaagcggg
+gaaacgatacatgttgtcagatttatgattatctagttttagatcacgtttaccgataat
+cggctgtggtctgagcagtcctacactgagtatttacttcagcttcatatcggtccgaaa
+aaaggttgtgaccgaatgtcaaaatacggagtacgatgggcatcttttttcgagtcgcgg
+ttgcagggcagcaaaaggcttaaaccatttttacgatttttactatagcggtcatgaagt
+gcgaaactgcttgcaaattttctacacacattgtggctcttgtccttgaagcttatggcg
+aaaatttgaaacatagtataccagggaaagcgcgaattatttggtgactaatagtccgtg
+ggtttgagccatatacctaacgccataaactacgtggtgctttagatgcaatctaaacag
+aacagaaagcgtagcgctcatcagcacagactaactttttcagtttgagtcgccggaggg
+acttcgagacaagaacgcgtcaagtcgcttgcgcggcacggattcgattgggcggctcaa
+tcttgcctaatttctactattgtcagctgtacgactgtactaagtgtatagccccaaata
+aaagaagtatcgatgcgtctttatgaccaaaggtcttataattgaagcgcacttccgttc
+atcaaattaaatcctggcttacccgattctccggaagtctgacctagagattgacgacgg
+ccgcgtattattgagacctcttcaggattaatcaataacgaagtagttgatctgtttggc
+gacgtaccttaagccgactccgctacacgagtttctactaaaccaatgtagccttatgct
+tagatgaataccgtcctaattagatattccggcataacagcagtaaattatctgttcaat
+ggacgaacattgaattgttagtattctacacaagtcaggcctcgtaaatattaggtaagg
+ccgtgggataacctacgtgatatgcttgagcttgcgttgcaagctctcgttaatcattaa
+tttaggtgcgtgagggttaaacaccagcatattctatatgctagacgtcttccttaaagg
+atcgtagtattataattaataataagaaatatggttgacgtctagtcagcgggcatacgc
+tgctctatatactggcattattcaaaacttgacggtaaaaaaacgaattttaaggcgctc
+acgtcgaatgagccgaactcatgggaaccaaaatgtcacagaaaacacctctttattgcc
+aagcatgcaataaaaaaaatgttaatagtacgtttacgacattttattttataataaaga
+gaaactattacacctattgatatgataggacgtaaattaacgagtagcctgcatagaggc
+aaatgaggtttctacatggtatagacctgatgctgaaacatcgatgagttttggtcccct
+cgctcgttgaaatctagtcatttactactgtctttcgagctattataccacttcactatg
+tggtgtttctttgctatgtatggggctagtcaaacatgatgactatagctacaactcaga
+gagcgggcgtgttaagagtatctcatgctagaactgcacgacgaacttgatacaaagtaa
+caacatttacgattccacaaggtgactttgaagaaacatagtttaattctctgcttcgat
+catttctataaaccggtaccatcgcagcggatagatgcataacatttctactactccagg
+catcttaaaacacacgtagtacttcactagattaagacacgataagtgtataacttggca
+gtgggaagcaaggagattggcgaactcctggcatctgttacgttttgttcaggctcggtt
+gttgataatgtccgactcctgccatattgaagactcgctcgagggagatcgggattcgtt
+gattataagtacacgtgttccgtaatactatgaggcagtgattcaaaatggcacttctga
+cttacatgactaggtattattaccacggaagcgttaaaggcacactcttatggacttaag
+attgcaagtgccttcttctagcctgaattcgcgggttcaacacaaactctctttagacat
+ccgttgcctaaaggctgagacgtaggggcaaccctttaactatgtactaaaaaactagtt
+ggtaatttaacaacgtgtccaatcaagacgatgcaccaacgcggtgcgaaaatcgggtta
+agcaaacacaaataggaattgtgataaaccccaccttgagaggtcgcaagaccaacctcg
+ggaacaacggctctaagagaataacctaaatccggatgagtagactgtgtaactctctaa
+agggaagtgaaaaaaagctaagcatacatttaggtctcctgcattgcattcaattgaatc
+gtttgtattatgagctgtacagtagctatatcagctatagttatcccagaggaacaggta
+aactagctctgagcgtgaaatccggatattagaacccctagatgggattgattctagcta
+atacaggcttatctggttttacagttatctagatgattggtaaggtgaaacgcttggtgc
+cttccaccacttaaacaaaagtattgcccgggaagctattttctaggtattataaagtcg
+agcattaatatcaatttgacagtaaaggtctttcaccagcttcatatgccatagggccca
+tactcgatttaaattgaacggtttaacgagtattggaactctcacttataactgagtagc
+tatacgaaaaatctggtccatttccagaaatttattatcgatttgctgcttagtacccag
+gaagtgataacccttgaaggcacaacactgtaataagttttcctgtcacatctgtaatat
+tcggtcactacgcattcacgactaaagataattactatactaattaaaagttcaatgtta
+gggccgaatcatagtagaaattctcgtctagcctaatcggacttacctatgggctgtgag
+gatttatcagtatgtggacaaaaatgctagagataggtatagttaaagtcaccatggtac
+atctatgtgaggaagtttgtagttcgcttctttagtccgggcgtttgggatgacaactac
+tatacgtagagccgtactcaggattagatagtgtgaaagagtcaaataaaagggttaata
+ttaatttaacgttgcaaatgtgtttaggccaaacattaaccgttgtagggatattctaat
+acaggccttcaccgaaccctaatgataatctgtcttaataacattaaatgattgtctccg
+ctacgagctcttagggcctcattttaaatgactaatgtccaaagaagagactttcccaat
+ttcaatctgtcacgtatagacggcaccttagtgagtcatatcattaagatagaagattat
+caggagggaagtttctattatcaaccgttacgcaaccataaacttttaaatctcataatg
+gcattgagatcaagagctttcatgatggtaaagttcgtatgtgatgctggggagctagat
+atcggtataccacttcggttgtggtaagcccgagtgggccgttagtaatattaatagacg
+attatccgacaatgcattcgctgaaataatcttacttaggagaaattaatgctatgagcc
+aaaactatttatgtctgtcacattattgactaaagtatctatcgacaaaactgatgtcca
+taagttgtagcagatagtcggtgtatggtgtcaccaatgaaaacctcgagcgaaaaatga
+attatagttatccaatttgagtaaattgcctattatacagataggcttgtttagtcagat
+aaggttccgcttgaggtgctctaacttagcgagagttagaaagcctagtgagaggcattt
+tggtgccaaactccggctcgcatgagtaggccagagagtcactttctttcgtcgaagaag
+ttggtgaacagccttttgattagttgtttgtcttgtggctatgtgctactatataagtta
+gaacgcaaactaatctaatcagcaaagtaaaataggaccttgaacgagacggggtacgcc
+gttgaggctcgagatagtagataaactagaggaatgtagataaaacattagctagggggt
+ttagttactggattacataggaagtgcaccatcacggtgtgggggttcgtacgtaaagtc
+gcatcaatattgtcagtggacttaacaagttcgtgcataatgaaatcctatacggacttt
+gcatatctctaccgactcatctggtcgtctatgcgggtaattgtattgctccaagtggat
+gactattttggcgtcccagcacatagtaaatgtaaatccttataatagcataagcaatta
+ttagactgcgtgaagtcttagtagttctcaagctttacgttgtatgtaaataactcacgt
+aatcagccgtccccaaatcaccattgaggtcattgaatgtacggagcactattatcaatg
+cggtatgcgattttctgagcgattattgttaaagacttagcgttgagccccggaacactt
+gattacagattctttaaggagttatccaaatatcattttaaataatagtagtatcgtgct
+ttggacaataaaaaaagacccgttctcttatgttgttttgcgacgtacttctctgatata
+tacttcaactatgaagattctattcatcgataacccaggtatatttatatgcccgttcac
+tgcgcagggcaaattatctacggacaataatgacgtagttggacccggtaagaactaacg
+cttaatatgattaaggatgtatgccagtattatcttattatgtcagagtagaagtttctc
+tgagattttccgtcgttgtggtacaccggatttggctctctttttagaactgagaactcg
+gagtgtgtagtcttgtttccttcaatttatcaatatgcttttataccgccctcatcaact
+ataacaggacgacaagttccgtcttgctccatcatatactaccgatacaccaatcgtatc
+aagtttagtatacttgctttctctcttctacagcttactcgcttgtccgagaagcggttg
+gtgctcataaagttagtagtaaatgtacaactagtagccagtccttacctgtttttacga
+ctactacggacaccatgagatacagaagttagtgctacaattataccattacatgctcaa
+tatcgttgtcggccataagatcgaagagtgcatcacgcgtgtgaatacgtaaaatctacc
+atcccgtcaatgcacaaaaacacactccccttgttgactaacatcttttacaagaggcta
+aatcattgtccaggatcgaataccttgtgtacaatcgtcacccatcggaagaataccact
+tttccgatgtagtatgatttacaaaaaacatctatgtgagtaggccaattgtagtagaat
+atattcatttgaccgtcattagccttcttcttaggttgtgtacggatagtaggtacataa
+accgtcgtgtggcatacgctgcgatttcatacagctgccaacaccttttttaccaggcta
+gagtcagaaaagttggagccatgttaaatagttaccatcataaaccactgttgtctacta
+gtctgatcagctttcatgcctgtgcaagcaatatggattctcacgtaatggtaacaactg
+ttgcgttacttaggctggttaatttgtcagagtaataaatacatgtcttgttgtgtttcc
+taatcctcggaaagtacacaagcctaggaataggaaaagtaaagctcttttattctgata
+gtgactaactcaggatctaaatacgcgattatactaaccttcaccaaagctcaaaaatca
+tctgctggtgaccagttatagacagggtaattcaatatttaatgtctcccttaacatttc
+accagcatggattgaagatagtataaagttttacatggcagtcattgtgtcacggttcta
+tacaaattctgatagttagacggtatttgaaatgtgcttctagcatggtatcttacacaa
+ctgaatgaacgactggagccgttcgtatactatttgcgagcctcgagaccccgtttccta
+atgttaacgaatatagtataatataaattgtgatatgaataacacaagtaactacagttt
+ggacaattaattgttctaaactaaaaatcattcacttcagatggcatagagttatggcta
+ctacacatataaagcggtatgtgaaacacccgttttagccggaaaccctctactgctcgg
+gacaatgaatgatttccaaaatatggatgtgcagaattgttagtgtgactcaggtccaaa
+tagacactttagtttcgtcaagtcgttgcaaagtttaaaaccatcgcagcattctttatt
+tggtctacattgagaaatgaaaaaacgtgacagaaagtctagaagaactgtgaataatgt
+ctattactgattaactagtaagacattagtgcatctggtccactgaagcacccgcttggc
+gttaggcaatctctgtgaactgtcgtggctgttccggtaatgtacgaaagcaagcctata
+ggttgatcgagtcgcttcattaaggtcaatttcacaatatccgatcacattgtgctaggt
+tcgtcctttaccttgcttagtgctgcatgtacggggtgtcatgacttgttatcggcagac
+tctttatcccaagaatggataatatgtacatggaaagtgtccataattaagtcccttcac
+tgtaaagaatgactgccacgtgatccatgaggtctacagaaaccgacttacttgcttttt
+gatcaacttaattatggattcataaagttcagatatcggtacaattggtgtacaatatga
+aattaatgaggaaacatggaaatctgaatgacagtgatagaaaagatccccatttgcccg
+gtcagttcatgttacaccactcattagtactgtaagtgtttcgtcagcattgagatccac
+gatcatgtgtttatgccttcgaaactggatgtacgacgatcgagacgaagaggtatatat
+aacctaaatactaggtacgttgttagagagacgatgaaaattaatcgtcaatacgctggc
+gaacactgagggggacccaatgctcttctcggtctaaaaaggaatgtgtcagaaattggt
+cagttcaaaagtagaccggatctttgcggagaacaattcacggaacgtagcgttgggaaa
+tatcctttctaccacacatcggattttcgccctctcccattatttattgtgttctcacat
+agaattattgtttagacatccctcgttgtatggagagttgcccgagcgtaaaggcataat
+ccatataccgccgggtgagtgacctgaaattgtttttagttgggatttcgctatggatta
+gcttacacgaagagattctaatggtactataggataattataatgctgcgtggcgcagta
+caccgttacaaacgtcgttcgcatatgtggctaacacggtgaaaatacctacatcgtatt
+tgcaatttcggtcgtttcatagagcgcattgaattactcaaaaattatatatgttgatta
+tttgattagactgcgtggaaagaaggggtactcaagccatttgtaaaagctgcatctcgc
+ttaagtttgagagcttacattagtctatttcagtcttctaggaaatgtctgtgtgagtgg
+ttgtcgtccataggtcactggcatatgcgattcatgacatgctaaactaagaaagtagat
+tactattaccggcatgcctaatgcgattgcactgctatgaaggtgcggacgtcgcgccca
+tgtagccctgataataccaatacttacatttggtcagcaattctgacattatacctagca
+cccataaatttactcagacttgaggacaggctcttggagtcgatcttctgtttgtatgca
+tgtgatcatatagatgaataagcgatgcgactagttagggcatagtatagatctgtgtat
+acagttcagctgaacgtccgcgagtggaagtacagctgagatctatcctaaaatgcaacc
+atatcgttcacacatgatatgaacccagggggaaacattgagttcagttaaattggcagc
+gaatcccccaagaagaaggcggagtgacgttgaacgggcttatggtttttcagtacttcc
+tccgtataagttgagcgaaatgtaaacagaataatcgttgtgttaacaacattaaaatcg
+cggaatatgatgagaatacacagtgtgagcatttcacttgtaaaatatctttggtagaac
+ttactttgctttaaatatgttaaaccgatctaataatctacaaaacggtagattttgcct
+agcacattgcgtccttctctattcagatagaggcaatactcagaaggttttatccaaagc
+actgtgttgactaacctaagttttagtctaataatcatgattgattataggtgccgtgga
+ctacatgactcgtccacaaataatacttagcagatcagcaattggccaagcacccgactt
+ttatttaatggttgtgcaatagtccagattcgtattcgggactctttcaaataatagttt
+cctggcatctaagtaagaaaagctcataaggaagcgatattatgacacgctcttccgccg
+ctgttttgaaacttgagtattgctcgtccgaaattgagggtcacttcaaaatttactgag
+aagacgaagatcgactaaagttaaaatgctagtccacagttggtcaagttgaattcatcc
+acgagttatatagctattttaatttatagtcgagtgtacaaaaaacatccacaataagat
+ttatcttagaataacaacccccgtatcatcgaaatcctccgttatggcctgactcctcga
+gcttatagcatttgtgctggcgctcttgccaggaacttgctcgcgaggtggtgacgagtg
+agatgatcagtttcattatgatgatacgattttatcgcgactagttaatcatcatagcaa
+gtaaaatttgaattatgtcattatcatgctccattaacaggttatttaattgatactgac
+gaaattttttcacaatgggttttctagaatttaatatcagtaattgaagccttcataggg
+gtcctactagtatcctacacgacgcaggtccgcagtatcctggagggacgtgttactgat
+taaaagggtcaaaggaatgaaggctcacaatgttacctgcttcaccatagtgagccgatg
+agttttacattagtactaaatcccaaatcatactttacgatgaggcttgctagcgctaaa
+gagaatacatacaccaccacatagaattgttagcgatgatatcaaatagactcctggaag
+tgtcagggggaaactgttcaatatttcgtccacaggactgaccaggcatggaaaagactg
+acgttggaaactataccatctcacgcccgacgcttcactaattgatgatccaaaaaatat
+agcccggattcctgattagcaaagggttcacagagaaagatattatcgacgtatatccca
+aaaaacagacgtaatgtgcatcttcgaatcgggatgaatacttgtatcataaaaatgtga
+cctctagtatacaggttaatgttagtgatacacaatactcgtgggccatgggttctcaaa
+taaaatgtaatattgcgtcgatcactcacccacgtatttggtctaattatgttttattta
+gtgacaatccaatagataaccggtcctattaagggctatatttttagcgaccacgcgttt
+aaacaaaggattgtatgtagatggtaccagtttaattgccagtgggcaatcctaagcaaa
+atgagattctatcctaaagtttgggcttgatataagatttcggatgtatgggttttataa
+tcgttggagagctcaatcatgagctaatacatggatttcgctacctcaccgagagacctt
+gcatgaagaattctaaccaaaagtttaataggccggattggattgagttaattaagacct
+tgttcagtcatagtaaaaacccttaaattttaccgattgacaaagtgagcagtcgcaata
+ccctatgcgaaacgcctcgatagtgactaggtatacaaggtttttgagttcctttgaaat
+agttaactaatttaaaattaattaacgacatggaaatcacagaacctaatgctttgtagg
+agttatttatgctgtttactgcctctacaaccctaataaagcagtcctaagaatgaaacg
+catcttttagttcagaaagtggtatccagggtggtcaatttaataaattcaacatcgggt
+ctcaggatattcggtcatataatttattaagggctcttcgagtcttactctgagtgaaat
+tggaaacagtcatccttttcgttgtgaggcatcttacaccgctatcgatatacaatgcat
+tccaccgcggtgtcccgtacacaaggaaacttgttaccttggggatataagaaaactcac
+acgtctcattattaaactgagtacaatttttgcacgagaaagtaatgcaatacaatatga
+tgaaagccagctaatgaaaagggatggaacgcacctcggatctgttgcactggattaaaa
+tccgattatttttaaaaatattcagtgctagagcatatcaggtctacttttttatctggt
+atgtaaagcccacggagcgatagtgagatccttacgactcaacgaaaagttataacataa
+ctcccgttagccaaagcccaatcccgattactgccctaccctaacgtctgccatctaaat
+atcgaacttgttatgatcaatgtgactacctcccaccctttccccttcatttgttccact
+ggggataagctagcgttttcagaatcaatgcaataagaatagccaattgtctcacttcat
+cagagctcttggcaattccaggcgctacgtggttctggaatatattcatttttcaaatag
+taatacgtttagtgttgctattgtctacacgtttggatattacgttatgtgagcggacat
+caatagttgtctaactctttagtaagccagagatagcactcttagcgaatggataccatc
+ttccataagtttagttaatagtccgaaacaactgcttcgagcatatttgaacctccttgt
+aggcaaatagcctcttcaaagcaatcttactaatagatagagtttgttttaagggactac
+tagaaatgggacaatcttaatagtatgacctaaactgacatttaaagatatatccaggtg
+gcaagcataaagatcattgcgccacctccaccgtgggattacttatcagtcgatatccta
+tatgctaagtttgcgacggcagaatacaaactaagctgagttgatgctaaccttacctat
+gataccccattggaccggttaacagccctacttattccaaataaaagaacttttatgctg
+tagaagctattatagtgatgcctggtaacttcagtatattaaaatgacacacatacgcca
+tatagagctcctggaactttgaataatgagcgaacttcgaagttgaagagcaagaaacca
+tatgtcacggttgcctaaagcccggtaaccagacatgtgctatcattgatcattatcgag
+gttttcataaccttgacccattatcggctgtgcgcggacaagtacttaaatcactagttt
+cttcacctgcttatcggtaagaaataaggttggcaaagaatcgcataagacggacgtaga
+gccgcagcgttgtgcgagtccaggtgcatgcgcagcaataggattttaaattttgttcca
+tttttaatttagccgtaaggatgtccgtaaatgattgaaaattggattcaatctttgggc
+ctatgctactggaacctgatcgacaaaatttcaaacatacgttaactccgaaagaccgta
+tttttgcggctagaatagtcagtcgcttggagccatataccttaccacttaaacgacgtg
+ctcctgtagttgaaatataaacagaacacaaagactaccgatcatatcaactgaagatct
+ttgtaactttgaggcgaagcaccctcttcgagacaactaagagtaaagtaccgggcgccg
+caaggagtcgattgggaccctaaatcttgacgaattgctaagaggctcagagctaccact
+gtaatttctctagagcccataataaatgaacgatacatccgtaggtagcacctaagggat
+tataatggaagccaaatgcagttaataatattatatactggcgtacacgattcgacggat
+ctctcacatagtgattcacgacccccccctttgattgacacagcgtcagcattttgcaag
+aacgatcttctgcatagggtgcgccaccgtaaggatgacgtcgaagctacaactgggtat
+aatttaccatgcttccctgatgctgagtgcaatacactaagaatgagtttttaccccata
+tcaccagtatttgttctgttattgcgaagaaatggctatgctgagttggcgactaaagtc
+acccatcctttttattaggtaaccccctcccttaaactaactgatttgctggagctgccc
+tgcatacatatactttatcatttatggacgtccgtgacgcttattatccaccatagtcga
+tatgctacacggattcattaatggatcgtaggagtttaagttatatttactaagatcggt
+ctcggctactatcccgccttacccggcgctatttacggccatttttaatatattgacggt
+aattattcctatggtttcgaccgcacgtccttggacaagaaagaatggcaaaaaaaatgt
+aaaagaaaaaaaatattgagtccctaccatcatataaaaaatatgtgatgagtaacttga
+cgaaatgttagtggttattaaagactatctattacaccttttgttttctgtcgtagtata
+ttaaagtctagaagccttacaggaaaatcagggttatacagccgatactccgcagcatga
+atcatcgaggaggtgtcctaccatcgcgccttgtaatcttgtctgtgtatactgtattta
+gaccttttatacaaagtaaatatctcggctttatgtgattgggaggggcctactcaaaca
+tgatgacttgacctaataatcactgtgcgggcgtcttatgactagctattccttgaaatc
+caccaccaaatggttaatatgtaaaaactttgacgatgaaacaaggtgaatgtgtagtta
+ctttgtgtaattagctgcgtcgagcattgcttgtaaaaccgtcaatcgcacacgttactt
+ccataaaatttctacgaatacacccttcttaaaaaaaacgtaggaattcacgagtttaac
+aaacgataactgtataaagtggaagtccgaagaaagcagatgcccgaactactcgaagat
+gtttcgttttcttaaccataggggcttcttaatggcccactacgcacattttgttcaagc
+ccgagagggacatccccattacgggagtattactaaaactgttccgtaatacgttcagca
+agggatgaaaaaggccactgctcaagttattgacgtgggagtattacatcggaagcctga
+atcccacactatgatggtctgtacaggcctagggactgcgtctagacggtattaccggct
+tctaatcatacgatcgtgagtcttaacgggaagtaaggctcacacctaccccaaaccatt
+tatctatgtaagtataaaattgtgcgtaagtgttcaaagtggacaataaagacgtggcaa
+aaacccccgcacataagccgctttagatttcacaaataccaatgcggttaaaaacatcct
+tgagtcgtacatacaccatactcgcgttaaacggatataacagaagataataaatccgga
+tgtggagtcggtgtaactatagaaagccaagtgaaataatgcttaccagtcatttagcta
+tacggctttcatttcatgtcaagagggtggagtttgacctgtacagttgatatatcaccg
+atacttagaactcacctaaagctaaaattgctcgcagcgtgtaatccgcatattacaaac
+aatagatgggattcattatacataagacacgatgatctgctttttcaggttgcgagatgt
+tgcctatcgtcaatcgagtcctgccttacaccacttaaacaaaagtattgacagggaacc
+tattttcgaggtattatatagtccagcttgaatatcaatttgacagttaacctagtgaaa
+atcagtaagaggaaatacgccacattctccagtgaaattctacgggttatcgtctagtcc
+aactatcaattataactcacgagatataagtaaattctcgtacttggcctgatttttatt
+atactttggatccttagtaaacaggaagggagaaaccttcaacgaaaaacactggatttt
+gttttactctcaaagctcttatatgacggaaataccctgtcaagtcttaactttattact
+agactaatgaaatgggcttggggtggccagaatcatagtacaatttagcggatacactat
+tcggactttcctatcggctgtctggttggataagtatggggactaataggctagacatac
+ctatacttaaactatacaggcgtcatctatctctgcaactttggagttccctgatgttct
+cccgccctttgggttcacatcttctataccgacacccctaataacgattagtttgtgggt
+tagagtaaattaatacggttaatattaatgtatcgttgaaaagctggtgtcgccaataag
+gtaaccggctaggcagagtatatgtcacgaagtataactaccctaatgataagctgtagg
+aataaaattaatgctgtctctaagcgaagagatatttccgactctgttttaatgacgaat
+ctcattacttctgacttgcaaatgttcaatatggcacggtttcacggcacctttgtgacg
+catataatgaacttagaagattataacgacggaactttatatgataatccgttacgatta
+aagaatctgttaaatatcataatggcattcagttctagaccgtgcatcatggtaaactta
+ctttctctgcatggcgacatacatttcgctattcaaattcgcgtgtggttacacccactc
+gcacctttggaatattaagagaagatgatcagaaaatccattcgctcaatttttctgacg
+tacgtctaatttatcctaggagacaaatcgttttatgtctctcacatttttgaagaaagg
+ttcgagagacaatactcaggtcctgaactgctagaagatactcggtggagcgtggcaaca
+atgaaaaactcgtgacataaatgaatgatacttttccaagttcagttaagtgaatatgtt
+taacatacccggcttttcgatcttaagctgacgctggacgtgcgagtaatgtcagtctct
+tacatacactagtgactccaagtttcgtcaaaaacgccccctcccttctcgagcccactc
+acgctatgtattgacgcgaacttgttcgggatcagacttttcaggagttcggtcgcgtgt
+ccctatgtgctaatatataagttagatcgcattagatgctaatctgaatacttatagacg
+accttcaacgagaacgggtaccaccttgaggctagagttaggtgtgaaacgacaggtagg
+gacatataaaatttgagtgcggctttagttaagggtttaattacctactcaaacatcacg
+ctcgcgcccttcgtacgtaatcgaccatctagaggctaaggggactgtactaggtagtga
+ttaatgatatcctagacgcacgtgccttagatcttcagactctgatggtccgcgatcacc
+gtaattgtagtcctccaactcgatcactttgttggcgtcaaagaaattacgatatctaaa
+tacttataatacaataaccaaggatgagaatgactcatcgcgttggagttatattgcttg
+aagttctatggaatgaaagcacgttatctgccgtcccaatatctccagtgagctaattca
+ttggacggtccactttgatcaatccccgaggagatgttcggacactttagtctgtaacac
+ttagcgttgagaccacgaacaattgattactcagtcttgaaggtgttttccaaagttcat
+tttaaataagactacgataggcctttcctattgatataaactacccggctctgttgttcg
+tgtgagtcgtacttctctgtgtttttctgattatagcaagattcgattcttagtgtaaac
+agcgatttttatttgacccgtcaatgagaagcgcataggatctaagcaaaattatcaagt
+tgtgccacaaggtaagatctttccagttattgcaggtaggatgtatcccacgttgatagt
+atgaggtctgacgtcaactgtctaggagagttgaccgcgtgcgggtacaccggatttgca
+tcgatgttgagaacgcagaactcccactgtcgtggcggcgttcctgatatttagcaagag
+gcgttgataaagccctcatcatctagatctcgacctcatctgccctcttgctccatcatt
+ttctacacagactactttcctatctacgttagtataattgctttctatcttagtatcatt
+tagagcttctccgtcaacaggttcgtgctattaaagttagtacgaaagggacaacttgta
+gcaacgcatttaatcggttttcgactacttcgcacaaaatcagataaagaagtttgtcat
+tctattagacattgaattgcgcaattgacttgtaccacttatgatcgaacactgaatcaa
+gactgtgattaactaaaatagacaagccactatatcaactaataaaaacgcccctggtgg
+tcgaacatagttgactacaggataattaattggactggagccattacattctctacaatc
+gtatcacttcccaagtagacaactttgaccttgtagtttcatgtacaaaaaaatgctttc
+gcaggagcacattggtagttcaatagtttcatgggaacctcttgagccgtcttctgtggg
+tgtgttcggatagtaggtactgataaagtcgtgtcgctttcgatgagagggaattcaccg
+gaaaacaccttggttaacaggatagtctatgtaaacttcgagacatgtttaagagttacc
+agcttaatccacggtgctctactagtatcatcagctgtcttgcctcgcctagaaatatgc
+attctatcgttatcctatcaacggttgccgtactgagcagccttattgtggaagagtaat
+atataaatgtagtcttgtctttacgaagcagacgtaagtaataatgacttggaataccaa
+aactaaacatagtggattatcatactcaagaactctccagataaataacagtttttacga
+tacgtcaccaatgagcttaaagattaggatcctcaaaactgatacaaacgctaattcatt
+tgttattggatccagtatcagttaaactgaatggagtgaagattgtagaatgttgttctg
+gcctcgcatggggtctaggtgatatacaatttctcatacttacacggtagtggaaatctg
+attctagcttcgtagctgactatactcaaggaaccactgctcaaggtaggagactagttc
+cgaccctacagtcaaagtggccgaagcttaaactatagactagttgttaaatgctgattt
+caagatatcatctatatacagtttggacaattatgtgtgcgaaactaaaattcatgctat
+tcagatggatttcacttatgccttagaaacagatattgcccgagctcaatcaacagtttt
+agccggaaacaatcgaagcatagggacaatgtatcttttcctaaattgccatgtgcagat
+ttctgagtgtcacgaagcgcataatagaatcttgtgttgcctcaactcgttgaaaagttt
+aaaacaatcgcagcagtctttttggggtctactgtgtgtttgcaaaataactgaaagaaa
+cgcttgaacaactctgaagtagctcgagtactcattaaagtgtaacacattagtgaatat
+cggccaatgaaccaaacgcttcccggtacgctatctctctcatcgggaggcgatgtgcag
+gttatctacgaaagcatccctttacgttgagagtgtcgatgcatgaacctcattgtaaca
+atagcccagcaaattctcatacgtgcctcagggtccgggcgtactcctccatggaagggc
+gcgcatctagtgttataccaactcgctttttaactactatgctgtagttctacaggcata
+gtggccagtattttctaacttctctggatagatgctctcactcctcatccatcacggctt
+cagtttacgtcttacttgcttgttcagcaacggatggaggcattaagtatcttcactgtt
+ccctaaaattgctgttcaatatcaaagtaaggacgatacagggaaagctcaagcacactc
+attgaatactgccccagttgcaacctcacttaatctgacaaaaataatgactactctaag
+tgttgcggaagcagtctcttccacgagcttgtctgtatcacttcgtataggcatgtaact
+cgatagacacgaacaccgagtgagaaactatattcttgcttccgtgtgtgtgacaccagg
+taattgatgcggatataagctggagatcactcacgcccacacaaggcgctgctacctctt
+tattccaatgtgtaagaatttgctaacttcatttctagaccgcagctttgcggtcataat
+ttcacggtacggacccttgggttagagacttgataacacacttcgcagtttccaccgcgc
+acatgttttagtggcttctaacatagaatttttgttgtgacataaagagtgcgtgggaga
+cttgcccgaccgttaagccataatcaattgaaagccccgtgagtcacatctaattggttg
+tactgcgcatttagctatcctttagctgactcgaagagattcgattcctaatataggtta
+attagatggctgccgcgcgaagtaaaacgtgaaaaacgtagtgcgcagatctgcataact
+cgcgcttaattacttatgagtagttccaagttcgctacgttatgagagagattggaatta
+agcaaatatgttttatggtgattttgggatgagaaggactgctaagtacggctactaaac
+aaatttctaaaaccgccatctaccttatcttggagacatttaagttgtatatgtcactag
+tctagcttttgtctgtgggacgcgttctcggaatgagggaaatgcaagagccgattcatc
+aaatgcttatctaagaaagtagtggactattacaccaagcacgaatgccagggaactgct
+ttcttgctcaggacctcgcgacaaggtaccccgcataagtcctagaattacatttggtca
+gcaatgctgacatttgaccgtgaaaacataattttaatcagaaggcagctcacccgcttg
+ctctagatcttatctttgtatgaatgtcagaatttactgcaatatccgttccgaatagtg
+agggcttagtatagttctctgtatacaggtcacatcaaactccccctgtcctagtacagc
+tctgagctttaattaattgcatacatttccttcaatcatcagatgaaaacaccgcgaatc
+atgctcttctcgtatagggcaagagaagcaacaaacaactagcccgactcacgttcatcc
+gccgtatccttgttcagttcttactccgtattaggtcagcgaaatctaatcagaataatc
+ggtcgcgtatcaaaattaaaatcccgcttgaggttgacaattaaaacgctgagcagttat
+cggctattagatagtggggtgaaagtaattggctggaattatgttaaaacgtgatattaa
+gctaaaatacgctacttgttgccgacctaattcagtcattcgatattcagttagagccaa
+gaataacaagcttgtataaattgaacggggtgcactaaacgatgtgttactctaatattc
+agcttggagtatacctgaaggcgaattcatgtatcggccaataataagacgttgaagatc
+acaatttggactagcaaaagaaggtgatttatgcgtggggattgagtccactgtacgagt
+acggtctctggaaaattataggttcagggaatataaggaagtaaagataattaccaagag
+atttttggtatcgctatgacccagaggtgttctaacgtctgttttgatccgcagaatttc
+tgcctcaatgcatatttgacggacttgaactagagcctctaaagttaaatggcgacgcaa
+ctgttcctaaacttcaattattactactctttttttcctagggtattgtagaggccagtg
+gacaaaataaatcaaatttaagatgtttcggacattaacatcccccgtagcatagaaatc
+atcagttatccaatctctcatcgagcttttacaatttctgctggcgctatggacagcata
+tgccgcgagacctccgcaagactcacttgatcactgtaagtatcttcattagaggttaga
+gcctatagttaagctgctgacctagtaaaattggtattttctaattttattgctcaagtt
+aaaggttagtgaagggataatgacgttatttttgaacaatgggttgtattcaattttata
+tcacgaatggaacccttcattcccggcataatactagacgacacgaacaagctccgatct
+atcagccaggcacgtgttaaggtttaattccggcaaaccaatgaagcatcaaaaggtgac
+ctgatgcaacttagggtcacgatgagtttttcaggactacttattacctattaataagtt
+aacatgagccttcataccccgtaagacaatacatactccaccaattagaattctgagcca
+tcttatctttttgtatcatcgaagggtatggccgaataggttaattagttactcctaacg
+tctctacaggcatgcatttgacgcaccttcgaaaatagtcaatctctcgccacacgcgtc
+tagtatgcagcatcaaaaatatagtccacggtttccggattaccaaacgcggcaaagaga
+aacattgtatcgacggagataacttaatacagaaggaaggggcatcttcgaatacggatg
+aataattctatctgtttattctgacatcttgttttcaggttaatcttacgcattcaaatg
+acgcctgccccatgcgtgcgcaattattttctaatattgacgagagcaatctcactcctt
+ttgggtctatttatgttttattgaggcacaagcctatacagaacaggtactattaaggcc
+gtgagtgtgagactcaaaccgtggaaacaaaggatgggttgttcttggtacaagttttag
+tgcatgtgggcaatccttaccaaaatcagatgctatccttaactttgggctgcatttaag
+atggcggttggaggcctgtgagaatcctgcgtgtcatctttaatgaccgaattcatccat
+gtagattcagatcacacactcattccttgatgttgtctaaacaaaagttgttgtggacgc
+attggagggagttaagtaacaacttgggatcgcatacttataaaaattatatgttaaact
+ttcacaaacgctgaagtccaaagtaactagcccaaacgcctcgagagtcactaggtatta
+atggtgtttgagttcctgtgaaatagtgttcgaaggtaaaatttatgtaccaaatcgaaa
+gaacacttaataaggcttgcttgcacggaggtatgatgtttactgactctacaaccctaa
+ttttccagtacgtacattcattccaataggttagttctcaaagtgctatacaggctcctc
+aattgatgatatgcttcagccgctctatggatattagctcattttatttaggaagcccgc
+ttagaggcttactatgagggaaatgccaaaatgtcatacttttcggtgtgtcccatatga
+caccgctttacatagaatttgaattaaaacgcgctctcccgttcactaccatacttggta
+ccgtgcgcatattacatatagatataggatcattttttaaagctgtactaggtttgatcg
+acaatcttatgctatactatatgatgtaaccctcataatcaataccgatcgtacgatcct
+agcataggtggcaagcgattttatgccgattattgtgttaaatagtctgtgagtgtgatt
+atcagggctacgttggtagaggggttgtatagacctcgcacacattgtgacatacttaac
+aatatacgaaaactgatataataaatccccttacccaaacaccaatcccgttgaatcaac
+taccataacgtctcccatataaattgcctacttgtttgcataaatctgaatacataacac
+cattgcaccttcttgtgttccaatcccgttaagattgccttgtcagatgatatgcaagaa
+caatagcatttgctagcaattattaacagctcttcgaattgcctccacataacgcgggag
+ggtatattttaatttggcaaatactaagtactgttggcgtcatatgctattaacggttgg
+atattaagttatgtcagccgtaagcaagagtgggcgaaatattttgttacccagtgagag
+cactcttagagtttggatacaataggccatatgttgacttaagaggacgtaactacgccg
+tacaccattgttcaaccgacttcttggcaaatagaatcgtattagcaatcttaagaatag
+agacacgttcgtgttagggtatactacaaatccgaaaatcttaagaggatcacctaaact
+gaaatttatacatatttcaacgtggatagatttaacataattcagccacctccaacctgg
+gagtaattttcagtagatttactagatgattagtggcccaacgcacttgactatataaga
+tctggggatcctaacctgacctatgagacaaaattggaaacgttaacagcccttatgtgt
+acaaagaaaagtaagttgttgctgttcaacagatgatagtcatgacgcgtaacttcacta
+tagtaaattgaaacaaatacgcaatttagacagaatggtacggtcatgaatgacagtaat
+tcgaagtgctagaccaacttaaaataggtaaacgtgcccgaaaccccccttaacagaaag
+ctgctatcatggtgcagtatcgacgtgttcagaaacttgtaacttttgagcaggtccgag
+cacatggaagtatatcacgtgtttctgaaccggcttatccctaagatatatccgtcgcaa
+actttcgatttagtcccacgtagagcccaagcgttgtgcgactccacgtgcatgcccaga
+aatacgagtttaaatttggttacatggttaattttgaccgaagcatcgcactttatgatt
+gataattggattcaatatgtcgccctatgcgaatgcaacatgatccacaatttggctata
+agacgtttaatccgtatcacactttgtttgcggctagtatagtaacgcccgtgcaccaag
+agtcagtaacaattataagtactccgcaggtacttcaaatataaaaactaatcaaacacg
+acccatatgatcatctgaagatatttggaactttctcgacaaccaccctcgtactcaata
+cttacactaatcgacaggcacacgcaacgtgtacagtcgcaccatattgagtcaagattt
+gcttagtggcgatgagcgtacacgcttatttctctagtcacaattagttatctacgagac
+atcacgagggagcaaataagcgatgttatggctacacataggcacgtatgaatatgatat
+aagccagttaaacagtcgaaccatcgagcaaattctcatgcaccaacccacacgttgagg
+cacaaagagtaagctgtttgaatgtaacttcttctgctgagcgggccccaacgtaaggat
+caactagaagagaaaactcggtattagtttaaatgcgtcacggagcatgagtgcatttca
+ctaagaatgtctgtgtaaccaatataacatctatttgttatctgattgcctacttatggc
+tttgcggtcgtggcgactaatgtctccaatccttttgaggtcggtaccaactccctttaa
+attacgctgtgcaggctcatgcactgcatacatatacggtagcaggtagggacctcacgc
+acccttattataatcaatagtagttatcagtcaacgaggcaggaatgctgaggtcgaggt
+gttggtatattttctatgtgccgtctaggcgactatcacgcattaccaggcgagatttaa
+gccaattttgaatatagtcaacgtaatttttactatgggttccaccgaaacgccttgcac
+aactaagaatcccataaaatatcgatatcaaataaaagattgtgtcaataccttcatata
+tattttttcggttgactaacgtgaactaaggttaggggttttgtatgtctatataggaaa
+cagtttcttttctgtcctactttagtaaagtcttcaagccttactccaaaatcacggtga
+ttaagccgttactcagcagcatgattctgcctgctcgggtcctaaaatccagccttgtaa
+gagtcgctgtgtattagctagggagacctttgttaaaaaggatatatcgcggcgggatgt
+gagtgcgtggcgcatactcaatcttcagctcgtgtcattataatatctctcccccacgct
+tttcactagatatgccgtgtaagcaaacaccttatgcttaatttcgaaaatattggtact
+tgaaaaaagctgtaggggtacttaatgtctggtaggagatcaggagagaattgagtgtaa
+aaccgtaaagccctcacctgacttcatgtaaatggcttagaagactccatgatttaataa
+atactacgaaggaaagactggatctaaagataactctagtaaggccaactcccttcaatg
+ctgttgccagttataatccaagagctgtccttttctgaaccatagcggcttctgaagcga
+actagaagcaaagttggttctagccagacagccacataccctgtacgggtgtattactaa
+aactggtccggtattagttcaccaagggaggaattaggcaaaggatctaggtatgcaagt
+cggagtattacatccctaccctgaatccatcaataggttcctctgtactggccttcgcaa
+tgagtattcaaggttgtacagccgtataataataagatagtgactatgaacgggaagtaa
+cccgctcaccttccccaaaacattgttatatctaagtattaaagtctgccgtagtgttaa
+tactcgaaaataaacaactggcaaattacaccgcacttaagccgcttttgatttatattt
+ttccaatgcgcttttaaaaataattcagtcctacatactaattaagacccttaaacggag
+atatcacaagttaagttttaaccatctcgactaggtggaactatagatacccaactcaat
+ttatcattacctgtaatgttcctagaaggattgcatttcatgtcaagacggtggagtttc
+acagcgaaacttcagtgtgaacagattctgagaaatcacctaaacctattagtcagagca
+cccggttagaaccagttgtcaaaaaatagagcggttgcatgagacagaagtaacgatgag
+atccgttgtaacgttgagacatctggcctatcgtcaatacagtcctcccttaaaaatatt
+tttaaatactaggcaaacccaacataggttagtcctatgtgatacgccacatggtatatc
+attttgtaacgttacctagggataatcaggaagtggaattacgcaaaagtagacagtgaa
+atgcttagggttatagtctagtccaaagataaaggataaagcacgtcagagaactatatt
+agccgaatgggaatcattgttaggagactgtggatcatgtctaaaaagcaacgcagaaac
+agtcatcgaaaaaatctcgtttttgtttgaatctaaaagagctttgatgaccgatagtac
+ctgtatactagttactgtattacgtgtctaatgatttcggattggggtccccagaatcag
+acgtcattgtagacgattcaagtttaccaatttaatttcccagctctccttggagaacta
+tcgccaataattgcagtcactttccttttctgaaacgataaagccgtcagagttctctgc
+aacgttggacttacctgaggttctaacccactttcggttctaatagtagttaacgacaca
+acgaataacctttactgtggggctttcacgatattttttcgcttattattaatggttacg
+tcataagctggtgtccaaattaaggttaccggcttcgcagagtagttgtatccaagtata
+acttccctaatcataagatcgaggtagaaaattaatgctgtctctaaccgaacagatatg
+tcccactatgtggtatggacgttgctaattacttctgaagggaaattggtcattatggat
+acgtgtctaccatcaggtcggacgcagatatggttctgtcttcagttgatccaccgttct
+ttataggataataactgacgattaaagattatggtaaatagattaagccaattctcttct
+tgtcagtgaagcatccttaactgacttgctctgcagcccctcatacatttagctattcaa
+agtaccggctcgtttcaaactctcccacctttggaagaggttgtcaacttgataagtata
+tcatttacagcattttttcggacgtacctctaatgtttcattgcagaaaattagtttttt
+ctatcgcacattttgcaagtaacgttagagacacaattatctgcgaatgaactgctagat
+ctgacgaccgggagcctcgcaaatatcaaaaaagactgacatatatcaaggagtcgttga
+caagtgctggtaagtcaattggtttatctgtcccggcgtttcgatcttaagctgaccatg
+cacggcagagtaatgtcactctcgttcttacaagtctgtctccaagggtcggcaaaaaag
+acccctccattctcgagcccactcacgatatgtagggacgacaacttgtgcggcttatga
+attgtctggactgcgggcgagggtccatatctccgaagttagaagggacatacctttaga
+tgataagatcaattcttattgacgaaattcatccacaacggggaacaacttcaccctaga
+cttacgtctgaaaagacacctagcgtcttataaaaggtcagtgccccgtttcgtaaggct
+ggaattacctacgcaaacttaaacctcgcgcccttccttacgtatcgacaagatagaggc
+tatcgcgaatgtactacggaggcatgaatcatatactagaaccaagtgcctgtgatatta
+acaagatgatccgacgcgagcaccgtaattctaggcataaaactccagcaatttgggggc
+cgaaaacaaatgacgttagctaattaattatatgacatgatcaaaggaggtcaatcacgc
+atcgagttcgacgtatattcattgaacttcgtgcgtttgaaagaaacttttatgaaggca
+aaattgatcctgtctcctatttcatgcgtacctcctagttgataattccccgagcagtgg
+ttaggacacttttgtcggtatcaagttccggtctcaaaacgtaaaattctgtaatctgta
+tggatggtctgtgaattagttaatttttatgaagtcgtcgagacgcagttcctattgatt
+tattctaaacggagatgtgcttcgtgggactcggaagtagatctgtgtttatgattattg
+ctactttagatgctgactgttaactccgtgttgtttttcaaccgtatatcacaaccgaat
+tggatagaacctatagtttcaagttctgccacaaggtatcatatttacagttagtgctgg
+ttgcttctttcaaacgtggtgagtttgtgctatcacgtcaacggtagagctcagtggacc
+gagtgcgcgttcaaccctgttccagagagggtgtgatagcacatataccacgctcgtcga
+ggcgttcatgatagtttgcaagagccggtgttaaacacatattattattgttatccaact
+aatcggacctatgcataaagcattgtctaaacagaataattgcctatatacggtagtttt
+agtgatttatatcttagtatcagttagagcttcgaactcttcaggttcctcatatttaac
+gttcttcgaaagcgaaaacttctacaaacgaatgtaagcggttttccaagtagtacctat
+aaatcacagaaagatctgtctcagtatagttgaaatggtattcagctagtgacgtgtacc
+aattatcatagttcactcaagcaagacgctcattaacgaatatagacaagacactatatc
+atataataaaaaagaacatggtgctcgaacatagttgaattcaccatattgaaggggaat
+gctgacatgtaattcgctactagacgatcaattccctacttgtcaaagttgaactggtac
+gttcttggaattaaatatgattgcgctggaccaaattgcgacttcttgagtttcagggca
+aacgattgagccggaggatgtccgtctcttacctttcttgcttatgataaacgacggtcc
+ctgtacatcactgggaattctcagcaaaaataattgggtaaatcgagactcgatgtattc
+ggccacaaaggtgttagacgttaaagattattcaacggggcgataataggatcataaccg
+gtatgcaagcgcattgaaagagccatgagatccttatccgataaacgctgcacggtatgt
+gcagccttattgtcgatcacgaatttataaatgtagtctgggctgtaagttgaagaccta
+agttataatgaagtgcaataccaaatcgattcatagtggattatcagactcaagatatct
+cctgataaattacagttgttaagatacggataaaatgagatttaagattagcagcctcta
+atctgtttcaatcccgttggaatgtggtatgcgatcaaggttaagttaaaatcaagcctg
+tcttcagtcttgattcttgttctgccatcgcatgcggtctacgtgagttaatatgtagct
+tacgttctagcttgtgctaatctgagtatagattcgtagaggaatattatcaagcttcca
+cgcctcaacgtacgtgtattggtcacacaagacactaaaagtggaagtagcgtaaactat
+agtctagttgttaaatgctcagttcttgttatattcgatatactcttggctaatttatgt
+ctgagtatataaaattaatgatattaacttgcatttcacggatcccttagaaaaagattt
+tgaccgagcgcattataaacggttacaccgaatcaatagaagcatacccaatagctttct
+ttgaatttattgcctgcgcaacttggctgactctctagatccgaataattctatatggtc
+gtgacgaaactagttcattactgtttaaaatgccaacatgtcttttgggccgataatggc
+tctttgcaaaattactcaatgatacgattgatcaaagcggtagttgctagtggtagcatg
+taagtctatcaaatgtctgattatccgaaaatcttccaaaagagtccacgtaccatatct
+atctcatagcgacgcgaggggaaccttatctaactatcattccatttaccgggtgactct
+cgatgcaggatccgattgggataaattgcccagaaatggctcattcctgactaagggtaa
+ggccgttctcagcaagggaaccccgcgaatctaggcttataccatctagattgttaacta
+cttgcctgtagttctacagccatactggacagttgtttctaaatgatcgggattcatgct
+agcactcctctgaatgcaccgcgtaagtttaactattacgtccgtgggcagataaggatg
+gaggctgtatgtatcttaactgttacctaatatggctggtaattatcaaagtaaggacct
+taatgccatagcgctagcaatcgctttgtatactgaccatgtgccaacctctcttaatct
+gtaaaatataatgtcttagctaactgtggacgatcatgtctctgcctagagcttcgctgt
+atcaattcctatagccagcgtactagtgacacaacaacaccgtgtgagaaaagatattag
+tccttacgtctgtctctctacagcttattgatgaggattgaacatggacatatagctccc
+cctcaaaagcagatgctacctctttattccattctcgaacatttgccgaacttaatttcg
+acaaacctgaggtcacgtcttaatttatcggtaacgtcacgtccctttgagactggataa
+atatattaccaggggccaacgagcaattgttggaggcgcttctataatacaaggtgtctt
+gtcaaagaaagacggcgtgcgtctcgtgcaactcacttaaccaatattaatgtgaaaccc
+ccctctctcacatcttatgcggtgtactgccctggtacatttcctgtacaggactccaac
+agtgtagattcctaagatagctgttggagttgcctcacgccagatcgaaaaactgaataa
+actagtgagctgagctgcagaaataccgcttaattacttatgactagttcaaagggacct
+acgtgatgtcagacattgcaaggaagaaattaggtttgtgcgtcattttggctggactag
+cactccttacttcccctactattcaaatgtcgtaaacagcatgagacaggatcgtgctga
+catttaaggtctattgggaacgaggctacctttggtcgcgcgctcgcgttctccgaatga
+ccgaaatgcatgagcacagtatgcaattgcttatagatctaaggtctggtcgttgaaacc
+aagcacgtaggcctgggaaatcagttcttcctcagcaactacacaaaagcgtccaagcat
+tagtacttgtagtaaatgtccgaacctatgcgctcatttgaaagtcaaaaaatattttta
+agcagtaggcacctaacccgattcctctacttagtagctttctttgattctcagaattga
+ctgcaatatcactgcacaattctgtgccattactagacttctctgtattaacgtctcatc
+ttactaacactcgcctaggacacatctgagagtgaagtatttcaatacatttactgaaat
+cttcagttctaaaatccccgaataaggctcttatcggtttggccaacacaagaaaaaaac
+ttcttgcaccactcaccttcatacgcaggagcctggggaacttagtaataactatttcgg
+cagacaaagcttataacaagttgccggcgcgtataatatttaaaagaccccttgagctgc
+tcaattaaaacgctcacctggtataggctattagatagtgccgtcttagtaaggggcggg
+aattatcggataaactgatattttgataaaataaccgacttgttcacgacataagtcact
+aaggagattttatctttctccaaagtatatcttccttggataatttcaaagcgctgcaat
+ttaagttctgttactagtttatgctgctgggaggtgaccggaaggcgtagtaatctagag
+gcaaattataagaagttcatcatatcattttcgactacaaaaacaaggtgttgtatgccg
+gcgcattgtgtaaactggacgagtaccctagatggaaaattatacgttaagccaagattt
+cgatgtaatgataattacctacacatttttgctatccataggaacaagagctgttctata
+ggctcgtggcatacgaacatttgctgccgctatgaatattggaagctcttcaactacaga
+ctctattcttaattgccgtcgaaaatgggccgaatcggctattattaatactcggttttt
+ccgaggggattgttgtcgacagtcgtaattattattaatattgatgttggtgaggtcatt
+taaatacaaccttgcagacaatgaataagggatccaatctctcatactccttttacaatt
+gctcatgcccctatgcaaaccttatgccgccacacctccgcaactctctcttctgaactg
+taagtagcttcattactggtttgagactatactgaagctgatgacattctaaaatggcta
+ttttcgaatgtgattcataatgtttatcgtttgggatggcagaatcacgttatttttgat
+atagcccgggtattctattgtatagaacgtatgctacaagtcattccccgaagaagacta
+gaagtaaacaacatgcgaccatcgttaagccacgcaaggctgtagctttatttcccgata
+acctatcttccataaatagcggacagcaggatactgacgctcaacatcagtggttatggt
+ctaatttttaacttttaataaggtaacttcagcaggcatacacagtaactctttaattta
+taatcaaattagaagtctgacacttcttatatttttctatcatccaacgcgatcgcccat
+tagcttattgtgttactaataacgtatctaaaccaatccttttcaagctactgcctatat
+tgtcaatatatacaaacaacaggatagtaggctgcttaaaaaatattgtcaaccgtgtac
+gctttacaatacccggaaatcacaaactttgtagacaacgagtgaaatttatacactacg
+aagggccagcgtacaagacccatgaattaggcgatatgtttattctgacatattggttta
+tccttaatctgtcgctgtaaaatgaagccgcccccatccctgcgaattttttttcgaaga
+ttcacgactgaaatataaatacgtttggctatatttatgttggagggaggcaatagcctt
+tactgttaaccgaagatttagccagtgagtgtgacactaaaacactggaataaatgcagg
+cgttcttctgggtaaaaggtttagtcaatctcgcctataagttcatatagctctggatat
+aattatctggcccatgcatttatcatggcgcttggtgccctgtgtgaagccggcctctca
+tattgaaggtccgaagtattccatgtacattaagatcactctctcattcatgcatcttgg
+cttaacaaatctggttgtccaagctttccaggcacgtatggtacaaattcggatcgaata
+cttataaaaatgatatgttaaactgtctaaaacgctcatctacaaagtaaagtgcactaa
+ccaatagagtctcaagaccgtgtaatgctggtgcactgaatgtgtaatacggttagaagg
+gattagttatgttacaaatccattgaaaacttaagaagcattgcgtgctcggagggtgca
+tcttttatcaagagactaacattattttcaacgacgtacatgctttacaatagggtactt
+atcaaacgccgagaaacgcgcctatagtgatgttatgattatgacccgatatccattgga
+ccgaattttatgtaggttcccagcgtactcgcgtaatatctcggtattgccataatgtaa
+tacttgtcggtctctcccagatgaaaaagcgttacagagtatttcaatgaaaaacagcgc
+gcaacgtcaatacctttaggggtaacggccgctgatttcatatagatatacgataagttg
+gtatagctctactaggtggcatccacaatcgttgcatttactatagctggttacaatcat
+aatctataccgttccttacatactaccatagcgggatagcgtttttttgccgttgattgg
+gtttaagaggatgtcagtctcattatatccgattcggtgggagagccgttgttttcaaat
+cgcacactttgtgacataatgtacaagataacaaaactgatataagatataaactgtcaa
+tatcaccttgacacttgaatcaaagtaaattaactcgcaaatataatttgactaattggg
+tgcagatttctcaattaataaaaaaatggcaccggatgggcttacaagccccttatcatt
+cacttgtatcatgatttccaagaacaatagaatttgctagcaagtatgaacagagattcg
+aattgcatccacagtacgccggagcgtttattttaatgtggatatgacgatgtactgttg
+gcggcatttgctagtaaccggtccttatttacgtagcgcacacgtaagcatgtctgggag
+aaatatggtggtacaatctcagagaaagattacagtttggtttaaataggacttatcggg
+tcggaagtggaacttaataagcagtacacaattgggcaacagacgtcttgcctattacaa
+taggattacaatgcgttagatttcagacacgttcgtgtttggctattcgtcaattcccta
+aatagttagacgatcaactattatcaaagtgattctttgttcatcctccattcatgtaac
+agatggcacactacgcataacgccgaggaattttaacgagatttaagagagcagttcggg
+cacaacccacttgactttataacagctcggcagcataaacggtaatatgtgacaaatttc
+caaacgttataagaacgtatgtgtacttagaaaactaagtggttcatgttcaacagatgt
+gacgcagcaagcctaacttatctattggttttgctataaaagaacaaagttacacagaat
+cctaagggcttgtttcacacttatgcctagtgcttcaccatcttaaaatagcgaaaccgg
+cacgaatcaaaccttaaaacaatgcgcagatattggtgatggtgactccgggtatgataa
+tggtaactgttgaccagcgcccacctcatcgaagtatagaaagtggttaggataaggatg
+agaccgaacttatttccggccataactttagattttctacctagtacacaacatcagggc
+ggacacgaaaccgccatcacatcatataccaggtttaatttgcttaatgggggaagtgtc
+aacgaaccttcgaactttagcaggcatatggccattatatatggccccagagcagaatgc
+tacagcagacaaaatttggatttatgtagtttaatacctatcaaacttggtgtgaccata
+cttgtctaacgacagtgcacaaagtgtaagttacaattattactactcagcagcttctgc
+aatgataaaatcttatcatacacgtcacatatgataatatctacttagggggaacgggct
+ccacaacctacatagtactcaatacttacactattcgacaggcacaccaaacctgtacag
+tcccaaaagattgagtcaactttgcagtactgcagatcacagtaatagcttagttagcga
+gtcaaaattagttttctacgagactgcacgaccgtgcaaatttccgatgtgttggctaca
+aatagcaacgtatgaatttgtttgaagccacgtaaactgtacaaccttagagataagtct
+caggctactaaaaacacgttgtggcactaacaggatcatggttgattcttacttattcgg
+ctgaccggcccaataagtaaccttcaactagaacagaataatcgggagtagtttaattca
+gtcaaggtgcaggtctcattgtaactaacaagctctgtgtaaccaagttaaaatcgtttt
+cttagcggattccctacttatggatttgagctcgtccacaatattcgatacaagaagttt
+gtggtccgtaacaacgaaattttaattacgctgtgcagcctcatccaaggaattaataga
+aggttgatggtaggctccgaacgctccatgattataatcaagtggactgtgcagtaaacg
+aggaaggtatcctgacgtcgtggtgttcgtttttgttatttgtgccctatacgagtagat
+aaaccatgaacagcacagtgtgaacccatggttgattttaggctaccttatttttaattt
+ccgttacacagaaacgaattccacaactaacatgccattaatttttcgatatcttataaa
+agatggtcgaaattcattcatttattttttttcggttctcgaaagtcaactaagctgtcg
+cgttttgtttctctttagaggtaaaagtggctttgatctcctacgtttggatactagtca
+accattactccatttgatccgtgagtatcacctgtctaacatccagcattatgactcctc
+ggcgaagaaaagacacacttcttagagtcgatgtgtattagctagggacacagttgttta
+atacgatagtgagcccagggagggcagtgcgtcccccagtagatttattcagctagtgta
+agtataagatatctcacccacgaggttcaagtgatatgcagtcttagaataatacttatc
+ctgaatttcgatattatgggtacttcaataatccgctagcgctactttatgtctcgttgg
+acagcaggacacatggcagtcttaaacactaaagacatcacctgaatgaatgtaatggga
+ttacaagaatcaatgaggtattatatacgacgtaggaaactctggatatatacagtaatc
+tagttacgccatcgcacttcattcctctggaaacttagaagacatcagctgtacgtggag
+gaaccagacccccgtatgtagccaaatagaaccaaagttgcttatacaaacacacccaat
+gacaatggaccgctggagttcgtaaactcggaacgtagtactgcacaaacccagcattta
+gcaataggagctacgtatgcaactcccacgtggtaataccttcaagctatcaatatatag
+gtgcctagctaatcgcattcgcaagcagtattcaagcttgtaaaccagtataataattac
+agaggctctatgaaacccaactttccagctaaaagtcccaattaaatggttatttcgtac
+ttttaaagtcgcccgttctgttattacgcgaattgattctactccaaaattaaacacaaa
+ttatcaaccgtttcatttatatttgtcaatgcagctgtttaaaataaggctctactaaat
+tataattaagacacttattaccagatttctctagttaagtttgaaccagctcgactaccg
+cgaaagatacattcccttctctatttttcagttcatctatgggtcagagaagcattgaat
+ttattctattcaccctcgtcgttcacagcgaatcgtcagtgtgatcagtgtatgagaaat
+atcctaaaccgtttagtcagaccacacgcttagaacaagtggtctaaaaagactgccctg
+gaaggagtaagaagtatacagctgatccggtgtatccttcagtcatctgccctatactaa
+ttacacgacgcaaggaaaaataggtttattttctaggcaaacccttcataggtgactccg
+atgtgttacgaatcatgcttgagaatgtgctatcgttaccgacggataataacgatctcc
+aatgaaccaaatgtagaatgtctattgattacccttttactattcgacttagagatagga
+gatagaacctcagtgtacttttttagccgaatgggaatctttgggaggtgaatggccata
+aggtcgtaaatccaaccctcttaaagtcttccatattatatcgttgttcgtggaatcgat
+aacagatttgttgacccatagtaaatgtatactagtttatgttgtaagtgtagattgttt
+tccgattgccgtccaaactttatgtcgtaattgtagaccagtaaagttgaccaaggtaag
+tgcccagcgatcctgcgagatcgatcgccaatttttccagtcactgtaagtgtaggttta
+gataaagccgtatgagttatatcataagggcctcggaaagcagcttcgaaccaaagttcc
+cttataatagtagtttaactataaaagtatatactggtctgtcgccctttcacgatttgt
+tttaccggtttatgaagcgttacgtcattagagcggctccaatttaaggttaacggcttc
+catgtgtagttgtatacaaggataacttaaagtatctgttcagcgagctagttaagttat
+cctcgatagaacacaactcagaggtcccaagatcgggtttgcaacttgctaatttattct
+caaggcaaattgggaattatcgatacctgtataccataaggtcgctcgatgtgatgctta
+tgtcttctggtgatcctaccttagttagtgctgattaacggaacattaatgtttatcgtt
+ttgagatttagccaattctctgattctaactcaagatgccttatctgacgtgctatgcag
+cccctaagtattttacattgtaataggacacgctcctttaaaactcgccaaaaggtcgtt
+gtggttctctactggttaactatataatttacagctttgttgagctagttcctctttggt
+ttaagtcctcaatattagttggttcgagcgataagttggctagttaccttagtcactata
+ttagatccgaatgttatgcttcatctgaagaccgccaccctccaaaatttcttttaagac
+tcacttattgcaaggtgtaggtgaattcggctcgtttctcaagtggtgtatctgtacacg
+agtttccatattttcatcaacagccaccgcacacttatgtcactctaggtattaaaagtc
+gctctacaaggggacgcaattaagaaacagacatgctagtcaaaaataaacatagcgagg
+caccactaattcggccgcttatcaatgggatgctctgcgcgagacgcgccagagctcagt
+agttagttcggacatacatttacttcagatgatcaattagttttctacaaatgcttactc
+taccccgaaaaaagtcaccagactcttacgtctctttagtatccttccgtcttatataag
+gtcagtcccccgtttcggtaccctggaatttactaagaataatgaaacagcccccaagga
+cgtacgtttacaaatgatagaccagatcgcctagcttattccgacgcatgttgcatagaa
+ttgaaccaacggaatgtgagagtaactagatgagccgaccacagcacccgtttgcgtcgc
+agaatacgcctgatagttcggccacgaaatcatatgtcctttgagtattaagtatttgta
+atgatcaatcgagctcaagcaagcttacacttcctcggatattcagggaacttagtgcct
+ttgaaagatacgttgatcaacgaaaaattgataatggctcatatggaatgcctacctcat
+agtgctgaattaacacagcactgcggacctaacttttcgaggtttcaagttcacgtctca
+aaacctaataggctggaatatgtagggatcctcggtgaatttgtgattgggtttgttgta
+gtactgaccaagtgaatattctttttttctaaaagcagatctgctgccgggcactacgaa
+ggagatctctgtgtatcattattgcttcttgacatgatgactcttaaatcactgtgggtg
+tgcaaaacgatagcacaacccaattcgatagtacatattgttgatacttcgcactaaacc
+gttcatatttaaaggttgtgctccttccttcgttaaatactggtgacttggtcctatcta
+ctattagctagacctctggggaaccacgcccccgtaaaacctgtgcaagagagggggtca
+tacatcttagacatcgcgcctccaccagggaagcattgggtgattgaccaggtgtgtaac
+aaatatgattattcttatactaatattagcaaagatgcataatgatttgtattaaatgta
+taattgaattgataagggtcttttagtcagtgatagagtagtataaggtagacattagaa
+ctcttaaccggacgcagatttttcggtcttagtaagccaattagtcgacaaaacaaggta
+agagcggttactagtagtacctataatgcactgaatcttcggtcgaagtatagttctaat
+gctatgcagattgtgacggcgacaaatgttcagacttatatcatgaaacaagctcttgta
+agtattgacaaatgaaaagattgaatatttttaaatacaaaatgcgcctacttattaggg
+gaattaaccagattgaaggccaatcctcacatgtaatgagataatagacgataaatgaaa
+ttcttgtaatagttgaactgctacgtgatgggtattatatatgattgagatcctccaatt
+gccgacgtcttgtcttgatgcccaaaagattgtcaacgaggagctccctcgcgtacctgt
+cgtccgtatcataaacgacgcgacatgtacagcactccgaagtataagcaataataatgc
+gggtaatccagactagatcttttcggactcaatgcggtttcacggtaaacatgattaata
+ccggagagtagtcgagcttatcagcgatgcaagcgaattcattgtgccaggagatacgtt
+gcagataaaaccggcaacgtatgtcaacaagttttggcgatctcgttgtttgtattcgac
+gaggcgcgggaacttcaagaactatcgtatattcaagtccattaccttttagtttcagac
+tggtggagctgactaaagttatatcatcattttgtacactggtttagttaacgataattt
+cagatttaacatgaccagacgataatcgctgtatatccagttggaatgtggtttgccaga
+aaggttaacttataatcaagcctctcttcagtcttgattcgtcgtatcccatccattgcg
+ctatacctcagtgtatttggagctgtagttataccgtgtgctaagatcagtagacatgac
+gagagcaatattatctaccttacaagcatcaacggacgtctagtcggaacaaaagactct
+aaaactcgaacttcaggttaatatactatagttctgtattcagcagttattcttatattc
+gatattatcttgcctattggatgtctgactttagtatattaatcatagtatctgccatgt
+aaaggtgccagtactaaatctgtttcacagtgcgaattataaacggttacaaccattaaa
+gacaacaagaccctatagctttatttgaattttgtcaatgcgcaacttggagctcgcgat
+acatcccaattagtctatagggtcgggacgattctacggcatttctggttataatgacaa
+catggattgtggcccgagaatcgctctttcattaattaagcaatcattacagtcttataa
+gcgctacttccgagtggtagcaggtaactcgatataaggtcgcatgagccgaatagctta
+aaaaacaggccaccgaacattgatagagaataccgaccacagcgcaacctttgattactt
+tcattaaattgtacggctcactcgacatcaagcttaagattgcgataatgtgaactcaaa
+tggatcagtactgaagaaccgtaacccacttcgcagaaagcgtacccagagaagatacgc
+tgttacaatatacagggtgaaattattgcctgttcttcgtaaccatttcgccaaacttgg
+ttagaaatgatagccattcatgatagaaataagctgaatgataccagtatctttaactat
+gtagtcagggggaagataacgatggtccatgtatgtttctgatatgtgacagtattggcc
+gcgtaatttgctaacgaagctacttaatgcctttgagcttcatatagatttctttaatca
+aaatcggcaaaaagatagtatgagctataatatatgctagtagagaactctggaccatca
+tctatatgaatactgattcgagcgtgcaattactttagcctgcgtactactgactctaca
+aaacactctgagataagtttgtagtcagtaagtcgctctctataaaccttttggatgacc
+attgtacagccacttatagatcccaataaatagcacaggagacagagtttttcaatgctc
+gatcatttgccgatagtattttcgtctaacctcagggcacctattatttgatacctaacc
+taacggccctttcacaatggagaaatatatgacatcgggacaaacacaaatggtgggtgg
+ccaggagatatgacatggtggcgtctctaagaaacacggactccctctaggcaaactcac
+gtaaccaattttaatgtcaaacaaaacgctcgaaaagattttgccgtgtaatgacctggt
+acattgactggtcaggaatacatcactgtagttgccgtagtgtcctgttggtgttccatc
+aagacacatcgtataacgcaatttacgacggacatcagatcaagttatacagattattta
+agtatcacgtgtgcattgggacataagggatctcacacatgccttggaacatttttgctt
+tgtgccgctttttcgctgcactaccaatccttacttaccagtatattcaaaggtcgttaa
+cagaatgagaaaggttagggctctaagttatcgtcgattgggatagacgagacatttgcg
+agcgccctccacggatacgaatctcccatatcaatgtgaactggatgctatgcagtttag
+ttcttacgtctcctagtggtaaaaatcaaagtagcactcgcatagcagttattcagaacc
+taatacacaaaaccgtcaaacattttctaattctaggtatgggccgatcataggagctaa
+ggtgaaactcataaatgttttgttagatctagcatcctaaaaagatgcatatactgagta
+gctggcgtgcattctctcaattgtatcctttttaactgaactagtcggtcccatttcgtg
+actgagatctattaaccgataagattaataacactcgcattcgtatcagctcagagtgaa
+gtttttcaataatttgactgatatattaacttctaaaataaccctttaagcctcggatcc
+gtttcccaatcacatcaaaaattcttattccaactatctacggattaacaacgtgcatgg
+ggatcgtagtaagaacttgttccgatcactttgagtatatcaagttgacggcccggttat
+tattgaatagaaacattcacctgctaaattaaataccgcacatcggatacccgatttcag
+agggccgtcttactaagggcaggctttgttcggtttaactgagatgttcattattttaca
+gtatgcttcaactaatatgtaacgaaggacagtggatctgtctccatagtagatcttcag
+tcgtgaatttcataccgctcctatttaagttcgcgttcgagttgttgatcatggcacgtg
+aaagcaacccctagtattctagacgaaaattttttctagttcatctgataatttgccaat
+tcaaaaacaaccgctggtttcccggcgcattctctaaaatggaagtcgaacctagagcca
+ttatttgtcggtaacccatgagttccttcttttcagaagttaatacactgtggtcctata
+cagaggaaaaacagcggttatatacgatcgtggcataacaacattggatcaagatagcaa
+tttggctacctattctaattctcactagattcggtattccactacaatatcggcagatta
+ggattggatgaataatcggtgtttaagtccggttgcgtctccaatctcctaatttttatt
+aatattgatcttggtgacctattgtaaataaaaacttcaagactttgaataacggtgaaa
+agatagaagactcatttgaaaatggatcatccacagatccaaacattagcaagacactaa
+tccccaactagctattctgatcgcgatcgtgctgcagtactcctgtcacaatagtctgtt
+catgatctaattctttttgggctttgttcgatggtgattcagaatctttatccggtcgct
+tccctgtagctactttgtggggatattgcccggggattatagggttgagatcgtttccta
+aaagtatttaaaccaagtagacttcaactaaactacatcagaacatcgtgaagacaccat
+acgcggtacctttatttaccgataacatttcttcaagaaataccggtaagcagcataatg
+accctaaacagctcggggtatcgtcgtagttttaaattttatttaggttactgctcaagg
+aataaaaactaactatttaatttataataatattacaaggctcacactgattagatttgt
+ctataagacttcgcgatcccccattaccggattgtcttaagaataaactagataaaccat
+gcattttctagataaggcctttagtctaattagatacaaaaaacacgatagttgcatcct
+taatttattgtgtcaaacctggaaccttttaattacccgcaaatcactttatgtcgagac
+tacctctgaaatttattatctacctaccgcatgaggacttgaaccatcttgtaggagtta
+tgtttattagctaagattcgtttatcctgtagcggtccatgtatattcaacaagcaaaaa
+gcactcagaattgtttttagttgagtcaagactgatatataaataagtttccctagtttt
+ttcgtggtgggacgatattgaattgaatcttaaccgaagagtttcccactctgtcgcaca
+ataatacacgccaatatttccagccctgcttatgccttaatcggttactcaatctcccat
+tgaagttcattttgatctgcatagaagtttcgggcccagccttttttctgccaccttcct
+ccaagctctgtagacgcactctaagattgatgctcacatgtattaattctacattaacat
+aaatatataagtcatgcatcttcgagtaaaatatctggttctccaacatgtcctggcacg
+tatcgttataatgcccatacatgtagtattaaaatgattgggttaactggatattaagat
+catcgaaattgtaaagtcaaattaacaatactgtctcaagaccgtgtattcctcgtgctc
+ggaagggctattacgcttacttccgttttggtatcttaatatgactttcaaaaattaagt
+tgcagtgagtcctacctgcgtgcatcggttagcaagagtataaaagttgtttaaacgaac
+tacttgctttacaataccggtcgtatatatcgccgtgaatccagaagattgtcttctttg
+gattatcaaccgagatcctgtggaccgatgttttgggaccttcacagaggactccaggta
+gagctcgcttttgcattaatctaagaattgtacctctctaaaagatctaaaacagtgaat
+gtgtatttcatggaaaaacacagagaaacgtaaattactttaggccgaaaggcacatgag
+ttattatacatatacgagatggtggtatacatcgaattcggggcatacactatagttgca
+ttgtatttagctgctttaaataatatgatattaccttccttacataagacattaccggca
+taccctggttttcaacttgtggggctttttgacgatcgcactctcatttgatccgagtag
+ggcggtgacccctgcttttcaaatacaaaaatttcgctatgaaggtaatagattactttt
+cgctgttatgatagaaacggtaaatttaaaattgaaacttctagaaaagtaaagtaacga
+gaaatgattttgtgaataatgcggtcatgattgcgcaagtaagaaaaaaaggcaaaagga
+tgcgcggaatagaaacttatcagtcacgggtatcttgatttcattcttcttgtcaattgc
+cgacataggatgaaatcagattccaatgcaatacacagtaacccccacccttgattgtaa
+tgtcgatttgaagttgtacgcgtcgacgaagtggatagtatacgggccttttgtacggtg
+cgatcaactatgaatctcggcgagttagatggtcgtacaatctcacacatagaggtcact
+tgcctgtaatgacgaattttcggctaggtactcgaactttattagaagtaaaaatgtggg
+caaaagaaggattccattttacaagacgattacaatgagttacatgtctctcaacgtagt
+ctttccctagtagtctttgaactatttaggtactccagaaaattttagcaaagggtttct
+gtgtgaatccgccattcatgtttatgatggaacaataagaataacgccctcgtatgttat
+cgacagtgaagtcagcagttcggccaaaaacatattcaatttagtacagatccccagaag
+ttaagctaagtgctctaaaatggcctaaacggttatcaaagtaggtctaattactatact
+aacgggtgcatcgtaataactgctgtcgatgcaacactatatgatagtgtcgttttgcta
+tatatgtacaatgtgacaaagaagccttagcgattcttgcaaacttaggacttcggattc
+tcaatcttaaatgtccgaaaacgcaaagattcaaaaatttaatctatgagcagatatgcc
+tgatggtgactacgcgtatgttaaggctaaatgttgacaaccgcacacataatcgaacta
+ttgatagtcgggagcataaccaggtgaacgtactttgttcacgacatttattgacatgtt
+ctaaatacgtctcaaaatcacggcgcactagaaaacgcaatcaaatcattgtcctggttt
+aagggccgtaatgccggtagtgtcaaacttcatgagaactttagctggcttttggccagt
+atttagggaccaagagcactagccttaagctgaatattttgccatttatctactgttata
+actttaaaacttggtggcaccagacttgtcgatacacacgcatcaatctgtaacgtaaaa
+ggtttactaagaacaagcgtaggaattgagtttatattatatttaaactaaaagatgata
+ttagcttctgagggcgatagggctccaaatcataaagaggaatatattattacacgatta
+gaaacccacaacatacctcgaatcgcccaaaagtttgacgaaacttggcagtactccaca
+tctcagtaatacagttgggagagtctcaaatgttgttttattactcaatgaaccaccctc
+ataatttcactgctgttccattaaatttgcaaacgatcatttgctttgaagaaacgtaaa
+atcgacaaaattacagataagtagatgcataataaaaaaaactgctcgctataacacgat
+catcgtgcattcttacttaggagcatcacccgcacaataacgtaccttaaactacaacac
+tattagaccgagtactgtaattcacgaaagctcaagctcgcattgtaaagaacttgctct
+ctcgtaaaatgtgataatagtttgcggagaggattcaattattttccattgcacctactc
+cactagattcgataaaagaaggtggtcctcccttaaaaagaaatgttaagtaacatcgga
+accataagcaaagcatgtaagtgaaccgtcatccttccctaagaaacataaaggttttta
+ataatgtcgactgtgaactataactgcatcctttcctgacctactccggttccttgttgt
+tatttctgaacgagaccagtagataaacaatgtaaaccacagtgggtaccaatggtgcat
+gtgacgctaccgttgttttaagtgcccgtacaaacataagaagtcataatcttacttgaa
+attaattttgccttttattttttttcaggctcgaaattaatgatttgttttttttgacct
+tctagttacgctaatatgcggtcgcctgtggtttctattgagtcctataacgggatggga
+tctaatacgtttggttactagtaaacaaggtataaatttgataccggagtatcaactgta
+taacatcaagctttatgactcatacgcgaagtaatgacacaaggctttcaggagatcgcg
+agtacagagccactaaggggtgtattacgatagtgacaccaccgagcgcactcactcccc
+aagtagatttatgatcctacgctaagtattagatatataaccaaagaggttctagtcagt
+gcaactcttagaataataattagccggttttgcctttttaggcctaatgcaatattcagc
+tagcccttatgtatctcgcgttccacagcaccactcatggcacgcgtttaaactaatcaa
+atataatctatgaatgttatgccagtacttgaataaatcaggttttttataagtccttgc
+atactctcgttatatactgttagagtcttaccccatagaaattctttcatctgcaaactt
+agaagaattctcagctacggggagcataaagtccccaggatgttgacaaatacaacaaat
+gtggcttatacaaacactccatatgaaaatcgaaccctcgtggtagttttagccgaacct
+tgtacggataaatccctccattttccaatagcagatacctatcctactacctcgtggtat
+taaattaaagcttgaaatatagagctgcatagcttatccaattcccaagcacgagtctac
+cgtcgtaaccacgatttgatttacagacgctagagcaaacccatctttaaacatataagt
+aaaaattaaagggtgagtgcgtacgtgtttactagcaacttcgcttattaagacaattgt
+ttataagccataattaaaaacatatgttcaacaggttcattgatatttgtaattgcacag
+gtttttaataaggatctacgtaagtataatgaacaaactttttaccagagttatattctg
+tactttgaaaatgctcctctaccgccttagagactttcaattagattttttgcagttaat
+ctatgcgtaagtgaaccatgcaagggatgcgattcaaccgcctcgtgctaaccctatcgt
+ctgtctcataactgtaggtctaatataattttcagttttcgaacacataaccctttgaaa
+atctgctatttaatgtctcacctgcatgcactatcttctatactgctcagaacggctata
+cgtcactatgctccaagtgacgatttaaacgaagcaaggaataataggtttattttagtg
+caaaacaattaagtgcggactacgtgctctttacaataagccttgtgattgggctatagg
+ttaagtcccatattaacgatctccaatgtacaaaatcgacaatcgctttgcattacccgg
+ttactagtcgaattacagatagctgttagatactcactctaattttggacaacaatccca
+atcttggggtcgtctatcgcctgaagctcgtaaatccttccatcttaaacgattacatat
+tatagacttgttcggggtagagatatcacagttgtgcaaacattgtaaatcgatactagt
+ttatgttggtagtctagttgcttttaccattccccgaaaaacttgatctactatttcgac
+aacagtaaacttgaactaggtaagtgaaaacagagaatgcctcatagtgccactatttgt
+ccactatatgtaagtgtagctttacataatccactatgactgagatcattacggcctagg
+aaagcagcgtagaaaaaaagggcccggatattacgactgtaactataaaactagttactg
+gtagcgcgccatgtatagatttgttttaccggttgtggttgcgttaacgaatttcagccg
+cgaaaattgatccgttaaccagtccatctcgacttctataaaacgataaagtaaagttga
+tgttcagcctccttcttatggttgcatcgagagtacactactcagtgggaaatagatcgg
+ggttcctacttcagattgtattatctaggcaattgccgattgtgccatacctggataaaa
+taagctacctacatgtgatgcttatctattatcgtcatactaccttagggtgtcctgttg
+aacgctacattaatctttagccgtttgagatgttccaatggataggagtctaacgcatga
+tgaagtttaggaaggcagagcatcccactaagtatgtgacagtgtatttcgaaacgagac
+gttataaatagaaaaaaggtccttctggttctattctgctgaactattgaatggaaagat
+tggttgacctacgtactatttgcttgaagtcatcaatttgacggggtgagagacatatgg
+tgcatactttacggactctatattttagatcagaagcttagcagtcttctctacaccccc
+tcacgacataattgcttttaagaatctatgtttgattcctctacgggaattcggatccgt
+tcgcatgtgcggtttatctaaaccaggggacatatgttcagctaaagcatacgaacactt
+tgctaactagacgtatgtatagtagctataaatcccgacgatatttacaaaaagaaatga
+gactcaaatatatacatagcgaccctacacttattcgcaccctgatctaggcgatcctag
+cacccacacccgaaagtgagcactagtgtcttccgtattaaatttactgcagttgagatt
+ttagttgtctactaaggattactctaacccgtaataaggatcaagactcggtactagctt
+tactatcattccctatgtgttttcctaactcacaagggtacgtaccagcctatgtaatta
+caataatgataaagacacaaaggaagtaactttacaaatgagtctccagttacactagct
+tagtccctcccatcttgctttgaagtctaaatacgcaatctctgaggatatacagcagaa
+gaacactcataacgttggagtccaagaattagactcatagggcccccaacatttaatatg
+tactgtgagtttgaaggtgttctattgttaattcctgctcttgatacatgacacgtactc
+cgtgtttaaggcttcggactgactttctttcataagttgagcaacgaaaatttcagaatc
+gataagttggattcactaactaatacggctgattgaaaactccactccggacctatatgg
+tcgacctttatacgtaaccgatataaaacttataggctggtatatcgagccttcctagcg
+caatttcggatggggtttcttctactactcaacaacggaatagtctttgtttagtaaacc
+agagctcaggacgcccaatacgtaggagagcgctgtggagcatgtgtcattatggactgg
+agcactcttaaatcactctgcgtgtgctaaacgatagatcataacatgtcctgagtaaat
+tttcttgatacgtcgcaatataccgttattagttaaacgttctcatccgtcatgcgtgaa
+atacggctgtcgtgctcagatatactattagcgactcatctcgcctaacacgcacacgta
+taaactcggaatgactgccgctcttacatattagaaatacagactacaccacggaagcat
+tgggtcattctcaaccgctgtataaaagatgattagtcttataataagattaccaaagag
+gcagaatcatgggtagtaaatctattattcaagtgattaccgtcgtgtaggcagggagtg
+aggacgagatggtactcaggacaaatattaaccggacgaagtggtttacgtcgtactttc
+actattagtagtaaatacaaggtaacaccggggaatagtactaaatataatgatatctat
+cttcgggagaacgagtcgtctattgctttgaacattctcaaggcgtaaaatgtgctgact
+tatagcatgatacaaccgattgttacttttgtctattcaaaagattgaatagttttttat
+acaaaagccgcatacttatgacggctagtatacagtttcatcccctagcatcaatgctat
+ggacagtattgaacttataggaaattcttctaatagggcaaatccgtcgtgatgcctatt
+ttttttcagtcacatcctcaaatggcactagtattgtcgggatcccattaacaggctcaa
+ccacgagctcacgcgaggacatgtagtccgtatctttaacgaagcgacagcgacagaact
+cccatggataaccaattataaggcccgtaatcctctagacatcgtttaccaataaatccg
+ctttctccgtaatcatgttgaataccccagagtagtccagatgataaccgatgaaacaca
+agtctttctcaatgcacttacggtgaacttattaccgccaacgtagctcatcaaggttgc
+gacatctagttgtgtgtttgcgacgagcccagcgaacttcatcaactttcgtatattcaa
+cgccttgtaattttactttaagacgcctggtgatgtagattcttagataatcagtttgtt
+atcggctgtactttaccataatttcacaggtttcaggtcaagaagattatagctgtatat
+acagttccatgctcggtgcacagaaacgtgatcggataataatcaatcgcttatgtcgtc
+tttaggcgtatccaatacatgccccgataccgcagtgtatttcgacatgtaggtataccg
+tcgcatttgagctcgagtcaggacgtcagctagattagattccttaatagaatataccga
+cctctagtccgaactaaactatagataacgccaacttcaggttaattgtctagtcgtctg
+tttgcagatgggattcttagatgagtgagtatcggccatattggttcgagcactttagtt
+tttgatgcataggatatgcaatgtatagctgaaagtactttatctgtttcaaactcacat
+tgattaaaccggtaaacctttaaagactacaagaaaatattcagtgagggcaattttgtc
+aatcacaatcttccagctagagatacttcacaatttgtcttgaggctacgcaacattaga
+cggattttcgcgttttattgaaataatcgaggggcccaagagtatccatagttcattttg
+taagatttctttacaggcttattacagcttcttcagactcctacatgcttacgagttata
+tgctagcatgtgaacaatagattaatatacaggaaaacgtacattgagagagatgaccct
+acacagcgcaaccgttgagtactttcattaaagggtaacgctctcgagacagcatcctta
+agatggccttattgtcaaatcatttgcagaagtacgcaagatccctaaccaacgtagaag
+aatccctacaaacacatgagacgcggtgaaaatagacagggtgttagtattcaatcttcg
+gagtatcaatttcgccaatcttggtgagaaagcataccctttcttcagagaaagaagatc
+aatcataacactatctttaacgaggtacgcacgcgcatcattacctgcctccatggatct
+ttaggatagcggaaagtattggcagcgtattgtgatttcgttcctactttatcaatttca
+cattcatatacatgtcttttatcaaaatcgccaataagataggatgagctatattagatg
+ctagtagagttcgcgccaacatcatcgataggaatactcaggacagcgtgataggacttt
+tcaatccctaatactctctataattataactctctcttaagtttggaggcagtaacgcgc
+tctatataatcagtttgctgcaccattcttcagcctctgatacatacaaataaattccac
+agcagtaagagggtttaattgagacatcttgggaacttaggattttactctaacatcacc
+gaaacgattattggataccgtacctaaacgaactttctcaaggcagtaatataggacatc
+cgcaataacacaaatgctgcctccccaggagttatgtcttcctggaggctatatcttaca
+cccactcactataggcaaactaaagtttaaatgttgattgtctaaaaaaaagatagataa
+gagttggccggcgtagcacatgcgaaagtgaatcgtaagctataattctctggacttgaa
+gttctgtcctgttcctctgcaagaaacaaacttcctttaaagctatttacgacgcacatc
+tcagcaagttataaacatgttggaagtttctagtcggaattcccaaagaacggatctatc
+taatgcattcctacatttttcctgtctgccgatggtgccatcctattcaaagaatttctt
+aaaagtagattaaatgggacttttaacaatgagtaaccttacgcctctaagggttcctcg
+agtgccatacaccagtcaggtccgagccacatacacggagaacattctaacatagcattc
+tcaactcgatcatttgcaggttacttctttcctatcctagtgctaaaaatcatacttgca
+atcccatagcacggattaagaacctaagaaacaattcagtaaaacatgttcgaattcttg
+gtatgggaacatcattgcagctatggtctaacgcattaatgtttgggtacatcttccatc
+atataaacaggaagagtctgacgacagggagtgcttgcgatcatgtctatcattgtgaaa
+tcaaattgtagctcacatgtcgtctatgagagcgtgtatccgataagatttagaaaaata
+gaagtcgtataagatctcactgaacttttgaatgaatgtgaagcatatatgatctgcttt
+aataaaactttatccataggatacgtttccaaatcaattcaataattattagtcaaaata
+gataaggatgaacaacctgaaggccgatcggacgtagaaagtggtcccatcactttgagt
+tgatattgttgaaccacacgttattatggttttcaaacagtctcaggatattgtatatac
+agataatccgataccagttgtctgacgcccctcttacgtaccccaccctttgtgacgttt
+aaagcagttgttcagtattttaaactaggcggcaactaatttggaaagaagcacagtgga
+tatgtctaaattcttgttattcaggcctgaatttaatacaccgcatagttaacttcgcgg
+tagagttgttcatcatgcctcctctaagctaccacttctatgatacaccaatagttgttc
+tacggaatctgataattggccaagtcataaacttccgctgcgttcaacccccttgctcga
+atatccaactcgaaaagacagccttttggtgtccggaacaaatcagttacttcttttctg
+atgttaattctctgtggtcagatacagaccaaaaactccgcggatttaccatcctccaag
+aacaaatttgcatcaacatagcattttggctacatattctaagtctcaatagtttaggtt
+ttcaactacattatcccaacattaggattggaggaataatagctgggtaagtccccttgc
+gtctacaatcgactattttttatgaatatgcttctgccgcacctatggttattaaaaaag
+tcatgactttgaagaaccctgaaaagatagatgaatcaggtgtaatggcagcagccaaag
+agcatataattagcaacactctaagaacattatagatatgatgatagcgatcgtcatgat
+gttatccggtcacaatagtagcttcatcagctaattcgttttgccagtggtgacttgcgc
+tggaagaatcgttatacggtcccttccctcttgatacggtgggggcttattcaaccgcgt
+ggattgggttgtcatacttgcattaaacgatgtaaaccatctagtagtcaactatactaa
+atcacaaaatagtgatcaatacatacccgcttcatggttttaaccatttaattgattaaa
+gatattccgctaagaaccattatctacctaaactgatcgccgtatcctagtagtttgaaa
+tttgatgtaccgtaatgatcaacgaagtaaaacgttatattgtatgtagaataataggtc
+ttggagctaaatgatgtgattggtagtgaagacttacccttacaactttaccggtttctc
+ggaagaatatactagagaatcaatgcatgggctacataagcactttagtctaatgagata
+aaaaatacacgagtcttccatcatgaattttttgtcgaaaaactcgaacctggtaattta
+aaccatatatctttatgtcgtcaataactctcatatgttttatataacttcccaatcacg
+acttgtaactgcttgttcgactgagctgtttgagctatgaggccgggatccggttgagct
+acatctatttgctacaagaaaaatgaaagcacatttgttgggagttctggctacactcat
+agagaaataagtggcccgagtgggtgcggcctgcctccatattcaagtgtatcttaaacc
+aagtggttccaacgctcgcgctaaagaattaaagcctttatttcctccacggagtagccc
+gtaatccggttcgaaagagaccattgaagttaattttcatatccagtgaagtttaggcac
+aagcatgtgttctgccacatgcctcaaagcgctcttcaaccaagatatgattcatcctaa
+cttcgatgaatgcgtctgtaacataaatatagaaggaatgattcggcgagttaattttcg
+ccttctccaacatggcatccctacgttcgttataaggaccatacatgtaggttttaaagg
+tttgcggttaatcgatatttacatcatagaaattctatagtcaaatttacaagactctag
+atactcactcgttgcagccggctaggaagcgctttgtaccttacttcccttttcgttgcg
+taatatgaatttcatatagtaagttcaaggcactcatacctccgtgaagagggtagatag
+actattaaagttgtttaatagtacgtattgatggaaatgacccgtaggagatttaccact
+caatccacaagattcgctgctgtgcattatcaaaacagtgcatgtcgaaacatgggttgg
+gtccttcaaacacgaatccaggtagagatacctttgcaatttttcgatgaaggcgaccga
+gataaatgagctataacactgtatgtcttttgattgctataaaacacagaaacggatatt
+aatttaggccgtaaccaacatctgttatttgacatagaacagatggtcctttacagcgta
+ttccggccttaatattgaggtccagtgtattgtcctcctttaaagaagttgattgtaact
+gacttaaataagacatgtcacccattcactgggttgcaactgctggccctttttgtccat
+cgcacgctaatgtgataacagtaccgccctcacacctgcgtttaaaagacataaatgtcg
+ctatgaaggttattcattaattttagctgttttcttagaaaaggtaaatttaaaattgaa
+aaggctagaaaactaaagttacgacaaatgtgtttgtcaagtaggcgggcatcattgaga
+ttgtaagaaataaagccataaccagccccggaatagaaaatgttaaggaaaggcgatctt
+ctttgaattcttattgtcaagtgcagtcatacgttcttatcagaggacattgcaataaaa
+tctaacaccctcccttgtgtggttgggccatttgtacttcgaagcgtccaccatgtgcag
+aggataacggaatgtggttccgtcccataaacgatcattctcgcccacttagtggcgcgg
+taaatcgctctcatagaggtaactggcctgtaatgtccaatgttaggctaccttctccaa
+ctttagtacaacgaataatgtccgattaacaaggagtcaatttgtcatgaccagttcatt
+caggtacttgtatctatacggacgcgttccagagtagtatttgaaattttgaggttctac
+tgataagtttagctatcgctgtatgtctgaataagaatttaatgtttatcttcgataaat
+aacaattaacaactcctaggtgatacactgtgaagtctgctgttccccaaattacatatg
+ctattttgttcacataccatgaagttaagctaagtgctctataatggcataaacggttat
+caaactagctcgaatttcttttattacgccggaagcggattaactgctgtagatcaaaca
+cgttaggatagtgtcgttttcatatatatctaaattcggtctaacatgcattacccatgc
+ttgataacgtagcacttcgcagtctaattatgtaatgtccgtttaaccaaactttaaaaa
+agtttatctatcaccagtgatgcctcatcgtgactacccggatctttagcctttagggtc
+taaacagaactaatattactacgtgtcatactccggagcttaaccaggtgaaacttattt
+gttaaccaaatttagtgacagggtagaaatacgtatcaaattaacccagcaatacaataa
+gcatgaaaataattgtaatcgggtttgggccggaatcccgcttggcgaaaacttaatgac
+atagtgtgatgcattttgcactggattgagccacaaactcaactagcattatgctcaata
+tttggccagtgttctacggtttgaaatttataaaggccgcgcaaaagtcttgtagttaca
+aacgcataaatctcgaacgtaataggtttaattagaacatccgtaggatttctgtttata
+gtagatttatactaaatgttctgattagattctgacggccttacccatacaattaataaa
+gacgaatatattagttatagtttactatccaaataaattaagcgaatcgaaataaactgt
+cacgatactgggcagttatcaacttatcacttatacagttcggacactctatattggtct
+gtgagtactctatcaaactaactcataagttaactgcgcttccattaaatttcaatacgt
+tcttgtgctgtgtacaaacctataatcgaataaatgacacatatggagatgcataataaa
+aaaaacggctccatatttctcgttaatcgggcattcttaaggaggagcatctcaccaaaa
+ataacgttcctgataagtcttaactattagaccgtcttcgggaatgaacgaaacctcaag
+ctagcatggtatagttcttgatagcgcgtaaattctgataatactgggcggacagctgga
+aattagttgccagtgcacctacgcaaatagtttacataaatcaacgggctccgaacgtaa
+atacaaagggttagttacatcgcaacaagatgaaaagcatgtatgtctaccgtcatccgt
+ccctaacaaacataaaggtggtgaagaatctcgtaggtcaactataactccatccttgaa
+gcaactactccgcgtccgtgtgcgtagttcgcaacgagaacactactgaaaaaagctaaa
+caactctcggtacaaatgcggcttgtgtcgataaagttggtggtagtgcacggaataaca
+taacaaggaatattatttattcaaattttttgtgactgttatttgttttctgcctagaat
+gtaaggatgtgttttttgtgacctgatagttacgcttatttcaggtccacggtgcgtgag
+agtgtgtcctataacggcaggggagcgaagtagtgtcctttagactattcaaggtagaat
+tttgataacgctctataaaaggtagaaaatcatgattgagcaataagaccccaacttatc
+aaaaaaggagttctcgacagcgcgtgtacagtccctataacggctgtatttcctgtgtca
+caacaccctcccatcgcactcaaaatgtagatttatgatcagacgctaacttgttcttag
+agaaaaatacacgggatactctgtgcaacgatttcattaataaggtgcagcttgggactt
+ttttggccgtaggctttattaacattcacagtaggtagcgagacttcctatgaaccaatc
+atgccacgcgttttaacgtttcaaatataagctaggaagcgtttgccaggacttctataa
+tgcaccgttttttttagtacttccttactagccttagtttatgttagagtctttccaatt
+acaaaggattgaatagccaaaatttctacaattctcagcgaacgccagcttaatctaaac
+acgagcttcaaatattctacatatcggcaggagtcaatatataaatatgaaaatcgtacc
+atcctcgtacttttagaccaaacgtcttcggataattaaatcctttttcaattaccacag
+tacgtgcattagaactactgctatgaaagtaaaccttgaaatatagtcctcaagagcgta
+tccaagtacattgcacgtgtatacagtcgtataaacgagttgatgttctgacgctagagc
+ttaccattcgttaaacagataactaaaatttaatggctgagtgacttagtgttttcgaca
+aacgtcgcggatgtagactattgtttataagcaatttttaaaaacatatgttcaaaacgg
+tatgggatatgtcgaattccacaggggtttatgtaccatagaagtatgtataaggtacta
+aaggtttaaatctgtgatattcggttcggtgaaaatcagactagtcacacttagtgtctg
+taaattagattgggtgaaggtaagcgatcccgaactctacaaggcatgggatgagattct
+accgactccggataacactttacgatcgcgcataactctagctcttagataagtttaact
+tgtcgatctcataaacagttcaaaatctgcgatttattgtatcaaatccatcctctatct
+tctataatcatctgaaccgcgatacggcactatgagccaagtgaagattgaatccaagaa
+agctataattggtttattttagtccatttaaattaagtccggtataagtgctctgtacaa
+tatgcagtctcatgggcatatacgttaactaccttttgatacttcgaattggtaaaatat
+cgactatcgatttgcagtaaaaggtgtagagtccaattactctttcctgttacatacgat
+ctcttagtttggacaactagcccatgatggcgctcctctagcgcatgaacctactttata
+attacatctttatcgatgaatttttttagactgcggaggccttgagttttaacagggctg
+ctaaatttcttaagcgattagacggtagcgtcgtacgctacttgcttggaacaggcaccg
+aaaatattgatctactattgcgtcaactctattctgctaatagcgatggcaaatcacaga
+agccctcttagtgacaatagttgtcaactatatctaagtcgacctttactgtatcaacga
+tcacggagagaattaccgaatacgaaacctcaggactaaaaaacggaaaggatttgtcga
+cggtaaatataatacttgttaagggtagcgacacaggtatactttgggtgtaaacgtggt
+gcttcccggaacgattttcagaccagaaaattgttccggtaaccaggaaatctcgtctgc
+gttaattcgtgttagtaaacttgatcttcagactccttcttttcgttgcagcgagactta
+aattatatctgcgaaatagtgccccgtgcatacttcagatggtaggagataccatttggc
+ccattgtgactttacgcgattaattaaccgacatacatctgttcctgagctatgatcgtc
+tgaataaattacggtctcctcttgatacctaatggtttctggagacgtttctcatgttca
+aatggatagcaggagatcgcttcatcaagtttagctacgcagagcatcaaaatatgtatg
+ggaaagtcgatttccaaaccagaagggataaagagaaataacggacttctccgtagatta
+gcctgatattttgatgggaatcatggcggcacatacgtaagagttgcgtgaacgaatatt
+ttggacggcgggagacacatatcggccattcgttaaggtctctatattggacatcacaag
+cttagcagtatgagctactaacactcaagacattattgattttttcaagatatgtttcat
+tcctctaccgctattcccatacgttcgattcgccgggtgagcgaaaccacgggactgagg
+ttaagctaatcaataacaactcgttgcgatagagacctatgtatactagagagaattccc
+caacatttttacaaaaacaaagcagactaaaatagatacagtccctccatacaattagga
+ccaacatgttattgccgatcctagcacacacaccacaaactcagaacttctgtcttacct
+atgaaagggtctgcacttctgattgtacgtgtctaattagcattaatattaaaactaatt
+aggataaactataggtacgagctttactataagtcactaggtgttttccgatcgaaaaac
+gggaccttcaagccttggtaagtacatttaggataaagaaaaaaaggaaggtacgtgact
+aatctgtctaaactgacaatagagtagtacctacatgcttcatgtcaagtcttaatacgc
+aagcgctctcgttatactgctcaacaaaactcataaagttggactccatcatttagaatc
+atagggaccaaaacatttatttgctactgtcactttgtaggtgttctattctgaattcct
+catattgatacatgaatcggaatacctgtggatcccttaggacgcacgtgctttctttac
+gtcagaatacatattgtcagaatcgagaagttccatgcaattaagaattcgcctctttga
+aaactcatatccccacatatagggtccaccgttattcggaaacgatataataattattcc
+agcgttgagcgtcccttaagagcgcattttcgcttggcctttcttctacgactctacaac
+gcaagtggctgtgtggagtttaccacagcgcagcaccccatagaactacctctgagagcg
+cgagatggtggcagtatgctctgcagctagcgtttagaacgcgcccgcgcattaaccagt
+catattaaaatggactgtcttaattgtcggcattaggagcaatattaactgatgagggta
+tcggtcgcagaagtaatgacggaaatacgcctctagtccgcagagatacgattacagact
+cagatcccctaacaagcaaaacgattaaatcggaatcactccccctatgacatatttgaa
+atacacaagaaaccacgcaacatgtcccgcattctcaaccgcgctttataagatgttgag
+tctgagaattagatgacctaactgcaagaatcatggcgagtttatctagtaggcaagtct
+gtaccctagggttcgaacgctgtgacgtcgtgatcggtctaaggacttagatgataacca
+agaactggtttaccgagtactttcactattaggagtaattacatgcgttcaccgcggaat
+acgacgaaattttttcatatctttatgagcgagatcgtgtcgtctttgcattgcaacagt
+cgctaccagtaattgctgatcaattatagattcattatacagatgcttacttttctctat
+tcaatactgtcatgagttgtttttaaataagcaccagaattatgtcgcctagtataatct
+tgcttccacttgaatcaatgcgatggacagtattctactgattgcaaagtagtctatttc
+ggcttagcagtacgcatgcctatttttttgcaggcacagaataatatgcaactaggattc
+tcggcatccaattaacaggctaaaacaccaccgaaagacaggtaatctacgaagttgatg
+tttactacagaaagcgaatgatatcacttggagaacattttagatgcccccttttaatct
+agactgagtgtaccaatatatcaccggtctaccgaatcagcttgaataaaccactctagt
+actcatgataaccgagcatacacatgtatttctcaatgcactgaaggtgaactgtttaca
+ccataccttgcgaatcaacgtggcgacttatacttctgtctttgagtacagcacacccta
+atgaatctaagttagttgttgatacgaattgtaatttgactggatctcgcctcctcatct
+agattcttagagaagatgtttcttatagccggtactgtaactttattgatctggtttatg
+gtaatcaacattttacctctatttaaacgtccttgcgccgtgcactcaatcctgatcggt
+ttagattcaagcgattatcgagtctggaggccgagaaaagaaatgcacagagtaagctct
+ctattgcgacatctacgtagaaactcgcatttcagatcgagtaagcaactctcattgtgt
+tgattcagtaatacaagattacctacgcttctacgaaatatactatagatttagcctacg
+tcacctttagtgtcgagtcggagctttgaagatcggatgcggtgtggactgtgtataggc
+aattttgctgcgagctcgtgacttttggttgatgtcgatatcaatgggatacctcaaacg
+tctttatctctggataactcacattgagtataccggtaaaaatttattctattcatctaa
+atagtcagtgagggctagggtcgcaatcacattaggccacatacacatacttaacatgtt
+ctattgacccgacccaactttagtagcattgtagccgtttatgcaaatatgccaggcgcc
+aaacactagccagagggcattttgttacatttatttaatcgattattacacagtcggaac
+acgcctacatgcgttcgacttatttgcgacatggtcaacaattcagtaatttaatccaaa
+acctaaagtcagagacatgacactaaaatcacattaaggtcagttagtgaaggaatggct
+aaccagctagagaatgcatcattaacaggcacttattgtcaaatattttccagatctaag
+caacatcacgttaaaaagtacaacaatcacttaaaacacatcagtccaggtgtaattaga
+aagccgcttagtaggcaagcgtaggagtataaatgtagacaatagtcgggacttagcaga
+cactggatgcagtcatagaagatcttgcataacacgttagggttagagctacgaacgccc
+atcattaactgcctaaagcgtgcgtgagcttagcgctaacttttccaacacgtttgtgat
+ttcgttcataatgtatcaatttcacagtcatatacagggagtgtagaaaaatcgcaatta
+acatacgttgacctatttttgttcagagttcagttagagcctaatgattcgagagcaata
+atcaggacagcctcataggaagtgtcaatcacttagaagctatattattataaatcgctc
+tttactgtcgtcgaaggaacgagcgagagagaatcagttgcctgcaactggcttaacaat
+atgatacataaaaatattttcatcaccactaagacggtggaattcagacttattggcaac
+ttaggatgggactattaaataacccataagatgttgggataaagttacgaaacgaaaggg
+atatagcctgttagataggaaatccccaataaaacatagccggcctccacagcagtgatc
+tattccgccacgcgatatctttataccacgcaatataccaataataaaggttaaatgtgg
+ttgcgatttaaaaaagatacatatcagttgcaccgcgtagcaaatccgtatgtgaagcgt
+aacctagaattatagcgtctgcaagttctctaagcttcctctgcaagatacaatatgact
+ttttagcttttttactaccaaatctcagaatcttagaaacaggttggtacgtgctactcg
+gaattcccaaagtaccctgctatatatgccattccttcattggtccgggctcaccatggg
+gccatcatagtaatagaaggtagtaaaactagttgatttccgacttttaacaatcactat
+cctgacccagatatgggttccgactggcccttactccagtaagggcagacacacagacaa
+cgagaacttgataactttgaattctcaaatcgatcattgcaacgtgacttatttactagc
+ctactcctataattcatacgtcaaatacatttcaacggaggaagataataagtaaatatt
+cactaaataatggtcgaaggagtcctttgccaacataagtccacatatgcgctatagatt
+ttttcttggggttcatattcaataagataaacagcaagagtatcacgtcagcgagtcatt
+gagatcttggctagcattgtgatagcatattctacctaaatggtagtctagcacagagtg
+gataagatatcagttagatatagacaagtactataacagatctcgcttcgttggattgta
+tggctagctttgatgatatgattttataaaaattgatccagacctgacctggccaattat
+attcattttttatgagtaaaaatagataaccatgaaaatactcaagccccttaggacgta
+caaagtggtaacataaatttcaggtgttattctgcaaccacacctgttttgggttttcaa
+aaaggctaagcagattggttttacagataatccctgaacactggtatctcccaacgatgt
+cgttcccaacccttgctgaccttttaagctctgctgaagttttgtaaactaggcggaaaa
+tatgttcgatagatccactcgcctgaggtagaaattcgtcttagtaacgcctctttggat
+tacacagaatagtgtactgacacgtacactgctgcagcagccatacgctaacattaaaat
+tcgttgagtctacatttgttgttattcggattatgttattgggaatagtatttttattcc
+cctgcgtgaaaccacatggatagattagcctactcctaaagactcccttttggtctacgg
+ttcaattctcttactgagtttatgttcgtaattatatcggcgcagtgaatctcctaatta
+tcaccggagttaccagacgccatgaacttatggccagaaacattgcatgtggcctacata
+ggattagtatcaagagtttacgtttgcaacgacatttgaccaacttgaccattcctgctt
+gtagaccgcgggaactcccctgcacgcgactatagaagttggtggtggatgtggcttatg
+ccgcaaatatggttttgaaaaaagtaatctattgcttgatacctgaattgagacatgtat
+aagggctattgccagatgaaaaactgcatataaggtcaaacaatataagaacattataca
+taggatcttagcgttcctcaggatggtatacgctataaagtctagcttcagcagctaagg
+agttttgccagtgcggacttccgctggaagattaggtttaaccgccctgacatcttcata
+aggtcgggcctgattcaaacccctggagtgccgtctcatacttgaattaatcgatggaaa
+acttcttctagtctaatattattattaacaaatgacggttcaataaataacaccgtaagg
+gtgggaaactgttaagtgatgaatcattttaacctatcatccattagctacagataatga
+taccccgatccgactagggggtaagtggttgttccgttaggataaaccatgtaaaacgtt
+agagggtttgtagattaattggtattccagataaatgaggtcagggcgagtgatcaatta
+cactgaaaaattgtcagcttgcgcggtagttgttaagacagtataaatgaaggggattca
+gaagcaagtttctcgattgactgaatttataaaccagtcgtcaatcatgatttttgtgtc
+gattaaagcctaaatggtaatttaaaccattgatatttatcgagtctataaatatctttg
+gttgtatattacttcacaatcaccaattctaaatgattcttccactgtgcgggtggagat
+atcaggacgggttaaggttgacctacatcgttttgatacaacaaaaatcaaagcacatgg
+ctggggacttctcgatactatctttgagatagtacgggcaagagtgggtgacgcctccct
+acattttcaagtctatcggataacttctcggtaaaacgctcgcgatatagttttaaagca
+ttgatttaatccacgcaggagcaagttttaccggtcgaatgagaaaattcaacgtaagtg
+tcatatccagtcatggttagccaaaagcatgggttatccaaaaggaataaaacagctctt
+caacaaagagatgaggcttcataacttcgatgaatgcgtatggttctgatatatagatcg
+atgcatgaggacactttattttagccggcgaattaatggaatccatacgttacttatttg
+gacatgacttctaggtgtttttgctgtcccgtttagcgatatttacagattagtatttcg
+tttctcatagttaattgtatctagatactaactcgttgaagacgcataccttgccatttg
+tacaggacttaactgttccgtgcgtaatttgaatttcttataggttcttcaaggcacgaa
+tacctcactcatgaccgttcatactctagttaaggtcgggaatactacgtatgcagggaa
+ttgtaacctaggagatttacaactctttaaacaagagtcgctgaggtccaggatcaaaac
+actgaatctcctaacttcgggtgcctccgtaaatcacctagaaacctactcatacatttg
+caattttgagatgtaggcgaaagagagaaatctgctttttaacggtatctcttgggattc
+cttttaaaaacacataacgatagtaatgtaccaagtaaccaaaagctgggatgtgtctgt
+gtactgatccgccgtgtcagagtagtccgccatgaatattgacgtcaaggctagtgtcat
+caggtattgatgttcattgtaaatgaaggaatgaactaatgtcaccaagtaaagggggtg
+aaaatgctccccagggttctacagacatagagatggtcagaacacgacccccctctcaac
+gcagtgtatttgaaatatatggacatatctaccttattctgtaattttagatgtgttctg
+tgtataccgatattgataagtcaataggcttgattacgtatcttaagacaaatctgtttc
+gcaagtaggaccgcatctttcagattgtttctttttatgccataacctgcccaggaattc
+aaaaggttatcgatacccgatatgctgtgaattattattctaatggccactcattcctgc
+ttatatctggaattggcatgaatatcttacaacctaaagtctggcgttgcgccagttcta
+cttcgtaccggacaccatctccagtcgttaaccgaaggtgggtacgtcacataaaagttc
+attagaccacactttgtgccgacgtatatagatatattacacgtatagggaatgttttct
+cctaggtgacccgaccttctactaaggttgtacatcgtataatggcccattaactacgag
+gaaagtggtattgacctggtaatgcacgttcttcgatatataccgacgaggtaaagtcta
+ctattgcaaagtttgacgttatactgataagtttagatttccctggatcgcgcatgaaca
+atgtatgcgttatctgccatatataacatgttacaaatccttggggatactatcgctact
+atcatcggaccaaaattaaataggctagtgtcttatcagaacatcatgtttaccgaactg
+atctattttccaatttaagctgatattacgtccgcgtatttattttagttccccggatga
+cgattatctgagctacatcatacaagttagcatactcgccggtgcattgatttcttattt
+cgctatatcttcaagttcacaggcttcatatagttccaattagcagtataattaggtttt
+gtaactttaaccatactttataaaaggttatattgcacaactgatcaagcatccgctata
+acccgagctttaccagttagcggctaataacaaataagatgacttcgtgtcatacgaccg
+tcatgatcatgctctaacttaggtgggaaccaaatttaggcaatgggtagtaataagtat
+aaaatgataccacatatactataacaatgaaattatttgtaatccggtttgccaacgtat
+cccccttcgcgataaattaatgacatagggtcatccatgtgccaatcgtgtgtgccaaaa
+tctcaaattcaattatcatcaatattggccaagtgttataagcgttgaaagtgatatagg
+ccgccaaaaagtagtctacttaaaaaccaatatttatcgttcgttattgctggtagtaca
+acatcacgagcatttctcttttgagttgatttatactatatctgctgatgtgattatgtc
+ccacttacccagaatattaagaaagtcctagattgtaggtatacttgactataaatataa
+tttaagactatacaaataatctggctacattatgccatcgtagaaactgataacgtagta
+acgtcggacactagattttggtcggggagtaatctagcatactaacgaatttgttaaatc
+cgctgaaagtatatgtcattacctgcttggcctgtcttcaatacgtttagactattaagg
+actcatttcgagatccagtattaattatacgcatccatatttatactgaagacggattga
+gttaggacgacaagctaaacaaatattaagttaaggattagtattatattgtagaaactc
+gtcgggttggaacgattcatcatcatagaatgcgttacttattcagagagacttaattcg
+gttatgactggcagctcacctggaaagtaggtgaaaggcaacagaagaatattgttgact
+gaattctacgggctacgaacgtaattacaaagcggttcgtaaagagcataaagatcaata
+caatggatctctacagtattacgtaaataacatacataaacctggtgttgattcgactag
+ctcatagattaatcattaattgaagctacgaagacgcggaagtctgcggagtgagcaaac
+agtaatcgactgataaatgcttataatatcgcgcttaaatgccgcatggtgtacattaac
+gtgggggtagtcaaaggaatatatttactaggaatattagttatgcaaatgttgtgtcaa
+tgtgatgtgttttatccagacattggatgcatggctgtgggggcacaggatacttaccat
+tagttcacctacaagcggcgtgagagggtctcagttttagccagcgcagagaagtacggg
+cctttagacgattaatgctagaattgtcataaacctcgtgaaaagctagttaataatcat
+ggtgctagaagaacacaacttttctataaaccagttctcgactgacagtcgtaactcact
+atatcgccgctttgtactgtcgcaaaaaaacctcacatagaaagaaaaatctactgggtg
+catcagtagagatcgtgttctgagagataaatacaccggatacgatctgcatcgagttca
+tgtattaggtcaagcttgggactgttgtgccagtagcattttttaacagtcaaagtaggg
+tgagacacgtcatatcataatatatgccatcgaggtttaaagtttatatgataagctagc
+atgcgttgcaatcgtattcttgaatgctccgtggtttgtactaattcctttatagactga
+gtgtatcgtacactcggtacaattacaaaggatggaagagcaaataggtcttcaattata
+acagtaccccaccttaatctaaaaaccagcttcaattagtattaatttcgccaggagtat
+atatataaatatctaaagactaaaagactcgtacttttacaacttacgtcgtagcataat
+taaatcatgggtaaatgtcatcagtaagtgcattagaaatactcctttgtaaggatacag
+tgaatgtgtctcagcaagtcagtagaaatggaaattcatactcgattaaggcctataaaa
+ctgttgttggtatctacagagtgattaaaattagtgaatcagattacgaaaatgttttcc
+cgctcgcacttacgcgtttagacaaaagtacaggtggtacaattggctgtagtagaattt
+tggtataaaataggtgataaaccggatgggtgtgggcgaattcaaaagcggtttttgttc
+catagaactatgtagttggttataaaggttgtaatctcggagattaggttagggcttaat
+cagaatagtaacaatttctctatgtaaagtacagtgggtgatcgtatgagttcacgaact
+cttaatgccatgcctggacaggataaacaatacgcatataacttgacgatcgagcttata
+tcgacctatttgagaagtttaacgggtcgatataatatacaggtcttaatagccgatttt
+ttctagaaaagcaatcctatatcttagttaatcagatcaaccccgtgaacgatatatcag
+caaactgaacattgtatacaacattcctttttgtccgggtggggactccatttaaagtat
+ctcacctagaactcagcggtaatagatgcagtctcttgcccagttacggtaactaaatgt
+tgatacttagaattgctaaattttagtctagacatttccaggtaaaccggtagacgacaa
+tttctctgtcatctgtcataagatcgcttagtgtgctcaaattgcaattgagggccctac
+tatagacaatcatcagactttttaattaaatagttttccatgaatgtgttgtcaaggcgg
+accccttcacttttatcacggctcataaatgtcgtatgactgtagtcggtagcggccttc
+gagtcttcaggggaaatggaaaagaaattaggcttctaagatggactataatcgattagg
+ctaattccgttcgcaaatcacagaagcaatcttactcaaaattgttggaatcgatagcga
+acgcgaccgtgaatgtttaaaagtgctcgcacagaattacccaatacctatcatcacgac
+ttaaatacccaaagcagttgtagtcgcgtaatagattaagtctgaagcctagagacaaag
+ggatactgggcggggaaacctgctccttcacggtaacatggtaacaacagaatttggtta
+aggttaaaacgaaatatactcggagtgaattactgttaggtttcgtcatcggatcaataa
+gtagtttccgtgaagacactcttatattagatctccgaaattctgacccgtgcattaggc
+acttggtaggagattccatttggaacttgctcaatgtaagccagtaatgttccgaaataa
+ttcgctgcaggagcgaggagccgctgaataaaggaccctcgcatcttgttaccttatggt
+tgagggtcaccgttctctgcgtcaattccagagctggagatacattcatcaacgttacct
+acgcacagaataaaaagatcgagcgctaactcgttttcctaaacacaacggatttagaca
+aattaccgaatgcgccggagagtagcatcttagtgtcatgcctatcatggcggctcagta
+cgaagagttcaggcatcgaatattgtggtagcccgcactcaaagttccgccattaggtaa
+gctatatattgtggtcagaacttgaggacaactatgagctactaaaaataaacaattttg
+tcatttgttctagatatgtggcattcatcgaacgcttgtaccagaagttacattcgcagc
+gtgagcgaataaacccgaatgagcgtaacattatcaataacatatagttcagatagagaa
+cgaggtattcgacagagaattacccaacattggttattaatctatgcagaataatttaga
+taatgtcactacataatattaggaccaaaaggtgattccccagaagacaaaacaataaac
+aatctcacatattcgctagtacctatgtatgggtatgatcttctgattggacggggataa
+tttccaggtatattaaaacttattaccataatctagacctaagagaggttatataagtaa
+agagctgtgttccgatagaaaaacccgaccttaaagacttgcgaagtaaattttgcttta
+acaaaaaaacctacgtaagggaatattctgtataaactgaaaagtcaggtgtaactacat
+gagtcatgtcttcgattaattacaatgcgatctcgttattctgatcaactaatatcataa
+actgccactacatcttgtacaatcattcgcaacaatacttttatgtgctaaggtcacgtg
+cttcctctgctatgctgatttaatcagattcataaaggaatacgaataactctggatcca
+ttaccacgcaagggatttatttacggctgattactttttggctgttgacagaactgccat
+gaaagtaagatgtcgcatcttgcataaataatagcacctaatatagccgacaaagtgatt
+ccgataacagattttaagttgtccagccttgagactccatgaagaccgcttgggagcttc
+cccgtgattagaagaatctaaatcccaagtggatggggggagtttaaatctcagcaccaa
+caaatagtacttcctctcagagcgcgtcatggtcgaaggagcctatcctgatagaggttt
+gaaagcgcacgcgcatttaactgtcatattaaattggaatctcgtaagtgtcggcagtac
+gacaaattttaactgatgtcggtatacggagaagaaggaagcacgcattgaagcagctac
+gcagaactgagaagatgacactctaagatacaattaatacaaaaacgttttaagcccaat
+ctatcaacagatgtaagatgtctaatacacaagaataaaaccttcatgtcccgatgtata
+ataacagctttatttctgctggtcgaggtgaagtagtggaaattactccatcttgctgcg
+cgtctttatagtgttggctactctgtaaccgacgcgtccatccctctctcctagtgatcc
+gtatatccaattagaggataaccaacatctgcgttaccgacgaatttaaatttttcgact
+atttaattccgttcaaacccgtattcgtagtaagtgtttcatagatttatgaccgacatc
+gtgtacgagttgcagtgcatatgtagataccactaattgctgatctaggatacatgcttt
+ataaacatgcttacttggctattttatttactgtcatgtgggggtttttattttcaacaa
+gtatgtgctaccattggataatctggcttcaaattgaagatatgcgttccaaacttgtct
+actgtttgctaagtaggagttgtcccattagaactacgcagcacgtggtttgtgatcgaa
+aagaataattggcaaatacgaggctagccttcaaatttaatgcagattactcctcagaaa
+cacacgtaagcgacgaacgtgatgtttactacacaatgcgtatcatagaaattcgtgata
+atttttgttccaacctttgaatctagactgagtggaaaaagatttcaccgggataccgtt
+tatgctggttttaaaaactcgtcgaatcatcttataactgcattcaaatggatttctcaa
+tcatctgtacgtcaactgttttaacaataacgtcagaataaaccggcacaatgagacggc
+ggtctttcactacaccacacccttaggattataagtgacgtgtggattcgaattctaagg
+tgacgggatctacaagcctcagctacattaggtctgaagatctttcgtatagccgcgtat
+gttactgtttggatatgggttatgctaatcaacagttgacagcgagtgaaacggccttgc
+gacctgaaatctttacggttaccttttgattcaagacaggatcgacgatggaccacgtga
+aatgaattcaaaactgtaacatcgcttgtgcctcagcgaccgagtaacgacaagttcaca
+tcctctatgcaactatcattgtggtcattaaggtattcaagattaactaagagtcgacca
+tatattctagagttttacaattaggaaccgttagtctagactaggagcgtgcaacatcgc
+aggaggtgtggactgtcttgacccaagttgcctgacacatagtgtcttttgcttcatgtc
+cttagcaatgcgatacctcaatcgtagttttatcgggataaataacatggtgtttaaccc
+tattaatggtttctattaatctaaattgtaaggcagcccttgggtcgaaagcacattagg
+ccacatacacagtatgaaattgttcgagtgtccagaccataattgactaccatggtacac
+ggtgttgctattatgactcccgcaaaactcttgacagagggaattttggtacattgatgt
+aatcgatgatttaacagtaggaactagacgtcatccgttagactgagttccgacatgctc
+aaattgtcaggatttttatccaataactaatggctctcacatgtaaataaaatcacatta
+acgtcacttagtgatggattcgctaaacagatagactatcattcatgaactggcactgtt
+tcgattatatttgcaacatcgaacatacttaaagttaaatacgacatcattcaattaaaa
+aaattcagtacacctctaatgagtatcccgctttggaggaaagagtagcactttaaatgg
+acaatttaggccggactttcctgtaaatggatgaagtcattgtacagcttgaataaatcg
+ttagggttagtccttacatccaccatatgttaatgaataaagcctgagggaccttagagc
+taacttgtccaacacgttgctcatttacttaataaggttgaaatgtatcagtaagtgaca
+gcgagtgtagattttgaccatttaactgaccttcacagttttgtcttcagacgtcactta
+caccataatgatgacagagcttgtagatgcacacactcattcctagtgtaaatcaagtag
+tagctagattattataaagagatattttctggcgtcgaacgtaacacagagagagtataa
+ggggcatgataatggcttatcaatatgtgtaagaaaaagtttttaatatcatctaactcg
+gtggaatgcacacttatggccaactgaccttgggacgagttaagataccataagaggttg
+cctgtaagttaagataacaaagggatattccatctttgtgtgctaagaacctatttatat
+ttgcagccataaaaacctctgtgctatgcagccaccagagttatttatacaaagaaagag
+accatttagatacgttaattctgcttgcgatttattaaacagacatttcacgtccaacca
+ctacaaaagccctatcgcaagacgatcattgtattatagcctatgcaacgtagctaagcg
+gccgaggaatcataaaatatgaattgttacattgtttactacatatgatcacaatctttg
+taaaaggttcgttcgtgatactaccatgtacctaactaacctgagatatatgcaatgact
+tatggggtcagcgcgcaacatccgcaaagcatagtaatacaaggtaggaaaacttctgga
+tttcccaaggttataatgctctatactgaccaagagatccgttacgactcgcaatgaata
+ctctaagggcactcacaaagaaaaccactaattgataaatttcaatgataatatcctgaa
+ttgcatcgtgtatgagttacgagaagtcgcatttaatgaattagtcatagaaatgtcata
+gcaggaacataattactatattttaacgatttaatcgtagttggagtcctttcccaaatt
+atgtcatcagttccgatttagatgttttcgggcccttcttagtaaagaagttaatatcca
+agactagctcctcacccacgcatgcacatattcgcgagaagtctgatagaatattcgaca
+gaaatgcgactctagctcacactcgttaactgatcaggtacttatagacaagtacgttat
+cagatatcgcttcggggcattgttgcgctacctttgtgcatagcagttttgaaaaattgt
+tcaagacctgaacgggaaaatgatattatttttttaggaggaataatacagtaccatgta
+aatactcaaccaccttacgtacttcttacgccgaacatatatggcacgtgttattcggct
+aacaaaactgttgtgccttttctataaggataagcagattcgttttaaacatatgacctg
+taaactgggatctacaaaagaggtacttaaaataaattgcgcaacggtttagatctgcgg
+atctttggttaaagagcaccattagatgtgccatacttcctatcgcctgagcgagaattt
+agtctgaggaaccactcttgggatttaaaacaattcggttaggacacctactcggcggat
+gaagcaatacgataacattaaaagtcgttcagtctaattttggtcgtagtacgatgagct
+gatggccaattgtatttttattaacagcactgaaacaaaatggagactttagactaatac
+taaagtctcaatgttcgtcgaaccttaaatgctcggaatgaggggatcttcggaagtata
+gcgccgaagtgtatctcattattataacaccagtgtacagacgacatctaattatggcca
+gaaactgtcattgtgccattaagaggattagtagatagtctggaccgtggaatagaattt
+tgaccaaattgaccagtcctgcttgtagacagcgcgatctaaactgcacgagaatataca
+agttggtggtgcttgtggctgagcacgctaagatgcgtttgtttttacgattctagtgct
+tcttaacgcaattcagtcttctagatccgctattccaacatcaatatctcaatttaaggt
+caatatatataacaaaattagacagagcagctgacacttacgaagcatcgtagaaccgat
+atagtcgaccttatgatgatatggacgtgtccaagtccgcacttccgatgcatcttgacg
+gtgaaccgaaatgaaatcttcattagggcccccatgtgtcaaaccactcgagtcccgtct
+ctgaagtcaagtattactgcgaaaaattcgtctactattagtttattatgaacttatgac
+gcttaaataaattaaacagtaagcctgggaaaatgttaaggcaggaatctttgtaacagt
+tcataatgttgctaaagattatcagaccccgtgaagacttcgggctttgggcttcgtacc
+gtagcataatacatctatatagttagaggcttgcgtgttgttgtgctattccacatatag
+cagctctgggcgactcttcaatgaaaatgaaaaatggtaacctggcgacctacttgttaa
+gtcagtttaattcaaggggattaagtaccaagggtcgagtttctctgtatttattatact
+gtaggcaagaagcttttttggcgagatttaagacttaagcctatggtaaaaatttgatag
+tgagcgactatagtaagagatttgggtggttagtaattaaaattctcctatgctaaatca
+ggcgtacaatctgagggtgcacatttctcgacgcgtgaaccttcaccgaaagcgtgtgga
+ttatacaaatttcaaacatattggcggggcacttatccataatagatttctgtttgtacg
+ccaaactctgcctcacccctccataaattgtattggctagaggttaaattctccgtaaat
+agagacacatatagttttatacaattgtttgaatcaaagcacgagaaacttttaaccgta
+cattgacaaatgtcttcggatggggcagagcatctcttcgtgacccaaatcaatcgctga
+gcaataagcaagaaaacacagattatacaaagagatctggatgaagatattcgtgcaatc
+actatcgttatgttagagagttccatgcatgaggactcgttttttgaccaggagaattaa
+gccaagaaataactgacgtatttccaaatgaattctacgtgtttttcctgtcacctttag
+ccagtgttaaagatgactatggagtttcgaataggttattctatagacattataacgagt
+ggaacacccataccttcacagtgctaaaggtaggaacgggtacgtcaggtagttcaaggg
+attttaggttcttaatccaacgaagaaataacgcatcacccgtcattctattgttttcgt
+cgggattacttagtaggcagggtattctaacctacctgagttacaaatctttaaaaaact
+ggccatgaggtcatggtgataaaatctgaatcgcctaaattcgcgtccctaaggaaatat
+actagaatccgtctcagaaagtgcaaaggttgacttcttcccctaacacagaattctcag
+ttttatagctatctagtggcattcctttttataaaactttacgtttgtaagggtccaact
+ttacaaaagctcggatgtgtatgtgtaatcttccgccgtgtaagacttggaacccatgta
+tattgacggcatggcgtggctaagcaggtattgatcttcagtgtaaagcaaggtatgttc
+taatctaacaatgtaaagccggggattagccgccaaaggggtctaatgacatagagatgc
+tctgaaatcgtaccaactataaaagcacgggatttgaaatatagcgacagatcttccgta
+ttctgttagttgacatctgtgctgtctttaccgattgtgatttggctttagcagtcattt
+agtttcgttactcattgctcgtgcgatagttccaccgaatatggcacattcgttcttttt
+ttccattttactgcaaaccttttcaaaagctgatcgataccactgatgatggcattgatt
+agtcgattggcaactatgtcctgcttatatctccaattgcattgaatatagtaaaaaata
+aaggctcgccttcccaatgggctacggagtacacgaaaaaatcgcaactcgtttaaccaa
+gcgccgtacctaacatataagtgattgagacaaatagttctccagacgtattgagatata
+tgtctcctataggcaagcgtttctaattgctgaccagaaattagaattaggttgttaata
+ctatattcgaccattttattccacgaatgtgctattctactggtattgctccgtatgcga
+tatataaccaacacggaaagtcgtcgattgcaaagtggctccgtagaatcatttctggtc
+atttaccgggagcgcgcttgaacaatggatgcggtatctgccatattgttattgttaaaa
+agacttccgcttactatcgcttcgatcatcggaaaaatattaatgaggattgggtcgtat
+aagaaaatcatcttttcagttcgcagatttttgccaatttaaccggttatttcgtcagac
+ttggtagtgtagttacaagcatcacgattatatcagctacagaattaaactgtcctgact
+cgacggggcagtgtgtgagtattgcgctatatattcaaggtaacaggaggcatataggtc
+atagtacaaggataatgaggtttgctaactttaaaaattattgatttaacggttgattga
+aaatctctgcaagatgacgctagaacacctgatgttcaagtttgccgataataacatata
+agatgaattactgtctttagaccctcatgttaatccgctaacttagggcggaaacaatgt
+taggctatgcggagtaagtactatattatgataccacatagaatttaacattcatatgat
+gtctaatacccgttcccaaccttgcaaccgtcccgattaattaagcaattacggtcatca
+atgggccaatcctgtctcaaaaattatcatattcaaggttcagctattttggcaatgggt
+gagtaccgttcttagtgatttacgaacccataatctaggcgacttaatatacaagattta
+gagttacgttttccgggtagtacatattaacgaccatggatcgggtgaggtgttgtatta
+gttatctgatcttgtcagtagctcccaatgtcccagaatattatgtttctactagagtgt
+tcgtatactggaatttaaatattatgtaagactagacaaattttatggatacattaggcc
+atcgtagaatatgatatagttgtaacgtccctctatagattttcggagggcaggtatatt
+gcttaataaagatgttcggaaatcagcggaaaggatttgtaattaactgatgcgcagcgc
+ttaaataagtttagactattaagctatatgttcgacagcatgtagttttttttaccagaa
+agtgttatactgatgacccatggaggtagctcctcatgataaaaatattgttacttaagc
+attactattatagtgttcaaactagtaccgttgcatactttaagaatcagacatggcgtt
+tcttatgcagacacacttttttagctgttgacgcccacctcacatccatagtaggtcaat
+cgcataagaacaatattctggactgttttattacccagaagaaagttttttctttccggt
+tcgttaagacaataaagatcatttcattcgttctcttaacgatgaactaaagtacttaaa
+gtatccgcctcttgtttcgactagcgcatagtgtaataattaaggcaagataagaagaac
+aggaacgcgcacgtcggagataactctaatagtctctttattccgtttaatatagcccgt
+aattgcaccatgcgctacagtaacggccgccttcgcaaacctatttatgtaattccaagt
+ttaggtatgcaatggttggggcaatgtgaggggttttatcaagactttcgttgcttcgcg
+gggggcgcaaagcagactttacagtagttaaccgaaaaccgcagggagtcgctctaagtg
+ttaccaacccctcactactacgcgaaggtactcgattattccttgaatgggctgaaacat
+cgtgattagcgtcttatgattcaggctgatagaagaaaacttattttctatattccacgt
+atacaatcacactcgtaactaaatagttcccagcgttgtaatgtcgctataataaataaa
+atacaaagaaaattcgtctgggtgcataagtacagttagtcgtctgtcacataaataatc
+cgcagtcgatctcattacaggtattgttgttggtcaaccttcgcaaggtggtccaagtag
+cattgttgaacagtaaaactaccgtcacacaaggaatatcataatagatgccatacacgg
+ttttacttgatatgtttacagtccttgagttgcaatcgtagtattgtttcatccggggtg
+tgtacgaagtaatttagacaaggtgtgtagcggtcactaggtaaaatgacttaggatgga
+tgagcatttaggtattctatgataacactaaccatcatgtttctaaaatcctcaggaaat
+ttgtattattttaccaacctgtatttatagaaagtgcttttgacttaaagaagccgaagt
+gttcaaattaaggagtacctgattgaaagaatggggaattgtaatctgtaactcaattac
+aaataagccgttctaaggattaaggctttgtgtctaagcaactcacgtgaattcgaaatt
+catactcgattaacgactttaatactcttctgcgtatctacagactcatttaaattacgg
+aatatgttttcgtttttggtttccagctcgcacgtacgcgtttacaaataaggacacctg
+gtacaattggctggagtacaatgttggtttttatttgctgattatcccgatccctgtggg
+cgttggcataaccgggttttcttcaagactactttcgtgttgcttatatacctggtaata
+tcggtgagtagcttagggcttaatcacaatactaacaagttctctatggattggacaggg
+cggcatccgttgactgaacgatctattaatccattccctgcactggataaacaagaccca
+tttaaattgaccatagagatgttagcgtcatatttctgttcgtgatagggtacatatatt
+ataaacggattatgagcagtggttttctagaaaagcattcatagttaggagtgtatcaga
+tcataccactgaaccatagagcacaattctctactggctatacttcattcctttttgtcc
+gggtggggacgaaatttaaaggttctaacctagaacgcagagcgaattgatcaaggcgct
+ggccaagtgaacggttctaaatgttcttaatgagaattgcgtattttgactattgacagg
+gcatcgtaaaccgctactcgacttggtatctgtaatctgtatgtagatagagtacgggcc
+tataattcaaattcagccaccgaagattcacaatcttcagacgtttgaaggaaagaggtt
+tactggtatgtggtgtcaagccccacccattctctgttatatccgagcattaatgtagtt
+tcactgtactacggtcacgccgtagagtcggcagggcaaatccaaaacaatttaggctga
+gaagtggcactataatagtttagcctaagtcccttcgctaataactcaacaaagatgacg
+caaaagtcggcgaatagattgcgttcgcgtaagggtatcttgaatactgatagctctcat
+ggtaccaagaactttcataacctctttatttaccaaacctgttctactagcgttagtgtt
+ttagtctgtagccgacacaaaaaccgagaatggccggcgtaaccggcgcctgcaagctaa
+catgggatcaaaactattggcttaacgtttaatcgaatgagactagcactgtattactct
+ttcgtttcggcagcggatcaataaggaggtgacggcatcactctcttatagtagatatca
+cttattctcacaacggaagtaggatcttccgtcctcattaaatttgcaactggctcaatg
+taacactgtaatgttaacaaagtatgagctgaaggtcagagcagacgatgtagtaaggtc
+cctcgaagctgcttacagtatccttgaggctcaacgggctatgcggaaattccagacctc
+gagttacattatgaaacgtgtcattccatctcattaaatagttcgtgccctatcgccttg
+taatataaacaaccgtttttgtctattttcccaaggagaaggagagtagcagcttagtgg
+cttgcctatatggccccctaagtacgtactcggcacgcttagaagattgggctaccccgc
+actatatgttcccaaagtaggtaacctagatagtgtcgtatgaaattcaggtcatcgatg
+agagtataaaaatatacaattttggcaggggttatacattgcgggcatgaagagtaacat
+tggacatgaacggacattcgaaccctgtgagtttaataccctatctccggatcattataa
+agtaaatatacgtcacttactctacgtgcgtttagacagtctttgaaactaaattggtta
+tttttctttcatctagatttgtctgtatctaactaaattatagttccacataaagctgat
+tcaactgaagacataaatataaactttctaacatagtagcgaggaaagagctatgcctag
+catcggatcatgcgtccgcgagtagttcctggtagagttaaaagtttttccagaatctag
+accgaacacagggtagtgaacgaaagtgcgcggtgaacatacataataccgaacgtaaac
+aattccgttcgtattgttgctgtatctatatttcctacgtaaggctatttgatctataat
+atgaaaagtcacgtcgaaataaatcaggaagcgcttcgagtatgtacattcagatctcct
+tagtatcatcaaattatagattttacggccacgaattattggtctagatgtcccaaaaat
+aatttgatgtcagtagcgatcgtgcttcctcggagttgaggttggaagaagagtcattat
+gctataccaagaactctccatccagtacctagaaaggcaggtatgtaccgctcattaatt
+ttgcgatcttgacagatctgcatgcaaagtaacttgtaccagatggcttttataatagaa
+actaagtttcccgaataacggtgtacgataacagatttttaggtgtacagacgtctgact
+caatgaacacacattgggacctgccccgggaggagtagtagataattaccttctccagcg
+cgggtcttttaatatcacaacataaaaatactaattaatatcacacaccctcatcctcga
+tggagcctagcatcatacacgtttgatagacaacgccaattttactgtaatatgatattc
+gaatctagtatgtggacgctgtaccacattgtttaaaggagctccctttaccgacatgaa
+cgaagcaagctttgtacaagatacgaagaactcagtactggtaactataagagacaattt
+atacataaaagtgttaagaccattatataaaaagaggtatgaggtctttgtaactacaat
+aatacattcatcgaacgatggagaataacagagttatttctgctgctcgagctctagttc
+tgctaatttctcaatcttgatgccactcgtttgagtcttccattcgctcttaacgacgcg
+tacatccctctctcctactcttacctatatcctattactggttaacctacatctccggga
+aagacgtaggtaaagtggtccacgattgtattcacttataacacctagtagtactatgtg
+ttgctgagagtgaggacacacttactctacgagttcaagtccatatggacattacacttt
+ttcagcatctaggtgtcatgatgtattaacagccgttaggggctatttgattttatcgat
+tgtcggcgtgtgtattttcaacaactaggtgctacaattcgtgaataggcatgaaaattc
+aagattgcagttcctatcttgtataatctttcctttggacgagttgtaccatttcaacta
+acctgcaagtggggggtcatccatatgaagatttgccaaatacctggagaccctgaaaag
+tttatccagattaataataacaaacaaacctaagcgaagaacgtcagctttaataaacta
+tcactatcatagaaattcctgttaattgttcttccaaacgttgaatagactatcacgggt
+aatagattgaacacggagaacgtttatccggcttgtaaaatatcgtcgaatctgctgata
+actcaattatattcgatggagaattcatatctaccgcttagcttttaaaaattaagtcag
+attattccgccacaatgagaaggcgcgagtgcactaatcaaatcacttaggattattacg
+gacgtctgcattacaatgctttggggtagggttatacaagcatatgattctttaggtctc
+ttgatcgggcgtttaccaccgtagcttaatgttggcatatccgtgatcctaatattctgt
+tgtcagcgtgtgtataggaatgcacaacgcaaatctttaagctgacctgttcatgaaaga
+caggagacacgaggcaccacctcaattctatgcaaaactctaacatagcgtggcactatg
+agtacgtgtaacgacaaggtctcatactcgatcctaagataattctcgtctggaaggttt
+taatctttaactaagagtagaacttagtttattgacttttacaattaggatacggttcgc
+gactctaccacagggcatcatacctggagctctgctatctcgtgaccaaagtggcagcac
+acatagggtcgggtcctgcatctactgagcaatccctttaagcattcctagtttgagagc
+catttagatattgctgtttaaaccgattaatggtttctattattataaagtgtaacgctc
+ccattcgggacattgaaaattagcaataagacaatgtatgatattcggcgagtctcaaca
+acattatggtctaccatgggacaaggggttgatatgatgaatccacaaaaaatagtcaaa
+cacccatggttcgttaagtgagggtatccaggtgttataaggacgatctagaagtattca
+ggtacacggtgttcagacatgctctaattgtcaggttgtttataatttaacgtatcgctc
+tctattctaaataatataaaattaaccgctcgtagggatgctttccagtaaaagatacac
+tatcattaaggttatgcaaatgtggcgatttgatttgaatcttagtacattcttaaactt
+aaatacgtattatttaaagtaaatatattatctaaaccgcttttgtctatccacatttcg
+tcgaatcacgacctcgttaatgcgacaatttacgaccctctttcatctaaagcgatcatc
+tatttcttctgattgatgtaatactgacccttactccgtacatacaaatgatggtaagca
+agaatgactgacgctcctgtcacctttcgtggcaatcaactggcgctggtactgaagtag
+cttgaaagggatatggatgtgtatgccaggcttcattttgacaatttttctgtcctgctc
+agtgttgtctgaagtcgtatcgtacacaataatgatgactctcattgtagatccaatcac
+gctttcctacgctaatgaaagttctagatagtgtaggtgttagacagaggttagcgccta
+catccttacacacacagtgttgaacggcaagcataatcgagtatcaatagctgtatgtat
+ttgtttggaatatcatatttctcccgcctttgaacaatgatgccaaaatgtcctgcccta
+gagttatgataaaataactgctgccctgtaacttaagtttacaaaccgatattcaatcgt
+tgtgtcctatgaaaatatttatatttgcaccaagaaaatcatctgtgcgatgaacaaaac
+acagtgatttataaatacaaagagtacatttagttaccggattgcggcttgacatttatt
+ttacagaattttatcggcaaaacacttcatatgaactatcgcttcacgataagtctatga
+tagactagcattcgtagagaacaggaagagcaatcattatatatgaagtgttacagtggg
+tactacatatgagatcattaggtctatatccggccttcctcataagaccttggaaatatc
+ttacatcagagatatcaaaggaagtatgggcgaacccagaaaaagccccaaagaatagta
+attcatcggacgtaatagtctggttttaactaggggttattgatatttaagctaaaagag
+ttccctgaacactcgaaatgtataatctatcccaactaaaaaagtatacctctaattcag
+aaatgtcattgagattagactgatgtcaatacgctaggaggtaagacaagtagaagtttt
+tgatttaggaattgaaatgtaatacctccatcttaagttctatattttaaagttttatgc
+ggacttcgagtaagtgcacaaatgatggcataagtgcccagttacatgtttgcggccccg
+tatgagtaatgatctgtttatcaatctctagctactatcccacgaatgcactgatgccag
+tcatggcgcttacattagtcgacagaaatccgacgatacctatcacgcgtgaactgttct
+ggttcttattcaattcgaagtgatctcagatacattacggccatgcttgcccttcatgtc
+tgctgagcagttttgttataggctgaatctcctctaagcgaaattgataggatttttggt
+ggtcgatttagtctgtacctgcttattaagattcaaaatgacctacttcttacgccgaaa
+tgatagggatcggctgaggaggataaatatacgctggtgcctggtatttatccagaacaa
+gttgcctgtgtatcagatgaactctaatctccgagataaaaaacaggtacgtaaaataaa
+ggccgcaaagggttacatctcaggatcgtggcgtatagtccaccattagttctgacttac
+ttaatatagactgaccgagattgtagtatgtggatccaagcttgccatgtaaaacatgtc
+ggttagcaaaacgtataggagcatgatcaaagaagagttaattaatagtactgcactata
+attgtcggcggagtaccatgagctgttgcccaattcgatgtttattaacagcacgcataa
+aaaatccagacttttcaattagaattaactataaatggtccgcgaaccttaaatgatcgg
+aaggacgggatctgccgttgtatagaccccaactctatctaatttttataacacctctgt
+aatcaacaaatcttattatgccatcattatgtcattcgccaagtaagtccagttcgagat
+tctctggaccgtgcaatagtattgtcaaattatggtaatggaatccttcttctaacaccc
+ttagaaaagccacgagaattgacaagttgggcgtgcttgtccaggagcaacataagtgcc
+gtttctttttacgatgatagggattcttaaagcttttctctattctagatcccagttgcc
+atcatcaatatctcaattgatgctcattatatagttcttatttagtatgtccagatgtca
+ctgaagatcctgcctagaaccgatattctcgacaggatcatcagttcgacggggcaaacg
+cacctatgcacatccatcttgaccgtgaaacgaaaggaaagagtcagtaccgacccaatg
+tggaaaaaaactcctgtccacgatatgtaggcaagttttactgcctttaattagtagtcg
+attagtgtagtttgatattatctaccttatagaatgtaaacagtaacccggccttaatgg
+tttggcaggattctttgtaaaagttaataatgttcataaactttatcagaaaacctgaag
+tagtccgcctttcgcctgcgtaacgttgcagattaattcgttttacggagtggcttgcgt
+cttgttgtccgagtacacatattgctcctctcccccactcttctaggaaaatcaattatg
+ctaacctgcagaccttcttctttactatctttaatgcatgcccagtatgttcatagggta
+gacttgctatctattttgtataatctacgaatgatgcttggggcgcgacttttaacaatt
+aagccgttgggtataatttgagagggtgccacgatagtaagagatttccggcgtgagtaa
+ggaaaatgataataggattaagcaggcgtaatagctcaccctcctcagttctccaaccct
+gaaccggctaagtatgactgtgcagtattaattttgaatacatattgcagcccctaggat
+acattatagatgtctctttcttacccaaactcgcccgcaccaagaaagaatgtggattcg
+attgaggttaaattagccggaattacagacacagattcttgtttacaattgtgggaagaa
+aaccacctcaaacgttgaaacctacattcacaaatggattacgttggggatgagaatcga
+ttccggtcaaaaatcatgcccggagcaataaccaagaattcacagaggattaatacactt
+ctccatgaagataggactgcttgcactatccttatctttgtgtcttccttcaagcaccaa
+tcgtttggggacaaccacaattatgccaagaaataacggaaggtgttccaaatctatgag
+tccgcggtttcatcgcaacgtttcactgtgggtatcatgactttggactttagatttggg
+tattctagagactgtagaaagactgcaacaacaagacattcacagggcgaaacctaggaa
+aggggaccgcacgttgtgctagggatgtttccttaggaatccatacatgtaagaaagaat
+caaccgtaattatagtgttttcggccccttgaattacgtgcatgcctttgctaaaagacc
+tctgggaaatagattgaatattctggacagcagcgaatcctgattatatctcaagcgaat
+atatgacccgcaagaaggatttatactagaataagtctaagaaagggcattgggtcactt
+cttccactaacacacttttatcagttttataccttgagagtcccatgcatttttatatat
+atttaactttcgttgcgtaaaactttaaatatgatccgtgctctatctctaatctgaaca
+acggtatcacgtcgaacaaatctagtggctacgaatcgcgtcgctaagaacggtttcttc
+tgctggcgttagctacgtatcttctatgctaaaaatgtatagccccgcattagcagcaaa
+accgggagaatcaaatacacatccgatgaaatcgtaacaaagataaaacaacgcgatttc
+tatgtttgccaaagtgattaagttgtatcgtaggggtcagcgctgatgtcttttcagttt
+gggttttggatttaccagtcttttagtttcggtactatttgatcgggacattcgtccaaa
+catgatggctcattcgttctttttttcaattttaatcaaaaccttgtatttacctgatac
+attaaactgagcatcgcatggaggtggagattcccatatatgtaatcatttgatatccta
+ttccattctttttagttataaataaacgctccactgcacaatgggagtaggacttcacca
+ataattagcatctactgtaaacaagcgccgtaacgaaatgattactgattgagaaaaata
+ggtctcaacaacttttgacagatatgtatccgatacccaagcgttgctaattgcgcaaaa
+gtaagtagaattacggtcgtattacttgttgccaaatggttattactccaatgggctatt
+ctaatccgatggatacgtaggagagagtgtacctacaccgaaactcgtagtgggcttagt
+ggctacgtagaagctgttcgggtcagttacagcgtgcgaccttgtaaaatcgatcacggt
+gatgaattattgttattgtttaaaagaagtcccctgaatagcccttagataatacgaaaa
+tttgttatgtccagtcgctcgtatatcaaaagattcggttaagttcgcagagttttgcca
+agtttacaggtgatttactaacacttgggagggtacgtacaaccatcacctggttagcag
+agaatgaattatacggtcatgtcgcgaagggcaagtgtgtgagtattgaccgagttatta
+aacgtaaatgcaggcatttacgtcataggacatcgagtttgtcctttgcgaaatgttaaa
+tttatggttttttccgttgagtgataatagctgcaacatgaagatagtaaaactgaggtt
+aaactttcaccatattaaattatatgttcaattacgcgatgtacaaactaatgttaatca
+gatttaggagcgcgcttaatatgggtccctatcccgactttgtacgagattttgataaaa
+aatagtattgtaaattcatttgatggcgtagaaccgggcaaaaccttgaaaaaggacaca
+tttaggatgctatttccctaagaaagcggaaaatcctggctcaatatttataatagtaat
+ggttaagattgtggcccaatcgctgagtacccgtcttacgctttttccaacacataatcg
+acgagaatgtatttaaatgtttgagacttacgttttccgcgtacttattattaaagtcat
+tggagagggtgtcgtctgggtgtagttttctcatctgctcaggagctaaaaatgtaaatc
+tattggttgtttctaattctgtcgtccgtgtaggctatttaatttttatggtacacttga
+atatgtttagccataatgtagccaatactacaatatcagatacttgtatacgacctatag
+acttttgccgaccgctcgtagagtgatttagaaagatgttcggatagcacagcaatcgtt
+tgcgaatgtaagcatgcgaagcgagtatttaactgttgactattttgctatatgttactc
+tgaatgttgttttttttaccagaatgtgttataatgatcaaccatgcacgttcctactaa
+tcatataaattttgttacgtaagcttttctatgatagtggtctaaagactacccttgcat
+actttaagattaagacatgcactttaggaggaactcacacgttttgagctgttctagccc
+acctataagccattcgtccgcaatcccataactacaatagtcggcaatcttttattaccc
+agaactaacgtttttatttcccggtacgtatcacattaatcttaatttaatgcgtgagag
+taacgatgaacgaaagttatttatgtttaagccgcttcttgagaatacagattactgtta
+gaatgaaggcatcataactagaacaccaacgcgcacctcgcacattactctaatagtagc
+tttattcagtttaatatagacagtatttgaaccaggcgctaatgttaaggcccccttcga
+aaaccttgttatgttattccatgtggtcggaggatttgcggggcgatagcgctgggcggg
+gatcaacaatttcgttcatgcgagcgcccccataaccagtaggtacagttcggaaaagaa
+aaccccacgcactcgctagaagtgttacaatcacatcacttcgtaccgaagggactactg
+tattccgtcttggggatgtaacagactgattacagtcttatgatgaagcctcattcatct
+aaaattagttgatttattccacggatactatcacactcctatagaaagagttaccaccgt
+gggaagctagatataataaataaaagacatacaatattagtatggctcatgatctacact
+tactcggatctctctttttttataaccagtagatcgcattacacgtattgttgttccgca
+tcaggccctaggggctcaaacttccatggtggataactaaaacgtccgtcactaaacgaa
+gatattaatagatgaaatacacgggtttacttgatttctgttcagtcattcacgggaaat
+cctaggagtctttcataacggcggtcttagtaggaatgtagtcaagctctgtagaggtct
+cgacggaattggtatttcctggcatcacaatttacctagtattggagatcacttaaaata
+atgttgagataataatcaggatatttctagtatgtgacaaacctctatttagtgattgtg
+attttcaattaaacaagacgtaggggtcaaattaacgactacatgttggaaagaaggccg
+aattgtaatatctaactcatgtactaagaagaagtgctttcgtttaaggctttctgtcta
+acattctaacgtcaattcctatgtaatactactgtaaccaagttattactcggctgcgta
+gataaagtctcatgtaaatgacggtttatctgttacttttgggtttcaacctagctagga
+cgccggtactaattacgacacctgcgtatagtgcagggtgttcaatgtgcctttttatgt
+ccggattataaccatccctctcccacttggaatatcaccgggttcttaatgacttagttc
+gtcttccttattttccgggtaagatcgctgtggaccggacccattttgatctagtctaaa
+aaggtatatagcgtttcgtctggcccgcttacgttcactgaaacttagattaatcaatgc
+actgcactggattaacaagaacatgttatagtgtactgacacatgttagactaagaggtc
+tgttcgggttagccgacttatatgtttaaccgattttgacaactgggttgagagataaca
+atgaagagtgaggactgtagaagatcttaaaactgtaccatagtgctcaattcgctaatg
+gcttgaattatttaattgttctaaccctggcgtcgaatttttttggttcgaaaatactta
+gcacagcgtattgttcaacgagatgcacaactgtaccgttagaaagcggcttaatgacaa
+ggcagtattgtgactattgacagggaatcctaaaaagctactcgaattggtatatggaag
+aggtatgtactgagaggtcgcgcctattagtcaaattctgccaaagaagagtcaaaagct
+taactagtttgatggtatgaggtttaatgctaggtggtctataccaccaaaaagtatatg
+ggatatcccagaatttatcgactttcaatcgtctaccgtcacgacgtacactaggcagcc
+ctaatccaaaacttttgaggatgagtactgccactattatactgtaccatttgtaactta
+cattttatatcttcaaagaggtagatattgtcggccattactgtcacttacactaagggt
+agcttgattactgatacctctcatggtaaaaagtaatttaagaacctatttttttacata
+acctctgctactaccgttagtgttttagtcggttcaagtcacaaaatccctgtagcgcac
+ccctataagcagaaggaaaccttaatgcggataaaaacttttgccggaaccgttaatcct
+atgagaataccactcttggaatcggtcctttaggctgaggatatagaacgaggggaacgc
+atcaatctaggttaggtgagagaactttgtatcaaaacgcaagtaccatatgccgtcctc
+agtaaattgccaaatgcagaaatcttacactcttttcttaactaagtatgagagcaacct
+cactcctgaacagcttgttacctaacgagaagaggctttaagtagcctggagcctcaacc
+ggatatccggatttgactctcatccacttacatgatgattacggtcattacatctcatga
+ttttctgagtgccctatagactgggaatttaatctaccctgtttctatttgttaacaagg
+agaaccactggtcaagatgacgcgcttccatttatgccaccataagtaagttctcggaac
+ccttacatgattggcctaccaacctatatatgtgaccaatgtacggtacatagagtgtgg
+cctatcatattcaggtcatcgagctcagtatttaaagattatatggtcgctgggggtatt
+cagtgcgcgatggaagactaacattggaaatcaacggaattgacaacacgctcactttaa
+taacctatctcaggataagtttaatgtaattagacggaactttctctaactccgtgtact
+aactctttgaaaataatgtgggtatttttatttcatctagatttgtctgtatcgaaagaa
+agtattggtccaaataatcctcagtaaaatcaagtcataaatataaaatttagatcttag
+gacagaggaaagtgctttcccgagcataggatctggcctacgccagtagttcatgcttgt
+gttaaaagttgttactgtttatagtccgtactcagggtagtgttcgatactcagcgggga
+actgacatattacactaaggaatcaaggcccttcgtatgggtcatgtttatatatttaat
+tacttacgctatttgatcgagaatagctatagtaacgtcgtaagaatgcaggatgcgatt
+cgagtttgtaaattcacagatactgtgtatcatattattatagatgttaaggcatagaat
+tattggtattgatgtacaaaaaattatgggtgggcagtaccgataggcattacgagcagt
+gcagcttggaagaactggatgtatcctataactagtaagagccttaaaggtactacatac
+ccagggatgttaccatcattaatttggccatcttcaatcttcgcaatgcatactttcttc
+tacaagatgccttttagaagacaaaataagtgtcaacaataacgctgtaacttaactctg
+ttgtacgtggaatcaagtctcactaaagcaactaacattccgacatgcaaacgcaggact
+actagattattaaattcgccagcccgcctcgtttaatataacatcataaaaattctaagt
+aatatctcacacactaatccgccatcgtccatagcatcagtcacctgtcttacacaaaca
+catgtttaatcgatgttgttatgccaagctagtttcgcgaccatgtaactaattgtggaa
+agctgctaccttgaacgacatcaaccatcctacctttgtacaacagaccaacatctctgt
+actggtaaatagatctgaaaagttataaatataactgttttcacattgatagaaaaacag
+ctatgtgctatttgtatatactataataaattaagcgaaacatggagattaaaacagtgt
+tttctcatcctccacctcttgttctgctaatttataattcttgatgccactcgtgtgagt
+cgtccattcgatcgtaaagaacccgacataaatagatacgacgctgaacgagatcctatt
+tctcctgaaaattattagcacggtaactcctagggatagtggtactagttggtatgaacg
+tataaaaacttgtactactttctcgggatgtgagggagcaaactattactcgaccagtgc
+aacgcattatcgacagtaaaagttttcagctgatacctgtctggatggattatatgcagg
+taggcgagagtggattgtagcgatgctcggcgggggtattttaaaaatctaggtgataaa
+agtcctgtttagccaggaaaagtcatcattgcactgcatatcgtcgattagctgtcattt
+cgtccactggtaccagttcaacgtacatcaaagtccgggcgcatccatatcaagttttgc
+aatagtactccagaccatgaaatggttatccagattaataataacttaatatactttcac
+tacatactcagcgggtattaaatttcactttatgtcaaaggactcttatgtggtcttcaa
+aaaggtctagagtctatcacgcctaattgtgtgaaaaccgagtaacttgatcagccttgt
+aaaatatagtagaatatgatgttaaatcatttatattccagggagattgaatagcttacg
+attagctggtataatttaactcacatgattaagcaaatatctgtaggaccgagggaaaga
+ataaaataaagtaccatgagttcggaacgctgcattacatggcgttgggctagcctgata
+caagaagatgagtatggagctctcttcatcgggacgtgacaaccctagcgtaatcttggc
+agatcccggagcagatgattatcgtctaacactgtctttaccaatgcacaacgcatagat
+ttaacctgaactgttctggattcactcctgactacagcctacaactcatttctatgcata
+actcttaaagacagtcgcaatatcagtacctctatacacatcggatcagactagatcata
+agataagtctcctctggatccttgtattctgttaagtacactacaaatttgtttagtgtc
+tgggacaattacgataagggtcgcgactagaccacagggcatatgacctccaccgctcct
+agcgagtctccaatctgcaagcactcatacgctaggggcatgaatcgactgtcaatgcac
+tgtaagatttacgagggtgagacccatttagatatgcctcgtttaaccgttttaggcttg
+ataggatgagtttgtcgatccatcaaattcccgacattcatattgtccaataagtatatc
+tagcttattcggactcgctaaactaaattatggtataaatgccgtcaaccggtgcatttg
+ttcaatcaacaaattatagtcaatctcccatggggccttatggcagcgtatacagctggt
+ataacgaccatatacaactatgaacggactagctgtgaactaagcagattattggatcct
+tgtgtataattttaagtttcgatctatatgctatagtatagaaaatgttccgatcgtacg
+cttcctttacagttaaacagtctatatcatgaagcttatccaaagctggacatttgatgg
+caatcttacttaattatgaaacttaattacctattattgaaagtatttatatgatcgaat
+aagatttgctctataaacaggtcgtccattcacgacctagtgattgcgtaaattgaccaa
+cctaggtaatctaaagcctgcatctatttcttatcattcatgttatactgacccgttctc
+agtacttaaaaatgatcgtaagcaagaatcactcacgctcatgtcacatttagtcgaaat
+aaactgccgatgggaaggaagttccgtcattgcgatatcgatgtctatcccacgcgtcat
+tttcaaattggttatctacggataactgtgcgatgaactactataggtcaaaattatctt
+caatctcattctagatcatataaagatgtccttcgcgattgatacgtctacagtgtgttg
+gtgttacacagagggtagcgactacttacttactaactctctcttgatccgcaagcataa
+gccaggttaaagtgctctatctttttctgtggattataatagttataccgccttgcatct
+aggtgcccattaggtaatgccctagtgttttcataaatttactcctgccatctaacgtta
+ctttaatttcccagattcaataggtctctcatttgaaaattgttatatgtcaacaaagaa
+tataatagctgagtggaacaatacactgtgagggagtaatacatactctaaattttcttt
+acggtttgcgcctgcacagttttttttatctatgtgatccgcataaaaagtaatttcaac
+gttccattcaagttaagtcttggtgacactagcattaggagagatcaccaagaccattat
+ttatttagctagggtttaagtcggttagaaatatcagataatgaggtctttatccggcct
+tacgcagtagaaattggaaatttcgtaaagcactgagttcaatggaagtatggccgaacc
+cacataatgcacaaatcaagtcgatttcttccgtccttttagtctcctgggaactacggg
+ttattcatagttaagctaaatcagttaacggaactagacaaatgtataatagttcccaaa
+tatatatctataaatcttatgcagttagggaatgcagatttgaatcatggcaatacgcta
+gctcggaactcaactacaagtgttggatgtacgaattcaaaggtattacatccttatgat
+gttcttttttggatacttttatgacgacttccacgaagtgaaattatgttcgaatatctg
+aacagttacttggttgagcccaaggatgacgaatgttctgtttataattctcgtcataat
+ataaatacaagcatatgaggccagtcatggagctttcatttggactaacatttccgtaga
+gtcatatcacgcctgtaatctgatccgtctttttctattcgaagtgttatcagatacatg
+acgcccttgcgtgacattcatggctcctgacatcgggtcttttaggctgaatctaatcta
+acccaatttgtttggattgtgggtcctccattttgtctgttaatgcttattaagattaaa
+aatgtactacgtatttagacctaatgattgcgatacgctgtggaccattaatataagctg
+cgccaggggatttttccagatcatctggcctgtgtatatgttcaaatctaatagccgaga
+gaaattactccgacggaaaataaaggcagataagcgtttcagagcaccatcgtggcgttt
+agtcaacctttagttcggaatttattaatatacaatctcactctttggacgagctcctta
+aaagatgcccttgtatatcatgtcccgtacctaaaagtataccagcatcatcaaagaaca
+gttaaggaatacgactgctctataattgtccgaggagtaccttctcatctgccaatagtc
+gttgggttggaaaacaacgcattaatatgccacacttgtcaattagaagtttctataaag
+gggacgagtaactgatttgagacctagcacggcagaggacgttcgtgtgacaacatctct
+ttataagtttgagataaaatcgctaatctacaatgattatttgccaatcattatcgaatg
+cgcaaagtatctcctgttcgtgattctagcctaaggccattactatggtcaaattatgct
+aatcgaagcagtcttctaacacccttagaaaagcaaacactattgaatactgccgccgca
+ttcgccagcaccaacataactgcacgtgcttttttccatgattggcattatgaaagattt
+gatctatgattcttaccagttgcaatattcaatttagcatgtgttcctaattattgtgtt
+attatggtctatctcatcatgtaaatgaagatcatgacgtcaacacagattctagtcagg
+atcatcagttcctcggggaaatcgcacctaggaacagccttatgcaaccgctaaacaaag
+caatgaggatgtaccgacaaaagctcgatttaaaagcctcgaaacgagatgtacgaatcg
+tttactgccttttatgaggagtcgagtactgttggttcatatttgctacatgattgtatg
+taataacgatcccgccctttatcggttcgatcctttatggcgataagttatgaatcgtca
+gtatctttagatcaaaaactcaactagtacccagttccccggaggaacggtcatgattaa
+tgcgttttacggtctcccgtccctcttcttgtcagaggaatcagtttcatccgatcccac
+tcgatgattggtatagctatttgccgaaaagccacaacgtattcggtactatcttgtttg
+attcccctgtatcttaattcgcgacacttgatatcttttgtgtttaatcgacgaatcatc
+ctgggggcgacacttgttacaattatccagttgcgtttaatggctgtgggtcacaagatt
+gttagacaggtcccgcgtgtcgtaggaaattgataattggagtttgcaggacgaatagct
+cacccgcctaagtgatccaaccctcatcaggataactatcactgggcagtattatttttg
+atttcatatgccaccccctaggagactgtagtcatgtatctttcttacccaatctagccc
+gaaacaagaaagaatgtcgattccagtcaccttttattagaccgatttacacacaaagtg
+tcttggtttaaaggctggcatgaatacatactcaaaagttgaaaacgacttgctctattc
+gattaccttcgcgatctcaatcgattacgctaaattttaatgcccgctgaaatatccaac
+atttaaaacaggattaattctctgatccatgaacttaggactcattgcacgtgacttatc
+tttctctcttaattcatgctccaatacggtgggctaaaccacttttatcacatgaatgta
+cgcaacgtgttaataagctatgagtacgcgggggcagcgaaacgggtcaatctgggtatc
+ttctattgggacggtacatttcggttttatagactatgtagttacacggcatcaacatgt
+aattaaaacggcgtaacctaggaaagccgaacgcaccttgggattgccatgtgtccggag
+gattacatacatctaagaaacattctaaactatgtatagtcgtttacgacccttgtagta
+cgtgcatcccttggcgaaaagtactctgggtattagagtgtatattatcgacagcaccga
+atcctcattttatagcttgacaatttatgacccgaaagaaccttttataagtctataagt
+atatctaacgcaattgcggcactgagtccactaactatctttgagcagtgttatacagtg
+agacgccatggaaggggtttatatattttactgtcgttccctaaaaagttaattatcaga
+cctgcgcgatctcgtagatgaacaacgcgatctagtcgaaaaatgcttgtggctaccatt
+ccagtcgagatcaaccgtttctgcggatcgcgttacattccttgcttatttgcgataaat
+cgatacaaccccattaccagaaaaacccggagaatcaattactctgcagatcttatacta
+aaaaagagattacaacccctgttctatgtgtcccaaagtgagtaacgtggagcgttgggg
+taagagcggagcgattttaactttcgcttttccattttccagtattgtactttacgttat
+atttgagcggcacattcgtcaaaacatgatccatatggactgaggtgtttaaatgttaat
+caaataattgtattttcagctgactttaaaatctgcagccattggaggtggagattccaa
+tagatgtaagcaggtgatatcatatgcaattcttgtgacttattaagataccagacacgg
+cacaatcgcagtagcacgtaaacaataatgacaatcgacggttaaattccgaacgtaaga
+tatgtttacggatgcactaaaataggtagcaacaacgtttctctgagatgtataagttac
+caaacactggagaattccgctaaactaaggacaatttccgtcgtattaattgttgacaaa
+tggttagtaatacattcgcagtggataatccgttgcatacctagcactgagtgtaaataa
+aaccaatcgactactggcatttcgggctaacgactagatgttagcctatgtgaaagcctc
+acacatgcttattgccttcacggtgagcaatgtttcttattcgttattagaagtcacctg
+tagagacagtagagatgacctaaatttggtttgtccagtcccgaggtgatctaatgatta
+ggttaacttagaacagtggtcaattggttaaagctgatttacgaacacttccgaggggtc
+gtaaaacattaaactggtgagaacagtatgatgtattcggtcatctagacaaccccatcg
+ctgggagtttggacagtgttatgattcgtaaatccaccatgtgtccgaattcgaaatcct
+gttgctccggggagatagggttaatttaggcttttttacggtgtggcatattagctcaaa
+catcaacattcttaaaatcagcgtaaacggtcaccagttgatatttgttctgctaggaag
+cgatgtacaaaataagcttaataagatttaggtccgaccttaatttcggtccatagcacc
+tctttctaagtgttttgcttaaataattgtattgttattgattttctgcgagttgaacac
+ggaaaataagtcaaaaaggacacttttaggttcatatgtaccgatgaatgcgcaatagaa
+tcgagaaatttttagattagtaatcgtgatgattgtggccaaatcccgcactaaacggct
+ttcgctgtttccaaaaaattttagtccactaggtatttaaatgttggacactgaacgtgg
+aagccgtcgtattatgaaactaatggcagaggggctcctctgcgtgtactttgagcagat
+gctatcgtcagaaaaaggtaaatcttttggttctttataattctggcgtccgtgtagcct
+agtgaatgtgtttggttcaagtgaatttgtttagccagaatggaccaattacgtcattag
+ctgttacgtctatacgaaatatagactgtggacgacccatcgtagagtcatgtagttaca
+tgtgaccttagaacaccaatcgtgtgcgattgtaagcaggacaacacagtattgtactgg
+tcaattggttcatagatctgactatgaatcttcgtttttgtacaacaatctcggtgaagc
+ttcaaaaagcctccttcctaataatcagttaatttttcgtaaggttcctgttcgaggtta
+gtcgtataaagacgaaacggccttaatgtaacattaactattccactgtaggtggatcta
+acaaggttggacatgtgctaccaataagataagaatttcgtccgcaatacaatatctact
+tttgtagcctatcttggattaacaacaacttacgttggtatttcaccggacgtatcaaat
+gattctgattttaatgactgagagtaaacatcaacgaatcttatgtatctttaagccgct
+gcttgacaagtcacattactgttagaatgaacgcttcattactacaaaacctaccaccaa
+ctcccacattaatattatactagatgtttgaagtttatttgacaaaggttttcaaaaagc
+acagaatcgttacgaacacgtacattaaattgttagggtattaattgtggtcggtgcatt
+tccggccccatagcgctccgcggggagaaactatggccttcatgacagcccccccataac
+atctaggtaatggtcggataactataaacaaccctctccagagaactgtgaaaataaaat
+ctcttagtacacaagcgtatactggtttaagtcttgcccatcttaaagactcttttcact
+attttcttgatgcctcattcttctaatattaggtgattttttaatccgagaatataaaaa
+gacgatagaaagtgttaaaacacggcgtagcgacatattttaaagaaatgaaatactttt
+tgactatccctcatgatctaaacttacgcggagctatctttttgtataacatgtacagag
+aattaatccgatgcttcttccgattaaggacatagcgccgaaaacgtcatggcggcttat
+cgatatcgtaacgcactataccaagtgattaagtgatcaatgaatacgggtttcgggatt
+tctgttaagtcatgcacggcaaatacttggagtcttgaataacgccgcgcgtagtacgaa
+ggttctcaagctcgcgtgacgtatagaccgtattgctatttcctgccttctcaattgtcc
+gaggattgctgataacttaaaataaggttgagtttttaataacgatttgtcgagtttggg
+aaaatcctcgtttgtgtgtttgtcattttcaagttatcaagaactacgggtataatttac
+gacgtaatgttggtttgatgcccgattgcgaatatcgtacgaatggtatttgtacaactg
+ctttcctttatcgattgctcgagaacattataaagtctattactatggattaagactgta
+tacaagtgtttaagcggagcccgtgataatctataaggttttggtacctttatctgttac
+ttttgccttgaaacatacatacgtacacgggaatatttacctaaacgccgtatagtccag
+cctcgtatttgggccgtgttttgtcagcattttaaactgaaagcgcccacttgcattata
+acccggtgcggaatctcttagtgactcgtcaggagtttacgcctttgagacctctcgaca
+ggacccattttgatctagtcgttataggtagagtgcctttcctatcgcaccattaccttc
+tagcaaacttagagtattcaatgaaatcatatcctgtttatactaaatgttataggctaa
+tgacacagctgacactaagaggtctcttcgggttacccgaatgagttgtttatacgatgt
+tgacaactcgggggagtcatttcaatgaagactgaggactcttgatcagattaaaacgct
+taatgactgataatttagattatgccgtgtattatttaagtgggcgaaccctcccctaga
+atgggtttcctgagaaaagtcttagaacacagtattctgaatccagatgcaaatcgctaa
+cgttagtaagcggctgtagctcttggcagtttggtcaatagtcaatcgcaatccgtttaa
+ccgtctactattcctagagcgaagagctatgttctgacacgtccccaatattaggcaaag
+gctccaaaagaacagtcaattgattaactacgggcttggtttctccgtgaatccttgcgc
+cgctataccacataaaaggatagcggtgataccacaagtttgcgacgttaaagcgtcgac
+cctcaacaagtacactagcaaccccttagcaattaattttgtccatcactactgccaaga
+gttgactggaccagttggaaatgacatttgatatattaatagagctacatattgtaccac
+tttactgtcacttacactaaccctagcgtgattactcatacatatattcgtaaattctaa
+gttatgatactagttttgtaaatttaatcggcgaagacacgttctcttgtacgagcttca
+actaaatatttcactgtagccaaccactttaaccagaaggataccttaatgccgatataa
+tattgtccaggaaacgttaatactttcacaagacaaagcttggaagaggtactttacgat
+cacctgatagatcgaccggaacgattctatataggtttggtctgagaaatttgtagctaa
+aaccatgttccataggaactcctctgtaatgggcaaaatgcagatagcgttcaatcgttg
+cttaactatctatcacagcatcctaactcctcaacagcttctttcctaaagacatcagca
+ggtaagttgacggcacccgataacccagagcacgattggaatctaatactctgtatggat
+cattacgctaagtaaatataatgattttctgactcaaagttacactgcgaattttatatt
+aactggttctatttgttaaataccacaacctctcgtcaacaggtcgcgatgcaagtgatc
+caaaaatatctaacttataccaaccattacttctggcgcagaaaaacatagatatctgaa
+caatcgaccgttaagactgtctcgccgatcttaggaacctaatactgctcagtagttatt
+gtttatttgggccatccccggattatgtcagccatggaacactaaaagtcctaatctaac
+ctatggacaaaaagctcacttttataaaattgctcaccttatgttgattgttatttgtcc
+gaaatgtctataactcagtgtactatctattggaaaattatggccggagttttattgaat
+atacttttgtatgttgagaaagaatgttgtcgtaataattatcagctggaaaatcatcta
+atatatattatattgagatattacgacagacctaagtgctttcccgtcatgagcagatgg
+actaacactcttggtaatccttctcgttttagttggtaatgtttagtctaagtaatatcc
+cgactcttacttactcagagcggaaatgactttttaaactaacgtttaaaggcacttagt
+atgcgtcagggttatttttttaattacgtacccttgtgcagagagtttagctattcgatc
+ctacttagtatgaaccatgagagtacaggttggtaattcacagagaaggtcgagaagatt
+atttttgatgtttaccaatactatgaggcgtattcatcgaaataattttatggctgcgca
+cttcacatacgcaggaagaccactgcagcttgctagatctggatgtatcattgtacttct
+aagagcctgaaaggtaatacattcccagcgagcgtaacagattgtatggggacatattca
+atcttagcaatgcattcgttcttcgaaatcaggcatttttgatgtcataagttctgtcaa
+ctataaccctggaactttaatctgttgttcgtcgaatcaaggatcaagaaagcttctaaa
+aggcccaaagcaaaacccaccactacttcagttttaaattagaatcacaccctagggtat
+tagataataattaaatgtcttaggaagagatatcaaaagatgcagacatcctcaagtgaa
+taagtctccggtctttcacaaacacatggttaagcgatgtggttttgactagagacgttc
+gccaccatcgtaatatttctggttacctgcgaacgtgaaccaaatcttacttcatacatt
+gcttaaacagtacaacttatctcttatcctatagagatctcaaaagtttgtatttttact
+ggtttcaaattgagagaaaaactgcgttctccgatttctatattattgtttaaatgatgc
+caaacatccagtttaaaacacggtgtgatcagccgactcagattcgtatcctatgttaga
+atgagtcatcaaactacggtcacgcgtacattacagagtaaactacacgaatgaaagaga
+taagaagatgaaagagttaataggtctcctgttaattatgagaaccctaactactacgga
+ttggcctactagtgggttggaacggatataaaattcgactaagttcgcggcatgtcaggc
+tcctaaatatgaagagaactcggcatcgaattatccacagtaatagttggaacatgattc
+ctctatgcatggtgtatatccacgtacgccagtgtgcagtgtagccatgcgaccacgggc
+gttgtgaatattcttcctcagaaaaggactgttgagcaaggaattggattctgtgaacgg
+aatatagtcgagtagatggaatttcctacactgcgaaaaggtcatagtaaatcaaacgcc
+gcgcgcagacatatcttcttggcaattagtactccactaaatcaattggttataaacttt
+tagaatatctttatataagttcactacttacgctgcgggtagtatatttaaagtgatgtc
+ttaggaatcttatggcggcggaataaacggcttgactatagataccctaattctggcata
+accctgtaacgtgtgaagcatgctttaatagacgactagatcagcttatagaatggatat
+gactgccacattgaagagattaacattagcgggtataatgttacgaacttgtttaacaaa
+atagctctaccacacacgcatagtataatataaaggtcctggagttcgctacgagcctgg
+aattgcagttcccctaccctgagtaaacaagatcagtatggacctatcttctgacccacg
+tgtaaaaactaccgttagcggccctgagaacggtgaagttgattatcggctaacactcgc
+tttaccaaggaacaaacaattgatggaacaggtaagcggctggattctatcctgaataca
+gcataataatatttgctttcaatatatagttatgacactcccaatatcactaactcttta
+caaatcggatatgaagagtgaattagagatggagccgatcgttccttgtattctggtaag
+tactcgactaatgtgtgtagtctaggggtaaaggtccttaaccgtcgagtctagaactca
+cgcattatgaaatcctccgagcatagagactctaaattcgccaagcaataagtcccgacg
+cgaaggatgagaagctcattgaactgtaacatttacgtcgggctcaccatgttacatatg
+cagcgggtaaaagtttttgcctggagtggttgagtttcgcgatacataaaaggccccact
+ttcatatggtcaaatatctatatcgtgctttggacgactcgataaactaaagtagcctag
+taatgccctaaaccgctgcatttgtgcaataaaaaatttagagtatatataacttccgga
+cgtatggctgccttgaatcctcggatatcgtccttatacaacgatgaacggtatagctcg
+gaactatgcagattaggcgatccttgggttgaatttttagtttccatagatatgagttag
+ttttgatatggttaccatacgtccctgcattgaaacttaatctgtatattgattgatcct
+tagcaatagcggcacatttctgggcaatatgacttaattaggttacggtttttactatga
+tggatacgttttatatgatagaataacagttgctatttaaacaggtactacattcaacta
+atactgtttcactattgtgtccaacatagggaatatattgcctgaatagatgtattatca
+ggcatcttttacgctccaggtagaactaattaaaaatgatccttagaaactttcaagcaa
+cataagctaaaagttacgccaattataagccacatcggtaggatcttcaggcattcccat
+atccttctctatcaatcccgtctgttgctaattggttatctaagcatatcgcggcgagca
+tctacgataggtataaagttgctgctatctaattcgtcataatatatacatggaattaca
+gattcatacgtcttcagtctcgtggtgtttctaagagcggacccaagaattacgtaatat
+ctctctcgtgttacccaagaagttgacacgtgattgtcagctatctttttctggcgatgt
+taatagttataaacaattgcatatagctgcaaattagctaatcaaatactcgtttcttaa
+atgttatcagcaaagctttaggttctgtaatttcactgtgtaaagagggcgctaagttca
+aaattggtttttggcaacaaacaatttaatagcgcagtgcaaaaataatatctcagggtg
+taattatttctctaattggtctttacggttggaccaggcaatgggttttttatctatgtg
+ataccaattaaaagtaatttcaaagtgacattaaacttaagtattgctgtcaagaccatt
+acgacacttcaccaacacatttatgtattgtgctacgcggtatggcccgtagtaatttct
+gatattgaccgcgttatcagcaagtacgctgtacaaatgccaaatttagtaaagctctgt
+gtgcattccaaggtgcccacatcacacattatcaacatatcatgtcgttgtattacgtcc
+ttttactagcctgggaaataccggtgattcagagtgaacataaatctctgaaagctacta
+gacaaagctagtatagttaaaatatatatttcttttaatattaggatctttgcgattgca
+catttcaagcatcgcattaacctacctccgtactcttctacaacggttgcatgtacgatt
+tctatgcgatgaaatacttatgttcttagtttggggttactttgttcacctagtcctcga
+acgcaaattagcttcgaatatctgaaaagtgtatgcgggcaccaaaacgatctcgattct
+taggtttataattatagtcagaagataaatacatgcatatctggacactcttccacatgt
+catgtcgactaactttgaactacagtcatatatagactgttatctgatccgtatgtgtct
+attactactcttatctgagaaaggacccaatggagtcacagtaagcgatcatgtcatcgg
+ggctttttccctgattataagattacactattgctgtgcttggggcctcctactttttct
+atcttaatcattttgtacattaaaaagctaagaagtaggtacaacttatctttcccatac
+gagctggaccattaatttaacagccgcaaggcgagttttaatgttaatctggaagggctt
+tatgttctaagcttttagcactgagaaattaatccgtaggaaattaatcccacataaccc
+ggtaagagaaccttacgccccgttactaataatgttctgcgcaatgtaggaagtgacaag
+ctcactcttgcgacgagctccttaatacaggccctgcgttatattcgaccgtacctataa
+ctagaccaccatcttaaatgtacagttatggttttcgacgcatagagtatgggaccacct
+cgaaatgctcagctgcaaattgtactgggggtggttatcaaacatttaatatgaatctat
+ggtaaagtactagtttatagatagccgaacactaaaggtttgcagaccttcctcccctga
+ggaacttcgtgtcacaaattagattgagaaggtggtgataaaatcgcgtatctacaatga
+tttggtgcaaatatttatcgattgcccaatcgttctactcgtactctttatagcctaacg
+ccttttcttggcgctaattagcctaatccaagaaggagtctaacaaaattacttaaccat
+actcttgtctattcggcccacgcatgcgcaagctcaaaaagttctcaacgggcgttttta
+cttgagtcccaggaggtaacattggatctatgagtcttaacagtggaaatatgattttta
+gattgtgttcagatttattgtcttattttggtctatctcatcagctatagctacataatg
+acgtcttaactgtttcgactaaccttcagatctgactaccccaaatacaacatagcaaaa
+gaatgatgctaacgcttaactatcctttcacgatcttaacaaaaaagctccatttaaaag
+aatcgaaaacagatctaccattcgtggaatcaatttttggacgagtactggtcgggtcgt
+gcttatttgctacaggattgtttcgtataacgttcaagcactttagcggttccatccttg
+atggcgttaactgatgatgcgtaagtttatggtgatctaaaactctactacgaaccaggt
+cccagcacgaaacgtcatctttaatgagtttttaggtctccaggcactaggctgcgaagt
+ggaatatgtgtcatcagagacaaatagatgattcctatagctttttgcagttaagccact
+aagtaggcggttctatagggtttcattcaaatcgatcgtaattcccgactctgcatagcg
+tgggtcttgtatagaccattcttcaggcccgccacaatggtttcaagtttcaacttccgt
+ttattggctgtccctcaatagagtcgttctcagggcacgactctcgttcgttattcataa
+gtccagtttgatccacgaatacagaacacgcatatctgataataaaagcttaacgataac
+tttcacgcgcatggtttatttttgatttattaggcaaccaaataccagaatgtagtcagc
+gatatgtagtaaaatttagacaaacataaaacaaagtatcgccattacagtctcctgtta
+ggagaacctttttatcaatatgtgtaggcgtgtattggcgcccttgatttaataataatt
+acggctaaacgtattgatattttccaggaactgccccatctcatgagatgaccctaaatt
+ttattcacacctcatttttaattcttttatatcacgattatttatctgagcaagcatctt
+tgcaagcattcatagtgacggtgctgtctctatgaatgcatgctaatatacggtgcgcta
+aacatattggttcaattcaatgtaagctacctcggaatttgcttgcactaagacggggaa
+gccaaaacggtaaatcgccgtatatgctagtgccaagggacttgtccgttggagtcacta
+tggagttacaagcattataaatctaaggaaatcgcagtatcagtccttaccccaaagata
+cttcgcattccctggggtacggaccatgaaatacttctttcatacatgataaacgatgga
+gactcggttaccaccctggtagttactccatcaattggagttaactaagatcgctattac
+aggctttattagccaatcatcacaagcctctttttagagattcacaagttagcaaaccaa
+agttcctttgataagtctttaacgagatctatcccaattccggctaggagtaaaatttat
+atatttgagatcggggttaaagtcacacgcaatgcaaggggtttttatatggtaatgtcc
+ttccctaattaggtaattttcagacctccgagagagagtagatcaacaacgcgttatact
+cctaaaatgcttgtcgataacatgacactacagatcatccctggatgagcatcgactttc
+attacttgattagttcagttaattcgtttcaaaccattttcaacaaaatcccccagtaga
+tatgtatatgcacatcttagactaaataacagttttcataccctgggatttgtgtcacta
+tctcaggaacgtcgagacgtcccctatcaccgcagcgagggtaactggccctgttccatt
+gtaatcgatgggacgggacgttatattgcagacccaaagtagtaataaattcagccatat
+ggacggagggggggaattgttaagaatataattcgattttcagctgaatgtaaaagctcc
+agccattcctcctccacttgacattagttcgaagaaggtctgagaattggaattgcttgt
+gacgttttttgtttccagacaaggaaatagcccagtaccaagtataatattatgacaata
+gaagcttaaattcacaacgtaacatatctgttagcatgctctaatagaccgagaaaataa
+gtgtctatgtgtgcgagaactgtcaattcacggcagtagtcacctaatctaacgtctagt
+tcccgactatgaagtcttcacaaatggttagtaataatttcccagtggagtagaagtggc
+ataacgtgcactctctgttaataatacctttagactactcccatttcgccagaacgtctt
+gatggtaccctatgggaaacactcacacatgcttattgcctgcaacctcagcaatgtgtc
+gtatgcggtatttctacgaacagctagtgaaaggactgatgacctaattttggtttctca
+agtccagacgtgatattttgatgaccgtatctgacatctctgggcaattcggttaacctc
+tggtacgaaatagtccgtcgcgtaggtaaaaatgataatgctgtcatcactatcatgttt
+tagctaagctacactaccccatcgctcgcacgtggcaaagtgtgaggattccgatatcat
+ccatgtgtacgaattcctaatactcttgctcagggcacttagggttattgtagcctgtgt
+taccgtctcgcatattagatcattaatcaacagtcttataatcaccgtaatcggtaaaca
+gttgttatttgttctgataggtagacagctaataaagatgctgttgaacagttacgtccc
+acctttattgccctacagtgaaactagttcttactctgttgctgtaatatgtctagggtt
+attgatttgctgccacttcaaaacggaaattaagtcattaacgaaaatggttccttcata
+ggtaaagatcaatccccaattgaagccagaaattttgagatgtcgattcctgatcattcg
+ccaaatttacagctcgtaaacgagttccatgtgtaaaaaaatgttgagtccactagcttg
+tttattctggctcaaggtacgtggaacacgtagtattttgatactaatgccagacccgct
+acgatccctgtactgtgagcagagccgatcctcagaaatagctaaatcttgtgcttcgtt
+agaagtctcgactacgtgtagcctagtgtttgtgttgcgttatagtctatttgtggacac
+agtatggtcaaatgacgtcttttgatctgacggcgttaacaaagatactctgggcaacac
+acatacttctctcatgttgtttcttcggacctttcataacctttcctggcacatggttag
+ctgcacatcacaggattgtaagggtctagtggttcagtgagcggaatatcattcgtcggt
+ggtgttaatctatctcggtgtagcttataaatgcatccgtaagaatattatgtttatttg
+tcggtacgttcatggtagtggtgtcgccgatttagacgtaaaggcatgtatggatcttga
+tctatgcaaaggtaggtccatctatatacgttgcacagcggatacaaataagataagaat
+ttactaacatttaaattttcttattgtcgagcatagattggaggaaaaacttatttactt
+ggtatttaaacggaagtttctaatgtttatgattggatgcacggacagtttactgcttac
+tttcttaggtttcttgaacaacaggatgcactagtaacatgtctcgttcatgcttccatt
+aagttcttcttaaacttacacaaactacctaatttagagttgacgagatggttgaacgtg
+ttgtgacaaacgtttgcaaaatgcacagtatcgttaccaaaaagtacatttaagtgtgtg
+cgtaggaattctgctacgtccattgcaggccacattcacatcccacccctgaatatatgg
+actgaatcacacacaccaaatttcatctaccttatcgtagcataactattaacaaacata
+tacagacttcgcggtaaataaaatatattagtacacaaccgtatactggttgaactattg
+cccagctttaagacgcttttaactaggtgcttgatcaagaagtattattatatgacggca
+gtgtgtaatacctgaatagatatagacgttagattgtctgaaaacacgccgtagagacat
+ttttgttagatatgtatttctttttgacgagccagcatcttagtatctgaagacgagcta
+tatgtttgtagaaaatcgactgacattgtatacgaggcggcgtaagattaaccaaattcc
+ccagaattagtaatggcgccttatcgatttactaacgatatataacttgtgatgttgtct
+gcaatgtatacccgtgtaggctgtgctcttatcgaaggaaacgcattgaagtccaggctg
+gatgaaaccaccgcgtacttccatgcgtctatacatagcgtcaccgatactacgttttgc
+tatgtaatccattctaatgggtaagaggattcctcttatagtaaaatatgcttgactttt
+taagaaccattgggagtggttggcaaaataatagtgggtgtctttctcagtgtatagttt
+tctacaactacccctattaggttacaagtaatctggctttcttgccacttggcgatgata
+gttagattcgtatttctacaacgcagttactgtatccatggcgcgagataattagatacg
+atttgaatttggatgtagactcgttactactgttgtagaccagcacgtgagtatctagat
+gggtttgctaccttgttagcggacttttgccgggaaaaagacatacgtacaaccgtatat
+tttactataagcagtattggccaccctcgtattgcggcagggtgtgctcacctggttaaa
+atgaaagagaaaaattccattttaaaacccggaggaatctattactgacgaggaaggtgt
+ttaacccgttgagacatctcctaacgtaaaaggttcatattctagttattccgagagtca
+ctttcctatccaaacatgaactgatagcataatgacaggttgaatggaaagcatatcctg
+tttattctaaatctgtttcgctaatcaatatgctgtcacgaactcggagcttacccttac
+aactatgtgttctgtttaccaggtgctaatatcccggcactcttttcatgcatgtcgctc
+ctagcgtcatctgatttaatagcttaatgtctcatattttacagtagccagtgtagtatg
+gaaggcggcgaaccagcccctacattgggtttcctgacataagtattacatatcacttgt
+ctgattacacagcaaaatcgctaaccttactttgcgcatgtagctattggaactttgggc
+tagtgtctatcccattaagtttaacagtagactagtccgtgagcgatcaccgagcttatg
+tctcgtacccaagttttggatttggatcaaaaactactcgatattcatgatctacgggct
+tcctttctccgggtatcattgcgccgagattaaaaataaaacgatagcgctgtgaaaaca
+tgtttgacacgggatagcgtagaaactaaacaacgaatagaccatccaatttgaatttta
+ttgggtccagcacttcgccatagtgttgaatggtaaagttcgaaaggaaatttgttatat
+taattctgctacattttcgaccacttgtatctcaaggacaatatcccttgaggcttttag
+cagaaagagatgccgtaattctaagggatgataataggttgggaaatttaagagcagtag
+taacggtcgcgggttcgaccttaaactatatatttaaatctagccaaacaagttaacaac
+aaccataaagttatgaccttattatattggcaagcttaacgttttaattgctctagtaat
+agagtggtagaggtaagggaccatcacctgattcttcctccgcaaccattatatagacgt
+gtcgtctgacaaatttcgagataaaacattcgtccttagcaacgaatatcgaatggcaat
+tagccacattgagttaaatagttgaggatatttcttgcacagaatcagatctaatctaat
+gattcgttactaaacacttcaccaggtatcgtgaaggctcaagattacccagagaacctt
+tgcaatataagaatatgtatgcagcattaccctaagtaattatattctttttctgactca
+aagtgacaagccctagtgtatattaaatcggtatatttgggaaattcctcaaactatcct
+aatcaggtagccatgaaagtgatcaaaaaagttcgtacttataccatacatgaattctgg
+ccaagtaaaaaatagattgcgcaaaattcgtaccttaagtctctcgccaagatattagga
+tcctattactcatatcgtgtttttctttattgccgccatccccggagtatctcacccatc
+cttctcttaaaggcctaatattacctatgcaaataaacatatattgttgaaaattgagaa
+cctgatcgtgattcttatgtgtaccatatgtatagtaatcacgcgactatatagtgcttt
+agtatcgcccgtgggtgagtgaatattctgggctagcgtgagatagtttcttgtcctaat
+atttttcagatcgaatagcttctatttttgtgtttattgacatatgtcgaaactccttac
+tcagtgaaagtcatgaccagatccacgaacaatcttcggaatcagtctcgttttacggcg
+gaatcttgagtctaacttatatcccgtcgcttactttctaacaccccttatgtattttta
+aaattacgtttattcgaacgtacttggcggaagcgttattttttgaagtaagttacattg
+ggcagactcttgacattttcgatacgactttctttcatccatcacaggactcgttcgtat
+tgatatcagaagctcgtgatgattagttgtcttctttaccaatactttgaggcctattct
+gcgaaatttttgttgccctgcgaacttcacataccaaggaacacctcgcaacatgccttc
+atatccatcgttcattgtaattcttacacaatgaatcctaagtaattacatccctgcgta
+aaagatggtaggggcactgaggatatattaccaagcatttagttatgagtaatcagcaat
+gtttcttgtattaagttctctaaaatagttacatcgtaatgttatctcgggttccgcgaa
+taaacgagatagattcattatatatggccctaagcaaaaacctcctcgtattctgttggt
+aattagaatcacacaatacgggttgagatattaattatttgtagtacgaagagatataaa
+aagatgaacaattactcaagtcaagatgtatacgggatttataataaaaatcgggtagag
+atctgctttgcaattcagacgtgccactaaatcgtaatatgtcgcgttacatcagaaagg
+gtaactattattaattaataaagggcttaatcactacatattagatcttatccgatagtc
+ttatctattcgttgtatttttaagcggttctaattcagtcattatatcagtgctccgagt
+tctttattattgttttaaggatgacaaaatgcctcttgttataacgctgggagaagcaga
+ctaagagtcggagcagttggtagaatgaggctgcaaaagacggtctcgacgaatggacag
+actttactaaaccaatgaaagacagaagtagagcaaagtctgaagtggtatcagcttaat
+tatgacaacccttaatacttccctttcgccgaatactggcgtggaaaggttttaaaagtc
+gaagtagttagaggcatctctcgctcataaataggtagactactcgcaatccaatgtgac
+tatgtaatactgggaacatcagtccgcgatgcagcgtgtttatcaaccgtccccactcgc
+ctggggagacatgagaccacccccgtggggattattagtccgcagtaatcgactcttgac
+aatccttttcgattatgtcatagcaatttacgacagttcagcgaagtgactactcggcga
+aatggtattactaaagcattcgaacccacatgaatgtgattcttggcaatttctaatcca
+ctaaagcttttccgttgaatctggttgtagatatttatataagttcactaattaagatca
+cggtagtatattgatagtgatgtctttgcaagaggttggccgaggaatttacggattctc
+tattgatacaatttgtctggcttataactcttaaggctgaaccaggcgtttttagacgac
+ttgatcagctgttagaatggtttggactccctctttcatgtcagtaacatttcagccgtt
+attgttacgatatgcttgaacaatattgatctaccacacacccatagtatattttatagg
+tcatgctgttacctacgagcatggtattccacttcccattcaatgagtattcaacatcac
+tagcctcagagatgatgacccacctctaataacgtcacgttgcggccatgtgaaacctga
+acttgagtagacgatatcaagcgctttaaattgcatataacatttgagggtaaagctaag
+cggatgctttatataatcaatactcaataataagatttgattgcattttagagttatgac
+acgacatagttcactaacgagttactattcccagatctagactgaagtactgatcgagac
+gatccttacgtcgatgatcgttagttatcgacttaggtcgggtctctagcggtattggta
+cttaaccggacactatactaataacccatgatcaaagcataacagaatacagacgataat
+ttcgccaacatatatgtacagaccccaagcatgagaagctcattgaaagctatcattgaa
+gtcccgctcacaatgtgtcttttccagacggtttaactggttcccgggagtcctggagtt
+tcgacttacataaatggaaacaatgtattttgctaatttatctatagcgtcatttggacc
+aatacagaatattatgttgcctagtaatccactataacccgcaagtgctgatagaaaatt
+tttagacgatttataaatgccccaagtatccctcccgtgaatcctccgttatactaatta
+gtattcgttcatacgtataccgcgcatatatgaacatttggcgataaggcgcgtgaattg
+ttacgtgacagagatagcagtttcttgtgatatggttaacagacgtacatgaagggaaac
+tttatatctatagtgatgcttccgtagaaataccgccactggtctgccaatgatgaagta
+tgtagctttaggtttgtactatgaggctttcgtttgtttgcagagtataacagttgcgag
+tgaaaaaccgacgaatttatactaatacgctttcactattggctacaaaatagggaagag
+tttcaatcatgagagggagtatatggatgctttgtagctaaaggtagaacgtatgtatat
+gctgccgttcattcttgaaagatacataagcgataagttacgacaattataagcaacatc
+cctaccttcgtaacgatttcactgttactgcgcttgaaatacactatggggctattggcg
+gagagaagcagatcgcgccgagcatatacgagacctataatgttgatgatagagaaggcg
+tctgaattgatacatcgaagtacactttctttcgtagtatctctcgtcctctttctatct
+ccggacacaagaattaagttatatatatagagtcttaccaatcatgttgaatcctgattc
+tcagagttctttggcgggccttgtgatgactgagaaacaatgcaatattgctccaaattt
+cctaagcaaattctcggttatgttatgttatcagcaaagcgttacgttatgttatttaaa
+tctggaatgacggagcgaagttcttatgtcggtgtgggaataattcttttgaagacagca
+ctccttaaataatatcgctccgtgtttgtatttatcgaatgggtctgtaaccttgcacaa
+gcaaatcggtggtgtatatatcggataacaattaatacgatgttcatagtgacagtatac
+tgatcgagtcctctaaagtcaattacctcacttaacaatctcattgatgttgtgtcattc
+ccggtatcgcccgtagtatgtgctctgattgaccgagtgtgaaccaaggaacatctacta
+atgcctttgttaggtaagatctctctgaattccttcgtgccaacttaaaacattatcaaa
+atttcttctacttggattaactacttttacgagcatggcaaattcccctgtggaagacgg
+ttcattattatcggaaaccttatagaaattgcgtgttgactgaaattagatttttattgt
+aagagttgcatctttgcgattcctctggtctagcttccaatgaacagtcctcccttctat
+tcgacatcgggtccttcgtacatgtctttgcgatgtaataattaggttcggagtgtggcc
+ttaatgggtgcaactaggaatacaacgcaaatttgctgacatgatagcaaatcggtatgc
+cggcaccaaaacgtgctccttgcttagcttgtgaatgagactcagtagttaaataaatcc
+atatctgcaatcgattccacaggtattgtccactatctttgaactactctaagagataca
+agcttagctgagaccgaggtgtatatgactacgctgatatctgtaaggtaccaatgcagg
+caaagtatgcgagaagctaataccggctgtttccagctttataagattaaaatttggctg
+tcctggcggcctcagaattgttctatcgtaatcagttggttcattaattagctaagtacg
+aggtacaacttatctgtcccagaacagctccacaagtttttttacagccgaaacccctgt
+gtgaatcttaatatccaagcgcgttatctgattagagtttacaactcagtattttatcag
+tacgttttgtttccaacattacccggtatgacaaaatgacgccacgtgtcgaataatggt
+ctgaccaatgtaggaagtgaaaagataaatattgcctacacatactgaattcaggcaatg
+cgttttattcgaaaggtcatataactagaaaacatgatgaattcttatcggatcctttta
+ctagcatagtgttggcgaacacctcgtaatgctcagcggcaaattggactgcgggtcctt
+atcatacattttttttcaatataggcgattggtctaggttagtgattccccaacacttaa
+ggtttgctgacattcataccctcagcaacttcctctcaaaaattagagtgagttggtggt
+cttataagaccgttgattatttgaggtggtcaaatgatggtgcgatgcacaaatcgttat
+aatcgtactctgtagacaataacccattgtagtgccgattttgtgcataatacaagaagg
+aggatataaaaatgacttttcaataatattggctattagcaacaagaaggagaatcctca
+ttaagttagcaaccgcagggggtactgcagtccaaggaggtttcattggagagagcagta
+tgaaaacggcaattatgattgtgagattcgctgaagattgtgtctctgattttcctagat
+agaataagctatagctacttaatcaactcttaactgtggagactatcctgatgatctgaa
+taccccatttacaaaattccatatcaatgaggctaacgcttaaatttcatttctccatcg
+taacaaaaatcagcctttttatacaagacaaaacactgcttccattacgggtagcaatgg
+ttgctcgactactggtagcgtcgtgatgtggtgataaagctgtcttgcgtttatacttaa
+acaaattttgacctgacataatggagcgacttatcggatgttgccgatctttagggtcat
+ctattaagcttatacgaaaaagggacaagcacgttacgtaatctggtaggactgggtacc
+tagaaacgcaagaggaggcgaactccaatatctgtaagaacagaaaaatacaggagtcct
+tttcatttttcaagttaacaatataagtaggagcttagagaggcttgcatgaaaatcgtt
+aggaattacagaataggcagagagtggggcgtgtagactacattcttcaggccccacaat
+atgggttataggttaaactgcactttttgcgatctcccgaaatactgtcgttctctgcga
+accacgctcgttccttttgctgtagtccacgttcatccaactattcagataaacaagatc
+gcagaattaaagcttaaccatatcttgatagcccatcgtgtatggggcatgtatgtgcaa
+acaaaagacctcaatcttgtctgcgagagggaggaaaatttagacaaacataattcattc
+tttcgactggacacgctaaggtttggacaaactttgtatctatatctggaggcctgtatt
+ccagcccttcttttaataagatttacggcttaaactatggatatttgccaggaaatgaca
+ctgctattgacaggaacataattttgattcaaacctcattgttaattattttatatctcc
+tgtttttatatcagaatgcttctgtcctagaaggcatactcaaggtgagggctcgaggaa
+tgaatcataatagaccggcccctattaatattggttcaattctttcttacataacgcgga
+atttgattgcacgaacaccgggaacacataaccgtatagcgcccgttatgctagtgccta
+gcgactgggaccgtggagtctatatcgtctttctaccattattaatctaaggatatacca
+ctttaagtcctttcaactaacataaggcgcattccatgcgctaaggaccttgaatttatt
+atttcttacatgataaaagatcgagtcgacgggaacaaaaggctacgtactcaataaagt
+gcagtttactaagagccctttttctggcttgtggagactatcataacatgaagatgtttt
+gacattcaatagtttgcaaaacaaacttactttgtgtagtattgaacgagatctttccaa
+ttgccccatagcaggaatagttatatattgcagatcgcggtgtaacgcactccaaatcca
+tcgcggtgtgtgagggtaagcgacttaaagaattacggtttttgatcaaagcacagtgag
+agttgagcaaattacagttatacgacttaattcagtctccataaattgaaacgacacttc
+ttaacgggaggaccagacacgttcattaagtgaggagtgcactttttgactttaaaaaca
+tggtaatcaatttaaaccacttgatatgtatatgaacagatttgaagttatttctgtttt
+aatacactgggagttctgtcaatatcgcaggaaccgcctgacgtcccctatcacacctca
+gagggtaaagggacaggggaaagggtaatcgaggggtagggaacgtagttggcacaccca
+atggacgaataaatgctgccatatccacggagggcgggattgcggttgattttaaggcga
+tggtaacctgaatgtaatagatcatcaaatgcctcctccactggaaattactgcgtacat
+ccgctgagaattgcaatggagtgtctcggtttttctttaaacaaaaccaaattgacaact
+tcatagtataatttttgcacattacaagcgttaattaacaaacttactttgctgttagct
+gcctatatttgtccgacaatataactggatatctctgcgagaactgtaaattaacggcac
+ttggaacataatagttcctattggtaacgacgttgtaggcggcaattatccggtggaaga
+attgacaactgcagttgaactgcatgaaagtcaaatctctcgtaagtataactttagaag
+actccaaggtacccagaacctcttcagcggacacgatcgctatcaatcaataaggattat
+tcactgaaaccgctcatatctggaggtggacgtttttcttcgaaaagcttgtcaaaggac
+tcatcaaatttttggccgtgctaatcgacacacctgttattttcatgaccggataggaca
+tctcgcggaaattcgggtaacagctgggtagatataggacctcccctacgtattaatgat
+aagcctgtcataactagcttggtttaccgaagagacaataaacattcgagcgctcgtgcc
+aaactcggtgcattacgtttgaataaatcggtaacatgtactattactctgcctaacggc
+acttacccgtttgggtccatggggtaaccgctcgatgttgacagaattatgctaaagtcg
+tttaagatcccgattaccgaaaatctggttatgtctgagcattcgtacactgcgtattaa
+gatcaggttgaacaggttcctaacaaattttgtgacctaaagtgaaactaggtcgtactc
+tgggcatgttttatgtcgtggcgtatgcatgtgctgacacttctaaaaccaaattaaggc
+tttatccaatatgggtccttaagtgctaaacatcattcacaatttcaagacagattgttg
+gtcttgtcgattccgcatctgtcgccaaattgacacatcgtaaaccaggtacatcggtaa
+ttatatgttgactaaactaccgtgtgtattctggctctaggtacggcgaacaagtacgat
+gtgcttaagaagccctcaccccagacgagcccgcgtaggtcacatcagcagatcctaagt
+aattccgttttattgtcctgagggagtaggatcgacgaactctacaagtcgctttgtcgt
+gccttataggctatttcgggtcaatgtagcgtcaaatgaactattgtcatctgtacgagt
+taactaagtgtctatcgccaactaaaagacgtctcgatggttctttatgcggacctgtca
+tatcattgactggcacttgcttacatccaaataacacgtttgttagcggatagtcgttaa
+gtgtgcgcaagatcatgaggcggggggggtaatatttcgccctctacatgataaatgaat
+aagtaagaagatgatctttttgtggcggtaccttaagcgtactcctgtcgacgagttact
+actaaaggaatgtagggttctggatctatgaaaagcgacctccatatatatacgggccta
+agcggagtaaaataagtgatcaatggactaacattgaaatgttagtattgtcgaccattg
+agggctggtaaatcttatttacgggcgtgggaaaacgaacgtgatatggtttagcatggg
+atgcaagcactcgttaatgcttactttagttggttgcgggaacaacaggaggctatacta
+actggtagcgttcttgcttccattatgttattattataattaaaaataagacatatggta
+gagttgtagtcagggtggatcgggttgtctataacgttggaataatcaaaactatcgtta
+acaaaaacgaaatttaagtcggtgcggtggaatgcgcctacctcatgtgcaccacacatt
+cacagcacacccctcattataggcaaggaagcaaacaaaaaaaagttaatcgaccgtatc
+cgaccttaaattttaaaataaatagaaacacttagcggtaatgaaaagataggactaaaa
+ttcactagtatcctggaacgaggcaacagagttatctagatggtaacgaggtgctgcatc
+aagatgtatgatttttggtccgctgtgtggaatacctctattgatatacaagtgactttc
+tcggtaataacgcacttcacaatgtgttgtttcttttctatgtattttgcaagagaaaga
+agcttagtataggtacacctcagagatgtttcgtgtaaatcgtatcacatggtataactg
+caggaggaacattatccaaattcaccacaattactaatccacccttttacttttactaaa
+gatatattaattctcatgttgtctgaattgtataacccggtaccctgggagcgtatcgaa
+ggataccaattgaagtcctcgaggcatgttacaacacacgacttccttccgtctattcag
+acactcaacgagactaacttttcctaggtaatcaatgatattgggtaactcgtggcatct
+tatagttattgatccggctcttttgtagatcctgtgcgactcgtgcgctaattaagactg
+gctctcttgcgcaggggatacgtttattctacgtacccgatttggttactactaagcggc
+ctttcttcaaacttgcagttgtgacttacattcctatttcttcaaagcagggaagggtta
+cagggagagacttattgagatacgattggaatttccatgtacaatcgttaatacgcttgt
+agaccagcaactcagtatagagatccgtttcctaaagggtgagcggtaggggcaaggcaa
+taagaaattactaaaaccctagttgttaatataagaacgattcgaaacaataggattgcc
+caagggggtgcgaacatggtgtaaatcaaagagaaataggcattgttaaaacccgcacgt
+ttctagtacgcaagaggaacgtcggtaaccagttctcaaagatcctaacctaaaaggggc
+ttattctactttttccgacactcaatggacgagacaaacatgaacggatagctttaggtc
+tcgttgaatgcaaagaatagaatcgttattattaatcggtttccattatctatatgcggt
+atagatctccgagaggaccctgtaaactagctctgcggtttaactggtgctaatagaccg
+ccactatgttattgcttctagctcctagcgtcttatcatgttatacattaatgtcgcata
+ttggacagtagccaggcttggatggatcgccgacaaaaagaaaagactttccctgtaagg
+acttaactattacatataacttggatcattaatctgcaaattagagtaacggtctttcac
+cagcttcatattccaacgtggcgctagtcgatatcccatgaagtttaaaactagaattgg
+cagtctcacttcacagtgcgtatctatacgacaaaagtggtcgatttgcataaatatctt
+atcgatattcaggttattaccgattccttgctaacgctagaagtcacaccagagtaataa
+taattccagacacctgtgaaataatcggtcactacggatagactagtaacgataatacgt
+atagtccataaaagttgaattttaggggctaaagatattagcaatactggtctagcctaa
+tcgtcgatagcaaagggctgtgaggatttctcctacattttcgaccaattgtatcgatag
+gaatagttacagtcacgcttgtagatgtaagagatgacgttattcttagggttcttaagt
+cggggggtaatttaagaccactagtaaaggtagaggcgtacacagtaaacgatattttga
+aatcgtcaaaaaaaagtttacaacatcctttaagttagcaactgattttagtggcaacct
+taacggttgaattgatctactaatacaggcctacaccgaagggtacagataatgattctt
+actaccctaacatgatagagtcctgtcctatctcataggtcgacattttaaattcgtaat
+gagcaacgaagatcgtttcccaatttgcaacattcacttatagacttcaggttatttcgt
+gctaacattaagatagaatataatcagtcgttaagaaactattatccagctttcgtcaac
+cataaagattaaaaactgaaacttggcaagatatgaatagctatcctgctttaaccgatc
+gtatgagatgctttgtagcaagaaaagtgactagcacttgtgtttagtaaagcgggagag
+tgcggtaattaatattaatatactattaagctacacagcaaaggctgcaataatgttagt
+aagtagaacataaaggtattctccacaagtaataaatagtgtgagctaattgactaactt
+aactctcgcgacaagtgatgtggataagatgactcatatcgtctttttctgtagtgccga
+catcccacctggatcgaacaattccttctagttatcgactttgattacctatcctattaa
+acagatagggttgtaaagtcagaaaatgatcggcttgcgttggtctaccatagctagagt
+tagaacgcgtagatagaggccttttgttgccaacgtgggggtgggatgagtctgggcgag
+cgtgactttctttcgtgtccgaatttgtttaacatccattagattagatgtttgtgtttt
+gggtctgatgtcctaactactttctcagtgaaactaatgtcatcatccaagtaaaatagt
+ccgatgaagtctccgttttcggccgaagcttgtctataacgtatataaagtcgctgaatt
+tagaacacaccttatctatgttgtaaagttactttattccaaaggacgtgcacgaagcgt
+gagtgtgggaaggaacttaaagtcggatcactcttgtcagtgtagataagaatttctttc
+atacttcactggaatccggcgtatggatatctctaccgcgtcatctggtggtgtctgcgg
+taaaaagtcttgctgcacgagtctgagaaatttttggtgccatcacatcgtaactgtaca
+acgaacaaatagcatcaggccttcttatccagcgtgaagtctaattatttcacaagcttt
+cctaagtatgtaaatccctcacttaatgatgcttgcgccaatgaggatagaggacattgc
+atgtacgtaggactattctccaaggggtcttctattttgttagcgaaaattgttacagcc
+taatgttagagcggcgtacgactttataccagatactttcattagatatgcaaatatcca
+attaaatcatagtagtatcgtggtatggacaatcaaaaaagacccgttgtgatatgatgt
+ttttctagttcgttctcatatatatagatcaacaatgaataatctcatgatctataaccg
+atgtatatttatattccggttgactgctccggtgcaattcactacggacactaatgacta
+atatggcgcctttcatcagaaacgctaaatatgattaatgaattaagggagtattatcta
+attattagagagtagcagttagtctgatattttcggtgtatgtgttagccgttataatgc
+tgtctttttatcagtgagaacagggagtgtgtagtgttgtatgcttcactttatgactct
+ggttatatccctcggagaacaagaataagagtacgagaagttcggtcattgaggatgaaa
+tagaaccgctagacgaatggactcacgtttataaaactatgtatcacagtactacagcta
+actctgaagtccgagaagcttttgtaggacaaaacgttataagtacctttcgcagaatac
+ggccgtgcatacctgttataaggcgtagtagggacaccatgctatccctcatatagagct
+acactaataccattacatggtgactatcgtttacggccatcatctgtaagcgatcatgcc
+tcgttagcatccgtacaatctcgcatggcgtcactgcagaaaaaccccgtgcggattttg
+agtcagaactattcgaagcttctcaatccttttccattatggcatagcaagtgacgactc
+gtcagccatgggaataatagcactaatccgattacttatgaattagaacccacatgaatg
+tgattctgcgaattgtctaagaatctaatgattttccggtgaatatggttgttgttattt
+attgaacttatattattaacatcacccttcgttagtgatagtcagctatttccaagaggt
+tccccgagcatttttaccattctctagtcatacaagttggagcgcttttaaatctttagg
+ctgatcaaggcgttttgtctagaattctgcagatgttagattcgtgtgcaatccctcttg
+catgtcagtaacaggtcacccgtttttcgttacatatgctggtaaaatattcatagtaat
+aactacaatacttgatttgttacgtaatgctcgtacataacacaatcgtattccacggaa
+cagtaaagctctattattctgatcgagcctaagagaggatcacactacgctattaaagtc
+acgttcacgaaatctcaaacctcaactgctggtgaccagttatagacagtgtaattccat
+attacatgtcaggcttaagctaacccgagcctttatataagctataatcaagaattagat
+tggagtgcattttagacttatctatcgaaatagtgatagtaagagtttatatgacctgat
+ctagactgatgttctcttccacaacagccttaaggcgtggagcctttcttatactattag
+gtcgcgtcgagagccctattcgtaatgttaacgacactagactaatatacaatgagctaa
+gaataacacaagtcacaagataatttacaaatcatatatctacagtccacaaccatcact
+agcgattgcaaagcgttattggtactaccgctctaaatcggtatgtgcaagacgcgttaa
+ctggttcaagcctctcctgctcgtgagactgaaagaaatcgaaaatatggatgtgcctaa
+ttgttcttgtgagtcatgtgcaactatacagtttagtttggtcaagactatgcaactatt
+aacagcatgtgcgcattgaatatttggtgtcgattgataaatgccccaacgttccatcac
+gtctataagccgtgttactaatgtgtattagtgcatacctattcagaccatagttcaact
+gttggactgaaggcccgtcttggggttcgtgaatgagagtgcagtttcttgtcttttcct
+taactgacctaaatgaaggcaatcggtttatctagagtcatgcttaaggtgaatttcagc
+caatgggctcccattgagctagtatggtgctttacctttgtaagtggtggctttccttgg
+tgtgctgactttaacacggcagagtgattatccgaagaatggataataagacgctggcaa
+tattggctaataaagtccgatgagtttcaatcatgactgcgaggagatccatgcggtgta
+cctaaacctacatcgtatgtatttgctgacgttcattcttgatacataaagatccgatat
+cggtccactttgtttaccaaaagccctaccttcgtaacgatggaaatgtgaatgagagtg
+aaatacacgatggggatattgccggtgagtacaagttagaccacacattagaactgacct
+atattcgtcatcatagagatggagtatgaattgattctgcgaagtacactggctttacga
+gtatctagacgccgcggtatatctcccgtcaatactatgaaggtatatatatagaggctg
+aaaattcatgttcaatcctctttctaagagtgagtgggagccccttctgttgtcggagta
+aaaaggcattattcctcaaattgtcagaagcaaagtatacgtgatgtttgcttagaacaa
+aagagttaccttagggtaggtaaatctcgattcaccgagagaagtgattttggcggtgtg
+cgattaattcttttgatgacagatctcattattttatatagctccctctttgtatttaga
+gtttgcgtaggtaacctggcaaaaccatatcccggggggagagtgcgctgaacattttat
+acgatgtgattactcaaaggataaggttcgaggcctctatactcatggaactatcttata
+attataatggatcgtggctcattccacctatccaaacttctttgtgatctgatgctacga
+gtgtgaacaaacgtacatcttctaaggaatttgggacgtttcatagctcgcatttcattc
+ctgaaaacttaaatatttttaaaaattgattctactgcgaggaactaaggtgtagacaag
+cccttagtaaccggtggatgtcgcttcagttttatagcaaacattattcaatttcagtct
+tgactgaaattagtttgttagtgttagaggtccatatgtcacatgcatatggtctagatg
+ccattgtacagtaataccttagattagtattagcggcatgcgtacttggatttcacttgt
+aagaatgagcttaggacggtcgcctgtagggctgcaaataggaatacttacaatttttga
+tgacttgttagcatatcgctatcacccataaaaaacctgatacttgatgagcgggtgatt
+gagactatgtactgatataattcaatagctccaatagatgaaacagctatgcgcctattt
+atgtcaaataatcgatgtgatacaagcttagagctgaacgagcgcgagtggaattagcgg
+tgatctctatcctaaaaagccacgaaatcgatcccagaagctaatacccgaggtgtcaag
+cttgagttcagttaaatttgcatctcatgccccacgaagaatgggtagagagtttgaagg
+tgcttctggattttcctaagtacgtggtaaaaatttgatgtaaatgaacacctcctaatg
+gttgtgttaaccacaaacccctgggtgaatctgattagccaacccagtgatctgatttca
+gttgtcaaatctcttttttataactaccttttgtttccataatttaaccggatctcataa
+tgaacaaacgggtagaataatggtagcacatagcgagcttgtctattcagaaatatggcc
+tactcagaatgtattctccaaatcagtgttatgcgaaacgtaattttacgtgtaataatg
+atgatttcttatcggttccttgtactacaatactcttgcccaacaaatactaagcataac
+agcaaaattcgaatccccctccttttaataaatggtttttcaatatagccgattcgtatt
+cgttagtctttcaccaactattaacctggcatctaattaataaaatcaccaaaggactct
+ataatatgacagtcacttcggcctcttttaagacagttgattattgcaggtccgcaattg
+atggtgacatgcacaattagttagaatccgactatggagacaattaacaattgtagtgcc
+catttggtccagttgacttcaaccacgagttataaaggtattttaatttatagtcgatag
+taccaacaacaagcacaatcataattatgttagaaaacccagggggtaatgctctaaatc
+cagctttaaggccagagtgcactatgaaatcgccattgatcattgtgtcattcgctgaac
+ttggtgtctaggaggtgccgagtgagaatatcagataccttatgaagcaacgattatatc
+tggactagatcatgatgatcggaataaaacattgaaataagtccttatcaaggagcataa
+acattttatttaatttatacttcgtaaataaattcagaattttttttcaagacattaatc
+tgagtaaatgacggctagaaagggttcctactcgaatcgtagcctacgcatgtgggcagt
+aacctggcttgcgtttttactgaaacaaaggttcaccggaaagaaggctgccacttttag
+cttcttgacgatctttagcgtcatatttttagattagtcgaaaaacggaaaacaaactta
+acgaagctggttgcacggggtaccgagaaaccaaagagcaggacaactccttgatcggga
+agaactgaaatagacagctgtcattttcattggtcaacttatcaatataacgaccaccgt
+agtgacgcttgcatgaaaatactgaggatgtaaactatagccagtcaggcccgcgtgttg
+actaattgatgaagcaaacaaaatagccggtattcgttaaaaggaacgggttgccagcta
+cagatatactctaggtatatcccaaacaagagacgtcctttggctgttgtaatcggtcat
+aatacttgtcacataaacaagatcgctgaattaaacattaaacagttagtgatacacaat
+cgtggttggggctgggatgtgcaataaaaagtcatctatcgtctatcacagagcgacgta
+aatttagacaaacattattatttcttgacaatggaatcgataagcgttcctctaacttgg
+tatatatatctcgaccccgggattccagccattcttgtatgaagatttaaccatttaact
+atgcatagttgaatggtaaggaaaatgatattgactgcaacagattttggatgcaaaaat
+atttgtgaattattggttatatactggttgtatagcacaatcattaggtcctagaaggca
+tactcaacctcagcgagagagctagcatgcataattgtaccgcccatattaatattcctg
+aaatgatttcttacattacgcccaatttcagtcatcgaacacccccatcaatttacccga
+tagagaacgtgatcatacgcaataccctatgcgaacgtccactctatagcgtctgtatac
+aatgattattcgttccatttacaacgttaagtaatttaaacttacataaggacaaggaaa
+tccgcgaacctcctggaatgtatgagttatttatgcagttaacttcgtctcgaccggaac
+taaaggcgtcgtacgaatgaaaggccacttttagaagagacctttgtatccattgtggag
+aatatcataaattcaagatggggtgtcatgctattcggtcctaaacattcttaatggctg
+ttctattgttagtctgatttaaaatggaaccatagcacgaatagttagatagggctcata
+cccctgtaacgatctacaaatccttccccgggtgtgtgcgttagcgacggaaagttttac
+ggtttgtgatcaaagaacactcacacgtcagattattacactgatacgaattatttcagt
+cgacagtaattgaatagaaacttattaacgccagcacctgacacggtaagtaaggcaggt
+ctgaactgtttgactgtaaaaaaatggtaatatttttaaaaatcttgatttctatatcaa
+atgatgtgtagttttttctctgttattaaaatcccagtgcgcgaaatttagatcgttacg
+actcacgtacaagatcacacatcacacgcgttagcgaaagcggaatggctaatacagccc
+tacgcaacgtagtgggatcaacatatggacgaatttatgctcaatgagccaacctccccc
+gcattgcggttcattttaaggcctgggtaacatctatcgtttagataatcaaaggaatcc
+gactatgcaattgtctgacttcatccgctctcaagtccaatgcaggcgctacgtgtttct
+ttaatcaataccatattgaaatcgtaatacgataattgttgctattgactacaggttatg
+aaaaaacttactttgcgggtacatgcatatttttgtaccacattattacgcgatatctct
+cagtgtactctaaattaaaccctcttcgaacattttagttcctattcgtaaacacgtgct
+acgcggcaatttgccggtcgtagaatggacaactccagttcaactgcatgtaactcatag
+ctcgcgttagtataaattgactagtagccatgggacaaagtaactagtcagcggaaaaga
+tccctttaaagatatatgcaggttgcaagcataaagctcattgctcgaggtgcaccgtgg
+tattccaaaagcgtctctatcgtatcttctaattttgggccgtgagaatcgaaactactc
+tgatttgctgcacacgttaggtaatatcgcccattttcccgtataagctccgtacttata
+cgaactacacgaccttttaagcattagccgctcatatcgtgattcgtgtacagatgagtc
+tattaaaattacagacatactccatatctcgctccttgaactttgaataatgcgctaact
+tgtactatgaataggcagaacccaactttcccgtttgcgtcaagcggggaaacgatacat
+gttgtcagatttatgattatctagttttagatcacgtttaccgataatcggctgtggtct
+gagcagtcctacactgagtatttacttcagcttcatatcggtccgaaaaaaggttgtgac
+cgaatgtcaaaatacggagtacgatgggcatcttttttcgagtcgcggttgcagggcagc
+aaaaggcttaaaccatttttacgatttttactatagcggtcatgaagtgcgaaactgctt
+gcaaattttctacacacattgtggctcttgtccttgaagcttatggcgaaaatttgaaac
+atagtataccagggaaagcgcgaattatttggtgactaatagtccgtgggtttgagccat
+atacctaacgccataaactacgtggtgctttagatgcaatctaaacagaacagaaagcgt
+agcgctcatcagcacagactaactttttcagtttgagtcgccggagggacttcgagacaa
+gaacgcgtcaagtcgcttgcgcggcacggattcgattgggcggctcaatcttgcctaatt
+tctactattgtcagctgtacgactgtactaagtgtatagccccaaataaaagaagtatcg
+atgcgtctttatgaccaaaggtcttataattgaagcgcacttccgttcatcaaattaaat
+cctggcttacccgattctccggaagtctgacctagagattgacgacggccgcgtattatt
+gagacctcttcaggattaatcaataacgaagtagttgatctgtttggcgacgtaccttaa
+gccgactccgctacacgagtttctactaaaccaatgtagccttatgcttagatgaatacc
+gtcctaattagatattccggcataacagcagtaaattatctgttcaatggacgaacattg
+aattgttagtattctacacaagtcaggcctcgtaaatattaggtaaggccgtgggataac
+ctacgtgatatgcttgagcttgcgttgcaagctctcgttaatcattaatttaggtgcgtg
+agggttaaacaccagcatattctatatgctagacgtcttccttaaaggatcgtagtatta
+taattaataataagaaatatggttgacgtctagtcagcgggcatacgctgctctatatac
+tggcattattcaaaacttgacggtaaaaaaacgaattttaaggcgctcacgtcgaatgag
+ccgaactcatgggaaccaaaatgtcacagaaaacacctctttattgccaagcatgcaata
+aaaaaaatgttaatagtacgtttacgacattttattttataataaagagaaactattaca
+cctattgatatgataggacgtaaattaacgagtagcctgcatagaggcaaatgaggtttc
+tacatggtatagacctgatgctgaaacatcgatgagttttggtcccctcgctcgttgaaa
+tctagtcatttactactgtctttcgagctattataccacttcactatgtggtgtttcttt
+gctatgtatggggctagtcaaacatgatgactatagctacaactcagagagcgggcgtgt
+taagagtatctcatgctagaactgcacgacgaacttgatacaaagtaacaacatttacga
+ttccacaaggtgactttgaagaaacatagtttaattctctgcttcgatcatttctataaa
+ccggtaccatcgcagcggatagatgcataacatttctactactccaggcatcttaaaaca
+cacgtagtacttcactagattaagacacgataagtgtataacttggcagtgggaagcaag
+gagattggcgaactcctggcatctgttacgttttgttcaggctcggttgttgataatgtc
+cgactcctgccatattgaagactcgctcgagggagatcgggattcgttgattataagtac
+acgtgttccgtaatactatgaggcagtgattcaaaatggcacttctgacttacatgacta
+ggtattattaccacggaagcgttaaaggcacactcttatggacttaagattgcaagtgcc
+ttcttctagcctgaattcgcgggttcaacacaaactctctttagacatccgttgcctaaa
+ggctgagacgtaggggcaaccctttaactatgtactaaaaaactagttggtaatttaaca
+acgtgtccaatcaagacgatgcaccaacgcggtgcgaaaatcgggttaagcaaacacaaa
+taggaattgtgataaaccccaccttgagaggtcgcaagaccaacctcgggaacaacggct
+ctaagagaataacctaaatccggatgagtagactgtgtaactctctaaagggaagtgaaa
+aaaagctaagcatacatttaggtctcctgcattgcattcaattgaatcgtttgtattatg
+agctgtacagtagctatatcagctatagttatcccagaggaacaggtaaactagctctga
+gcgtgaaatccggatattagaacccctagatgggattgattctagctaatacaggcttat
+ctggttttacagttatctagatgattggtaaggtgaaacgcttggtgccttccaccactt
+aaacaaaagtattgcccgggaagctattttctaggtattataaagtcgagcattaatatc
+aatttgacagtaaaggtctttcaccagcttcatatgccatagggcccatactcgatttaa
+attgaacggtttaacgagtattggaactctcacttataactgagtagctatacgaaaaat
+ctggtccatttccagaaatttattatcgatttgctgcttagtacccaggaagtgataacc
+cttgaaggcacaacactgtaataagttttcctgtcacatctgtaatattcggtcactacg
+cattcacgactaaagataattactatactaattaaaagttcaatgttagggccgaatcat
+agtagaaattctcgtctagcctaatcggacttacctatgggctgtgaggatttatcagta
+tgtggacaaaaatgctagagataggtatagttaaagtcaccatggtacatctatgtgagg
+aagtttgtagttcgcttctttagtccgggcgtttgggatgacaactactatacgtagagc
+cgtactcaggattagatagtgtgaaagagtcaaataaaagggttaatattaatttaacgt
+tgcaaatgtgtttaggccaaacattaaccgttgtagggatattctaatacaggccttcac
+cgaaccctaatgataatctgtcttaataacattaaatgattgtctccgctacgagctctt
+agggcctcattttaaatgactaatgtccaaagaagagactttcccaatttcaatctgtca
+cgtatagacggcaccttagtgagtcatatcattaagatagaagattatcaggagggaagt
+ttctattatcaaccgttacgcaaccataaacttttaaatctcataatggcattgagatca
+agagctttcatgatggtaaagttcgtatgtgatgctggggagctagatatcggtatacca
+cttcggttgtggtaagcccgagtgggccgttagtaatattaatagacgattatccgacaa
+tgcattcgctgaaataatcttacttaggagaaattaatgctatgagccaaaactatttat
+gtctgtcacattattgactaaagtatctatcgacaaaactgatgtccataagttgtagca
+gatagtcggtgtatggtgtcaccaatgaaaacctcgagcgaaaaatgaattatagttatc
+caatttgagtaaattgcctattatacagataggcttgtttagtcagataaggttccgctt
+gaggtgctctaacttagcgagagttagaaagcctagtgagaggcattttggtgccaaact
+ccggctcgcatgagtaggccagagagtcactttctttcgtcgaagaagttggtgaacagc
+cttttgattagttgtttgtcttgtggctatgtgctactatataagttagaacgcaaacta
+atctaatcagcaaagtaaaataggaccttgaacgagacggggtacgccgttgaggctcga
+gatagtagataaactagaggaatgtagataaaacattagctagggggtttagttactgga
+ttacataggaagtgcaccatcacggtgtgggggttcgtacgtaaagtcgcatcaatattg
+tcagtggacttaacaagttcgtgcataatgaaatcctatacggactttgcatatctctac
+cgactcatctggtcgtctatgcgggtaattgtattgctccaagtggatgactattttggc
+gtcccagcacatagtaaatgtaaatccttataatagcataagcaattattagactgcgtg
+aagtcttagtagttctcaagctttacgttgtatgtaaataactcacgtaatcagccgtcc
+ccaaatcaccattgaggtcattgaatgtacggagcactattatcaatgcggtatgcgatt
+ttctgagcgattattgttaaagacttagcgttgagccccggaacacttgattacagattc
+tttaaggagttatccaaatatcattttaaataatagtagtatcgtgctttggacaataaa
+aaaagacccgttctcttatgttgttttgcgacgtacttctctgatatatacttcaactat
+gaagattctattcatcgataacccaggtatatttatatgcccgttcactgcgcagggcaa
+attatctacggacaataatgacgtagttggacccggtaagaactaacgcttaatatgatt
+aaggatgtatgccagtattatcttattatgtcagagtagaagtttctctgagattttccg
+tcgttgtggtacaccggatttggctctctttttagaactgagaactcggagtgtgtagtc
+ttgtttccttcaatttatcaatatgcttttataccgccctcatcaactataacaggacga
+caagttccgtcttgctccatcatatactaccgatacaccaatcgtatcaagtttagtata
+cttgctttctctcttctacagcttactcgcttgtccgagaagcggttggtgctcataaag
+ttagtagtaaatgtacaactagtagccagtccttacctgtttttacgactactacggaca
+ccatgagatacagaagttagtgctacaattataccattacatgctcaatatcgttgtcgg
+ccataagatcgaagagtgcatcacgcgtgtgaatacgtaaaatctaccatcccgtcaatg
+cacaaaaacacactccccttgttgactaacatcttttacaagaggctaaatcattgtcca
+ggatcgaataccttgtgtacaatcgtcacccatcggaagaataccacttttccgatgtag
+tatgatttacaaaaaacatctatgtgagtaggccaattgtagtagaatatattcatttga
+ccgtcattagccttcttcttaggttgtgtacggatagtaggtacataaaccgtcgtgtgg
+catacgctgcgatttcatacagctgccaacaccttttttaccaggctagagtcagaaaag
+ttggagccatgttaaatagttaccatcataaaccactgttgtctactagtctgatcagct
+ttcatgcctgtgcaagcaatatggattctcacgtaatggtaacaactgttgcgttactta
+ggctggttaatttgtcagagtaataaatacatgtcttgttgtgtttcctaatcctcggaa
+agtacacaagcctaggaataggaaaagtaaagctcttttattctgatagtgactaactca
+ggatctaaatacgcgattatactaaccttcaccaaagctcaaaaatcatctgctggtgac
+cagttatagacagggtaattcaatatttaatgtctcccttaacatttcaccagcatggat
+tgaagatagtataaagttttacatggcagtcattgtgtcacggttctatacaaattctga
+tagttagacggtatttgaaatgtgcttctagcatggtatcttacacaactgaatgaacga
+ctggagccgttcgtatactatttgcgagcctcgagaccccgtttcctaatgttaacgaat
+atagtataatataaattgtgatatgaataacacaagtaactacagtttggacaattaatt
+gttctaaactaaaaatcattcacttcagatggcatagagttatggctactacacatataa
+agcggtatgtgaaacacccgttttagccggaaaccctctactgctcgggacaatgaatga
+tttccaaaatatggatgtgcagaattgttagtgtgactcaggtccaaatagacactttag
+tttcgtcaagtcgttgcaaagtttaaaaccatcgcagcattctttatttggtctacattg
+agaaatgaaaaaacgtgacagaaagtctagaagaactgtgaataatgtctattactgatt
+aactagtaagacattagtgcatctggtccactgaagcacccgcttggcgttaggcaatct
+ctgtgaactgtcgtggctgttccggtaatgtacgaaagcaagcctataggttgatcgagt
+cgcttcattaaggtcaatttcacaatatccgatcacattgtgctaggttcgtcctttacc
+ttgcttagtgctgcatgtacggggtgtcatgacttgttatcggcagactctttatcccaa
+gaatggataatatgtacatggaaagtgtccataattaagtcccttcactgtaaagaatga
+ctgccacgtgatccatgaggtctacagaaaccgacttacttgctttttgatcaacttaat
+tatggattcataaagttcagatatcggtacaattggtgtacaatatgaaattaatgagga
+aacatggaaatctgaatgacagtgatagaaaagatccccatttgcccggtcagttcatgt
+tacaccactcattagtactgtaagtgtttcgtcagcattgagatccacgatcatgtgttt
+atgccttcgaaactggatgtacgacgatcgagacgaagaggtatatataacctaaatact
+aggtacgttgttagagagacgatgaaaattaatcgtcaatacgctggcgaacactgaggg
+ggacccaatgctcttctcggtctaaaaaggaatgtgtcagaaattggtcagttcaaaagt
+agaccggatctttgcggagaacaattcacggaacgtagcgttgggaaatatcctttctac
+cacacatcggattttcgccctctcccattatttattgtgttctcacatagaattattgtt
+tagacatccctcgttgtatggagagttgcccgagcgtaaaggcataatccatataccgcc
+gggtgagtgacctgaaattgtttttagttgggatttcgctatggattagcttacacgaag
+agattctaatggtactataggataattataatgctgcgtggcgcagtacaccgttacaaa
+cgtcgttcgcatatgtggctaacacggtgaaaatacctacatcgtatttgcaatttcggt
+cgtttcatagagcgcattgaattactcaaaaattatatatgttgattatttgattagact
+gcgtggaaagaaggggtactcaagccatttgtaaaagctgcatctcgcttaagtttgaga
+gcttacattagtctatttcagtcttctaggaaatgtctgtgtgagtggttgtcgtccata
+ggtcactggcatatgcgattcatgacatgctaaactaagaaagtagattactattaccgg
+catgcctaatgcgattgcactgctatgaaggtgcggacgtcgcgcccatgtagccctgat
+aataccaatacttacatttggtcagcaattctgacattatacctagcacccataaattta
+ctcagacttgaggacaggctcttggagtcgatcttctgtttgtatgcatgtgatcatata
+gatgaataagcgatgcgactagttagggcatagtatagatctgtgtatacagttcagctg
+aacgtccgcgagtggaagtacagctgagatctatcctaaaatgcaaccatatcgttcaca
+catgatatgaacccagggggaaacattgagttcagttaaattggcagcgaatcccccaag
+aagaaggcggagtgacgttgaacgggcttatggtttttcagtacttcctccgtataagtt
+gagcgaaatgtaaacagaataatcgttgtgttaacaacattaaaatcgcggaatatgatg
+agaatacacagtgtgagcatttcacttgtaaaatatctttggtagaacttactttgcttt
+aaatatgttaaaccgatctaataatctacaaaacggtagattttgcctagcacattgcgt
+ccttctctattcagatagaggcaatactcagaaggttttatccaaagcactgtgttgact
+aacctaagttttagtctaataatcatgattgattataggtgccgtggactacatgactcg
+tccacaaataatacttagcagatcagcaattggccaagcacccgacttttatttaatggt
+tgtgcaatagtccagattcgtattcgggactctttcaaataatagtttcctggcatctaa
+gtaagaaaagctcataaggaagcgatattatgacacgctcttccgccgctgttttgaaac
+ttgagtattgctcgtccgaaattgagggtcacttcaaaatttactgagaagacgaagatc
+gactaaagttaaaatgctagtccacagttggtcaagttgaattcatccacgagttatata
+gctattttaatttatagtcgagtgtacaaaaaacatccacaataagatttatcttagaat
+aacaacccccgtatcatcgaaatcctccgttatggcctgactcctcgagcttatagcatt
+tgtgctggcgctcttgccaggaacttgctcgcgaggtggtgacgagtgagatgatcagtt
+tcattatgatgatacgattttatcgcgactagttaatcatcatagcaagtaaaatttgaa
+ttatgtcattatcatgctccattaacaggttatttaattgatactgacgaaattttttca
+caatgggttttctagaatttaatatcagtaattgaagccttcataggggtcctactagta
+tcctacacgacgcaggtccgcagtatcctggagggacgtgttactgattaaaagggtcaa
+aggaatgaaggctcacaatgttacctgcttcaccatagtgagccgatgagttttacatta
+gtactaaatcccaaatcatactttacgatgaggcttgctagcgctaaagagaatacatac
+accaccacatagaattgttagcgatgatatcaaatagactcctggaagtgtcagggggaa
+actgttcaatatttcgtccacaggactgaccaggcatggaaaagactgacgttggaaact
+ataccatctcacgcccgacgcttcactaattgatgatccaaaaaatatagcccggattcc
+tgattagcaaagggttcacagagaaagatattatcgacgtatatcccaaaaaacagacgt
+aatgtgcatcttcgaatcgggatgaatacttgtatcataaaaatgtgacctctagtatac
+aggttaatgttagtgatacacaatactcgtgggccatgggttctcaaataaaatgtaata
+ttgcgtcgatcactcacccacgtatttggtctaattatgttttatttagtgacaatccaa
+tagataaccggtcctattaagggctatatttttagcgaccacgcgtttaaacaaaggatt
+gtatgtagatggtaccagtttaattgccagtgggcaatcctaagcaaaatgagattctat
+cctaaagtttgggcttgatataagatttcggatgtatgggttttataatcgttggagagc
+tcaatcatgagctaatacatggatttcgctacctcaccgagagaccttgcatgaagaatt
+ctaaccaaaagtttaataggccggattggattgagttaattaagaccttgttcagtcata
+gtaaaaacccttaaattttaccgattgacaaagtgagcagtcgcaataccctatgcgaaa
+cgcctcgatagtgactaggtatacaaggtttttgagttcctttgaaatagttaactaatt
+taaaattaattaacgacatggaaatcacagaacctaatgctttgtaggagttatttatgc
+tgtttactgcctctacaaccctaataaagcagtcctaagaatgaaacgcatcttttagtt
+cagaaagtggtatccagggtggtcaatttaataaattcaacatcgggtctcaggatattc
+ggtcatataatttattaagggctcttcgagtcttactctgagtgaaattggaaacagtca
+tccttttcgttgtgaggcatcttacaccgctatcgatatacaatgcattccaccgcggtg
+tcccgtacacaaggaaacttgttaccttggggatataagaaaactcacacgtctcattat
+taaactgagtacaatttttgcacgagaaagtaatgcaatacaatatgatgaaagccagct
+aatgaaaagggatggaacgcacctcggatctgttgcactggattaaaatccgattatttt
+taaaaatattcagtgctagagcatatcaggtctacttttttatctggtatgtaaagccca
+cggagcgatagtgagatccttacgactcaacgaaaagttataacataactcccgttagcc
+aaagcccaatcccgattactgccctaccctaacgtctgccatctaaatatcgaacttgtt
+atgatcaatgtgactacctcccaccctttccccttcatttgttccactggggataagcta
+gcgttttcagaatcaatgcaataagaatagccaattgtctcacttcatcagagctcttgg
+caattccaggcgctacgtggttctggaatatattcatttttcaaatagtaatacgtttag
+tgttgctattgtctacacgtttggatattacgttatgtgagcggacatcaatagttgtct
+aactctttagtaagccagagatagcactcttagcgaatggataccatcttccataagttt
+agttaatagtccgaaacaactgcttcgagcatatttgaacctccttgtaggcaaatagcc
+tcttcaaagcaatcttactaatagatagagtttgttttaagggactactagaaatgggac
+aatcttaatagtatgacctaaactgacatttaaagatatatccaggtggcaagcataaag
+atcattgcgccacctccaccgtgggattacttatcagtcgatatcctatatgctaagttt
+gcgacggcagaatacaaactaagctgagttgatgctaaccttacctatgataccccattg
+gaccggttaacagccctacttattccaaataaaagaacttttatgctgtagaagctatta
+tagtgatgcctggtaacttcagtatattaaaatgacacacatacgccatatagagctcct
+ggaactttgaataatgagcgaacttcgaagttgaagagcaagaaaccatatgtcacggtt
+gcctaaagcccggtaaccagacatgtgctatcattgatcattatcgaggttttcataacc
+ttgacccattatcggctgtgcgcggacaagtacttaaatcactagtttcttcacctgctt
+atcggtaagaaataaggttggcaaagaatcgcataagacggacgtagagccgcagcgttg
+tgcgagtccaggtgcatgcgcagcaataggattttaaattttgttccatttttaatttag
+ccgtaaggatgtccgtaaatgattgaaaattggattcaatctttgggcctatgctactgg
+aacctgatcgacaaaatttcaaacatacgttaactccgaaagaccgtatttttgcggcta
+gaatagtcagtcgcttggagccatataccttaccacttaaacgacgtgctcctgtagttg
+aaatataaacagaacacaaagactaccgatcatatcaactgaagatctttgtaactttga
+ggcgaagcaccctcttcgagacaactaagagtaaagtaccgggcgccgcaaggagtcgat
+tgggaccctaaatcttgacgaattgctaagaggctcagagctaccactgtaatttctcta
+gagcccataataaatgaacgatacatccgtaggtagcacctaagggattataatggaagc
+caaatgcagttaataatattatatactggcgtacacgattcgacggatctctcacatagt
+gattcacgacccccccctttgattgacacagcgtcagcattttgcaagaacgatcttctg
+catagggtgcgccaccgtaaggatgacgtcgaagctacaactgggtataatttaccatgc
+ttccctgatgctgagtgcaatacactaagaatgagtttttaccccatatcaccagtattt
+gttctgttattgcgaagaaatggctatgctgagttggcgactaaagtcacccatcctttt
+tattaggtaaccccctcccttaaactaactgatttgctggagctgccctgcatacatata
+ctttatcatttatggacgtccgtgacgcttattatccaccatagtcgatatgctacacgg
+attcattaatggatcgtaggagtttaagttatatttactaagatcggtctcggctactat
+cccgccttacccggcgctatttacggccatttttaatatattgacggtaattattcctat
+ggtttcgaccgcacgtccttggacaagaaagaatggcaaaaaaaatgtaaaagaaaaaaa
+atattgagtccctaccatcatataaaaaatatgtgatgagtaacttgacgaaatgttagt
+ggttattaaagactatctattacaccttttgttttctgtcgtagtatattaaagtctaga
+agccttacaggaaaatcagggttatacagccgatactccgcagcatgaatcatcgaggag
+gtgtcctaccatcgcgccttgtaatcttgtctgtgtatactgtatttagaccttttatac
+aaagtaaatatctcggctttatgtgattgggaggggcctactcaaacatgatgacttgac
+ctaataatcactgtgcgggcgtcttatgactagctattccttgaaatccaccaccaaatg
+gttaatatgtaaaaactttgacgatgaaacaaggtgaatgtgtagttactttgtgtaatt
+agctgcgtcgagcattgcttgtaaaaccgtcaatcgcacacgttacttccataaaatttc
+tacgaatacacccttcttaaaaaaaacgtaggaattcacgagtttaacaaacgataactg
+tataaagtggaagtccgaagaaagcagatgcccgaactactcgaagatgtttcgttttct
+taaccataggggcttcttaatggcccactacgcacattttgttcaagcccgagagggaca
+tccccattacgggagtattactaaaactgttccgtaatacgttcagcaagggatgaaaaa
+ggccactgctcaagttattgacgtgggagtattacatcggaagcctgaatcccacactat
+gatggtctgtacaggcctagggactgcgtctagacggtattaccggcttctaatcatacg
+atcgtgagtcttaacgggaagtaaggctcacacctaccccaaaccatttatctatgtaag
+tataaaattgtgcgtaagtgttcaaagtggacaataaagacgtggcaaaaacccccgcac
+ataagccgctttagatttcacaaataccaatgcggttaaaaacatccttgagtcgtacat
+acaccatactcgcgttaaacggatataacagaagataataaatccggatgtggagtcggt
+gtaactatagaaagccaagtgaaataatgcttaccagtcatttagctatacggctttcat
+ttcatgtcaagagggtggagtttgacctgtacagttgatatatcaccgatacttagaact
+cacctaaagctaaaattgctcgcagcgtgtaatccgcatattacaaacaatagatgggat
+tcattatacataagacacgatgatctgctttttcaggttgcgagatgttgcctatcgtca
+atcgagtcctgccttacaccacttaaacaaaagtattgacagggaacctattttcgaggt
+attatatagtccagcttgaatatcaatttgacagttaacctagtgaaaatcagtaagagg
+aaatacgccacattctccagtgaaattctacgggttatcgtctagtccaactatcaatta
+taactcacgagatataagtaaattctcgtacttggcctgatttttattatactttggatc
+cttagtaaacaggaagggagaaaccttcaacgaaaaacactggattttgttttactctca
+aagctcttatatgacggaaataccctgtcaagtcttaactttattactagactaatgaaa
+tgggcttggggtggccagaatcatagtacaatttagcggatacactattcggactttcct
+atcggctgtctggttggataagtatggggactaataggctagacatacctatacttaaac
+tatacaggcgtcatctatctctgcaactttggagttccctgatgttctcccgccctttgg
+gttcacatcttctataccgacacccctaataacgattagtttgtgggttagagtaaatta
+atacggttaatattaatgtatcgttgaaaagctggtgtcgccaataaggtaaccggctag
+gcagagtatatgtcacgaagtataactaccctaatgataagctgtaggaataaaattaat
+gctgtctctaagcgaagagatatttccgactctgttttaatgacgaatctcattacttct
+gacttgcaaatgttcaatatggcacggtttcacggcacctttgtgacgcatataatgaac
+ttagaagattataacgacggaactttatatgataatccgttacgattaaagaatctgtta
+aatatcataatggcattcagttctagaccgtgcatcatggtaaacttactttctctgcat
+ggcgacatacatttcgctattcaaattcgcgtgtggttacacccactcgcacctttggaa
+tattaagagaagatgatcagaaaatccattcgctcaatttttctgacgtacgtctaattt
+atcctaggagacaaatcgttttatgtctctcacatttttgaagaaaggttcgagagacaa
+tactcaggtcctgaactgctagaagatactcggtggagcgtggcaacaatgaaaaactcg
+tgacataaatgaatgatacttttccaagttcagttaagtgaatatgtttaacatacccgg
+cttttcgatcttaagctgacgctggacgtgcgagtaatgtcagtctcttacatacactag
+tgactccaagtttcgtcaaaaacgccccctcccttctcgagcccactcacgctatgtatt
+gacgcgaacttgttcgggatcagacttttcaggagttcggtcgcgtgtccctatgtgcta
+atatataagttagatcgcattagatgctaatctgaatacttatagacgaccttcaacgag
+aacgggtaccaccttgaggctagagttaggtgtgaaacgacaggtagggacatataaaat
+ttgagtgcggctttagttaagggtttaattacctactcaaacatcacgctcgcgcccttc
+gtacgtaatcgaccatctagaggctaaggggactgtactaggtagtgattaatgatatcc
+tagacgcacgtgccttagatcttcagactctgatggtccgcgatcaccgtaattgtagtc
+ctccaactcgatcactttgttggcgtcaaagaaattacgatatctaaatacttataatac
+aataaccaaggatgagaatgactcatcgcgttggagttatattgcttgaagttctatgga
+atgaaagcacgttatctgccgtcccaatatctccagtgagctaattcattggacggtcca
+ctttgatcaatccccgaggagatgttcggacactttagtctgtaacacttagcgttgaga
+ccacgaacaattgattactcagtcttgaaggtgttttccaaagttcattttaaataagac
+tacgataggcctttcctattgatataaactacccggctctgttgttcgtgtgagtcgtac
+ttctctgtgtttttctgattatagcaagattcgattcttagtgtaaacagcgatttttat
+ttgacccgtcaatgagaagcgcataggatctaagcaaaattatcaagttgtgccacaagg
+taagatctttccagttattgcaggtaggatgtatcccacgttgatagtatgaggtctgac
+gtcaactgtctaggagagttgaccgcgtgcgggtacaccggatttgcatcgatgttgaga
+acgcagaactcccactgtcgtggcggcgttcctgatatttagcaagaggcgttgataaag
+ccctcatcatctagatctcgacctcatctgccctcttgctccatcattttctacacagac
+tactttcctatctacgttagtataattgctttctatcttagtatcatttagagcttctcc
+gtcaacaggttcgtgctattaaagttagtacgaaagggacaacttgtagcaacgcattta
+atcggttttcgactacttcgcacaaaatcagataaagaagtttgtcattctattagacat
+tgaattgcgcaattgacttgtaccacttatgatcgaacactgaatcaagactgtgattaa
+ctaaaatagacaagccactatatcaactaataaaaacgcccctggtggtcgaacatagtt
+gactacaggataattaattggactggagccattacattctctacaatcgtatcacttccc
+aagtagacaactttgaccttgtagtttcatgtacaaaaaaatgctttcgcaggagcacat
+tggtagttcaatagtttcatgggaacctcttgagccgtcttctgtgggtgtgttcggata
+gtaggtactgataaagtcgtgtcgctttcgatgagagggaattcaccggaaaacaccttg
+gttaacaggatagtctatgtaaacttcgagacatgtttaagagttaccagcttaatccac
+ggtgctctactagtatcatcagctgtcttgcctcgcctagaaatatgcattctatcgtta
+tcctatcaacggttgccgtactgagcagccttattgtggaagagtaatatataaatgtag
+tcttgtctttacgaagcagacgtaagtaataatgacttggaataccaaaactaaacatag
+tggattatcatactcaagaactctccagataaataacagtttttacgatacgtcaccaat
+gagcttaaagattaggatcctcaaaactgatacaaacgctaattcatttgttattggatc
+cagtatcagttaaactgaatggagtgaagattgtagaatgttgttctggcctcgcatggg
+gtctaggtgatatacaatttctcatacttacacggtagtggaaatctgattctagcttcg
+tagctgactatactcaaggaaccactgctcaaggtaggagactagttccgaccctacagt
+caaagtggccgaagcttaaactatagactagttgttaaatgctgatttcaagatatcatc
+tatatacagtttggacaattatgtgtgcgaaactaaaattcatgctattcagatggattt
+cacttatgccttagaaacagatattgcccgagctcaatcaacagttttagccggaaacaa
+tcgaagcatagggacaatgtatcttttcctaaattgccatgtgcagatttctgagtgtca
+cgaagcgcataatagaatcttgtgttgcctcaactcgttgaaaagtttaaaacaatcgca
+gcagtctttttggggtctactgtgtgtttgcaaaataactgaaagaaacgcttgaacaac
+tctgaagtagctcgagtactcattaaagtgtaacacattagtgaatatcggccaatgaac
+caaacgcttcccggtacgctatctctctcatcgggaggcgatgtgcaggttatctacgaa
+agcatccctttacgttgagagtgtcgatgcatgaacctcattgtaacaatagcccagcaa
+attctcatacgtgcctcagggtccgggcgtactcctccatggaagggcgcgcatctagtg
+ttataccaactcgctttttaactactatgctgtagttctacaggcatagtggccagtatt
+ttctaacttctctggatagatgctctcactcctcatccatcacggcttcagtttacgtct
+tacttgcttgttcagcaacggatggaggcattaagtatcttcactgttccctaaaattgc
+tgttcaatatcaaagtaaggacgatacagggaaagctcaagcacactcattgaatactgc
+cccagttgcaacctcacttaatctgacaaaaataatgactactctaagtgttgcggaagc
+agtctcttccacgagcttgtctgtatcacttcgtataggcatgtaactcgatagacacga
+acaccgagtgagaaactatattcttgcttccgtgtgtgtgacaccaggtaattgatgcgg
+atataagctggagatcactcacgcccacacaaggcgctgctacctctttattccaatgtg
+taagaatttgctaacttcatttctagaccgcagctttgcggtcataatttcacggtacgg
+acccttgggttagagacttgataacacacttcgcagtttccaccgcgcacatgttttagt
+ggcttctaacatagaatttttgttgtgacataaagagtgcgtgggagacttgcccgaccg
+ttaagccataatcaattgaaagccccgtgagtcacatctaattggttgtactgcgcattt
+agctatcctttagctgactcgaagagattcgattcctaatataggttaattagatggctg
+ccgcgcgaagtaaaacgtgaaaaacgtagtgcgcagatctgcataactcgcgcttaatta
+cttatgagtagttccaagttcgctacgttatgagagagattggaattaagcaaatatgtt
+ttatggtgattttgggatgagaaggactgctaagtacggctactaaacaaatttctaaaa
+ccgccatctaccttatcttggagacatttaagttgtatatgtcactagtctagcttttgt
+ctgtgggacgcgttctcggaatgagggaaatgcaagagccgattcatcaaatgcttatct
+aagaaagtagtggactattacaccaagcacgaatgccagggaactgctttcttgctcagg
+acctcgcgacaaggtaccccgcataagtcctagaattacatttggtcagcaatgctgaca
+tttgaccgtgaaaacataattttaatcagaaggcagctcacccgcttgctctagatctta
+tctttgtatgaatgtcagaatttactgcaatatccgttccgaatagtgagggcttagtat
+agttctctgtatacaggtcacatcaaactccccctgtcctagtacagctctgagctttaa
+ttaattgcatacatttccttcaatcatcagatgaaaacaccgcgaatcatgctcttctcg
+tatagggcaagagaagcaacaaacaactagcccgactcacgttcatccgccgtatccttg
+ttcagttcttactccgtattaggtcagcgaaatctaatcagaataatcggtcgcgtatca
+aaattaaaatcccgcttgaggttgacaattaaaacgctgagcagttatcggctattagat
+agtggggtgaaagtaattggctggaattatgttaaaacgtgatattaagctaaaatacgc
+tacttgttgccgacctaattcagtcattcgatattcagttagagccaagaataacaagct
+tgtataaattgaacggggtgcactaaacgatgtgttactctaatattcagcttggagtat
+acctgaaggcgaattcatgtatcggccaataataagacgttgaagatcacaatttggact
+agcaaaagaaggtgatttatgcgtggggattgagtccactgtacgagtacggtctctgga
+aaattataggttcagggaatataaggaagtaaagataattaccaagagatttttggtatc
+gctatgacccagaggtgttctaacgtctgttttgatccgcagaatttctgcctcaatgca
+tatttgacggacttgaactagagcctctaaagttaaatggcgacgcaactgttcctaaac
+ttcaattattactactctttttttcctagggtattgtagaggccagtggacaaaataaat
+caaatttaagatgtttcggacattaacatcccccgtagcatagaaatcatcagttatcca
+atctctcatcgagcttttacaatttctgctggcgctatggacagcatatgccgcgagacc
+tccgcaagactcacttgatcactgtaagtatcttcattagaggttagagcctatagttaa
+gctgctgacctagtaaaattggtattttctaattttattgctcaagttaaaggttagtga
+agggataatgacgttatttttgaacaatgggttgtattcaattttatatcacgaatggaa
+cccttcattcccggcataatactagacgacacgaacaagctccgatctatcagccaggca
+cgtgttaaggtttaattccggcaaaccaatgaagcatcaaaaggtgacctgatgcaactt
+agggtcacgatgagtttttcaggactacttattacctattaataagttaacatgagcctt
+cataccccgtaagacaatacatactccaccaattagaattctgagccatcttatcttttt
+gtatcatcgaagggtatggccgaataggttaattagttactcctaacgtctctacaggca
+tgcatttgacgcaccttcgaaaatagtcaatctctcgccacacgcgtctagtatgcagca
+tcaaaaatatagtccacggtttccggattaccaaacgcggcaaagagaaacattgtatcg
+acggagataacttaatacagaaggaaggggcatcttcgaatacggatgaataattctatc
+tgtttattctgacatcttgttttcaggttaatcttacgcattcaaatgacgcctgcccca
+tgcgtgcgcaattattttctaatattgacgagagcaatctcactccttttgggtctattt
+atgttttattgaggcacaagcctatacagaacaggtactattaaggccgtgagtgtgaga
+ctcaaaccgtggaaacaaaggatgggttgttcttggtacaagttttagtgcatgtgggca
+atccttaccaaaatcagatgctatccttaactttgggctgcatttaagatggcggttgga
+ggcctgtgagaatcctgcgtgtcatctttaatgaccgaattcatccatgtagattcagat
+cacacactcattccttgatgttgtctaaacaaaagttgttgtggacgcattggagggagt
+taagtaacaacttgggatcgcatacttataaaaattatatgttaaactttcacaaacgct
+gaagtccaaagtaactagcccaaacgcctcgagagtcactaggtattaatggtgtttgag
+ttcctgtgaaatagtgttcgaaggtaaaatttatgtaccaaatcgaaagaacacttaata
+aggcttgcttgcacggaggtatgatgtttactgactctacaaccctaattttccagtacg
+tacattcattccaataggttagttctcaaagtgctatacaggctcctcaattgatgatat
+gcttcagccgctctatggatattagctcattttatttaggaagcccgcttagaggcttac
+tatgagggaaatgccaaaatgtcatacttttcggtgtgtcccatatgacaccgctttaca
+tagaatttgaattaaaacgcgctctcccgttcactaccatacttggtaccgtgcgcatat
+tacatatagatataggatcattttttaaagctgtactaggtttgatcgacaatcttatgc
+tatactatatgatgtaaccctcataatcaataccgatcgtacgatcctagcataggtggc
+aagcgattttatgccgattattgtgttaaatagtctgtgagtgtgattatcagggctacg
+ttggtagaggggttgtatagacctcgcacacattgtgacatacttaacaatatacgaaaa
+ctgatataataaatccccttacccaaacaccaatcccgttgaatcaactaccataacgtc
+tcccatataaattgcctacttgtttgcataaatctgaatacataacaccattgcaccttc
+ttgtgttccaatcccgttaagattgccttgtcagatgatatgcaagaacaatagcatttg
+ctagcaattattaacagctcttcgaattgcctccacataacgcgggagggtatattttaa
+tttggcaaatactaagtactgttggcgtcatatgctattaacggttggatattaagttat
+gtcagccgtaagcaagagtgggcgaaatattttgttacccagtgagagcactcttagagt
+ttggatacaataggccatatgttgacttaagaggacgtaactacgccgtacaccattgtt
+caaccgacttcttggcaaatagaatcgtattagcaatcttaagaatagagacacgttcgt
+gttagggtatactacaaatccgaaaatcttaagaggatcacctaaactgaaatttataca
+tatttcaacgtggatagatttaacataattcagccacctccaacctgggagtaattttca
+gtagatttactagatgattagtggcccaacgcacttgactatataagatctggggatcct
+aacctgacctatgagacaaaattggaaacgttaacagcccttatgtgtacaaagaaaagt
+aagttgttgctgttcaacagatgatagtcatgacgcgtaacttcactatagtaaattgaa
+acaaatacgcaatttagacagaatggtacggtcatgaatgacagtaattcgaagtgctag
+accaacttaaaataggtaaacgtgcccgaaaccccccttaacagaaagctgctatcatgg
+tgcagtatcgacgtgttcagaaacttgtaacttttgagcaggtccgagcacatggaagta
+tatcacgtgtttctgaaccggcttatccctaagatatatccgtcgcaaactttcgattta
+gtcccacgtagagcccaagcgttgtgcgactccacgtgcatgcccagaaatacgagttta
+aatttggttacatggttaattttgaccgaagcatcgcactttatgattgataattggatt
+caatatgtcgccctatgcgaatgcaacatgatccacaatttggctataagacgtttaatc
+cgtatcacactttgtttgcggctagtatagtaacgcccgtgcaccaagagtcagtaacaa
+ttataagtactccgcaggtacttcaaatataaaaactaatcaaacacgacccatatgatc
+atctgaagatatttggaactttctcgacaaccaccctcgtactcaatacttacactaatc
+gacaggcacacgcaacgtgtacagtcgcaccatattgagtcaagatttgcttagtggcga
+tgagcgtacacgcttatttctctagtcacaattagttatctacgagacatcacgagggag
+caaataagcgatgttatggctacacataggcacgtatgaatatgatataagccagttaaa
+cagtcgaaccatcgagcaaattctcatgcaccaacccacacgttgaggcacaaagagtaa
+gctgtttgaatgtaacttcttctgctgagcgggccccaacgtaaggatcaactagaagag
+aaaactcggtattagtttaaatgcgtcacggagcatgagtgcatttcactaagaatgtct
+gtgtaaccaatataacatctatttgttatctgattgcctacttatggctttgcggtcgtg
+gcgactaatgtctccaatccttttgaggtcggtaccaactccctttaaattacgctgtgc
+aggctcatgcactgcatacatatacggtagcaggtagggacctcacgcacccttattata
+atcaatagtagttatcagtcaacgaggcaggaatgctgaggtcgaggtgttggtatattt
+tctatgtgccgtctaggcgactatcacgcattaccaggcgagatttaagccaattttgaa
+tatagtcaacgtaatttttactatgggttccaccgaaacgccttgcacaactaagaatcc
+cataaaatatcgatatcaaataaaagattgtgtcaataccttcatatatattttttcggt
+tgactaacgtgaactaaggttaggggttttgtatgtctatataggaaacagtttcttttc
+tgtcctactttagtaaagtcttcaagccttactccaaaatcacggtgattaagccgttac
+tcagcagcatgattctgcctgctcgggtcctaaaatccagccttgtaagagtcgctgtgt
+attagctagggagacctttgttaaaaaggatatatcgcggcgggatgtgagtgcgtggcg
+catactcaatcttcagctcgtgtcattataatatctctcccccacgcttttcactagata
+tgccgtgtaagcaaacaccttatgcttaatttcgaaaatattggtacttgaaaaaagctg
+taggggtacttaatgtctggtaggagatcaggagagaattgagtgtaaaaccgtaaagcc
+ctcacctgacttcatgtaaatggcttagaagactccatgatttaataaatactacgaagg
+aaagactggatctaaagataactctagtaaggccaactcccttcaatgctgttgccagtt
+ataatccaagagctgtccttttctgaaccatagcggcttctgaagcgaactagaagcaaa
+gttggttctagccagacagccacataccctgtacgggtgtattactaaaactggtccggt
+attagttcaccaagggaggaattaggcaaaggatctaggtatgcaagtcggagtattaca
+tccctaccctgaatccatcaataggttcctctgtactggccttcgcaatgagtattcaag
+gttgtacagccgtataataataagatagtgactatgaacgggaagtaacccgctcacctt
+ccccaaaacattgttatatctaagtattaaagtctgccgtagtgttaatactcgaaaata
+aacaactggcaaattacaccgcacttaagccgcttttgatttatatttttccaatgcgct
+tttaaaaataattcagtcctacatactaattaagacccttaaacggagatatcacaagtt
+aagttttaaccatctcgactaggtggaactatagatacccaactcaatttatcattacct
+gtaatgttcctagaaggattgcatttcatgtcaagacggtggagtttcacagcgaaactt
+cagtgtgaacagattctgagaaatcacctaaacctattagtcagagcacccggttagaac
+cagttgtcaaaaaatagagcggttgcatgagacagaagtaacgatgagatccgttgtaac
+gttgagacatctggcctatcgtcaatacagtcctcccttaaaaatatttttaaatactag
+gcaaacccaacataggttagtcctatgtgatacgccacatggtatatcattttgtaacgt
+tacctagggataatcaggaagtggaattacgcaaaagtagacagtgaaatgcttagggtt
+atagtctagtccaaagataaaggataaagcacgtcagagaactatattagccgaatggga
+atcattgttaggagactgtggatcatgtctaaaaagcaacgcagaaacagtcatcgaaaa
+aatctcgtttttgtttgaatctaaaagagctttgatgaccgatagtacctgtatactagt
+tactgtattacgtgtctaatgatttcggattggggtccccagaatcagacgtcattgtag
+acgattcaagtttaccaatttaatttcccagctctccttggagaactatcgccaataatt
+gcagtcactttccttttctgaaacgataaagccgtcagagttctctgcaacgttggactt
+acctgaggttctaacccactttcggttctaatagtagttaacgacacaacgaataacctt
+tactgtggggctttcacgatattttttcgcttattattaatggttacgtcataagctggt
+gtccaaattaaggttaccggcttcgcagagtagttgtatccaagtataacttccctaatc
+ataagatcgaggtagaaaattaatgctgtctctaaccgaacagatatgtcccactatgtg
+gtatggacgttgctaattacttctgaagggaaattggtcattatggatacgtgtctacca
+tcaggtcggacgcagatatggttctgtcttcagttgatccaccgttctttataggataat
+aactgacgattaaagattatggtaaatagattaagccaattctcttcttgtcagtgaagc
+atccttaactgacttgctctgcagcccctcatacatttagctattcaaagtaccggctcg
+tttcaaactctcccacctttggaagaggttgtcaacttgataagtatatcatttacagca
+ttttttcggacgtacctctaatgtttcattgcagaaaattagttttttctatcgcacatt
+ttgcaagtaacgttagagacacaattatctgcgaatgaactgctagatctgacgaccggg
+agcctcgcaaatatcaaaaaagactgacatatatcaaggagtcgttgacaagtgctggta
+agtcaattggtttatctgtcccggcgtttcgatcttaagctgaccatgcacggcagagta
+atgtcactctcgttcttacaagtctgtctccaagggtcggcaaaaaagacccctccattc
+tcgagcccactcacgatatgtagggacgacaacttgtgcggcttatgaattgtctggact
+gcgggcgagggtccatatctccgaagttagaagggacatacctttagatgataagatcaa
+ttcttattgacgaaattcatccacaacggggaacaacttcaccctagacttacgtctgaa
+aagacacctagcgtcttataaaaggtcagtgccccgtttcgtaaggctggaattacctac
+gcaaacttaaacctcgcgcccttccttacgtatcgacaagatagaggctatcgcgaatgt
+actacggaggcatgaatcatatactagaaccaagtgcctgtgatattaacaagatgatcc
+gacgcgagcaccgtaattctaggcataaaactccagcaatttgggggccgaaaacaaatg
+acgttagctaattaattatatgacatgatcaaaggaggtcaatcacgcatcgagttcgac
+gtatattcattgaacttcgtgcgtttgaaagaaacttttatgaaggcaaaattgatcctg
+tctcctatttcatgcgtacctcctagttgataattccccgagcagtggttaggacacttt
+tgtcggtatcaagttccggtctcaaaacgtaaaattctgtaatctgtatggatggtctgt
+gaattagttaatttttatgaagtcgtcgagacgcagttcctattgatttattctaaacgg
+agatgtgcttcgtgggactcggaagtagatctgtgtttatgattattgctactttagatg
+ctgactgttaactccgtgttgtttttcaaccgtatatcacaaccgaattggatagaacct
+atagtttcaagttctgccacaaggtatcatatttacagttagtgctggttgcttctttca
+aacgtggtgagtttgtgctatcacgtcaacggtagagctcagtggaccgagtgcgcgttc
+aaccctgttccagagagggtgtgatagcacatataccacgctcgtcgaggcgttcatgat
+agtttgcaagagccggtgttaaacacatattattattgttatccaactaatcggacctat
+gcataaagcattgtctaaacagaataattgcctatatacggtagttttagtgatttatat
+cttagtatcagttagagcttcgaactcttcaggttcctcatatttaacgttcttcgaaag
+cgaaaacttctacaaacgaatgtaagcggttttccaagtagtacctataaatcacagaaa
+gatctgtctcagtatagttgaaatggtattcagctagtgacgtgtaccaattatcatagt
+tcactcaagcaagacgctcattaacgaatatagacaagacactatatcatataataaaaa
+agaacatggtgctcgaacatagttgaattcaccatattgaaggggaatgctgacatgtaa
+ttcgctactagacgatcaattccctacttgtcaaagttgaactggtacgttcttggaatt
+aaatatgattgcgctggaccaaattgcgacttcttgagtttcagggcaaacgattgagcc
+ggaggatgtccgtctcttacctttcttgcttatgataaacgacggtccctgtacatcact
+gggaattctcagcaaaaataattgggtaaatcgagactcgatgtattcggccacaaaggt
+gttagacgttaaagattattcaacggggcgataataggatcataaccggtatgcaagcgc
+attgaaagagccatgagatccttatccgataaacgctgcacggtatgtgcagccttattg
+tcgatcacgaatttataaatgtagtctgggctgtaagttgaagacctaagttataatgaa
+gtgcaataccaaatcgattcatagtggattatcagactcaagatatctcctgataaatta
+cagttgttaagatacggataaaatgagatttaagattagcagcctctaatctgtttcaat
+cccgttggaatgtggtatgcgatcaaggttaagttaaaatcaagcctgtcttcagtcttg
+attcttgttctgccatcgcatgcggtctacgtgagttaatatgtagcttacgttctagct
+tgtgctaatctgagtatagattcgtagaggaatattatcaagcttccacgcctcaacgta
+cgtgtattggtcacacaagacactaaaagtggaagtagcgtaaactatagtctagttgtt
+aaatgctcagttcttgttatattcgatatactcttggctaatttatgtctgagtatataa
+aattaatgatattaacttgcatttcacggatcccttagaaaaagattttgaccgagcgca
+ttataaacggttacaccgaatcaatagaagcatacccaatagctttctttgaatttattg
+cctgcgcaacttggctgactctctagatccgaataattctatatggtcgtgacgaaacta
+gttcattactgtttaaaatgccaacatgtcttttgggccgataatggctctttgcaaaat
+tactcaatgatacgattgatcaaagcggtagttgctagtggtagcatgtaagtctatcaa
+atgtctgattatccgaaaatcttccaaaagagtccacgtaccatatctatctcatagcga
+cgcgaggggaaccttatctaactatcattccatttaccgggtgactctcgatgcaggatc
+cgattgggataaattgcccagaaatggctcattcctgactaagggtaaggccgttctcag
+caagggaaccccgcgaatctaggcttataccatctagattgttaactacttgcctgtagt
+tctacagccatactggacagttgtttctaaatgatcgggattcatgctagcactcctctg
+aatgcaccgcgtaagtttaactattacgtccgtgggcagataaggatggaggctgtatgt
+atcttaactgttacctaatatggctggtaattatcaaagtaaggaccttaatgccatagc
+gctagcaatcgctttgtatactgaccatgtgccaacctctcttaatctgtaaaatataat
+gtcttagctaactgtggacgatcatgtctctgcctagagcttcgctgtatcaattcctat
+agccagcgtactagtgacacaacaacaccgtgtgagaaaagatattagtccttacgtctg
+tctctctacagcttattgatgaggattgaacatggacatatagctccccctcaaaagcag
+atgctacctctttattccattctcgaacatttgccgaacttaatttcgacaaacctgagg
+tcacgtcttaatttatcggtaacgtcacgtccctttgagactggataaatatattaccag
+gggccaacgagcaattgttggaggcgcttctataatacaaggtgtcttgtcaaagaaaga
+cggcgtgcgtctcgtgcaactcacttaaccaatattaatgtgaaacccccctctctcaca
+tcttatgcggtgtactgccctggtacatttcctgtacaggactccaacagtgtagattcc
+taagatagctgttggagttgcctcacgccagatcgaaaaactgaataaactagtgagctg
+agctgcagaaataccgcttaattacttatgactagttcaaagggacctacgtgatgtcag
+acattgcaaggaagaaattaggtttgtgcgtcattttggctggactagcactccttactt
+cccctactattcaaatgtcgtaaacagcatgagacaggatcgtgctgacatttaaggtct
+attgggaacgaggctacctttggtcgcgcgctcgcgttctccgaatgaccgaaatgcatg
+agcacagtatgcaattgcttatagatctaaggtctggtcgttgaaaccaagcacgtaggc
+ctgggaaatcagttcttcctcagcaactacacaaaagcgtccaagcattagtacttgtag
+taaatgtccgaacctatgcgctcatttgaaagtcaaaaaatatttttaagcagtaggcac
+ctaacccgattcctctacttagtagctttctttgattctcagaattgactgcaatatcac
+tgcacaattctgtgccattactagacttctctgtattaacgtctcatcttactaacactc
+gcctaggacacatctgagagtgaagtatttcaatacatttactgaaatcttcagttctaa
+aatccccgaataaggctcttatcggtttggccaacacaagaaaaaaacttcttgcaccac
+tcaccttcatacgcaggagcctggggaacttagtaataactatttcggcagacaaagctt
+ataacaagttgccggcgcgtataatatttaaaagaccccttgagctgctcaattaaaacg
+ctcacctggtataggctattagatagtgccgtcttagtaaggggcgggaattatcggata
+aactgatattttgataaaataaccgacttgttcacgacataagtcactaaggagatttta
+tctttctccaaagtatatcttccttggataatttcaaagcgctgcaatttaagttctgtt
+actagtttatgctgctgggaggtgaccggaaggcgtagtaatctagaggcaaattataag
+aagttcatcatatcattttcgactacaaaaacaaggtgttgtatgccggcgcattgtgta
+aactggacgagtaccctagatggaaaattatacgttaagccaagatttcgatgtaatgat
+aattacctacacatttttgctatccataggaacaagagctgttctataggctcgtggcat
+acgaacatttgctgccgctatgaatattggaagctcttcaactacagactctattcttaa
+ttgccgtcgaaaatgggccgaatcggctattattaatactcggtttttccgaggggattg
+ttgtcgacagtcgtaattattattaatattgatgttggtgaggtcatttaaatacaacct
+tgcagacaatgaataagggatccaatctctcatactccttttacaattgctcatgcccct
+atgcaaaccttatgccgccacacctccgcaactctctcttctgaactgtaagtagcttca
+ttactggtttgagactatactgaagctgatgacattctaaaatggctattttcgaatgtg
+attcataatgtttatcgtttgggatggcagaatcacgttatttttgatatagcccgggta
+ttctattgtatagaacgtatgctacaagtcattccccgaagaagactagaagtaaacaac
+atgcgaccatcgttaagccacgcaaggctgtagctttatttcccgataacctatcttcca
+taaatagcggacagcaggatactgacgctcaacatcagtggttatggtctaatttttaac
+ttttaataaggtaacttcagcaggcatacacagtaactctttaatttataatcaaattag
+aagtctgacacttcttatatttttctatcatccaacgcgatcgcccattagcttattgtg
+ttactaataacgtatctaaaccaatccttttcaagctactgcctatattgtcaatatata
+caaacaacaggatagtaggctgcttaaaaaatattgtcaaccgtgtacgctttacaatac
+ccggaaatcacaaactttgtagacaacgagtgaaatttatacactacgaagggccagcgt
+acaagacccatgaattaggcgatatgtttattctgacatattggtttatccttaatctgt
+cgctgtaaaatgaagccgcccccatccctgcgaattttttttcgaagattcacgactgaa
+atataaatacgtttggctatatttatgttggagggaggcaatagcctttactgttaaccg
+aagatttagccagtgagtgtgacactaaaacactggaataaatgcaggcgttcttctggg
+taaaaggtttagtcaatctcgcctataagttcatatagctctggatataattatctggcc
+catgcatttatcatggcgcttggtgccctgtgtgaagccggcctctcatattgaaggtcc
+gaagtattccatgtacattaagatcactctctcattcatgcatcttggcttaacaaatct
+ggttgtccaagctttccaggcacgtatggtacaaattcggatcgaatacttataaaaatg
+atatgttaaactgtctaaaacgctcatctacaaagtaaagtgcactaaccaatagagtct
+caagaccgtgtaatgctggtgcactgaatgtgtaatacggttagaagggattagttatgt
+tacaaatccattgaaaacttaagaagcattgcgtgctcggagggtgcatcttttatcaag
+agactaacattattttcaacgacgtacatgctttacaatagggtacttatcaaacgccga
+gaaacgcgcctatagtgatgttatgattatgacccgatatccattggaccgaattttatg
+taggttcccagcgtactcgcgtaatatctcggtattgccataatgtaatacttgtcggtc
+tctcccagatgaaaaagcgttacagagtatttcaatgaaaaacagcgcgcaacgtcaata
+cctttaggggtaacggccgctgatttcatatagatatacgataagttggtatagctctac
+taggtggcatccacaatcgttgcatttactatagctggttacaatcataatctataccgt
+tccttacatactaccatagcgggatagcgtttttttgccgttgattgggtttaagaggat
+gtcagtctcattatatccgattcggtgggagagccgttgttttcaaatcgcacactttgt
+gacataatgtacaagataacaaaactgatataagatataaactgtcaatatcaccttgac
+acttgaatcaaagtaaattaactcgcaaatataatttgactaattgggtgcagatttctc
+aattaataaaaaaatggcaccggatgggcttacaagccccttatcattcacttgtatcat
+gatttccaagaacaatagaatttgctagcaagtatgaacagagattcgaattgcatccac
+agtacgccggagcgtttattttaatgtggatatgacgatgtactgttggcggcatttgct
+agtaaccggtccttatttacgtagcgcacacgtaagcatgtctgggagaaatatggtggt
+acaatctcagagaaagattacagtttggtttaaataggacttatcgggtcggaagtggaa
+cttaataagcagtacacaattgggcaacagacgtcttgcctattacaataggattacaat
+gcgttagatttcagacacgttcgtgtttggctattcgtcaattccctaaatagttagacg
+atcaactattatcaaagtgattctttgttcatcctccattcatgtaacagatggcacact
+acgcataacgccgaggaattttaacgagatttaagagagcagttcgggcacaacccactt
+gactttataacagctcggcagcataaacggtaatatgtgacaaatttccaaacgttataa
+gaacgtatgtgtacttagaaaactaagtggttcatgttcaacagatgtgacgcagcaagc
+ctaacttatctattggttttgctataaaagaacaaagttacacagaatcctaagggcttg
+tttcacacttatgcctagtgcttcaccatcttaaaatagcgaaaccggcacgaatcaaac
+cttaaaacaatgcgcagatattggtgatggtgactccgggtatgataatggtaactgttg
+accagcgcccacctcatcgaagtatagaaagtggttaggataaggatgagaccgaactta
+tttccggccataactttagattttctacctagtacacaacatcagggcggacacgaaacc
+gccatcacatcatataccaggtttaatttgcttaatgggggaagtgtcaacgaaccttcg
+aactttagcaggcatatggccattatatatggccccagagcagaatgctacagcagacaa
+aatttggatttatgtagtttaatacctatcaaacttggtgtgaccatacttgtctaacga
+cagtgcacaaagtgtaagttacaattattactactcagcagcttctgcaatgataaaatc
+ttatcatacacgtcacatatgataatatctacttagggggaacgggctccacaacctaca
+tagtactcaatacttacactattcgacaggcacaccaaacctgtacagtcccaaaagatt
+gagtcaactttgcagtactgcagatcacagtaatagcttagttagcgagtcaaaattagt
+tttctacgagactgcacgaccgtgcaaatttccgatgtgttggctacaaatagcaacgta
+tgaatttgtttgaagccacgtaaactgtacaaccttagagataagtctcaggctactaaa
+aacacgttgtggcactaacaggatcatggttgattcttacttattcggctgaccggccca
+ataagtaaccttcaactagaacagaataatcgggagtagtttaattcagtcaaggtgcag
+gtctcattgtaactaacaagctctgtgtaaccaagttaaaatcgttttcttagcggattc
+cctacttatggatttgagctcgtccacaatattcgatacaagaagtttgtggtccgtaac
+aacgaaattttaattacgctgtgcagcctcatccaaggaattaatagaaggttgatggta
+ggctccgaacgctccatgattataatcaagtggactgtgcagtaaacgaggaaggtatcc
+tgacgtcgtggtgttcgtttttgttatttgtgccctatacgagtagataaaccatgaaca
+gcacagtgtgaacccatggttgattttaggctaccttatttttaatttccgttacacaga
+aacgaattccacaactaacatgccattaatttttcgatatcttataaaagatggtcgaaa
+ttcattcatttattttttttcggttctcgaaagtcaactaagctgtcgcgttttgtttct
+ctttagaggtaaaagtggctttgatctcctacgtttggatactagtcaaccattactcca
+tttgatccgtgagtatcacctgtctaacatccagcattatgactcctcggcgaagaaaag
+acacacttcttagagtcgatgtgtattagctagggacacagttgtttaatacgatagtga
+gcccagggagggcagtgcgtcccccagtagatttattcagctagtgtaagtataagatat
+ctcacccacgaggttcaagtgatatgcagtcttagaataatacttatcctgaatttcgat
+attatgggtacttcaataatccgctagcgctactttatgtctcgttggacagcaggacac
+atggcagtcttaaacactaaagacatcacctgaatgaatgtaatgggattacaagaatca
+atgaggtattatatacgacgtaggaaactctggatatatacagtaatctagttacgccat
+cgcacttcattcctctggaaacttagaagacatcagctgtacgtggaggaaccagacccc
+cgtatgtagccaaatagaaccaaagttgcttatacaaacacacccaatgacaatggaccg
+ctggagttcgtaaactcggaacgtagtactgcacaaacccagcatttagcaataggagct
+acgtatgcaactcccacgtggtaataccttcaagctatcaatatataggtgcctagctaa
+tcgcattcgcaagcagtattcaagcttgtaaaccagtataataattacagaggctctatg
+aaacccaactttccagctaaaagtcccaattaaatggttatttcgtacttttaaagtcgc
+ccgttctgttattacgcgaattgattctactccaaaattaaacacaaattatcaaccgtt
+tcatttatatttgtcaatgcagctgtttaaaataaggctctactaaattataattaagac
+acttattaccagatttctctagttaagtttgaaccagctcgactaccgcgaaagatacat
+tcccttctctatttttcagttcatctatgggtcagagaagcattgaatttattctattca
+ccctcgtcgttcacagcgaatcgtcagtgtgatcagtgtatgagaaatatcctaaaccgt
+ttagtcagaccacacgcttagaacaagtggtctaaaaagactgccctggaaggagtaaga
+agtatacagctgatccggtgtatccttcagtcatctgccctatactaattacacgacgca
+aggaaaaataggtttattttctaggcaaacccttcataggtgactccgatgtgttacgaa
+tcatgcttgagaatgtgctatcgttaccgacggataataacgatctccaatgaaccaaat
+gtagaatgtctattgattacccttttactattcgacttagagataggagatagaacctca
+gtgtacttttttagccgaatgggaatctttgggaggtgaatggccataaggtcgtaaatc
+caaccctcttaaagtcttccatattatatcgttgttcgtggaatcgataacagatttgtt
+gacccatagtaaatgtatactagtttatgttgtaagtgtagattgttttccgattgccgt
+ccaaactttatgtcgtaattgtagaccagtaaagttgaccaaggtaagtgcccagcgatc
+ctgcgagatcgatcgccaatttttccagtcactgtaagtgtaggtttagataaagccgta
+tgagttatatcataagggcctcggaaagcagcttcgaaccaaagttcccttataatagta
+gtttaactataaaagtatatactggtctgtcgccctttcacgatttgttttaccggttta
+tgaagcgttacgtcattagagcggctccaatttaaggttaacggcttccatgtgtagttg
+tatacaaggataacttaaagtatctgttcagcgagctagttaagttatcctcgatagaac
+acaactcagaggtcccaagatcgggtttgcaacttgctaatttattctcaaggcaaattg
+ggaattatcgatacctgtataccataaggtcgctcgatgtgatgcttatgtcttctggtg
+atcctaccttagttagtgctgattaacggaacattaatgtttatcgttttgagatttagc
+caattctctgattctaactcaagatgccttatctgacgtgctatgcagcccctaagtatt
+ttacattgtaataggacacgctcctttaaaactcgccaaaaggtcgttgtggttctctac
+tggttaactatataatttacagctttgttgagctagttcctctttggtttaagtcctcaa
+tattagttggttcgagcgataagttggctagttaccttagtcactatattagatccgaat
+gttatgcttcatctgaagaccgccaccctccaaaatttcttttaagactcacttattgca
+aggtgtaggtgaattcggctcgtttctcaagtggtgtatctgtacacgagtttccatatt
+ttcatcaacagccaccgcacacttatgtcactctaggtattaaaagtcgctctacaaggg
+gacgcaattaagaaacagacatgctagtcaaaaataaacatagcgaggcaccactaattc
+ggccgcttatcaatgggatgctctgcgcgagacgcgccagagctcagtagttagttcgga
+catacatttacttcagatgatcaattagttttctacaaatgcttactctaccccgaaaaa
+agtcaccagactcttacgtctctttagtatccttccgtcttatataaggtcagtcccccg
+tttcggtaccctggaatttactaagaataatgaaacagcccccaaggacgtacgtttaca
+aatgatagaccagatcgcctagcttattccgacgcatgttgcatagaattgaaccaacgg
+aatgtgagagtaactagatgagccgaccacagcacccgtttgcgtcgcagaatacgcctg
+atagttcggccacgaaatcatatgtcctttgagtattaagtatttgtaatgatcaatcga
+gctcaagcaagcttacacttcctcggatattcagggaacttagtgcctttgaaagatacg
+ttgatcaacgaaaaattgataatggctcatatggaatgcctacctcatagtgctgaatta
+acacagcactgcggacctaacttttcgaggtttcaagttcacgtctcaaaacctaatagg
+ctggaatatgtagggatcctcggtgaatttgtgattgggtttgttgtagtactgaccaag
+tgaatattctttttttctaaaagcagatctgctgccgggcactacgaaggagatctctgt
+gtatcattattgcttcttgacatgatgactcttaaatcactgtgggtgtgcaaaacgata
+gcacaacccaattcgatagtacatattgttgatacttcgcactaaaccgttcatatttaa
+aggttgtgctccttccttcgttaaatactggtgacttggtcctatctactattagctaga
+cctctggggaaccacgcccccgtaaaacctgtgcaagagagggggtcatacatcttagac
+atcgcgcctccaccagggaagcattgggtgattgaccaggtgtgtaacaaatatgattat
+tcttatactaatattagcaaagatgcataatgatttgtattaaatgtataattgaattga
+taagggtcttttagtcagtgatagagtagtataaggtagacattagaactcttaaccgga
+cgcagatttttcggtcttagtaagccaattagtcgacaaaacaaggtaagagcggttact
+agtagtacctataatgcactgaatcttcggtcgaagtatagttctaatgctatgcagatt
+gtgacggcgacaaatgttcagacttatatcatgaaacaagctcttgtaagtattgacaaa
+tgaaaagattgaatatttttaaatacaaaatgcgcctacttattaggggaattaaccaga
+ttgaaggccaatcctcacatgtaatgagataatagacgataaatgaaattcttgtaatag
+ttgaactgctacgtgatgggtattatatatgattgagatcctccaattgccgacgtcttg
+tcttgatgcccaaaagattgtcaacgaggagctccctcgcgtacctgtcgtccgtatcat
+aaacgacgcgacatgtacagcactccgaagtataagcaataataatgcgggtaatccaga
+ctagatcttttcggactcaatgcggtttcacggtaaacatgattaataccggagagtagt
+cgagcttatcagcgatgcaagcgaattcattgtgccaggagatacgttgcagataaaacc
+ggcaacgtatgtcaacaagttttggcgatctcgttgtttgtattcgacgaggcgcgggaa
+cttcaagaactatcgtatattcaagtccattaccttttagtttcagactggtggagctga
+ctaaagttatatcatcattttgtacactggtttagttaacgataatttcagatttaacat
+gaccagacgataatcgctgtatatccagttggaatgtggtttgccagaaaggttaactta
+taatcaagcctctcttcagtcttgattcgtcgtatcccatccattgcgctatacctcagt
+gtatttggagctgtagttataccgtgtgctaagatcagtagacatgacgagagcaatatt
+atctaccttacaagcatcaacggacgtctagtcggaacaaaagactctaaaactcgaact
+tcaggttaatatactatagttctgtattcagcagttattcttatattcgatattatcttg
+cctattggatgtctgactttagtatattaatcatagtatctgccatgtaaaggtgccagt
+actaaatctgtttcacagtgcgaattataaacggttacaaccattaaagacaacaagacc
+ctatagctttatttgaattttgtcaatgcgcaacttggagctcgcgatacatcccaatta
+gtctatagggtcgggacgattctacggcatttctggttataatgacaacatggattgtgg
+cccgagaatcgctctttcattaattaagcaatcattacagtcttataagcgctacttccg
+agtggtagcaggtaactcgatataaggtcgcatgagccgaatagcttaaaaaacaggcca
+ccgaacattgatagagaataccgaccacagcgcaacctttgattactttcattaaattgt
+acggctcactcgacatcaagcttaagattgcgataatgtgaactcaaatggatcagtact
+gaagaaccgtaacccacttcgcagaaagcgtacccagagaagatacgctgttacaatata
+cagggtgaaattattgcctgttcttcgtaaccatttcgccaaacttggttagaaatgata
+gccattcatgatagaaataagctgaatgataccagtatctttaactatgtagtcaggggg
+aagataacgatggtccatgtatgtttctgatatgtgacagtattggccgcgtaatttgct
+aacgaagctacttaatgcctttgagcttcatatagatttctttaatcaaaatcggcaaaa
+agatagtatgagctataatatatgctagtagagaactctggaccatcatctatatgaata
+ctgattcgagcgtgcaattactttagcctgcgtactactgactctacaaaacactctgag
+ataagtttgtagtcagtaagtcgctctctataaaccttttggatgaccattgtacagcca
+cttatagatcccaataaatagcacaggagacagagtttttcaatgctcgatcatttgccg
+atagtattttcgtctaacctcagggcacctattatttgatacctaacctaacggcccttt
+cacaatggagaaatatatgacatcgggacaaacacaaatggtgggtggccaggagatatg
+acatggtggcgtctctaagaaacacggactccctctaggcaaactcacgtaaccaatttt
+aatgtcaaacaaaacgctcgaaaagattttgccgtgtaatgacctggtacattgactggt
+caggaatacatcactgtagttgccgtagtgtcctgttggtgttccatcaagacacatcgt
+ataacgcaatttacgacggacatcagatcaagttatacagattatttaagtatcacgtgt
+gcattgggacataagggatctcacacatgccttggaacatttttgctttgtgccgctttt
+tcgctgcactaccaatccttacttaccagtatattcaaaggtcgttaacagaatgagaaa
+ggttagggctctaagttatcgtcgattgggatagacgagacatttgcgagcgccctccac
+ggatacgaatctcccatatcaatgtgaactggatgctatgcagtttagttcttacgtctc
+ctagtggtaaaaatcaaagtagcactcgcatagcagttattcagaacctaatacacaaaa
+ccgtcaaacattttctaattctaggtatgggccgatcataggagctaaggtgaaactcat
+aaatgttttgttagatctagcatcctaaaaagatgcatatactgagtagctggcgtgcat
+tctctcaattgtatcctttttaactgaactagtcggtcccatttcgtgactgagatctat
+taaccgataagattaataacactcgcattcgtatcagctcagagtgaagtttttcaataa
+tttgactgatatattaacttctaaaataaccctttaagcctcggatccgtttcccaatca
+catcaaaaattcttattccaactatctacggattaacaacgtgcatggggatcgtagtaa
+gaacttgttccgatcactttgagtatatcaagttgacggcccggttattattgaatagaa
+acattcacctgctaaattaaataccgcacatcggatacccgatttcagagggccgtctta
+ctaagggcaggctttgttcggtttaactgagatgttcattattttacagtatgcttcaac
+taatatgtaacgaaggacagtggatctgtctccatagtagatcttcagtcgtgaatttca
+taccgctcctatttaagttcgcgttcgagttgttgatcatggcacgtgaaagcaacccct
+agtattctagacgaaaattttttctagttcatctgataatttgccaattcaaaaacaacc
+gctggtttcccggcgcattctctaaaatggaagtcgaacctagagccattatttgtcggt
+aacccatgagttccttcttttcagaagttaatacactgtggtcctatacagaggaaaaac
+agcggttatatacgatcgtggcataacaacattggatcaagatagcaatttggctaccta
+ttctaattctcactagattcggtattccactacaatatcggcagattaggattggatgaa
+taatcggtgtttaagtccggttgcgtctccaatctcctaatttttattaatattgatctt
+ggtgacctattgtaaataaaaacttcaagactttgaataacggtgaaaagatagaagact
+catttgaaaatggatcatccacagatccaaacattagcaagacactaatccccaactagc
+tattctgatcgcgatcgtgctgcagtactcctgtcacaatagtctgttcatgatctaatt
+ctttttgggctttgttcgatggtgattcagaatctttatccggtcgcttccctgtagcta
+ctttgtggggatattgcccggggattatagggttgagatcgtttcctaaaagtatttaaa
+ccaagtagacttcaactaaactacatcagaacatcgtgaagacaccatacgcggtacctt
+tatttaccgataacatttcttcaagaaataccggtaagcagcataatgaccctaaacagc
+tcggggtatcgtcgtagttttaaattttatttaggttactgctcaaggaataaaaactaa
+ctatttaatttataataatattacaaggctcacactgattagatttgtctataagacttc
+gcgatcccccattaccggattgtcttaagaataaactagataaaccatgcattttctaga
+taaggcctttagtctaattagatacaaaaaacacgatagttgcatccttaatttattgtg
+tcaaacctggaaccttttaattacccgcaaatcactttatgtcgagactacctctgaaat
+ttattatctacctaccgcatgaggacttgaaccatcttgtaggagttatgtttattagct
+aagattcgtttatcctgtagcggtccatgtatattcaacaagcaaaaagcactcagaatt
+gtttttagttgagtcaagactgatatataaataagtttccctagttttttcgtggtggga
+cgatattgaattgaatcttaaccgaagagtttcccactctgtcgcacaataatacacgcc
+aatatttccagccctgcttatgccttaatcggttactcaatctcccattgaagttcattt
+tgatctgcatagaagtttcgggcccagccttttttctgccaccttcctccaagctctgta
+gacgcactctaagattgatgctcacatgtattaattctacattaacataaatatataagt
+catgcatcttcgagtaaaatatctggttctccaacatgtcctggcacgtatcgttataat
+gcccatacatgtagtattaaaatgattgggttaactggatattaagatcatcgaaattgt
+aaagtcaaattaacaatactgtctcaagaccgtgtattcctcgtgctcggaagggctatt
+acgcttacttccgttttggtatcttaatatgactttcaaaaattaagttgcagtgagtcc
+tacctgcgtgcatcggttagcaagagtataaaagttgtttaaacgaactacttgctttac
+aataccggtcgtatatatcgccgtgaatccagaagattgtcttctttggattatcaaccg
+agatcctgtggaccgatgttttgggaccttcacagaggactccaggtagagctcgctttt
+gcattaatctaagaattgtacctctctaaaagatctaaaacagtgaatgtgtatttcatg
+gaaaaacacagagaaacgtaaattactttaggccgaaaggcacatgagttattatacata
+tacgagatggtggtatacatcgaattcggggcatacactatagttgcattgtatttagct
+gctttaaataatatgatattaccttccttacataagacattaccggcataccctggtttt
+caacttgtggggctttttgacgatcgcactctcatttgatccgagtagggcggtgacccc
+tgcttttcaaatacaaaaatttcgctatgaaggtaatagattacttttcgctgttatgat
+agaaacggtaaatttaaaattgaaacttctagaaaagtaaagtaacgagaaatgattttg
+tgaataatgcggtcatgattgcgcaagtaagaaaaaaaggcaaaaggatgcgcggaatag
+aaacttatcagtcacgggtatcttgatttcattcttcttgtcaattgccgacataggatg
+aaatcagattccaatgcaatacacagtaacccccacccttgattgtaatgtcgatttgaa
+gttgtacgcgtcgacgaagtggatagtatacgggccttttgtacggtgcgatcaactatg
+aatctcggcgagttagatggtcgtacaatctcacacatagaggtcacttgcctgtaatga
+cgaattttcggctaggtactcgaactttattagaagtaaaaatgtgggcaaaagaaggat
+tccattttacaagacgattacaatgagttacatgtctctcaacgtagtctttccctagta
+gtctttgaactatttaggtactccagaaaattttagcaaagggtttctgtgtgaatccgc
+cattcatgtttatgatggaacaataagaataacgccctcgtatgttatcgacagtgaagt
+cagcagttcggccaaaaacatattcaatttagtacagatccccagaagttaagctaagtg
+ctctaaaatggcctaaacggttatcaaagtaggtctaattactatactaacgggtgcatc
+gtaataactgctgtcgatgcaacactatatgatagtgtcgttttgctatatatgtacaat
+gtgacaaagaagccttagcgattcttgcaaacttaggacttcggattctcaatcttaaat
+gtccgaaaacgcaaagattcaaaaatttaatctatgagcagatatgcctgatggtgacta
+cgcgtatgttaaggctaaatgttgacaaccgcacacataatcgaactattgatagtcggg
+agcataaccaggtgaacgtactttgttcacgacatttattgacatgttctaaatacgtct
+caaaatcacggcgcactagaaaacgcaatcaaatcattgtcctggtttaagggccgtaat
+gccggtagtgtcaaacttcatgagaactttagctggcttttggccagtatttagggacca
+agagcactagccttaagctgaatattttgccatttatctactgttataactttaaaactt
+ggtggcaccagacttgtcgatacacacgcatcaatctgtaacgtaaaaggtttactaaga
+acaagcgtaggaattgagtttatattatatttaaactaaaagatgatattagcttctgag
+ggcgatagggctccaaatcataaagaggaatatattattacacgattagaaacccacaac
+atacctcgaatcgcccaaaagtttgacgaaacttggcagtactccacatctcagtaatac
+agttgggagagtctcaaatgttgttttattactcaatgaaccaccctcataatttcactg
+ctgttccattaaatttgcaaacgatcatttgctttgaagaaacgtaaaatcgacaaaatt
+acagataagtagatgcataataaaaaaaactgctcgctataacacgatcatcgtgcattc
+ttacttaggagcatcacccgcacaataacgtaccttaaactacaacactattagaccgag
+tactgtaattcacgaaagctcaagctcgcattgtaaagaacttgctctctcgtaaaatgt
+gataatagtttgcggagaggattcaattattttccattgcacctactccactagattcga
+taaaagaaggtggtcctcccttaaaaagaaatgttaagtaacatcggaaccataagcaaa
+gcatgtaagtgaaccgtcatccttccctaagaaacataaaggtttttaataatgtcgact
+gtgaactataactgcatcctttcctgacctactccggttccttgttgttatttctgaacg
+agaccagtagataaacaatgtaaaccacagtgggtaccaatggtgcatgtgacgctaccg
+ttgttttaagtgcccgtacaaacataagaagtcataatcttacttgaaattaattttgcc
+ttttattttttttcaggctcgaaattaatgatttgttttttttgaccttctagttacgct
+aatatgcggtcgcctgtggtttctattgagtcctataacgggatgggatctaatacgttt
+ggttactagtaaacaaggtataaatttgataccggagtatcaactgtataacatcaagct
+ttatgactcatacgcgaagtaatgacacaaggctttcaggagatcgcgagtacagagcca
+ctaaggggtgtattacgatagtgacaccaccgagcgcactcactccccaagtagatttat
+gatcctacgctaagtattagatatataaccaaagaggttctagtcagtgcaactcttaga
+ataataattagccggttttgcctttttaggcctaatgcaatattcagctagcccttatgt
+atctcgcgttccacagcaccactcatggcacgcgtttaaactaatcaaatataatctatg
+aatgttatgccagtacttgaataaatcaggttttttataagtccttgcatactctcgtta
+tatactgttagagtcttaccccatagaaattctttcatctgcaaacttagaagaattctc
+agctacggggagcataaagtccccaggatgttgacaaatacaacaaatgtggcttataca
+aacactccatatgaaaatcgaaccctcgtggtagttttagccgaaccttgtacggataaa
+tccctccattttccaatagcagatacctatcctactacctcgtggtattaaattaaagct
+tgaaatatagagctgcatagcttatccaattcccaagcacgagtctaccgtcgtaaccac
+gatttgatttacagacgctagagcaaacccatctttaaacatataagtaaaaattaaagg
+gtgagtgcgtacgtgtttactagcaacttcgcttattaagacaattgtttataagccata
+attaaaaacatatgttcaacaggttcattgatatttgtaattgcacaggtttttaataag
+gatctacgtaagtataatgaacaaactttttaccagagttatattctgtactttgaaaat
+gctcctctaccgccttagagactttcaattagattttttgcagttaatctatgcgtaagt
+gaaccatgcaagggatgcgattcaaccgcctcgtgctaaccctatcgtctgtctcataac
+tgtaggtctaatataattttcagttttcgaacacataaccctttgaaaatctgctattta
+atgtctcacctgcatgcactatcttctatactgctcagaacggctatacgtcactatgct
+ccaagtgacgatttaaacgaagcaaggaataataggtttattttagtgcaaaacaattaa
+gtgcggactacgtgctctttacaataagccttgtgattgggctataggttaagtcccata
+ttaacgatctccaatgtacaaaatcgacaatcgctttgcattacccggttactagtcgaa
+ttacagatagctgttagatactcactctaattttggacaacaatcccaatcttggggtcg
+tctatcgcctgaagctcgtaaatccttccatcttaaacgattacatattatagacttgtt
+cggggtagagatatcacagttgtgcaaacattgtaaatcgatactagtttatgttggtag
+tctagttgcttttaccattccccgaaaaacttgatctactatttcgacaacagtaaactt
+gaactaggtaagtgaaaacagagaatgcctcatagtgccactatttgtccactatatgta
+agtgtagctttacataatccactatgactgagatcattacggcctaggaaagcagcgtag
+aaaaaaagggcccggatattacgactgtaactataaaactagttactggtagcgcgccat
+gtatagatttgttttaccggttgtggttgcgttaacgaatttcagccgcgaaaattgatc
+cgttaaccagtccatctcgacttctataaaacgataaagtaaagttgatgttcagcctcc
+ttcttatggttgcatcgagagtacactactcagtgggaaatagatcggggttcctacttc
+agattgtattatctaggcaattgccgattgtgccatacctggataaaataagctacctac
+atgtgatgcttatctattatcgtcatactaccttagggtgtcctgttgaacgctacatta
+atctttagccgtttgagatgttccaatggataggagtctaacgcatgatgaagtttagga
+aggcagagcatcccactaagtatgtgacagtgtatttcgaaacgagacgttataaataga
+aaaaaggtccttctggttctattctgctgaactattgaatggaaagattggttgacctac
+gtactatttgcttgaagtcatcaatttgacggggtgagagacatatggtgcatactttac
+ggactctatattttagatcagaagcttagcagtcttctctacaccccctcacgacataat
+tgcttttaagaatctatgtttgattcctctacgggaattcggatccgttcgcatgtgcgg
+tttatctaaaccaggggacatatgttcagctaaagcatacgaacactttgctaactagac
+gtatgtatagtagctataaatcccgacgatatttacaaaaagaaatgagactcaaatata
+tacatagcgaccctacacttattcgcaccctgatctaggcgatcctagcacccacacccg
+aaagtgagcactagtgtcttccgtattaaatttactgcagttgagattttagttgtctac
+taaggattactctaacccgtaataaggatcaagactcggtactagctttactatcattcc
+ctatgtgttttcctaactcacaagggtacgtaccagcctatgtaattacaataatgataa
+agacacaaaggaagtaactttacaaatgagtctccagttacactagcttagtccctccca
+tcttgctttgaagtctaaatacgcaatctctgaggatatacagcagaagaacactcataa
+cgttggagtccaagaattagactcatagggcccccaacatttaatatgtactgtgagttt
+gaaggtgttctattgttaattcctgctcttgatacatgacacgtactccgtgtttaaggc
+ttcggactgactttctttcataagttgagcaacgaaaatttcagaatcgataagttggat
+tcactaactaatacggctgattgaaaactccactccggacctatatggtcgacctttata
+cgtaaccgatataaaacttataggctggtatatcgagccttcctagcgcaatttcggatg
+gggtttcttctactactcaacaacggaatagtctttgtttagtaaaccagagctcaggac
+gcccaatacgtaggagagcgctgtggagcatgtgtcattatggactggagcactcttaaa
+tcactctgcgtgtgctaaacgatagatcataacatgtcctgagtaaattttcttgatacg
+tcgcaatataccgttattagttaaacgttctcatccgtcatgcgtgaaatacggctgtcg
+tgctcagatatactattagcgactcatctcgcctaacacgcacacgtataaactcggaat
+gactgccgctcttacatattagaaatacagactacaccacggaagcattgggtcattctc
+aaccgctgtataaaagatgattagtcttataataagattaccaaagaggcagaatcatgg
+gtagtaaatctattattcaagtgattaccgtcgtgtaggcagggagtgaggacgagatgg
+tactcaggacaaatattaaccggacgaagtggtttacgtcgtactttcactattagtagt
+aaatacaaggtaacaccggggaatagtactaaatataatgatatctatcttcgggagaac
+gagtcgtctattgctttgaacattctcaaggcgtaaaatgtgctgacttatagcatgata
+caaccgattgttacttttgtctattcaaaagattgaatagttttttatacaaaagccgca
+tacttatgacggctagtatacagtttcatcccctagcatcaatgctatggacagtattga
+acttataggaaattcttctaatagggcaaatccgtcgtgatgcctattttttttcagtca
+catcctcaaatggcactagtattgtcgggatcccattaacaggctcaaccacgagctcac
+gcgaggacatgtagtccgtatctttaacgaagcgacagcgacagaactcccatggataac
+caattataaggcccgtaatcctctagacatcgtttaccaataaatccgctttctccgtaa
+tcatgttgaataccccagagtagtccagatgataaccgatgaaacacaagtctttctcaa
+tgcacttacggtgaacttattaccgccaacgtagctcatcaaggttgcgacatctagttg
+tgtgtttgcgacgagcccagcgaacttcatcaactttcgtatattcaacgccttgtaatt
+ttactttaagacgcctggtgatgtagattcttagataatcagtttgttatcggctgtact
+ttaccataatttcacaggtttcaggtcaagaagattatagctgtatatacagttccatgc
+tcggtgcacagaaacgtgatcggataataatcaatcgcttatgtcgtctttaggcgtatc
+caatacatgccccgataccgcagtgtatttcgacatgtaggtataccgtcgcatttgagc
+tcgagtcaggacgtcagctagattagattccttaatagaatataccgacctctagtccga
+actaaactatagataacgccaacttcaggttaattgtctagtcgtctgtttgcagatggg
+attcttagatgagtgagtatcggccatattggttcgagcactttagtttttgatgcatag
+gatatgcaatgtatagctgaaagtactttatctgtttcaaactcacattgattaaaccgg
+taaacctttaaagactacaagaaaatattcagtgagggcaattttgtcaatcacaatctt
+ccagctagagatacttcacaatttgtcttgaggctacgcaacattagacggattttcgcg
+ttttattgaaataatcgaggggcccaagagtatccatagttcattttgtaagatttcttt
+acaggcttattacagcttcttcagactcctacatgcttacgagttatatgctagcatgtg
+aacaatagattaatatacaggaaaacgtacattgagagagatgaccctacacagcgcaac
+cgttgagtactttcattaaagggtaacgctctcgagacagcatccttaagatggccttat
+tgtcaaatcatttgcagaagtacgcaagatccctaaccaacgtagaagaatccctacaaa
+cacatgagacgcggtgaaaatagacagggtgttagtattcaatcttcggagtatcaattt
+cgccaatcttggtgagaaagcataccctttcttcagagaaagaagatcaatcataacact
+atctttaacgaggtacgcacgcgcatcattacctgcctccatggatctttaggatagcgg
+aaagtattggcagcgtattgtgatttcgttcctactttatcaatttcacattcatataca
+tgtcttttatcaaaatcgccaataagataggatgagctatattagatgctagtagagttc
+gcgccaacatcatcgataggaatactcaggacagcgtgataggacttttcaatccctaat
+actctctataattataactctctcttaagtttggaggcagtaacgcgctctatataatca
+gtttgctgcaccattcttcagcctctgatacatacaaataaattccacagcagtaagagg
+gtttaattgagacatcttgggaacttaggattttactctaacatcaccgaaacgattatt
+ggataccgtacctaaacgaactttctcaaggcagtaatataggacatccgcaataacaca
+aatgctgcctccccaggagttatgtcttcctggaggctatatcttacacccactcactat
+aggcaaactaaagtttaaatgttgattgtctaaaaaaaagatagataagagttggccggc
+gtagcacatgcgaaagtgaatcgtaagctataattctctggacttgaagttctgtcctgt
+tcctctgcaagaaacaaacttcctttaaagctatttacgacgcacatctcagcaagttat
+aaacatgttggaagtttctagtcggaattcccaaagaacggatctatctaatgcattcct
+acatttttcctgtctgccgatggtgccatcctattcaaagaatttcttaaaagtagatta
+aatgggacttttaacaatgagtaaccttacgcctctaagggttcctcgagtgccatacac
+cagtcaggtccgagccacatacacggagaacattctaacatagcattctcaactcgatca
+tttgcaggttacttctttcctatcctagtgctaaaaatcatacttgcaatcccatagcac
+ggattaagaacctaagaaacaattcagtaaaacatgttcgaattcttggtatgggaacat
+cattgcagctatggtctaacgcattaatgtttgggtacatcttccatcatataaacagga
+agagtctgacgacagggagtgcttgcgatcatgtctatcattgtgaaatcaaattgtagc
+tcacatgtcgtctatgagagcgtgtatccgataagatttagaaaaatagaagtcgtataa
+gatctcactgaacttttgaatgaatgtgaagcatatatgatctgctttaataaaacttta
+tccataggatacgtttccaaatcaattcaataattattagtcaaaatagataaggatgaa
+caacctgaaggccgatcggacgtagaaagtggtcccatcactttgagttgatattgttga
+accacacgttattatggttttcaaacagtctcaggatattgtatatacagataatccgat
+accagttgtctgacgcccctcttacgtaccccaccctttgtgacgtttaaagcagttgtt
+cagtattttaaactaggcggcaactaatttggaaagaagcacagtggatatgtctaaatt
+cttgttattcaggcctgaatttaatacaccgcatagttaacttcgcggtagagttgttca
+tcatgcctcctctaagctaccacttctatgatacaccaatagttgttctacggaatctga
+taattggccaagtcataaacttccgctgcgttcaacccccttgctcgaatatccaactcg
+aaaagacagccttttggtgtccggaacaaatcagttacttcttttctgatgttaattctc
+tgtggtcagatacagaccaaaaactccgcggatttaccatcctccaagaacaaatttgca
+tcaacatagcattttggctacatattctaagtctcaatagtttaggttttcaactacatt
+atcccaacattaggattggaggaataatagctgggtaagtccccttgcgtctacaatcga
+ctattttttatgaatatgcttctgccgcacctatggttattaaaaaagtcatgactttga
+agaaccctgaaaagatagatgaatcaggtgtaatggcagcagccaaagagcatataatta
+gcaacactctaagaacattatagatatgatgatagcgatcgtcatgatgttatccggtca
+caatagtagcttcatcagctaattcgttttgccagtggtgacttgcgctggaagaatcgt
+tatacggtcccttccctcttgatacggtgggggcttattcaaccgcgtggattgggttgt
+catacttgcattaaacgatgtaaaccatctagtagtcaactatactaaatcacaaaatag
+tgatcaatacatacccgcttcatggttttaaccatttaattgattaaagatattccgcta
+agaaccattatctacctaaactgatcgccgtatcctagtagtttgaaatttgatgtaccg
+taatgatcaacgaagtaaaacgttatattgtatgtagaataataggtcttggagctaaat
+gatgtgattggtagtgaagacttacccttacaactttaccggtttctcggaagaatatac
+tagagaatcaatgcatgggctacataagcactttagtctaatgagataaaaaatacacga
+gtcttccatcatgaattttttgtcgaaaaactcgaacctggtaatttaaaccatatatct
+ttatgtcgtcaataactctcatatgttttatataacttcccaatcacgacttgtaactgc
+ttgttcgactgagctgtttgagctatgaggccgggatccggttgagctacatctatttgc
+tacaagaaaaatgaaagcacatttgttgggagttctggctacactcatagagaaataagt
+ggcccgagtgggtgcggcctgcctccatattcaagtgtatcttaaaccaagtggttccaa
+cgctcgcgctaaagaattaaagcctttatttcctccacggagtagcccgtaatccggttc
+gaaagagaccattgaagttaattttcatatccagtgaagtttaggcacaagcatgtgttc
+tgccacatgcctcaaagcgctcttcaaccaagatatgattcatcctaacttcgatgaatg
+cgtctgtaacataaatatagaaggaatgattcggcgagttaattttcgccttctccaaca
+tggcatccctacgttcgttataaggaccatacatgtaggttttaaaggtttgcggttaat
+cgatatttacatcatagaaattctatagtcaaatttacaagactctagatactcactcgt
+tgcagccggctaggaagcgctttgtaccttacttcccttttcgttgcgtaatatgaattt
+catatagtaagttcaaggcactcatacctccgtgaagagggtagatagactattaaagtt
+gtttaatagtacgtattgatggaaatgacccgtaggagatttaccactcaatccacaaga
+ttcgctgctgtgcattatcaaaacagtgcatgtcgaaacatgggttgggtccttcaaaca
+cgaatccaggtagagatacctttgcaatttttcgatgaaggcgaccgagataaatgagct
+ataacactgtatgtcttttgattgctataaaacacagaaacggatattaatttaggccgt
+aaccaacatctgttatttgacatagaacagatggtcctttacagcgtattccggccttaa
+tattgaggtccagtgtattgtcctcctttaaagaagttgattgtaactgacttaaataag
+acatgtcacccattcactgggttgcaactgctggccctttttgtccatcgcacgctaatg
+tgataacagtaccgccctcacacctgcgtttaaaagacataaatgtcgctatgaaggtta
+ttcattaattttagctgttttcttagaaaaggtaaatttaaaattgaaaaggctagaaaa
+ctaaagttacgacaaatgtgtttgtcaagtaggcgggcatcattgagattgtaagaaata
+aagccataaccagccccggaatagaaaatgttaaggaaaggcgatcttctttgaattctt
+attgtcaagtgcagtcatacgttcttatcagaggacattgcaataaaatctaacaccctc
+ccttgtgtggttgggccatttgtacttcgaagcgtccaccatgtgcagaggataacggaa
+tgtggttccgtcccataaacgatcattctcgcccacttagtggcgcggtaaatcgctctc
+atagaggtaactggcctgtaatgtccaatgttaggctaccttctccaactttagtacaac
+gaataatgtccgattaacaaggagtcaatttgtcatgaccagttcattcaggtacttgta
+tctatacggacgcgttccagagtagtatttgaaattttgaggttctactgataagtttag
+ctatcgctgtatgtctgaataagaatttaatgtttatcttcgataaataacaattaacaa
+ctcctaggtgatacactgtgaagtctgctgttccccaaattacatatgctattttgttca
+cataccatgaagttaagctaagtgctctataatggcataaacggttatcaaactagctcg
+aatttcttttattacgccggaagcggattaactgctgtagatcaaacacgttaggatagt
+gtcgttttcatatatatctaaattcggtctaacatgcattacccatgcttgataacgtag
+cacttcgcagtctaattatgtaatgtccgtttaaccaaactttaaaaaagtttatctatc
+accagtgatgcctcatcgtgactacccggatctttagcctttagggtctaaacagaacta
+atattactacgtgtcatactccggagcttaaccaggtgaaacttatttgttaaccaaatt
+tagtgacagggtagaaatacgtatcaaattaacccagcaatacaataagcatgaaaataa
+ttgtaatcgggtttgggccggaatcccgcttggcgaaaacttaatgacatagtgtgatgc
+attttgcactggattgagccacaaactcaactagcattatgctcaatatttggccagtgt
+tctacggtttgaaatttataaaggccgcgcaaaagtcttgtagttacaaacgcataaatc
+tcgaacgtaataggtttaattagaacatccgtaggatttctgtttatagtagatttatac
+taaatgttctgattagattctgacggccttacccatacaattaataaagacgaatatatt
+agttatagtttactatccaaataaattaagcgaatcgaaataaactgtcacgatactggg
+cagttatcaacttatcacttatacagttcggacactctatattggtctgtgagtactcta
+tcaaactaactcataagttaactgcgcttccattaaatttcaatacgttcttgtgctgtg
+tacaaacctataatcgaataaatgacacatatggagatgcataataaaaaaaacggctcc
+atatttctcgttaatcgggcattcttaaggaggagcatctcaccaaaaataacgttcctg
+ataagtcttaactattagaccgtcttcgggaatgaacgaaacctcaagctagcatggtat
+agttcttgatagcgcgtaaattctgataatactgggcggacagctggaaattagttgcca
+gtgcacctacgcaaatagtttacataaatcaacgggctccgaacgtaaatacaaagggtt
+agttacatcgcaacaagatgaaaagcatgtatgtctaccgtcatccgtccctaacaaaca
+taaaggtggtgaagaatctcgtaggtcaactataactccatccttgaagcaactactccg
+cgtccgtgtgcgtagttcgcaacgagaacactactgaaaaaagctaaacaactctcggta
+caaatgcggcttgtgtcgataaagttggtggtagtgcacggaataacataacaaggaata
+ttatttattcaaattttttgtgactgttatttgttttctgcctagaatgtaaggatgtgt
+tttttgtgacctgatagttacgcttatttcaggtccacggtgcgtgagagtgtgtcctat
+aacggcaggggagcgaagtagtgtcctttagactattcaaggtagaattttgataacgct
+ctataaaaggtagaaaatcatgattgagcaataagaccccaacttatcaaaaaaggagtt
+ctcgacagcgcgtgtacagtccctataacggctgtatttcctgtgtcacaacaccctccc
+atcgcactcaaaatgtagatttatgatcagacgctaacttgttcttagagaaaaatacac
+gggatactctgtgcaacgatttcattaataaggtgcagcttgggacttttttggccgtag
+gctttattaacattcacagtaggtagcgagacttcctatgaaccaatcatgccacgcgtt
+ttaacgtttcaaatataagctaggaagcgtttgccaggacttctataatgcaccgttttt
+tttagtacttccttactagccttagtttatgttagagtctttccaattacaaaggattga
+atagccaaaatttctacaattctcagcgaacgccagcttaatctaaacacgagcttcaaa
+tattctacatatcggcaggagtcaatatataaatatgaaaatcgtaccatcctcgtactt
+ttagaccaaacgtcttcggataattaaatcctttttcaattaccacagtacgtgcattag
+aactactgctatgaaagtaaaccttgaaatatagtcctcaagagcgtatccaagtacatt
+gcacgtgtatacagtcgtataaacgagttgatgttctgacgctagagcttaccattcgtt
+aaacagataactaaaatttaatggctgagtgacttagtgttttcgacaaacgtcgcggat
+gtagactattgtttataagcaatttttaaaaacatatgttcaaaacggtatgggatatgt
+cgaattccacaggggtttatgtaccatagaagtatgtataaggtactaaaggtttaaatc
+tgtgatattcggttcggtgaaaatcagactagtcacacttagtgtctgtaaattagattg
+ggtgaaggtaagcgatcccgaactctacaaggcatgggatgagattctaccgactccgga
+taacactttacgatcgcgcataactctagctcttagataagtttaacttgtcgatctcat
+aaacagttcaaaatctgcgatttattgtatcaaatccatcctctatcttctataatcatc
+tgaaccgcgatacggcactatgagccaagtgaagattgaatccaagaaagctataattgg
+tttattttagtccatttaaattaagtccggtataagtgctctgtacaatatgcagtctca
+tgggcatatacgttaactaccttttgatacttcgaattggtaaaatatcgactatcgatt
+tgcagtaaaaggtgtagagtccaattactctttcctgttacatacgatctcttagtttgg
+acaactagcccatgatggcgctcctctagcgcatgaacctactttataattacatcttta
+tcgatgaatttttttagactgcggaggccttgagttttaacagggctgctaaatttctta
+agcgattagacggtagcgtcgtacgctacttgcttggaacaggcaccgaaaatattgatc
+tactattgcgtcaactctattctgctaatagcgatggcaaatcacagaagccctcttagt
+gacaatagttgtcaactatatctaagtcgacctttactgtatcaacgatcacggagagaa
+ttaccgaatacgaaacctcaggactaaaaaacggaaaggatttgtcgacggtaaatataa
+tacttgttaagggtagcgacacaggtatactttgggtgtaaacgtggtgcttcccggaac
+gattttcagaccagaaaattgttccggtaaccaggaaatctcgtctgcgttaattcgtgt
+tagtaaacttgatcttcagactccttcttttcgttgcagcgagacttaaattatatctgc
+gaaatagtgccccgtgcatacttcagatggtaggagataccatttggcccattgtgactt
+tacgcgattaattaaccgacatacatctgttcctgagctatgatcgtctgaataaattac
+ggtctcctcttgatacctaatggtttctggagacgtttctcatgttcaaatggatagcag
+gagatcgcttcatcaagtttagctacgcagagcatcaaaatatgtatgggaaagtcgatt
+tccaaaccagaagggataaagagaaataacggacttctccgtagattagcctgatatttt
+gatgggaatcatggcggcacatacgtaagagttgcgtgaacgaatattttggacggcggg
+agacacatatcggccattcgttaaggtctctatattggacatcacaagcttagcagtatg
+agctactaacactcaagacattattgattttttcaagatatgtttcattcctctaccgct
+attcccatacgttcgattcgccgggtgagcgaaaccacgggactgaggttaagctaatca
+ataacaactcgttgcgatagagacctatgtatactagagagaattccccaacatttttac
+aaaaacaaagcagactaaaatagatacagtccctccatacaattaggaccaacatgttat
+tgccgatcctagcacacacaccacaaactcagaacttctgtcttacctatgaaagggtct
+gcacttctgattgtacgtgtctaattagcattaatattaaaactaattaggataaactat
+aggtacgagctttactataagtcactaggtgttttccgatcgaaaaacgggaccttcaag
+ccttggtaagtacatttaggataaagaaaaaaaggaaggtacgtgactaatctgtctaaa
+ctgacaatagagtagtacctacatgcttcatgtcaagtcttaatacgcaagcgctctcgt
+tatactgctcaacaaaactcataaagttggactccatcatttagaatcatagggaccaaa
+acatttatttgctactgtcactttgtaggtgttctattctgaattcctcatattgataca
+tgaatcggaatacctgtggatcccttaggacgcacgtgctttctttacgtcagaatacat
+attgtcagaatcgagaagttccatgcaattaagaattcgcctctttgaaaactcatatcc
+ccacatatagggtccaccgttattcggaaacgatataataattattccagcgttgagcgt
+cccttaagagcgcattttcgcttggcctttcttctacgactctacaacgcaagtggctgt
+gtggagtttaccacagcgcagcaccccatagaactacctctgagagcgcgagatggtggc
+agtatgctctgcagctagcgtttagaacgcgcccgcgcattaaccagtcatattaaaatg
+gactgtcttaattgtcggcattaggagcaatattaactgatgagggtatcggtcgcagaa
+gtaatgacggaaatacgcctctagtccgcagagatacgattacagactcagatcccctaa
+caagcaaaacgattaaatcggaatcactccccctatgacatatttgaaatacacaagaaa
+ccacgcaacatgtcccgcattctcaaccgcgctttataagatgttgagtctgagaattag
+atgacctaactgcaagaatcatggcgagtttatctagtaggcaagtctgtaccctagggt
+tcgaacgctgtgacgtcgtgatcggtctaaggacttagatgataaccaagaactggttta
+ccgagtactttcactattaggagtaattacatgcgttcaccgcggaatacgacgaaattt
+tttcatatctttatgagcgagatcgtgtcgtctttgcattgcaacagtcgctaccagtaa
+ttgctgatcaattatagattcattatacagatgcttacttttctctattcaatactgtca
+tgagttgtttttaaataagcaccagaattatgtcgcctagtataatcttgcttccacttg
+aatcaatgcgatggacagtattctactgattgcaaagtagtctatttcggcttagcagta
+cgcatgcctatttttttgcaggcacagaataatatgcaactaggattctcggcatccaat
+taacaggctaaaacaccaccgaaagacaggtaatctacgaagttgatgtttactacagaa
+agcgaatgatatcacttggagaacattttagatgcccccttttaatctagactgagtgta
+ccaatatatcaccggtctaccgaatcagcttgaataaaccactctagtactcatgataac
+cgagcatacacatgtatttctcaatgcactgaaggtgaactgtttacaccataccttgcg
+aatcaacgtggcgacttatacttctgtctttgagtacagcacaccctaatgaatctaagt
+tagttgttgatacgaattgtaatttgactggatctcgcctcctcatctagattcttagag
+aagatgtttcttatagccggtactgtaactttattgatctggtttatggtaatcaacatt
+ttacctctatttaaacgtccttgcgccgtgcactcaatcctgatcggtttagattcaagc
+gattatcgagtctggaggccgagaaaagaaatgcacagagtaagctctctattgcgacat
+ctacgtagaaactcgcatttcagatcgagtaagcaactctcattgtgttgattcagtaat
+acaagattacctacgcttctacgaaatatactatagatttagcctacgtcacctttagtg
+tcgagtcggagctttgaagatcggatgcggtgtggactgtgtataggcaattttgctgcg
+agctcgtgacttttggttgatgtcgatatcaatgggatacctcaaacgtctttatctctg
+gataactcacattgagtataccggtaaaaatttattctattcatctaaatagtcagtgag
+ggctagggtcgcaatcacattaggccacatacacatacttaacatgttctattgacccga
+cccaactttagtagcattgtagccgtttatgcaaatatgccaggcgccaaacactagcca
+gagggcattttgttacatttatttaatcgattattacacagtcggaacacgcctacatgc
+gttcgacttatttgcgacatggtcaacaattcagtaatttaatccaaaacctaaagtcag
+agacatgacactaaaatcacattaaggtcagttagtgaaggaatggctaaccagctagag
+aatgcatcattaacaggcacttattgtcaaatattttccagatctaagcaacatcacgtt
+aaaaagtacaacaatcacttaaaacacatcagtccaggtgtaattagaaagccgcttagt
+aggcaagcgtaggagtataaatgtagacaatagtcgggacttagcagacactggatgcag
+tcatagaagatcttgcataacacgttagggttagagctacgaacgcccatcattaactgc
+ctaaagcgtgcgtgagcttagcgctaacttttccaacacgtttgtgatttcgttcataat
+gtatcaatttcacagtcatatacagggagtgtagaaaaatcgcaattaacatacgttgac
+ctatttttgttcagagttcagttagagcctaatgattcgagagcaataatcaggacagcc
+tcataggaagtgtcaatcacttagaagctatattattataaatcgctctttactgtcgtc
+gaaggaacgagcgagagagaatcagttgcctgcaactggcttaacaatatgatacataaa
+aatattttcatcaccactaagacggtggaattcagacttattggcaacttaggatgggac
+tattaaataacccataagatgttgggataaagttacgaaacgaaagggatatagcctgtt
+agataggaaatccccaataaaacatagccggcctccacagcagtgatctattccgccacg
+cgatatctttataccacgcaatataccaataataaaggttaaatgtggttgcgatttaaa
+aaagatacatatcagttgcaccgcgtagcaaatccgtatgtgaagcgtaacctagaatta
+tagcgtctgcaagttctctaagcttcctctgcaagatacaatatgactttttagcttttt
+tactaccaaatctcagaatcttagaaacaggttggtacgtgctactcggaattcccaaag
+taccctgctatatatgccattccttcattggtccgggctcaccatggggccatcatagta
+atagaaggtagtaaaactagttgatttccgacttttaacaatcactatcctgacccagat
+atgggttccgactggcccttactccagtaagggcagacacacagacaacgagaacttgat
+aactttgaattctcaaatcgatcattgcaacgtgacttatttactagcctactcctataa
+ttcatacgtcaaatacatttcaacggaggaagataataagtaaatattcactaaataatg
+gtcgaaggagtcctttgccaacataagtccacatatgcgctatagattttttcttggggt
+tcatattcaataagataaacagcaagagtatcacgtcagcgagtcattgagatcttggct
+agcattgtgatagcatattctacctaaatggtagtctagcacagagtggataagatatca
+gttagatatagacaagtactataacagatctcgcttcgttggattgtatggctagctttg
+atgatatgattttataaaaattgatccagacctgacctggccaattatattcatttttta
+tgagtaaaaatagataaccatgaaaatactcaagccccttaggacgtacaaagtggtaac
+ataaatttcaggtgttattctgcaaccacacctgttttgggttttcaaaaaggctaagca
+gattggttttacagataatccctgaacactggtatctcccaacgatgtcgttcccaaccc
+ttgctgaccttttaagctctgctgaagttttgtaaactaggcggaaaatatgttcgatag
+atccactcgcctgaggtagaaattcgtcttagtaacgcctctttggattacacagaatag
+tgtactgacacgtacactgctgcagcagccatacgctaacattaaaattcgttgagtcta
+catttgttgttattcggattatgttattgggaatagtatttttattcccctgcgtgaaac
+cacatggatagattagcctactcctaaagactcccttttggtctacggttcaattctctt
+actgagtttatgttcgtaattatatcggcgcagtgaatctcctaattatcaccggagtta
+ccagacgccatgaacttatggccagaaacattgcatgtggcctacataggattagtatca
+agagtttacgtttgcaacgacatttgaccaacttgaccattcctgcttgtagaccgcggg
+aactcccctgcacgcgactatagaagttggtggtggatgtggcttatgccgcaaatatgg
+ttttgaaaaaagtaatctattgcttgatacctgaattgagacatgtataagggctattgc
+cagatgaaaaactgcatataaggtcaaacaatataagaacattatacataggatcttagc
+gttcctcaggatggtatacgctataaagtctagcttcagcagctaaggagttttgccagt
+gcggacttccgctggaagattaggtttaaccgccctgacatcttcataaggtcgggcctg
+attcaaacccctggagtgccgtctcatacttgaattaatcgatggaaaacttcttctagt
+ctaatattattattaacaaatgacggttcaataaataacaccgtaagggtgggaaactgt
+taagtgatgaatcattttaacctatcatccattagctacagataatgataccccgatccg
+actagggggtaagtggttgttccgttaggataaaccatgtaaaacgttagagggtttgta
+gattaattggtattccagataaatgaggtcagggcgagtgatcaattacactgaaaaatt
+gtcagcttgcgcggtagttgttaagacagtataaatgaaggggattcagaagcaagtttc
+tcgattgactgaatttataaaccagtcgtcaatcatgatttttgtgtcgattaaagccta
+aatggtaatttaaaccattgatatttatcgagtctataaatatctttggttgtatattac
+ttcacaatcaccaattctaaatgattcttccactgtgcgggtggagatatcaggacgggt
+taaggttgacctacatcgttttgatacaacaaaaatcaaagcacatggctggggacttct
+cgatactatctttgagatagtacgggcaagagtgggtgacgcctccctacattttcaagt
+ctatcggataacttctcggtaaaacgctcgcgatatagttttaaagcattgatttaatcc
+acgcaggagcaagttttaccggtcgaatgagaaaattcaacgtaagtgtcatatccagtc
+atggttagccaaaagcatgggttatccaaaaggaataaaacagctcttcaacaaagagat
+gaggcttcataacttcgatgaatgcgtatggttctgatatatagatcgatgcatgaggac
+actttattttagccggcgaattaatggaatccatacgttacttatttggacatgacttct
+aggtgtttttgctgtcccgtttagcgatatttacagattagtatttcgtttctcatagtt
+aattgtatctagatactaactcgttgaagacgcataccttgccatttgtacaggacttaa
+ctgttccgtgcgtaatttgaatttcttataggttcttcaaggcacgaatacctcactcat
+gaccgttcatactctagttaaggtcgggaatactacgtatgcagggaattgtaacctagg
+agatttacaactctttaaacaagagtcgctgaggtccaggatcaaaacactgaatctcct
+aacttcgggtgcctccgtaaatcacctagaaacctactcatacatttgcaattttgagat
+gtaggcgaaagagagaaatctgctttttaacggtatctcttgggattccttttaaaaaca
+cataacgatagtaatgtaccaagtaaccaaaagctgggatgtgtctgtgtactgatccgc
+cgtgtcagagtagtccgccatgaatattgacgtcaaggctagtgtcatcaggtattgatg
+ttcattgtaaatgaaggaatgaactaatgtcaccaagtaaagggggtgaaaatgctcccc
+agggttctacagacatagagatggtcagaacacgacccccctctcaacgcagtgtatttg
+aaatatatggacatatctaccttattctgtaattttagatgtgttctgtgtataccgata
+ttgataagtcaataggcttgattacgtatcttaagacaaatctgtttcgcaagtaggacc
+gcatctttcagattgtttctttttatgccataacctgcccaggaattcaaaaggttatcg
+atacccgatatgctgtgaattattattctaatggccactcattcctgcttatatctggaa
+ttggcatgaatatcttacaacctaaagtctggcgttgcgccagttctacttcgtaccgga
+caccatctccagtcgttaaccgaaggtgggtacgtcacataaaagttcattagaccacac
+tttgtgccgacgtatatagatatattacacgtatagggaatgttttctcctaggtgaccc
+gaccttctactaaggttgtacatcgtataatggcccattaactacgaggaaagtggtatt
+gacctggtaatgcacgttcttcgatatataccgacgaggtaaagtctactattgcaaagt
+ttgacgttatactgataagtttagatttccctggatcgcgcatgaacaatgtatgcgtta
+tctgccatatataacatgttacaaatccttggggatactatcgctactatcatcggacca
+aaattaaataggctagtgtcttatcagaacatcatgtttaccgaactgatctattttcca
+atttaagctgatattacgtccgcgtatttattttagttccccggatgacgattatctgag
+ctacatcatacaagttagcatactcgccggtgcattgatttcttatttcgctatatcttc
+aagttcacaggcttcatatagttccaattagcagtataattaggttttgtaactttaacc
+atactttataaaaggttatattgcacaactgatcaagcatccgctataacccgagcttta
+ccagttagcggctaataacaaataagatgacttcgtgtcatacgaccgtcatgatcatgc
+tctaacttaggtgggaaccaaatttaggcaatgggtagtaataagtataaaatgatacca
+catatactataacaatgaaattatttgtaatccggtttgccaacgtatcccccttcgcga
+taaattaatgacatagggtcatccatgtgccaatcgtgtgtgccaaaatctcaaattcaa
+ttatcatcaatattggccaagtgttataagcgttgaaagtgatataggccgccaaaaagt
+agtctacttaaaaaccaatatttatcgttcgttattgctggtagtacaacatcacgagca
+tttctcttttgagttgatttatactatatctgctgatgtgattatgtcccacttacccag
+aatattaagaaagtcctagattgtaggtatacttgactataaatataatttaagactata
+caaataatctggctacattatgccatcgtagaaactgataacgtagtaacgtcggacact
+agattttggtcggggagtaatctagcatactaacgaatttgttaaatccgctgaaagtat
+atgtcattacctgcttggcctgtcttcaatacgtttagactattaaggactcatttcgag
+atccagtattaattatacgcatccatatttatactgaagacggattgagttaggacgaca
+agctaaacaaatattaagttaaggattagtattatattgtagaaactcgtcgggttggaa
+cgattcatcatcatagaatgcgttacttattcagagagacttaattcggttatgactggc
+agctcacctggaaagtaggtgaaaggcaacagaagaatattgttgactgaattctacggg
+ctacgaacgtaattacaaagcggttcgtaaagagcataaagatcaatacaatggatctct
+acagtattacgtaaataacatacataaacctggtgttgattcgactagctcatagattaa
+tcattaattgaagctacgaagacgcggaagtctgcggagtgagcaaacagtaatcgactg
+ataaatgcttataatatcgcgcttaaatgccgcatggtgtacattaacgtgggggtagtc
+aaaggaatatatttactaggaatattagttatgcaaatgttgtgtcaatgtgatgtgttt
+tatccagacattggatgcatggctgtgggggcacaggatacttaccattagttcacctac
+aagcggcgtgagagggtctcagttttagccagcgcagagaagtacgggcctttagacgat
+taatgctagaattgtcataaacctcgtgaaaagctagttaataatcatggtgctagaaga
+acacaacttttctataaaccagttctcgactgacagtcgtaactcactatatcgccgctt
+tgtactgtcgcaaaaaaacctcacatagaaagaaaaatctactgggtgcatcagtagaga
+tcgtgttctgagagataaatacaccggatacgatctgcatcgagttcatgtattaggtca
+agcttgggactgttgtgccagtagcattttttaacagtcaaagtagggtgagacacgtca
+tatcataatatatgccatcgaggtttaaagtttatatgataagctagcatgcgttgcaat
+cgtattcttgaatgctccgtggtttgtactaattcctttatagactgagtgtatcgtaca
+ctcggtacaattacaaaggatggaagagcaaataggtcttcaattataacagtaccccac
+cttaatctaaaaaccagcttcaattagtattaatttcgccaggagtatatatataaatat
+ctaaagactaaaagactcgtacttttacaacttacgtcgtagcataattaaatcatgggt
+aaatgtcatcagtaagtgcattagaaatactcctttgtaaggatacagtgaatgtgtctc
+agcaagtcagtagaaatggaaattcatactcgattaaggcctataaaactgttgttggta
+tctacagagtgattaaaattagtgaatcagattacgaaaatgttttcccgctcgcactta
+cgcgtttagacaaaagtacaggtggtacaattggctgtagtagaattttggtataaaata
+ggtgataaaccggatgggtgtgggcgaattcaaaagcggtttttgttccatagaactatg
+tagttggttataaaggttgtaatctcggagattaggttagggcttaatcagaatagtaac
+aatttctctatgtaaagtacagtgggtgatcgtatgagttcacgaactcttaatgccatg
+cctggacaggataaacaatacgcatataacttgacgatcgagcttatatcgacctatttg
+agaagtttaacgggtcgatataatatacaggtcttaatagccgattttttctagaaaagc
+aatcctatatcttagttaatcagatcaaccccgtgaacgatatatcagcaaactgaacat
+tgtatacaacattcctttttgtccgggtggggactccatttaaagtatctcacctagaac
+tcagcggtaatagatgcagtctcttgcccagttacggtaactaaatgttgatacttagaa
+ttgctaaattttagtctagacatttccaggtaaaccggtagacgacaatttctctgtcat
+ctgtcataagatcgcttagtgtgctcaaattgcaattgagggccctactatagacaatca
+tcagactttttaattaaatagttttccatgaatgtgttgtcaaggcggaccccttcactt
+ttatcacggctcataaatgtcgtatgactgtagtcggtagcggccttcgagtcttcaggg
+gaaatggaaaagaaattaggcttctaagatggactataatcgattaggctaattccgttc
+gcaaatcacagaagcaatcttactcaaaattgttggaatcgatagcgaacgcgaccgtga
+atgtttaaaagtgctcgcacagaattacccaatacctatcatcacgacttaaatacccaa
+agcagttgtagtcgcgtaatagattaagtctgaagcctagagacaaagggatactgggcg
+gggaaacctgctccttcacggtaacatggtaacaacagaatttggttaaggttaaaacga
+aatatactcggagtgaattactgttaggtttcgtcatcggatcaataagtagtttccgtg
+aagacactcttatattagatctccgaaattctgacccgtgcattaggcacttggtaggag
+attccatttggaacttgctcaatgtaagccagtaatgttccgaaataattcgctgcagga
+gcgaggagccgctgaataaaggaccctcgcatcttgttaccttatggttgagggtcaccg
+ttctctgcgtcaattccagagctggagatacattcatcaacgttacctacgcacagaata
+aaaagatcgagcgctaactcgttttcctaaacacaacggatttagacaaattaccgaatg
+cgccggagagtagcatcttagtgtcatgcctatcatggcggctcagtacgaagagttcag
+gcatcgaatattgtggtagcccgcactcaaagttccgccattaggtaagctatatattgt
+ggtcagaacttgaggacaactatgagctactaaaaataaacaattttgtcatttgttcta
+gatatgtggcattcatcgaacgcttgtaccagaagttacattcgcagcgtgagcgaataa
+acccgaatgagcgtaacattatcaataacatatagttcagatagagaacgaggtattcga
+cagagaattacccaacattggttattaatctatgcagaataatttagataatgtcactac
+ataatattaggaccaaaaggtgattccccagaagacaaaacaataaacaatctcacatat
+tcgctagtacctatgtatgggtatgatcttctgattggacggggataatttccaggtata
+ttaaaacttattaccataatctagacctaagagaggttatataagtaaagagctgtgttc
+cgatagaaaaacccgaccttaaagacttgcgaagtaaattttgctttaacaaaaaaacct
+acgtaagggaatattctgtataaactgaaaagtcaggtgtaactacatgagtcatgtctt
+cgattaattacaatgcgatctcgttattctgatcaactaatatcataaactgccactaca
+tcttgtacaatcattcgcaacaatacttttatgtgctaaggtcacgtgcttcctctgcta
+tgctgatttaatcagattcataaaggaatacgaataactctggatccattaccacgcaag
+ggatttatttacggctgattactttttggctgttgacagaactgccatgaaagtaagatg
+tcgcatcttgcataaataatagcacctaatatagccgacaaagtgattccgataacagat
+tttaagttgtccagccttgagactccatgaagaccgcttgggagcttccccgtgattaga
+agaatctaaatcccaagtggatggggggagtttaaatctcagcaccaacaaatagtactt
+cctctcagagcgcgtcatggtcgaaggagcctatcctgatagaggtttgaaagcgcacgc
+gcatttaactgtcatattaaattggaatctcgtaagtgtcggcagtacgacaaattttaa
+ctgatgtcggtatacggagaagaaggaagcacgcattgaagcagctacgcagaactgaga
+agatgacactctaagatacaattaatacaaaaacgttttaagcccaatctatcaacagat
+gtaagatgtctaatacacaagaataaaaccttcatgtcccgatgtataataacagcttta
+tttctgctggtcgaggtgaagtagtggaaattactccatcttgctgcgcgtctttatagt
+gttggctactctgtaaccgacgcgtccatccctctctcctagtgatccgtatatccaatt
+agaggataaccaacatctgcgttaccgacgaatttaaatttttcgactatttaattccgt
+tcaaacccgtattcgtagtaagtgtttcatagatttatgaccgacatcgtgtacgagttg
+cagtgcatatgtagataccactaattgctgatctaggatacatgctttataaacatgctt
+acttggctattttatttactgtcatgtgggggtttttattttcaacaagtatgtgctacc
+attggataatctggcttcaaattgaagatatgcgttccaaacttgtctactgtttgctaa
+gtaggagttgtcccattagaactacgcagcacgtggtttgtgatcgaaaagaataattgg
+caaatacgaggctagccttcaaatttaatgcagattactcctcagaaacacacgtaagcg
+acgaacgtgatgtttactacacaatgcgtatcatagaaattcgtgataatttttgttcca
+acctttgaatctagactgagtggaaaaagatttcaccgggataccgtttatgctggtttt
+aaaaactcgtcgaatcatcttataactgcattcaaatggatttctcaatcatctgtacgt
+caactgttttaacaataacgtcagaataaaccggcacaatgagacggcggtctttcacta
+caccacacccttaggattataagtgacgtgtggattcgaattctaaggtgacgggatcta
+caagcctcagctacattaggtctgaagatctttcgtatagccgcgtatgttactgtttgg
+atatgggttatgctaatcaacagttgacagcgagtgaaacggccttgcgacctgaaatct
+ttacggttaccttttgattcaagacaggatcgacgatggaccacgtgaaatgaattcaaa
+actgtaacatcgcttgtgcctcagcgaccgagtaacgacaagttcacatcctctatgcaa
+ctatcattgtggtcattaaggtattcaagattaactaagagtcgaccatatattctagag
+ttttacaattaggaaccgttagtctagactaggagcgtgcaacatcgcaggaggtgtgga
+ctgtcttgacccaagttgcctgacacatagtgtcttttgcttcatgtccttagcaatgcg
+atacctcaatcgtagttttatcgggataaataacatggtgtttaaccctattaatggttt
+ctattaatctaaattgtaaggcagcccttgggtcgaaagcacattaggccacatacacag
+tatgaaattgttcgagtgtccagaccataattgactaccatggtacacggtgttgctatt
+atgactcccgcaaaactcttgacagagggaattttggtacattgatgtaatcgatgattt
+aacagtaggaactagacgtcatccgttagactgagttccgacatgctcaaattgtcagga
+tttttatccaataactaatggctctcacatgtaaataaaatcacattaacgtcacttagt
+gatggattcgctaaacagatagactatcattcatgaactggcactgtttcgattatattt
+gcaacatcgaacatacttaaagttaaatacgacatcattcaattaaaaaaattcagtaca
+cctctaatgagtatcccgctttggaggaaagagtagcactttaaatggacaatttaggcc
+ggactttcctgtaaatggatgaagtcattgtacagcttgaataaatcgttagggttagtc
+cttacatccaccatatgttaatgaataaagcctgagggaccttagagctaacttgtccaa
+cacgttgctcatttacttaataaggttgaaatgtatcagtaagtgacagcgagtgtagat
+tttgaccatttaactgaccttcacagttttgtcttcagacgtcacttacaccataatgat
+gacagagcttgtagatgcacacactcattcctagtgtaaatcaagtagtagctagattat
+tataaagagatattttctggcgtcgaacgtaacacagagagagtataaggggcatgataa
+tggcttatcaatatgtgtaagaaaaagtttttaatatcatctaactcggtggaatgcaca
+cttatggccaactgaccttgggacgagttaagataccataagaggttgcctgtaagttaa
+gataacaaagggatattccatctttgtgtgctaagaacctatttatatttgcagccataa
+aaacctctgtgctatgcagccaccagagttatttatacaaagaaagagaccatttagata
+cgttaattctgcttgcgatttattaaacagacatttcacgtccaaccactacaaaagccc
+tatcgcaagacgatcattgtattatagcctatgcaacgtagctaagcggccgaggaatca
+taaaatatgaattgttacattgtttactacatatgatcacaatctttgtaaaaggttcgt
+tcgtgatactaccatgtacctaactaacctgagatatatgcaatgacttatggggtcagc
+gcgcaacatccgcaaagcatagtaatacaaggtaggaaaacttctggatttcccaaggtt
+ataatgctctatactgaccaagagatccgttacgactcgcaatgaatactctaagggcac
+tcacaaagaaaaccactaattgataaatttcaatgataatatcctgaattgcatcgtgta
+tgagttacgagaagtcgcatttaatgaattagtcatagaaatgtcatagcaggaacataa
+ttactatattttaacgatttaatcgtagttggagtcctttcccaaattatgtcatcagtt
+ccgatttagatgttttcgggcccttcttagtaaagaagttaatatccaagactagctcct
+cacccacgcatgcacatattcgcgagaagtctgatagaatattcgacagaaatgcgactc
+tagctcacactcgttaactgatcaggtacttatagacaagtacgttatcagatatcgctt
+cggggcattgttgcgctacctttgtgcatagcagttttgaaaaattgttcaagacctgaa
+cgggaaaatgatattatttttttaggaggaataatacagtaccatgtaaatactcaacca
+ccttacgtacttcttacgccgaacatatatggcacgtgttattcggctaacaaaactgtt
+gtgccttttctataaggataagcagattcgttttaaacatatgacctgtaaactgggatc
+tacaaaagaggtacttaaaataaattgcgcaacggtttagatctgcggatctttggttaa
+agagcaccattagatgtgccatacttcctatcgcctgagcgagaatttagtctgaggaac
+cactcttgggatttaaaacaattcggttaggacacctactcggcggatgaagcaatacga
+taacattaaaagtcgttcagtctaattttggtcgtagtacgatgagctgatggccaattg
+tatttttattaacagcactgaaacaaaatggagactttagactaatactaaagtctcaat
+gttcgtcgaaccttaaatgctcggaatgaggggatcttcggaagtatagcgccgaagtgt
+atctcattattataacaccagtgtacagacgacatctaattatggccagaaactgtcatt
+gtgccattaagaggattagtagatagtctggaccgtggaatagaattttgaccaaattga
+ccagtcctgcttgtagacagcgcgatctaaactgcacgagaatatacaagttggtggtgc
+ttgtggctgagcacgctaagatgcgtttgtttttacgattctagtgcttcttaacgcaat
+tcagtcttctagatccgctattccaacatcaatatctcaatttaaggtcaatatatataa
+caaaattagacagagcagctgacacttacgaagcatcgtagaaccgatatagtcgacctt
+atgatgatatggacgtgtccaagtccgcacttccgatgcatcttgacggtgaaccgaaat
+gaaatcttcattagggcccccatgtgtcaaaccactcgagtcccgtctctgaagtcaagt
+attactgcgaaaaattcgtctactattagtttattatgaacttatgacgcttaaataaat
+taaacagtaagcctgggaaaatgttaaggcaggaatctttgtaacagttcataatgttgc
+taaagattatcagaccccgtgaagacttcgggctttgggcttcgtaccgtagcataatac
+atctatatagttagaggcttgcgtgttgttgtgctattccacatatagcagctctgggcg
+actcttcaatgaaaatgaaaaatggtaacctggcgacctacttgttaagtcagtttaatt
+caaggggattaagtaccaagggtcgagtttctctgtatttattatactgtaggcaagaag
+cttttttggcgagatttaagacttaagcctatggtaaaaatttgatagtgagcgactata
+gtaagagatttgggtggttagtaattaaaattctcctatgctaaatcaggcgtacaatct
+gagggtgcacatttctcgacgcgtgaaccttcaccgaaagcgtgtggattatacaaattt
+caaacatattggcggggcacttatccataatagatttctgtttgtacgccaaactctgcc
+tcacccctccataaattgtattggctagaggttaaattctccgtaaatagagacacatat
+agttttatacaattgtttgaatcaaagcacgagaaacttttaaccgtacattgacaaatg
+tcttcggatggggcagagcatctcttcgtgacccaaatcaatcgctgagcaataagcaag
+aaaacacagattatacaaagagatctggatgaagatattcgtgcaatcactatcgttatg
+ttagagagttccatgcatgaggactcgttttttgaccaggagaattaagccaagaaataa
+ctgacgtatttccaaatgaattctacgtgtttttcctgtcacctttagccagtgttaaag
+atgactatggagtttcgaataggttattctatagacattataacgagtggaacacccata
+ccttcacagtgctaaaggtaggaacgggtacgtcaggtagttcaagggattttaggttct
+taatccaacgaagaaataacgcatcacccgtcattctattgttttcgtcgggattactta
+gtaggcagggtattctaacctacctgagttacaaatctttaaaaaactggccatgaggtc
+atggtgataaaatctgaatcgcctaaattcgcgtccctaaggaaatatactagaatccgt
+ctcagaaagtgcaaaggttgacttcttcccctaacacagaattctcagttttatagctat
+ctagtggcattcctttttataaaactttacgtttgtaagggtccaactttacaaaagctc
+ggatgtgtatgtgtaatcttccgccgtgtaagacttggaacccatgtatattgacggcat
+ggcgtggctaagcaggtattgatcttcagtgtaaagcaaggtatgttctaatctaacaat
+gtaaagccggggattagccgccaaaggggtctaatgacatagagatgctctgaaatcgta
+ccaactataaaagcacgggatttgaaatatagcgacagatcttccgtattctgttagttg
+acatctgtgctgtctttaccgattgtgatttggctttagcagtcatttagtttcgttact
+cattgctcgtgcgatagttccaccgaatatggcacattcgttctttttttccattttact
+gcaaaccttttcaaaagctgatcgataccactgatgatggcattgattagtcgattggca
+actatgtcctgcttatatctccaattgcattgaatatagtaaaaaataaaggctcgcctt
+cccaatgggctacggagtacacgaaaaaatcgcaactcgtttaaccaagcgccgtaccta
+acatataagtgattgagacaaatagttctccagacgtattgagatatatgtctcctatag
+gcaagcgtttctaattgctgaccagaaattagaattaggttgttaatactatattcgacc
+attttattccacgaatgtgctattctactggtattgctccgtatgcgatatataaccaac
+acggaaagtcgtcgattgcaaagtggctccgtagaatcatttctggtcatttaccgggag
+cgcgcttgaacaatggatgcggtatctgccatattgttattgttaaaaagacttccgctt
+actatcgcttcgatcatcggaaaaatattaatgaggattgggtcgtataagaaaatcatc
+ttttcagttcgcagatttttgccaatttaaccggttatttcgtcagacttggtagtgtag
+ttacaagcatcacgattatatcagctacagaattaaactgtcctgactcgacggggcagt
+gtgtgagtattgcgctatatattcaaggtaacaggaggcatataggtcatagtacaagga
+taatgaggtttgctaactttaaaaattattgatttaacggttgattgaaaatctctgcaa
+gatgacgctagaacacctgatgttcaagtttgccgataataacatataagatgaattact
+gtctttagaccctcatgttaatccgctaacttagggcggaaacaatgttaggctatgcgg
+agtaagtactatattatgataccacatagaatttaacattcatatgatgtctaatacccg
+ttcccaaccttgcaaccgtcccgattaattaagcaattacggtcatcaatgggccaatcc
+tgtctcaaaaattatcatattcaaggttcagctattttggcaatgggtgagtaccgttct
+tagtgatttacgaacccataatctaggcgacttaatatacaagatttagagttacgtttt
+ccgggtagtacatattaacgaccatggatcgggtgaggtgttgtattagttatctgatct
+tgtcagtagctcccaatgtcccagaatattatgtttctactagagtgttcgtatactgga
+atttaaatattatgtaagactagacaaattttatggatacattaggccatcgtagaatat
+gatatagttgtaacgtccctctatagattttcggagggcaggtatattgcttaataaaga
+tgttcggaaatcagcggaaaggatttgtaattaactgatgcgcagcgcttaaataagttt
+agactattaagctatatgttcgacagcatgtagttttttttaccagaaagtgttatactg
+atgacccatggaggtagctcctcatgataaaaatattgttacttaagcattactattata
+gtgttcaaactagtaccgttgcatactttaagaatcagacatggcgtttcttatgcagac
+acacttttttagctgttgacgcccacctcacatccatagtaggtcaatcgcataagaaca
+atattctggactgttttattacccagaagaaagttttttctttccggttcgttaagacaa
+taaagatcatttcattcgttctcttaacgatgaactaaagtacttaaagtatccgcctct
+tgtttcgactagcgcatagtgtaataattaaggcaagataagaagaacaggaacgcgcac
+gtcggagataactctaatagtctctttattccgtttaatatagcccgtaattgcaccatg
+cgctacagtaacggccgccttcgcaaacctatttatgtaattccaagtttaggtatgcaa
+tggttggggcaatgtgaggggttttatcaagactttcgttgcttcgcggggggcgcaaag
+cagactttacagtagttaaccgaaaaccgcagggagtcgctctaagtgttaccaacccct
+cactactacgcgaaggtactcgattattccttgaatgggctgaaacatcgtgattagcgt
+cttatgattcaggctgatagaagaaaacttattttctatattccacgtatacaatcacac
+tcgtaactaaatagttcccagcgttgtaatgtcgctataataaataaaatacaaagaaaa
+ttcgtctgggtgcataagtacagttagtcgtctgtcacataaataatccgcagtcgatct
+cattacaggtattgttgttggtcaaccttcgcaaggtggtccaagtagcattgttgaaca
+gtaaaactaccgtcacacaaggaatatcataatagatgccatacacggttttacttgata
+tgtttacagtccttgagttgcaatcgtagtattgtttcatccggggtgtgtacgaagtaa
+tttagacaaggtgtgtagcggtcactaggtaaaatgacttaggatggatgagcatttagg
+tattctatgataacactaaccatcatgtttctaaaatcctcaggaaatttgtattatttt
+accaacctgtatttatagaaagtgcttttgacttaaagaagccgaagtgttcaaattaag
+gagtacctgattgaaagaatggggaattgtaatctgtaactcaattacaaataagccgtt
+ctaaggattaaggctttgtgtctaagcaactcacgtgaattcgaaattcatactcgatta
+acgactttaatactcttctgcgtatctacagactcatttaaattacggaatatgttttcg
+tttttggtttccagctcgcacgtacgcgtttacaaataaggacacctggtacaattggct
+ggagtacaatgttggtttttatttgctgattatcccgatccctgtgggcgttggcataac
+cgggttttcttcaagactactttcgtgttgcttatatacctggtaatatcggtgagtagc
+ttagggcttaatcacaatactaacaagttctctatggattggacagggcggcatccgttg
+actgaacgatctattaatccattccctgcactggataaacaagacccatttaaattgacc
+atagagatgttagcgtcatatttctgttcgtgatagggtacatatattataaacggatta
+tgagcagtggttttctagaaaagcattcatagttaggagtgtatcagatcataccactga
+accatagagcacaattctctactggctatacttcattcctttttgtccgggtggggacga
+aatttaaaggttctaacctagaacgcagagcgaattgatcaaggcgctggccaagtgaac
+ggttctaaatgttcttaatgagaattgcgtattttgactattgacagggcatcgtaaacc
+gctactcgacttggtatctgtaatctgtatgtagatagagtacgggcctataattcaaat
+tcagccaccgaagattcacaatcttcagacgtttgaaggaaagaggtttactggtatgtg
+gtgtcaagccccacccattctctgttatatccgagcattaatgtagtttcactgtactac
+ggtcacgccgtagagtcggcagggcaaatccaaaacaatttaggctgagaagtggcacta
+taatagtttagcctaagtcccttcgctaataactcaacaaagatgacgcaaaagtcggcg
+aatagattgcgttcgcgtaagggtatcttgaatactgatagctctcatggtaccaagaac
+tttcataacctctttatttaccaaacctgttctactagcgttagtgttttagtctgtagc
+cgacacaaaaaccgagaatggccggcgtaaccggcgcctgcaagctaacatgggatcaaa
+actattggcttaacgtttaatcgaatgagactagcactgtattactctttcgtttcggca
+gcggatcaataaggaggtgacggcatcactctcttatagtagatatcacttattctcaca
+acggaagtaggatcttccgtcctcattaaatttgcaactggctcaatgtaacactgtaat
+gttaacaaagtatgagctgaaggtcagagcagacgatgtagtaaggtccctcgaagctgc
+ttacagtatccttgaggctcaacgggctatgcggaaattccagacctcgagttacattat
+gaaacgtgtcattccatctcattaaatagttcgtgccctatcgccttgtaatataaacaa
+ccgtttttgtctattttcccaaggagaaggagagtagcagcttagtggcttgcctatatg
+gccccctaagtacgtactcggcacgcttagaagattgggctaccccgcactatatgttcc
+caaagtaggtaacctagatagtgtcgtatgaaattcaggtcatcgatgagagtataaaaa
+tatacaattttggcaggggttatacattgcgggcatgaagagtaacattggacatgaacg
+gacattcgaaccctgtgagtttaataccctatctccggatcattataaagtaaatatacg
+tcacttactctacgtgcgtttagacagtctttgaaactaaattggttatttttctttcat
+ctagatttgtctgtatctaactaaattatagttccacataaagctgattcaactgaagac
+ataaatataaactttctaacatagtagcgaggaaagagctatgcctagcatcggatcatg
+cgtccgcgagtagttcctggtagagttaaaagtttttccagaatctagaccgaacacagg
+gtagtgaacgaaagtgcgcggtgaacatacataataccgaacgtaaacaattccgttcgt
+attgttgctgtatctatatttcctacgtaaggctatttgatctataatatgaaaagtcac
+gtcgaaataaatcaggaagcgcttcgagtatgtacattcagatctccttagtatcatcaa
+attatagattttacggccacgaattattggtctagatgtcccaaaaataatttgatgtca
+gtagcgatcgtgcttcctcggagttgaggttggaagaagagtcattatgctataccaaga
+actctccatccagtacctagaaaggcaggtatgtaccgctcattaattttgcgatcttga
+cagatctgcatgcaaagtaacttgtaccagatggcttttataatagaaactaagtttccc
+gaataacggtgtacgataacagatttttaggtgtacagacgtctgactcaatgaacacac
+attgggacctgccccgggaggagtagtagataattaccttctccagcgcgggtcttttaa
+tatcacaacataaaaatactaattaatatcacacaccctcatcctcgatggagcctagca
+tcatacacgtttgatagacaacgccaattttactgtaatatgatattcgaatctagtatg
+tggacgctgtaccacattgtttaaaggagctccctttaccgacatgaacgaagcaagctt
+tgtacaagatacgaagaactcagtactggtaactataagagacaatttatacataaaagt
+gttaagaccattatataaaaagaggtatgaggtctttgtaactacaataatacattcatc
+gaacgatggagaataacagagttatttctgctgctcgagctctagttctgctaatttctc
+aatcttgatgccactcgtttgagtcttccattcgctcttaacgacgcgtacatccctctc
+tcctactcttacctatatcctattactggttaacctacatctccgggaaagacgtaggta
+aagtggtccacgattgtattcacttataacacctagtagtactatgtgttgctgagagtg
+aggacacacttactctacgagttcaagtccatatggacattacactttttcagcatctag
+gtgtcatgatgtattaacagccgttaggggctatttgattttatcgattgtcggcgtgtg
+tattttcaacaactaggtgctacaattcgtgaataggcatgaaaattcaagattgcagtt
+cctatcttgtataatctttcctttggacgagttgtaccatttcaactaacctgcaagtgg
+ggggtcatccatatgaagatttgccaaatacctggagaccctgaaaagtttatccagatt
+aataataacaaacaaacctaagcgaagaacgtcagctttaataaactatcactatcatag
+aaattcctgttaattgttcttccaaacgttgaatagactatcacgggtaatagattgaac
+acggagaacgtttatccggcttgtaaaatatcgtcgaatctgctgataactcaattatat
+tcgatggagaattcatatctaccgcttagcttttaaaaattaagtcagattattccgcca
+caatgagaaggcgcgagtgcactaatcaaatcacttaggattattacggacgtctgcatt
+acaatgctttggggtagggttatacaagcatatgattctttaggtctcttgatcgggcgt
+ttaccaccgtagcttaatgttggcatatccgtgatcctaatattctgttgtcagcgtgtg
+tataggaatgcacaacgcaaatctttaagctgacctgttcatgaaagacaggagacacga
+ggcaccacctcaattctatgcaaaactctaacatagcgtggcactatgagtacgtgtaac
+gacaaggtctcatactcgatcctaagataattctcgtctggaaggttttaatctttaact
+aagagtagaacttagtttattgacttttacaattaggatacggttcgcgactctaccaca
+gggcatcatacctggagctctgctatctcgtgaccaaagtggcagcacacatagggtcgg
+gtcctgcatctactgagcaatccctttaagcattcctagtttgagagccatttagatatt
+gctgtttaaaccgattaatggtttctattattataaagtgtaacgctcccattcgggaca
+ttgaaaattagcaataagacaatgtatgatattcggcgagtctcaacaacattatggtct
+accatgggacaaggggttgatatgatgaatccacaaaaaatagtcaaacacccatggttc
+gttaagtgagggtatccaggtgttataaggacgatctagaagtattcaggtacacggtgt
+tcagacatgctctaattgtcaggttgtttataatttaacgtatcgctctctattctaaat
+aatataaaattaaccgctcgtagggatgctttccagtaaaagatacactatcattaaggt
+tatgcaaatgtggcgatttgatttgaatcttagtacattcttaaacttaaatacgtatta
+tttaaagtaaatatattatctaaaccgcttttgtctatccacatttcgtcgaatcacgac
+ctcgttaatgcgacaatttacgaccctctttcatctaaagcgatcatctatttcttctga
+ttgatgtaatactgacccttactccgtacatacaaatgatggtaagcaagaatgactgac
+gctcctgtcacctttcgtggcaatcaactggcgctggtactgaagtagcttgaaagggat
+atggatgtgtatgccaggcttcattttgacaatttttctgtcctgctcagtgttgtctga
+agtcgtatcgtacacaataatgatgactctcattgtagatccaatcacgctttcctacgc
+taatgaaagttctagatagtgtaggtgttagacagaggttagcgcctacatccttacaca
+cacagtgttgaacggcaagcataatcgagtatcaatagctgtatgtatttgtttggaata
+tcatatttctcccgcctttgaacaatgatgccaaaatgtcctgccctagagttatgataa
+aataactgctgccctgtaacttaagtttacaaaccgatattcaatcgttgtgtcctatga
+aaatatttatatttgcaccaagaaaatcatctgtgcgatgaacaaaacacagtgatttat
+aaatacaaagagtacatttagttaccggattgcggcttgacatttattttacagaatttt
+atcggcaaaacacttcatatgaactatcgcttcacgataagtctatgatagactagcatt
+cgtagagaacaggaagagcaatcattatatatgaagtgttacagtgggtactacatatga
+gatcattaggtctatatccggccttcctcataagaccttggaaatatcttacatcagaga
+tatcaaaggaagtatgggcgaacccagaaaaagccccaaagaatagtaattcatcggacg
+taatagtctggttttaactaggggttattgatatttaagctaaaagagttccctgaacac
+tcgaaatgtataatctatcccaactaaaaaagtatacctctaattcagaaatgtcattga
+gattagactgatgtcaatacgctaggaggtaagacaagtagaagtttttgatttaggaat
+tgaaatgtaatacctccatcttaagttctatattttaaagttttatgcggacttcgagta
+agtgcacaaatgatggcataagtgcccagttacatgtttgcggccccgtatgagtaatga
+tctgtttatcaatctctagctactatcccacgaatgcactgatgccagtcatggcgctta
+cattagtcgacagaaatccgacgatacctatcacgcgtgaactgttctggttcttattca
+attcgaagtgatctcagatacattacggccatgcttgcccttcatgtctgctgagcagtt
+ttgttataggctgaatctcctctaagcgaaattgataggatttttggtggtcgatttagt
+ctgtacctgcttattaagattcaaaatgacctacttcttacgccgaaatgatagggatcg
+gctgaggaggataaatatacgctggtgcctggtatttatccagaacaagttgcctgtgta
+tcagatgaactctaatctccgagataaaaaacaggtacgtaaaataaaggccgcaaaggg
+ttacatctcaggatcgtggcgtatagtccaccattagttctgacttacttaatatagact
+gaccgagattgtagtatgtggatccaagcttgccatgtaaaacatgtcggttagcaaaac
+gtataggagcatgatcaaagaagagttaattaatagtactgcactataattgtcggcgga
+gtaccatgagctgttgcccaattcgatgtttattaacagcacgcataaaaaatccagact
+tttcaattagaattaactataaatggtccgcgaaccttaaatgatcggaaggacgggatc
+tgccgttgtatagaccccaactctatctaatttttataacacctctgtaatcaacaaatc
+ttattatgccatcattatgtcattcgccaagtaagtccagttcgagattctctggaccgt
+gcaatagtattgtcaaattatggtaatggaatccttcttctaacacccttagaaaagcca
+cgagaattgacaagttgggcgtgcttgtccaggagcaacataagtgccgtttctttttac
+gatgatagggattcttaaagcttttctctattctagatcccagttgccatcatcaatatc
+tcaattgatgctcattatatagttcttatttagtatgtccagatgtcactgaagatcctg
+cctagaaccgatattctcgacaggatcatcagttcgacggggcaaacgcacctatgcaca
+tccatcttgaccgtgaaacgaaaggaaagagtcagtaccgacccaatgtggaaaaaaact
+cctgtccacgatatgtaggcaagttttactgcctttaattagtagtcgattagtgtagtt
+tgatattatctaccttatagaatgtaaacagtaacccggccttaatggtttggcaggatt
+ctttgtaaaagttaataatgttcataaactttatcagaaaacctgaagtagtccgccttt
+cgcctgcgtaacgttgcagattaattcgttttacggagtggcttgcgtcttgttgtccga
+gtacacatattgctcctctcccccactcttctaggaaaatcaattatgctaacctgcaga
+ccttcttctttactatctttaatgcatgcccagtatgttcatagggtagacttgctatct
+attttgtataatctacgaatgatgcttggggcgcgacttttaacaattaagccgttgggt
+ataatttgagagggtgccacgatagtaagagatttccggcgtgagtaaggaaaatgataa
+taggattaagcaggcgtaatagctcaccctcctcagttctccaaccctgaaccggctaag
+tatgactgtgcagtattaattttgaatacatattgcagcccctaggatacattatagatg
+tctctttcttacccaaactcgcccgcaccaagaaagaatgtggattcgattgaggttaaa
+ttagccggaattacagacacagattcttgtttacaattgtgggaagaaaaccacctcaaa
+cgttgaaacctacattcacaaatggattacgttggggatgagaatcgattccggtcaaaa
+atcatgcccggagcaataaccaagaattcacagaggattaatacacttctccatgaagat
+aggactgcttgcactatccttatctttgtgtcttccttcaagcaccaatcgtttggggac
+aaccacaattatgccaagaaataacggaaggtgttccaaatctatgagtccgcggtttca
+tcgcaacgtttcactgtgggtatcatgactttggactttagatttgggtattctagagac
+tgtagaaagactgcaacaacaagacattcacagggcgaaacctaggaaaggggaccgcac
+gttgtgctagggatgtttccttaggaatccatacatgtaagaaagaatcaaccgtaatta
+tagtgttttcggccccttgaattacgtgcatgcctttgctaaaagacctctgggaaatag
+attgaatattctggacagcagcgaatcctgattatatctcaagcgaatatatgacccgca
+agaaggatttatactagaataagtctaagaaagggcattgggtcacttcttccactaaca
+cacttttatcagttttataccttgagagtcccatgcatttttatatatatttaactttcg
+ttgcgtaaaactttaaatatgatccgtgctctatctctaatctgaacaacggtatcacgt
+cgaacaaatctagtggctacgaatcgcgtcgctaagaacggtttcttctgctggcgttag
+ctacgtatcttctatgctaaaaatgtatagccccgcattagcagcaaaaccgggagaatc
+aaatacacatccgatgaaatcgtaacaaagataaaacaacgcgatttctatgtttgccaa
+agtgattaagttgtatcgtaggggtcagcgctgatgtcttttcagtttgggttttggatt
+taccagtcttttagtttcggtactatttgatcgggacattcgtccaaacatgatggctca
+ttcgttctttttttcaattttaatcaaaaccttgtatttacctgatacattaaactgagc
+atcgcatggaggtggagattcccatatatgtaatcatttgatatcctattccattctttt
+tagttataaataaacgctccactgcacaatgggagtaggacttcaccaataattagcatc
+tactgtaaacaagcgccgtaacgaaatgattactgattgagaaaaataggtctcaacaac
+ttttgacagatatgtatccgatacccaagcgttgctaattgcgcaaaagtaagtagaatt
+acggtcgtattacttgttgccaaatggttattactccaatgggctattctaatccgatgg
+atacgtaggagagagtgtacctacaccgaaactcgtagtgggcttagtggctacgtagaa
+gctgttcgggtcagttacagcgtgcgaccttgtaaaatcgatcacggtgatgaattattg
+ttattgtttaaaagaagtcccctgaatagcccttagataatacgaaaatttgttatgtcc
+agtcgctcgtatatcaaaagattcggttaagttcgcagagttttgccaagtttacaggtg
+atttactaacacttgggagggtacgtacaaccatcacctggttagcagagaatgaattat
+acggtcatgtcgcgaagggcaagtgtgtgagtattgaccgagttattaaacgtaaatgca
+ggcatttacgtcataggacatcgagtttgtcctttgcgaaatgttaaatttatggttttt
+tccgttgagtgataatagctgcaacatgaagatagtaaaactgaggttaaactttcacca
+tattaaattatatgttcaattacgcgatgtacaaactaatgttaatcagatttaggagcg
+cgcttaatatgggtccctatcccgactttgtacgagattttgataaaaaatagtattgta
+aattcatttgatggcgtagaaccgggcaaaaccttgaaaaaggacacatttaggatgcta
+tttccctaagaaagcggaaaatcctggctcaatatttataatagtaatggttaagattgt
+ggcccaatcgctgagtacccgtcttacgctttttccaacacataatcgacgagaatgtat
+ttaaatgtttgagacttacgttttccgcgtacttattattaaagtcattggagagggtgt
+cgtctgggtgtagttttctcatctgctcaggagctaaaaatgtaaatctattggttgttt
+ctaattctgtcgtccgtgtaggctatttaatttttatggtacacttgaatatgtttagcc
+ataatgtagccaatactacaatatcagatacttgtatacgacctatagacttttgccgac
+cgctcgtagagtgatttagaaagatgttcggatagcacagcaatcgtttgcgaatgtaag
+catgcgaagcgagtatttaactgttgactattttgctatatgttactctgaatgttgttt
+tttttaccagaatgtgttataatgatcaaccatgcacgttcctactaatcatataaattt
+tgttacgtaagcttttctatgatagtggtctaaagactacccttgcatactttaagatta
+agacatgcactttaggaggaactcacacgttttgagctgttctagcccacctataagcca
+ttcgtccgcaatcccataactacaatagtcggcaatcttttattacccagaactaacgtt
+tttatttcccggtacgtatcacattaatcttaatttaatgcgtgagagtaacgatgaacg
+aaagttatttatgtttaagccgcttcttgagaatacagattactgttagaatgaaggcat
+cataactagaacaccaacgcgcacctcgcacattactctaatagtagctttattcagttt
+aatatagacagtatttgaaccaggcgctaatgttaaggcccccttcgaaaaccttgttat
+gttattccatgtggtcggaggatttgcggggcgatagcgctgggcggggatcaacaattt
+cgttcatgcgagcgcccccataaccagtaggtacagttcggaaaagaaaaccccacgcac
+tcgctagaagtgttacaatcacatcacttcgtaccgaagggactactgtattccgtcttg
+gggatgtaacagactgattacagtcttatgatgaagcctcattcatctaaaattagttga
+tttattccacggatactatcacactcctatagaaagagttaccaccgtgggaagctagat
+ataataaataaaagacatacaatattagtatggctcatgatctacacttactcggatctc
+tctttttttataaccagtagatcgcattacacgtattgttgttccgcatcaggccctagg
+ggctcaaacttccatggtggataactaaaacgtccgtcactaaacgaagatattaataga
+tgaaatacacgggtttacttgatttctgttcagtcattcacgggaaatcctaggagtctt
+tcataacggcggtcttagtaggaatgtagtcaagctctgtagaggtctcgacggaattgg
+tatttcctggcatcacaatttacctagtattggagatcacttaaaataatgttgagataa
+taatcaggatatttctagtatgtgacaaacctctatttagtgattgtgattttcaattaa
+acaagacgtaggggtcaaattaacgactacatgttggaaagaaggccgaattgtaatatc
+taactcatgtactaagaagaagtgctttcgtttaaggctttctgtctaacattctaacgt
+caattcctatgtaatactactgtaaccaagttattactcggctgcgtagataaagtctca
+tgtaaatgacggtttatctgttacttttgggtttcaacctagctaggacgccggtactaa
+ttacgacacctgcgtatagtgcagggtgttcaatgtgcctttttatgtccggattataac
+catccctctcccacttggaatatcaccgggttcttaatgacttagttcgtcttccttatt
+ttccgggtaagatcgctgtggaccggacccattttgatctagtctaaaaaggtatatagc
+gtttcgtctggcccgcttacgttcactgaaacttagattaatcaatgcactgcactggat
+taacaagaacatgttatagtgtactgacacatgttagactaagaggtctgttcgggttag
+ccgacttatatgtttaaccgattttgacaactgggttgagagataacaatgaagagtgag
+gactgtagaagatcttaaaactgtaccatagtgctcaattcgctaatggcttgaattatt
+taattgttctaaccctggcgtcgaatttttttggttcgaaaatacttagcacagcgtatt
+gttcaacgagatgcacaactgtaccgttagaaagcggcttaatgacaaggcagtattgtg
+actattgacagggaatcctaaaaagctactcgaattggtatatggaagaggtatgtactg
+agaggtcgcgcctattagtcaaattctgccaaagaagagtcaaaagcttaactagtttga
+tggtatgaggtttaatgctaggtggtctataccaccaaaaagtatatgggatatcccaga
+atttatcgactttcaatcgtctaccgtcacgacgtacactaggcagccctaatccaaaac
+ttttgaggatgagtactgccactattatactgtaccatttgtaacttacattttatatct
+tcaaagaggtagatattgtcggccattactgtcacttacactaagggtagcttgattact
+gatacctctcatggtaaaaagtaatttaagaacctatttttttacataacctctgctact
+accgttagtgttttagtcggttcaagtcacaaaatccctgtagcgcacccctataagcag
+aaggaaaccttaatgcggataaaaacttttgccggaaccgttaatcctatgagaatacca
+ctcttggaatcggtcctttaggctgaggatatagaacgaggggaacgcatcaatctaggt
+taggtgagagaactttgtatcaaaacgcaagtaccatatgccgtcctcagtaaattgcca
+aatgcagaaatcttacactcttttcttaactaagtatgagagcaacctcactcctgaaca
+gcttgttacctaacgagaagaggctttaagtagcctggagcctcaaccggatatccggat
+ttgactctcatccacttacatgatgattacggtcattacatctcatgattttctgagtgc
+cctatagactgggaatttaatctaccctgtttctatttgttaacaaggagaaccactggt
+caagatgacgcgcttccatttatgccaccataagtaagttctcggaacccttacatgatt
+ggcctaccaacctatatatgtgaccaatgtacggtacatagagtgtggcctatcatattc
+aggtcatcgagctcagtatttaaagattatatggtcgctgggggtattcagtgcgcgatg
+gaagactaacattggaaatcaacggaattgacaacacgctcactttaataacctatctca
+ggataagtttaatgtaattagacggaactttctctaactccgtgtactaactctttgaaa
+ataatgtgggtatttttatttcatctagatttgtctgtatcgaaagaaagtattggtcca
+aataatcctcagtaaaatcaagtcataaatataaaatttagatcttaggacagaggaaag
+tgctttcccgagcataggatctggcctacgccagtagttcatgcttgtgttaaaagttgt
+tactgtttatagtccgtactcagggtagtgttcgatactcagcggggaactgacatatta
+cactaaggaatcaaggcccttcgtatgggtcatgtttatatatttaattacttacgctat
+ttgatcgagaatagctatagtaacgtcgtaagaatgcaggatgcgattcgagtttgtaaa
+ttcacagatactgtgtatcatattattatagatgttaaggcatagaattattggtattga
+tgtacaaaaaattatgggtgggcagtaccgataggcattacgagcagtgcagcttggaag
+aactggatgtatcctataactagtaagagccttaaaggtactacatacccagggatgtta
+ccatcattaatttggccatcttcaatcttcgcaatgcatactttcttctacaagatgcct
+tttagaagacaaaataagtgtcaacaataacgctgtaacttaactctgttgtacgtggaa
+tcaagtctcactaaagcaactaacattccgacatgcaaacgcaggactactagattatta
+aattcgccagcccgcctcgtttaatataacatcataaaaattctaagtaatatctcacac
+actaatccgccatcgtccatagcatcagtcacctgtcttacacaaacacatgtttaatcg
+atgttgttatgccaagctagtttcgcgaccatgtaactaattgtggaaagctgctacctt
+gaacgacatcaaccatcctacctttgtacaacagaccaacatctctgtactggtaaatag
+atctgaaaagttataaatataactgttttcacattgatagaaaaacagctatgtgctatt
+tgtatatactataataaattaagcgaaacatggagattaaaacagtgttttctcatcctc
+cacctcttgttctgctaatttataattcttgatgccactcgtgtgagtcgtccattcgat
+cgtaaagaacccgacataaatagatacgacgctgaacgagatcctatttctcctgaaaat
+tattagcacggtaactcctagggatagtggtactagttggtatgaacgtataaaaacttg
+tactactttctcgggatgtgagggagcaaactattactcgaccagtgcaacgcattatcg
+acagtaaaagttttcagctgatacctgtctggatggattatatgcaggtaggcgagagtg
+gattgtagcgatgctcggcgggggtattttaaaaatctaggtgataaaagtcctgtttag
+ccaggaaaagtcatcattgcactgcatatcgtcgattagctgtcatttcgtccactggta
+ccagttcaacgtacatcaaagtccgggcgcatccatatcaagttttgcaatagtactcca
+gaccatgaaatggttatccagattaataataacttaatatactttcactacatactcagc
+gggtattaaatttcactttatgtcaaaggactcttatgtggtcttcaaaaaggtctagag
+tctatcacgcctaattgtgtgaaaaccgagtaacttgatcagccttgtaaaatatagtag
+aatatgatgttaaatcatttatattccagggagattgaatagcttacgattagctggtat
+aatttaactcacatgattaagcaaatatctgtaggaccgagggaaagaataaaataaagt
+accatgagttcggaacgctgcattacatggcgttgggctagcctgatacaagaagatgag
+tatggagctctcttcatcgggacgtgacaaccctagcgtaatcttggcagatcccggagc
+agatgattatcgtctaacactgtctttaccaatgcacaacgcatagatttaacctgaact
+gttctggattcactcctgactacagcctacaactcatttctatgcataactcttaaagac
+agtcgcaatatcagtacctctatacacatcggatcagactagatcataagataagtctcc
+tctggatccttgtattctgttaagtacactacaaatttgtttagtgtctgggacaattac
+gataagggtcgcgactagaccacagggcatatgacctccaccgctcctagcgagtctcca
+atctgcaagcactcatacgctaggggcatgaatcgactgtcaatgcactgtaagatttac
+gagggtgagacccatttagatatgcctcgtttaaccgttttaggcttgataggatgagtt
+tgtcgatccatcaaattcccgacattcatattgtccaataagtatatctagcttattcgg
+actcgctaaactaaattatggtataaatgccgtcaaccggtgcatttgttcaatcaacaa
+attatagtcaatctcccatggggccttatggcagcgtatacagctggtataacgaccata
+tacaactatgaacggactagctgtgaactaagcagattattggatccttgtgtataattt
+taagtttcgatctatatgctatagtatagaaaatgttccgatcgtacgcttcctttacag
+ttaaacagtctatatcatgaagcttatccaaagctggacatttgatggcaatcttactta
+attatgaaacttaattacctattattgaaagtatttatatgatcgaataagatttgctct
+ataaacaggtcgtccattcacgacctagtgattgcgtaaattgaccaacctaggtaatct
+aaagcctgcatctatttcttatcattcatgttatactgacccgttctcagtacttaaaaa
+tgatcgtaagcaagaatcactcacgctcatgtcacatttagtcgaaataaactgccgatg
+ggaaggaagttccgtcattgcgatatcgatgtctatcccacgcgtcattttcaaattggt
+tatctacggataactgtgcgatgaactactataggtcaaaattatcttcaatctcattct
+agatcatataaagatgtccttcgcgattgatacgtctacagtgtgttggtgttacacaga
+gggtagcgactacttacttactaactctctcttgatccgcaagcataagccaggttaaag
+tgctctatctttttctgtggattataatagttataccgccttgcatctaggtgcccatta
+ggtaatgccctagtgttttcataaatttactcctgccatctaacgttactttaatttccc
+agattcaataggtctctcatttgaaaattgttatatgtcaacaaagaatataatagctga
+gtggaacaatacactgtgagggagtaatacatactctaaattttctttacggtttgcgcc
+tgcacagttttttttatctatgtgatccgcataaaaagtaatttcaacgttccattcaag
+ttaagtcttggtgacactagcattaggagagatcaccaagaccattatttatttagctag
+ggtttaagtcggttagaaatatcagataatgaggtctttatccggccttacgcagtagaa
+attggaaatttcgtaaagcactgagttcaatggaagtatggccgaacccacataatgcac
+aaatcaagtcgatttcttccgtccttttagtctcctgggaactacgggttattcatagtt
+aagctaaatcagttaacggaactagacaaatgtataatagttcccaaatatatatctata
+aatcttatgcagttagggaatgcagatttgaatcatggcaatacgctagctcggaactca
+actacaagtgttggatgtacgaattcaaaggtattacatccttatgatgttcttttttgg
+atacttttatgacgacttccacgaagtgaaattatgttcgaatatctgaacagttacttg
+gttgagcccaaggatgacgaatgttctgtttataattctcgtcataatataaatacaagc
+atatgaggccagtcatggagctttcatttggactaacatttccgtagagtcatatcacgc
+ctgtaatctgatccgtctttttctattcgaagtgttatcagatacatgacgcccttgcgt
+gacattcatggctcctgacatcgggtcttttaggctgaatctaatctaacccaatttgtt
+tggattgtgggtcctccattttgtctgttaatgcttattaagattaaaaatgtactacgt
+atttagacctaatgattgcgatacgctgtggaccattaatataagctgcgccaggggatt
+tttccagatcatctggcctgtgtatatgttcaaatctaatagccgagagaaattactccg
+acggaaaataaaggcagataagcgtttcagagcaccatcgtggcgtttagtcaaccttta
+gttcggaatttattaatatacaatctcactctttggacgagctccttaaaagatgccctt
+gtatatcatgtcccgtacctaaaagtataccagcatcatcaaagaacagttaaggaatac
+gactgctctataattgtccgaggagtaccttctcatctgccaatagtcgttgggttggaa
+aacaacgcattaatatgccacacttgtcaattagaagtttctataaaggggacgagtaac
+tgatttgagacctagcacggcagaggacgttcgtgtgacaacatctctttataagtttga
+gataaaatcgctaatctacaatgattatttgccaatcattatcgaatgcgcaaagtatct
+cctgttcgtgattctagcctaaggccattactatggtcaaattatgctaatcgaagcagt
+cttctaacacccttagaaaagcaaacactattgaatactgccgccgcattcgccagcacc
+aacataactgcacgtgcttttttccatgattggcattatgaaagatttgatctatgattc
+ttaccagttgcaatattcaatttagcatgtgttcctaattattgtgttattatggtctat
+ctcatcatgtaaatgaagatcatgacgtcaacacagattctagtcaggatcatcagttcc
+tcggggaaatcgcacctaggaacagccttatgcaaccgctaaacaaagcaatgaggatgt
+accgacaaaagctcgatttaaaagcctcgaaacgagatgtacgaatcgtttactgccttt
+tatgaggagtcgagtactgttggttcatatttgctacatgattgtatgtaataacgatcc
+cgccctttatcggttcgatcctttatggcgataagttatgaatcgtcagtatctttagat
+caaaaactcaactagtacccagttccccggaggaacggtcatgattaatgcgttttacgg
+tctcccgtccctcttcttgtcagaggaatcagtttcatccgatcccactcgatgattggt
+atagctatttgccgaaaagccacaacgtattcggtactatcttgtttgattcccctgtat
+cttaattcgcgacacttgatatcttttgtgtttaatcgacgaatcatcctgggggcgaca
+cttgttacaattatccagttgcgtttaatggctgtgggtcacaagattgttagacaggtc
+ccgcgtgtcgtaggaaattgataattggagtttgcaggacgaatagctcacccgcctaag
+tgatccaaccctcatcaggataactatcactgggcagtattatttttgatttcatatgcc
+accccctaggagactgtagtcatgtatctttcttacccaatctagcccgaaacaagaaag
+aatgtcgattccagtcaccttttattagaccgatttacacacaaagtgtcttggtttaaa
+ggctggcatgaatacatactcaaaagttgaaaacgacttgctctattcgattaccttcgc
+gatctcaatcgattacgctaaattttaatgcccgctgaaatatccaacatttaaaacagg
+attaattctctgatccatgaacttaggactcattgcacgtgacttatctttctctcttaa
+ttcatgctccaatacggtgggctaaaccacttttatcacatgaatgtacgcaacgtgtta
+ataagctatgagtacgcgggggcagcgaaacgggtcaatctgggtatcttctattgggac
+ggtacatttcggttttatagactatgtagttacacggcatcaacatgtaattaaaacggc
+gtaacctaggaaagccgaacgcaccttgggattgccatgtgtccggaggattacatacat
+ctaagaaacattctaaactatgtatagtcgtttacgacccttgtagtacgtgcatccctt
+ggcgaaaagtactctgggtattagagtgtatattatcgacagcaccgaatcctcatttta
+tagcttgacaatttatgacccgaaagaaccttttataagtctataagtatatctaacgca
+attgcggcactgagtccactaactatctttgagcagtgttatacagtgagacgccatgga
+aggggtttatatattttactgtcgttccctaaaaagttaattatcagacctgcgcgatct
+cgtagatgaacaacgcgatctagtcgaaaaatgcttgtggctaccattccagtcgagatc
+aaccgtttctgcggatcgcgttacattccttgcttatttgcgataaatcgatacaacccc
+attaccagaaaaacccggagaatcaattactctgcagatcttatactaaaaaagagatta
+caacccctgttctatgtgtcccaaagtgagtaacgtggagcgttggggtaagagcggagc
+gattttaactttcgcttttccattttccagtattgtactttacgttatatttgagcggca
+cattcgtcaaaacatgatccatatggactgaggtgtttaaatgttaatcaaataattgta
+ttttcagctgactttaaaatctgcagccattggaggtggagattccaatagatgtaagca
+ggtgatatcatatgcaattcttgtgacttattaagataccagacacggcacaatcgcagt
+agcacgtaaacaataatgacaatcgacggttaaattccgaacgtaagatatgtttacgga
+tgcactaaaataggtagcaacaacgtttctctgagatgtataagttaccaaacactggag
+aattccgctaaactaaggacaatttccgtcgtattaattgttgacaaatggttagtaata
+cattcgcagtggataatccgttgcatacctagcactgagtgtaaataaaaccaatcgact
+actggcatttcgggctaacgactagatgttagcctatgtgaaagcctcacacatgcttat
+tgccttcacggtgagcaatgtttcttattcgttattagaagtcacctgtagagacagtag
+agatgacctaaatttggtttgtccagtcccgaggtgatctaatgattaggttaacttaga
+acagtggtcaattggttaaagctgatttacgaacacttccgaggggtcgtaaaacattaa
+actggtgagaacagtatgatgtattcggtcatctagacaaccccatcgctgggagtttgg
+acagtgttatgattcgtaaatccaccatgtgtccgaattcgaaatcctgttgctccgggg
+agatagggttaatttaggcttttttacggtgtggcatattagctcaaacatcaacattct
+taaaatcagcgtaaacggtcaccagttgatatttgttctgctaggaagcgatgtacaaaa
+taagcttaataagatttaggtccgaccttaatttcggtccatagcacctctttctaagtg
+ttttgcttaaataattgtattgttattgattttctgcgagttgaacacggaaaataagtc
+aaaaaggacacttttaggttcatatgtaccgatgaatgcgcaatagaatcgagaaatttt
+tagattagtaatcgtgatgattgtggccaaatcccgcactaaacggctttcgctgtttcc
+aaaaaattttagtccactaggtatttaaatgttggacactgaacgtggaagccgtcgtat
+tatgaaactaatggcagaggggctcctctgcgtgtactttgagcagatgctatcgtcaga
+aaaaggtaaatcttttggttctttataattctggcgtccgtgtagcctagtgaatgtgtt
+tggttcaagtgaatttgtttagccagaatggaccaattacgtcattagctgttacgtcta
+tacgaaatatagactgtggacgacccatcgtagagtcatgtagttacatgtgaccttaga
+acaccaatcgtgtgcgattgtaagcaggacaacacagtattgtactggtcaattggttca
+tagatctgactatgaatcttcgtttttgtacaacaatctcggtgaagcttcaaaaagcct
+ccttcctaataatcagttaatttttcgtaaggttcctgttcgaggttagtcgtataaaga
+cgaaacggccttaatgtaacattaactattccactgtaggtggatctaacaaggttggac
+atgtgctaccaataagataagaatttcgtccgcaatacaatatctacttttgtagcctat
+cttggattaacaacaacttacgttggtatttcaccggacgtatcaaatgattctgatttt
+aatgactgagagtaaacatcaacgaatcttatgtatctttaagccgctgcttgacaagtc
+acattactgttagaatgaacgcttcattactacaaaacctaccaccaactcccacattaa
+tattatactagatgtttgaagtttatttgacaaaggttttcaaaaagcacagaatcgtta
+cgaacacgtacattaaattgttagggtattaattgtggtcggtgcatttccggccccata
+gcgctccgcggggagaaactatggccttcatgacagcccccccataacatctaggtaatg
+gtcggataactataaacaaccctctccagagaactgtgaaaataaaatctcttagtacac
+aagcgtatactggtttaagtcttgcccatcttaaagactcttttcactattttcttgatg
+cctcattcttctaatattaggtgattttttaatccgagaatataaaaagacgatagaaag
+tgttaaaacacggcgtagcgacatattttaaagaaatgaaatactttttgactatccctc
+atgatctaaacttacgcggagctatctttttgtataacatgtacagagaattaatccgat
+gcttcttccgattaaggacatagcgccgaaaacgtcatggcggcttatcgatatcgtaac
+gcactataccaagtgattaagtgatcaatgaatacgggtttcgggatttctgttaagtca
+tgcacggcaaatacttggagtcttgaataacgccgcgcgtagtacgaaggttctcaagct
+cgcgtgacgtatagaccgtattgctatttcctgccttctcaattgtccgaggattgctga
+taacttaaaataaggttgagtttttaataacgatttgtcgagtttgggaaaatcctcgtt
+tgtgtgtttgtcattttcaagttatcaagaactacgggtataatttacgacgtaatgttg
+gtttgatgcccgattgcgaatatcgtacgaatggtatttgtacaactgctttcctttatc
+gattgctcgagaacattataaagtctattactatggattaagactgtatacaagtgttta
+agcggagcccgtgataatctataaggttttggtacctttatctgttacttttgccttgaa
+acatacatacgtacacgggaatatttacctaaacgccgtatagtccagcctcgtatttgg
+gccgtgttttgtcagcattttaaactgaaagcgcccacttgcattataacccggtgcgga
+atctcttagtgactcgtcaggagtttacgcctttgagacctctcgacaggacccattttg
+atctagtcgttataggtagagtgcctttcctatcgcaccattaccttctagcaaacttag
+agtattcaatgaaatcatatcctgtttatactaaatgttataggctaatgacacagctga
+cactaagaggtctcttcgggttacccgaatgagttgtttatacgatgttgacaactcggg
+ggagtcatttcaatgaagactgaggactcttgatcagattaaaacgcttaatgactgata
+atttagattatgccgtgtattatttaagtgggcgaaccctcccctagaatgggtttcctg
+agaaaagtcttagaacacagtattctgaatccagatgcaaatcgctaacgttagtaagcg
+gctgtagctcttggcagtttggtcaatagtcaatcgcaatccgtttaaccgtctactatt
+cctagagcgaagagctatgttctgacacgtccccaatattaggcaaaggctccaaaagaa
+cagtcaattgattaactacgggcttggtttctccgtgaatccttgcgccgctataccaca
+taaaaggatagcggtgataccacaagtttgcgacgttaaagcgtcgaccctcaacaagta
+cactagcaaccccttagcaattaattttgtccatcactactgccaagagttgactggacc
+agttggaaatgacatttgatatattaatagagctacatattgtaccactttactgtcact
+tacactaaccctagcgtgattactcatacatatattcgtaaattctaagttatgatacta
+gttttgtaaatttaatcggcgaagacacgttctcttgtacgagcttcaactaaatatttc
+actgtagccaaccactttaaccagaaggataccttaatgccgatataatattgtccagga
+aacgttaatactttcacaagacaaagcttggaagaggtactttacgatcacctgatagat
+cgaccggaacgattctatataggtttggtctgagaaatttgtagctaaaaccatgttcca
+taggaactcctctgtaatgggcaaaatgcagatagcgttcaatcgttgcttaactatcta
+tcacagcatcctaactcctcaacagcttctttcctaaagacatcagcaggtaagttgacg
+gcacccgataacccagagcacgattggaatctaatactctgtatggatcattacgctaag
+taaatataatgattttctgactcaaagttacactgcgaattttatattaactggttctat
+ttgttaaataccacaacctctcgtcaacaggtcgcgatgcaagtgatccaaaaatatcta
+acttataccaaccattacttctggcgcagaaaaacatagatatctgaacaatcgaccgtt
+aagactgtctcgccgatcttaggaacctaatactgctcagtagttattgtttatttgggc
+catccccggattatgtcagccatggaacactaaaagtcctaatctaacctatggacaaaa
+agctcacttttataaaattgctcaccttatgttgattgttatttgtccgaaatgtctata
+actcagtgtactatctattggaaaattatggccggagttttattgaatatacttttgtat
+gttgagaaagaatgttgtcgtaataattatcagctggaaaatcatctaatatatattata
+ttgagatattacgacagacctaagtgctttcccgtcatgagcagatggactaacactctt
+ggtaatccttctcgttttagttggtaatgtttagtctaagtaatatcccgactcttactt
+actcagagcggaaatgactttttaaactaacgtttaaaggcacttagtatgcgtcagggt
+tatttttttaattacgtacccttgtgcagagagtttagctattcgatcctacttagtatg
+aaccatgagagtacaggttggtaattcacagagaaggtcgagaagattatttttgatgtt
+taccaatactatgaggcgtattcatcgaaataattttatggctgcgcacttcacatacgc
+aggaagaccactgcagcttgctagatctggatgtatcattgtacttctaagagcctgaaa
+ggtaatacattcccagcgagcgtaacagattgtatggggacatattcaatcttagcaatg
+cattcgttcttcgaaatcaggcatttttgatgtcataagttctgtcaactataaccctgg
+aactttaatctgttgttcgtcgaatcaaggatcaagaaagcttctaaaaggcccaaagca
+aaacccaccactacttcagttttaaattagaatcacaccctagggtattagataataatt
+aaatgtcttaggaagagatatcaaaagatgcagacatcctcaagtgaataagtctccggt
+ctttcacaaacacatggttaagcgatgtggttttgactagagacgttcgccaccatcgta
+atatttctggttacctgcgaacgtgaaccaaatcttacttcatacattgcttaaacagta
+caacttatctcttatcctatagagatctcaaaagtttgtatttttactggtttcaaattg
+agagaaaaactgcgttctccgatttctatattattgtttaaatgatgccaaacatccagt
+ttaaaacacggtgtgatcagccgactcagattcgtatcctatgttagaatgagtcatcaa
+actacggtcacgcgtacattacagagtaaactacacgaatgaaagagataagaagatgaa
+agagttaataggtctcctgttaattatgagaaccctaactactacggattggcctactag
+tgggttggaacggatataaaattcgactaagttcgcggcatgtcaggctcctaaatatga
+agagaactcggcatcgaattatccacagtaatagttggaacatgattcctctatgcatgg
+tgtatatccacgtacgccagtgtgcagtgtagccatgcgaccacgggcgttgtgaatatt
+cttcctcagaaaaggactgttgagcaaggaattggattctgtgaacggaatatagtcgag
+tagatggaatttcctacactgcgaaaaggtcatagtaaatcaaacgccgcgcgcagacat
+atcttcttggcaattagtactccactaaatcaattggttataaacttttagaatatcttt
+atataagttcactacttacgctgcgggtagtatatttaaagtgatgtcttaggaatctta
+tggcggcggaataaacggcttgactatagataccctaattctggcataaccctgtaacgt
+gtgaagcatgctttaatagacgactagatcagcttatagaatggatatgactgccacatt
+gaagagattaacattagcgggtataatgttacgaacttgtttaacaaaatagctctacca
+cacacgcatagtataatataaaggtcctggagttcgctacgagcctggaattgcagttcc
+cctaccctgagtaaacaagatcagtatggacctatcttctgacccacgtgtaaaaactac
+cgttagcggccctgagaacggtgaagttgattatcggctaacactcgctttaccaaggaa
+caaacaattgatggaacaggtaagcggctggattctatcctgaatacagcataataatat
+ttgctttcaatatatagttatgacactcccaatatcactaactctttacaaatcggatat
+gaagagtgaattagagatggagccgatcgttccttgtattctggtaagtactcgactaat
+gtgtgtagtctaggggtaaaggtccttaaccgtcgagtctagaactcacgcattatgaaa
+tcctccgagcatagagactctaaattcgccaagcaataagtcccgacgcgaaggatgaga
+agctcattgaactgtaacatttacgtcgggctcaccatgttacatatgcagcgggtaaaa
+gtttttgcctggagtggttgagtttcgcgatacataaaaggccccactttcatatggtca
+aatatctatatcgtgctttggacgactcgataaactaaagtagcctagtaatgccctaaa
+ccgctgcatttgtgcaataaaaaatttagagtatatataacttccggacgtatggctgcc
+ttgaatcctcggatatcgtccttatacaacgatgaacggtatagctcggaactatgcaga
+ttaggcgatccttgggttgaatttttagtttccatagatatgagttagttttgatatggt
+taccatacgtccctgcattgaaacttaatctgtatattgattgatccttagcaatagcgg
+cacatttctgggcaatatgacttaattaggttacggtttttactatgatggatacgtttt
+atatgatagaataacagttgctatttaaacaggtactacattcaactaatactgtttcac
+tattgtgtccaacatagggaatatattgcctgaatagatgtattatcaggcatcttttac
+gctccaggtagaactaattaaaaatgatccttagaaactttcaagcaacataagctaaaa
+gttacgccaattataagccacatcggtaggatcttcaggcattcccatatccttctctat
+caatcccgtctgttgctaattggttatctaagcatatcgcggcgagcatctacgataggt
+ataaagttgctgctatctaattcgtcataatatatacatggaattacagattcatacgtc
+ttcagtctcgtggtgtttctaagagcggacccaagaattacgtaatatctctctcgtgtt
+acccaagaagttgacacgtgattgtcagctatctttttctggcgatgttaatagttataa
+acaattgcatatagctgcaaattagctaatcaaatactcgtttcttaaatgttatcagca
+aagctttaggttctgtaatttcactgtgtaaagagggcgctaagttcaaaattggttttt
+ggcaacaaacaatttaatagcgcagtgcaaaaataatatctcagggtgtaattatttctc
+taattggtctttacggttggaccaggcaatgggttttttatctatgtgataccaattaaa
+agtaatttcaaagtgacattaaacttaagtattgctgtcaagaccattacgacacttcac
+caacacatttatgtattgtgctacgcggtatggcccgtagtaatttctgatattgaccgc
+gttatcagcaagtacgctgtacaaatgccaaatttagtaaagctctgtgtgcattccaag
+gtgcccacatcacacattatcaacatatcatgtcgttgtattacgtccttttactagcct
+gggaaataccggtgattcagagtgaacataaatctctgaaagctactagacaaagctagt
+atagttaaaatatatatttcttttaatattaggatctttgcgattgcacatttcaagcat
+cgcattaacctacctccgtactcttctacaacggttgcatgtacgatttctatgcgatga
+aatacttatgttcttagtttggggttactttgttcacctagtcctcgaacgcaaattagc
+ttcgaatatctgaaaagtgtatgcgggcaccaaaacgatctcgattcttaggtttataat
+tatagtcagaagataaatacatgcatatctggacactcttccacatgtcatgtcgactaa
+ctttgaactacagtcatatatagactgttatctgatccgtatgtgtctattactactctt
+atctgagaaaggacccaatggagtcacagtaagcgatcatgtcatcggggctttttccct
+gattataagattacactattgctgtgcttggggcctcctactttttctatcttaatcatt
+ttgtacattaaaaagctaagaagtaggtacaacttatctttcccatacgagctggaccat
+taatttaacagccgcaaggcgagttttaatgttaatctggaagggctttatgttctaagc
+ttttagcactgagaaattaatccgtaggaaattaatcccacataacccggtaagagaacc
+ttacgccccgttactaataatgttctgcgcaatgtaggaagtgacaagctcactcttgcg
+acgagctccttaatacaggccctgcgttatattcgaccgtacctataactagaccaccat
+cttaaatgtacagttatggttttcgacgcatagagtatgggaccacctcgaaatgctcag
+ctgcaaattgtactgggggtggttatcaaacatttaatatgaatctatggtaaagtacta
+gtttatagatagccgaacactaaaggtttgcagaccttcctcccctgaggaacttcgtgt
+cacaaattagattgagaaggtggtgataaaatcgcgtatctacaatgatttggtgcaaat
+atttatcgattgcccaatcgttctactcgtactctttatagcctaacgccttttcttggc
+gctaattagcctaatccaagaaggagtctaacaaaattacttaaccatactcttgtctat
+tcggcccacgcatgcgcaagctcaaaaagttctcaacgggcgtttttacttgagtcccag
+gaggtaacattggatctatgagtcttaacagtggaaatatgatttttagattgtgttcag
+atttattgtcttattttggtctatctcatcagctatagctacataatgacgtcttaactg
+tttcgactaaccttcagatctgactaccccaaatacaacatagcaaaagaatgatgctaa
+cgcttaactatcctttcacgatcttaacaaaaaagctccatttaaaagaatcgaaaacag
+atctaccattcgtggaatcaatttttggacgagtactggtcgggtcgtgcttatttgcta
+caggattgtttcgtataacgttcaagcactttagcggttccatccttgatggcgttaact
+gatgatgcgtaagtttatggtgatctaaaactctactacgaaccaggtcccagcacgaaa
+cgtcatctttaatgagtttttaggtctccaggcactaggctgcgaagtggaatatgtgtc
+atcagagacaaatagatgattcctatagctttttgcagttaagccactaagtaggcggtt
+ctatagggtttcattcaaatcgatcgtaattcccgactctgcatagcgtgggtcttgtat
+agaccattcttcaggcccgccacaatggtttcaagtttcaacttccgtttattggctgtc
+cctcaatagagtcgttctcagggcacgactctcgttcgttattcataagtccagtttgat
+ccacgaatacagaacacgcatatctgataataaaagcttaacgataactttcacgcgcat
+ggtttatttttgatttattaggcaaccaaataccagaatgtagtcagcgatatgtagtaa
+aatttagacaaacataaaacaaagtatcgccattacagtctcctgttaggagaacctttt
+tatcaatatgtgtaggcgtgtattggcgcccttgatttaataataattacggctaaacgt
+attgatattttccaggaactgccccatctcatgagatgaccctaaattttattcacacct
+catttttaattcttttatatcacgattatttatctgagcaagcatctttgcaagcattca
+tagtgacggtgctgtctctatgaatgcatgctaatatacggtgcgctaaacatattggtt
+caattcaatgtaagctacctcggaatttgcttgcactaagacggggaagccaaaacggta
+aatcgccgtatatgctagtgccaagggacttgtccgttggagtcactatggagttacaag
+cattataaatctaaggaaatcgcagtatcagtccttaccccaaagatacttcgcattccc
+tggggtacggaccatgaaatacttctttcatacatgataaacgatggagactcggttacc
+accctggtagttactccatcaattggagttaactaagatcgctattacaggctttattag
+ccaatcatcacaagcctctttttagagattcacaagttagcaaaccaaagttcctttgat
+aagtctttaacgagatctatcccaattccggctaggagtaaaatttatatatttgagatc
+ggggttaaagtcacacgcaatgcaaggggtttttatatggtaatgtccttccctaattag
+gtaattttcagacctccgagagagagtagatcaacaacgcgttatactcctaaaatgctt
+gtcgataacatgacactacagatcatccctggatgagcatcgactttcattacttgatta
+gttcagttaattcgtttcaaaccattttcaacaaaatcccccagtagatatgtatatgca
+catcttagactaaataacagttttcataccctgggatttgtgtcactatctcaggaacgt
+cgagacgtcccctatcaccgcagcgagggtaactggccctgttccattgtaatcgatggg
+acgggacgttatattgcagacccaaagtagtaataaattcagccatatggacggaggggg
+ggaattgttaagaatataattcgattttcagctgaatgtaaaagctccagccattcctcc
+tccacttgacattagttcgaagaaggtctgagaattggaattgcttgtgacgttttttgt
+ttccagacaaggaaatagcccagtaccaagtataatattatgacaatagaagcttaaatt
+cacaacgtaacatatctgttagcatgctctaatagaccgagaaaataagtgtctatgtgt
+gcgagaactgtcaattcacggcagtagtcacctaatctaacgtctagttcccgactatga
+agtcttcacaaatggttagtaataatttcccagtggagtagaagtggcataacgtgcact
+ctctgttaataatacctttagactactcccatttcgccagaacgtcttgatggtacccta
+tgggaaacactcacacatgcttattgcctgcaacctcagcaatgtgtcgtatgcggtatt
+tctacgaacagctagtgaaaggactgatgacctaattttggtttctcaagtccagacgtg
+atattttgatgaccgtatctgacatctctgggcaattcggttaacctctggtacgaaata
+gtccgtcgcgtaggtaaaaatgataatgctgtcatcactatcatgttttagctaagctac
+actaccccatcgctcgcacgtggcaaagtgtgaggattccgatatcatccatgtgtacga
+attcctaatactcttgctcagggcacttagggttattgtagcctgtgttaccgtctcgca
+tattagatcattaatcaacagtcttataatcaccgtaatcggtaaacagttgttatttgt
+tctgataggtagacagctaataaagatgctgttgaacagttacgtcccacctttattgcc
+ctacagtgaaactagttcttactctgttgctgtaatatgtctagggttattgatttgctg
+ccacttcaaaacggaaattaagtcattaacgaaaatggttccttcataggtaaagatcaa
+tccccaattgaagccagaaattttgagatgtcgattcctgatcattcgccaaatttacag
+ctcgtaaacgagttccatgtgtaaaaaaatgttgagtccactagcttgtttattctggct
+caaggtacgtggaacacgtagtattttgatactaatgccagacccgctacgatccctgta
+ctgtgagcagagccgatcctcagaaatagctaaatcttgtgcttcgttagaagtctcgac
+tacgtgtagcctagtgtttgtgttgcgttatagtctatttgtggacacagtatggtcaaa
+tgacgtcttttgatctgacggcgttaacaaagatactctgggcaacacacatacttctct
+catgttgtttcttcggacctttcataacctttcctggcacatggttagctgcacatcaca
+ggattgtaagggtctagtggttcagtgagcggaatatcattcgtcggtggtgttaatcta
+tctcggtgtagcttataaatgcatccgtaagaatattatgtttatttgtcggtacgttca
+tggtagtggtgtcgccgatttagacgtaaaggcatgtatggatcttgatctatgcaaagg
+taggtccatctatatacgttgcacagcggatacaaataagataagaatttactaacattt
+aaattttcttattgtcgagcatagattggaggaaaaacttatttacttggtatttaaacg
+gaagtttctaatgtttatgattggatgcacggacagtttactgcttactttcttaggttt
+cttgaacaacaggatgcactagtaacatgtctcgttcatgcttccattaagttcttctta
+aacttacacaaactacctaatttagagttgacgagatggttgaacgtgttgtgacaaacg
+tttgcaaaatgcacagtatcgttaccaaaaagtacatttaagtgtgtgcgtaggaattct
+gctacgtccattgcaggccacattcacatcccacccctgaatatatggactgaatcacac
+acaccaaatttcatctaccttatcgtagcataactattaacaaacatatacagacttcgc
+ggtaaataaaatatattagtacacaaccgtatactggttgaactattgcccagctttaag
+acgcttttaactaggtgcttgatcaagaagtattattatatgacggcagtgtgtaatacc
+tgaatagatatagacgttagattgtctgaaaacacgccgtagagacatttttgttagata
+tgtatttctttttgacgagccagcatcttagtatctgaagacgagctatatgtttgtaga
+aaatcgactgacattgtatacgaggcggcgtaagattaaccaaattccccagaattagta
+atggcgccttatcgatttactaacgatatataacttgtgatgttgtctgcaatgtatacc
+cgtgtaggctgtgctcttatcgaaggaaacgcattgaagtccaggctggatgaaaccacc
+gcgtacttccatgcgtctatacatagcgtcaccgatactacgttttgctatgtaatccat
+tctaatgggtaagaggattcctcttatagtaaaatatgcttgactttttaagaaccattg
+ggagtggttggcaaaataatagtgggtgtctttctcagtgtatagttttctacaactacc
+cctattaggttacaagtaatctggctttcttgccacttggcgatgatagttagattcgta
+tttctacaacgcagttactgtatccatggcgcgagataattagatacgatttgaatttgg
+atgtagactcgttactactgttgtagaccagcacgtgagtatctagatgggtttgctacc
+ttgttagcggacttttgccgggaaaaagacatacgtacaaccgtatattttactataagc
+agtattggccaccctcgtattgcggcagggtgtgctcacctggttaaaatgaaagagaaa
+aattccattttaaaacccggaggaatctattactgacgaggaaggtgtttaacccgttga
+gacatctcctaacgtaaaaggttcatattctagttattccgagagtcactttcctatcca
+aacatgaactgatagcataatgacaggttgaatggaaagcatatcctgtttattctaaat
+ctgtttcgctaatcaatatgctgtcacgaactcggagcttacccttacaactatgtgttc
+tgtttaccaggtgctaatatcccggcactcttttcatgcatgtcgctcctagcgtcatct
+gatttaatagcttaatgtctcatattttacagtagccagtgtagtatggaaggcggcgaa
+ccagcccctacattgggtttcctgacataagtattacatatcacttgtctgattacacag
+caaaatcgctaaccttactttgcgcatgtagctattggaactttgggctagtgtctatcc
+cattaagtttaacagtagactagtccgtgagcgatcaccgagcttatgtctcgtacccaa
+gttttggatttggatcaaaaactactcgatattcatgatctacgggcttcctttctccgg
+gtatcattgcgccgagattaaaaataaaacgatagcgctgtgaaaacatgtttgacacgg
+gatagcgtagaaactaaacaacgaatagaccatccaatttgaattttattgggtccagca
+cttcgccatagtgttgaatggtaaagttcgaaaggaaatttgttatattaattctgctac
+attttcgaccacttgtatctcaaggacaatatcccttgaggcttttagcagaaagagatg
+ccgtaattctaagggatgataataggttgggaaatttaagagcagtagtaacggtcgcgg
+gttcgaccttaaactatatatttaaatctagccaaacaagttaacaacaaccataaagtt
+atgaccttattatattggcaagcttaacgttttaattgctctagtaatagagtggtagag
+gtaagggaccatcacctgattcttcctccgcaaccattatatagacgtgtcgtctgacaa
+atttcgagataaaacattcgtccttagcaacgaatatcgaatggcaattagccacattga
+gttaaatagttgaggatatttcttgcacagaatcagatctaatctaatgattcgttacta
+aacacttcaccaggtatcgtgaaggctcaagattacccagagaacctttgcaatataaga
+atatgtatgcagcattaccctaagtaattatattctttttctgactcaaagtgacaagcc
+ctagtgtatattaaatcggtatatttgggaaattcctcaaactatcctaatcaggtagcc
+atgaaagtgatcaaaaaagttcgtacttataccatacatgaattctggccaagtaaaaaa
+tagattgcgcaaaattcgtaccttaagtctctcgccaagatattaggatcctattactca
+tatcgtgtttttctttattgccgccatccccggagtatctcacccatccttctcttaaag
+gcctaatattacctatgcaaataaacatatattgttgaaaattgagaacctgatcgtgat
+tcttatgtgtaccatatgtatagtaatcacgcgactatatagtgctttagtatcgcccgt
+gggtgagtgaatattctgggctagcgtgagatagtttcttgtcctaatatttttcagatc
+gaatagcttctatttttgtgtttattgacatatgtcgaaactccttactcagtgaaagtc
+atgaccagatccacgaacaatcttcggaatcagtctcgttttacggcggaatcttgagtc
+taacttatatcccgtcgcttactttctaacaccccttatgtatttttaaaattacgttta
+ttcgaacgtacttggcggaagcgttattttttgaagtaagttacattgggcagactcttg
+acattttcgatacgactttctttcatccatcacaggactcgttcgtattgatatcagaag
+ctcgtgatgattagttgtcttctttaccaatactttgaggcctattctgcgaaatttttg
+ttgccctgcgaacttcacataccaaggaacacctcgcaacatgccttcatatccatcgtt
+cattgtaattcttacacaatgaatcctaagtaattacatccctgcgtaaaagatggtagg
+ggcactgaggatatattaccaagcatttagttatgagtaatcagcaatgtttcttgtatt
+aagttctctaaaatagttacatcgtaatgttatctcgggttccgcgaataaacgagatag
+attcattatatatggccctaagcaaaaacctcctcgtattctgttggtaattagaatcac
+acaatacgggttgagatattaattatttgtagtacgaagagatataaaaagatgaacaat
+tactcaagtcaagatgtatacgggatttataataaaaatcgggtagagatctgctttgca
+attcagacgtgccactaaatcgtaatatgtcgcgttacatcagaaagggtaactattatt
+aattaataaagggcttaatcactacatattagatcttatccgatagtcttatctattcgt
+tgtatttttaagcggttctaattcagtcattatatcagtgctccgagttctttattattg
+ttttaaggatgacaaaatgcctcttgttataacgctgggagaagcagactaagagtcgga
+gcagttggtagaatgaggctgcaaaagacggtctcgacgaatggacagactttactaaac
+caatgaaagacagaagtagagcaaagtctgaagtggtatcagcttaattatgacaaccct
+taatacttccctttcgccgaatactggcgtggaaaggttttaaaagtcgaagtagttaga
+ggcatctctcgctcataaataggtagactactcgcaatccaatgtgactatgtaatactg
+ggaacatcagtccgcgatgcagcgtgtttatcaaccgtccccactcgcctggggagacat
+gagaccacccccgtggggattattagtccgcagtaatcgactcttgacaatccttttcga
+ttatgtcatagcaatttacgacagttcagcgaagtgactactcggcgaaatggtattact
+aaagcattcgaacccacatgaatgtgattcttggcaatttctaatccactaaagcttttc
+cgttgaatctggttgtagatatttatataagttcactaattaagatcacggtagtatatt
+gatagtgatgtctttgcaagaggttggccgaggaatttacggattctctattgatacaat
+ttgtctggcttataactcttaaggctgaaccaggcgtttttagacgacttgatcagctgt
+tagaatggtttggactccctctttcatgtcagtaacatttcagccgttattgttacgata
+tgcttgaacaatattgatctaccacacacccatagtatattttataggtcatgctgttac
+ctacgagcatggtattccacttcccattcaatgagtattcaacatcactagcctcagaga
+tgatgacccacctctaataacgtcacgttgcggccatgtgaaacctgaacttgagtagac
+gatatcaagcgctttaaattgcatataacatttgagggtaaagctaagcggatgctttat
+ataatcaatactcaataataagatttgattgcattttagagttatgacacgacatagttc
+actaacgagttactattcccagatctagactgaagtactgatcgagacgatccttacgtc
+gatgatcgttagttatcgacttaggtcgggtctctagcggtattggtacttaaccggaca
+ctatactaataacccatgatcaaagcataacagaatacagacgataatttcgccaacata
+tatgtacagaccccaagcatgagaagctcattgaaagctatcattgaagtcccgctcaca
+atgtgtcttttccagacggtttaactggttcccgggagtcctggagtttcgacttacata
+aatggaaacaatgtattttgctaatttatctatagcgtcatttggaccaatacagaatat
+tatgttgcctagtaatccactataacccgcaagtgctgatagaaaatttttagacgattt
+ataaatgccccaagtatccctcccgtgaatcctccgttatactaattagtattcgttcat
+acgtataccgcgcatatatgaacatttggcgataaggcgcgtgaattgttacgtgacaga
+gatagcagtttcttgtgatatggttaacagacgtacatgaagggaaactttatatctata
+gtgatgcttccgtagaaataccgccactggtctgccaatgatgaagtatgtagctttagg
+tttgtactatgaggctttcgtttgtttgcagagtataacagttgcgagtgaaaaaccgac
+gaatttatactaatacgctttcactattggctacaaaatagggaagagtttcaatcatga
+gagggagtatatggatgctttgtagctaaaggtagaacgtatgtatatgctgccgttcat
+tcttgaaagatacataagcgataagttacgacaattataagcaacatccctaccttcgta
+acgatttcactgttactgcgcttgaaatacactatggggctattggcggagagaagcaga
+tcgcgccgagcatatacgagacctataatgttgatgatagagaaggcgtctgaattgata
+catcgaagtacactttctttcgtagtatctctcgtcctctttctatctccggacacaaga
+attaagttatatatatagagtcttaccaatcatgttgaatcctgattctcagagttcttt
+ggcgggccttgtgatgactgagaaacaatgcaatattgctccaaatttcctaagcaaatt
+ctcggttatgttatgttatcagcaaagcgttacgttatgttatttaaatctggaatgacg
+gagcgaagttcttatgtcggtgtgggaataattcttttgaagacagcactccttaaataa
+tatcgctccgtgtttgtatttatcgaatgggtctgtaaccttgcacaagcaaatcggtgg
+tgtatatatcggataacaattaatacgatgttcatagtgacagtatactgatcgagtcct
+ctaaagtcaattacctcacttaacaatctcattgatgttgtgtcattcccggtatcgccc
+gtagtatgtgctctgattgaccgagtgtgaaccaaggaacatctactaatgcctttgtta
+ggtaagatctctctgaattccttcgtgccaacttaaaacattatcaaaatttcttctact
+tggattaactacttttacgagcatggcaaattcccctgtggaagacggttcattattatc
+ggaaaccttatagaaattgcgtgttgactgaaattagatttttattgtaagagttgcatc
+tttgcgattcctctggtctagcttccaatgaacagtcctcccttctattcgacatcgggt
+ccttcgtacatgtctttgcgatgtaataattaggttcggagtgtggccttaatgggtgca
+actaggaatacaacgcaaatttgctgacatgatagcaaatcggtatgccggcaccaaaac
+gtgctccttgcttagcttgtgaatgagactcagtagttaaataaatccatatctgcaatc
+gattccacaggtattgtccactatctttgaactactctaagagatacaagcttagctgag
+accgaggtgtatatgactacgctgatatctgtaaggtaccaatgcaggcaaagtatgcga
+gaagctaataccggctgtttccagctttataagattaaaatttggctgtcctggcggcct
+cagaattgttctatcgtaatcagttggttcattaattagctaagtacgaggtacaactta
+tctgtcccagaacagctccacaagtttttttacagccgaaacccctgtgtgaatcttaat
+atccaagcgcgttatctgattagagtttacaactcagtattttatcagtacgttttgttt
+ccaacattacccggtatgacaaaatgacgccacgtgtcgaataatggtctgaccaatgta
+ggaagtgaaaagataaatattgcctacacatactgaattcaggcaatgcgttttattcga
+aaggtcatataactagaaaacatgatgaattcttatcggatccttttactagcatagtgt
+tggcgaacacctcgtaatgctcagcggcaaattggactgcgggtccttatcatacatttt
+ttttcaatataggcgattggtctaggttagtgattccccaacacttaaggtttgctgaca
+ttcataccctcagcaacttcctctcaaaaattagagtgagttggtggtcttataagaccg
+ttgattatttgaggtggtcaaatgatggtgcgatgcacaaatcgttataatcgtactctg
+tagacaataacccattgtagtgccgattttgtgcataatacaagaaggaggatataaaaa
+tgacttttcaataatattggctattagcaacaagaaggagaatcctcattaagttagcaa
+ccgcagggggtactgcagtccaaggaggtttcattggagagagcagtatgaaaacggcaa
+ttatgattgtgagattcgctgaagattgtgtctctgattttcctagatagaataagctat
+agctacttaatcaactcttaactgtggagactatcctgatgatctgaataccccatttac
+aaaattccatatcaatgaggctaacgcttaaatttcatttctccatcgtaacaaaaatca
+gcctttttatacaagacaaaacactgcttccattacgggtagcaatggttgctcgactac
+tggtagcgtcgtgatgtggtgataaagctgtcttgcgtttatacttaaacaaattttgac
+ctgacataatggagcgacttatcggatgttgccgatctttagggtcatctattaagctta
+tacgaaaaagggacaagcacgttacgtaatctggtaggactgggtacctagaaacgcaag
+aggaggcgaactccaatatctgtaagaacagaaaaatacaggagtccttttcatttttca
+agttaacaatataagtaggagcttagagaggcttgcatgaaaatcgttaggaattacaga
+ataggcagagagtggggcgtgtagactacattcttcaggccccacaatatgggttatagg
+ttaaactgcactttttgcgatctcccgaaatactgtcgttctctgcgaaccacgctcgtt
+ccttttgctgtagtccacgttcatccaactattcagataaacaagatcgcagaattaaag
+cttaaccatatcttgatagcccatcgtgtatggggcatgtatgtgcaaacaaaagacctc
+aatcttgtctgcgagagggaggaaaatttagacaaacataattcattctttcgactggac
+acgctaaggtttggacaaactttgtatctatatctggaggcctgtattccagcccttctt
+ttaataagatttacggcttaaactatggatatttgccaggaaatgacactgctattgaca
+ggaacataattttgattcaaacctcattgttaattattttatatctcctgtttttatatc
+agaatgcttctgtcctagaaggcatactcaaggtgagggctcgaggaatgaatcataata
+gaccggcccctattaatattggttcaattctttcttacataacgcggaatttgattgcac
+gaacaccgggaacacataaccgtatagcgcccgttatgctagtgcctagcgactgggacc
+gtggagtctatatcgtctttctaccattattaatctaaggatataccactttaagtcctt
+tcaactaacataaggcgcattccatgcgctaaggaccttgaatttattatttcttacatg
+ataaaagatcgagtcgacgggaacaaaaggctacgtactcaataaagtgcagtttactaa
+gagccctttttctggcttgtggagactatcataacatgaagatgttttgacattcaatag
+tttgcaaaacaaacttactttgtgtagtattgaacgagatctttccaattgccccatagc
+aggaatagttatatattgcagatcgcggtgtaacgcactccaaatccatcgcggtgtgtg
+agggtaagcgacttaaagaattacggtttttgatcaaagcacagtgagagttgagcaaat
+tacagttatacgacttaattcagtctccataaattgaaacgacacttcttaacgggagga
+ccagacacgttcattaagtgaggagtgcactttttgactttaaaaacatggtaatcaatt
+taaaccacttgatatgtatatgaacagatttgaagttatttctgttttaatacactggga
+gttctgtcaatatcgcaggaaccgcctgacgtcccctatcacacctcagagggtaaaggg
+acaggggaaagggtaatcgaggggtagggaacgtagttggcacacccaatggacgaataa
+atgctgccatatccacggagggcgggattgcggttgattttaaggcgatggtaacctgaa
+tgtaatagatcatcaaatgcctcctccactggaaattactgcgtacatccgctgagaatt
+gcaatggagtgtctcggtttttctttaaacaaaaccaaattgacaacttcatagtataat
+ttttgcacattacaagcgttaattaacaaacttactttgctgttagctgcctatatttgt
+ccgacaatataactggatatctctgcgagaactgtaaattaacggcacttggaacataat
+agttcctattggtaacgacgttgtaggcggcaattatccggtggaagaattgacaactgc
+agttgaactgcatgaaagtcaaatctctcgtaagtataactttagaagactccaaggtac
+ccagaacctcttcagcggacacgatcgctatcaatcaataaggattattcactgaaaccg
+ctcatatctggaggtggacgtttttcttcgaaaagcttgtcaaaggactcatcaaatttt
+tggccgtgctaatcgacacacctgttattttcatgaccggataggacatctcgcggaaat
+tcgggtaacagctgggtagatataggacctcccctacgtattaatgataagcctgtcata
+actagcttggtttaccgaagagacaataaacattcgagcgctcgtgccaaactcggtgca
+ttacgtttgaataaatcggtaacatgtactattactctgcctaacggcacttacccgttt
+gggtccatggggtaaccgctcgatgttgacagaattatgctaaagtcgtttaagatcccg
+attaccgaaaatctggttatgtctgagcattcgtacactgcgtattaagatcaggttgaa
+caggttcctaacaaattttgtgacctaaagtgaaactaggtcgtactctgggcatgtttt
+atgtcgtggcgtatgcatgtgctgacacttctaaaaccaaattaaggctttatccaatat
+gggtccttaagtgctaaacatcattcacaatttcaagacagattgttggtcttgtcgatt
+ccgcatctgtcgccaaattgacacatcgtaaaccaggtacatcggtaattatatgttgac
+taaactaccgtgtgtattctggctctaggtacggcgaacaagtacgatgtgcttaagaag
+ccctcaccccagacgagcccgcgtaggtcacatcagcagatcctaagtaattccgtttta
+ttgtcctgagggagtaggatcgacgaactctacaagtcgctttgtcgtgccttataggct
+atttcgggtcaatgtagcgtcaaatgaactattgtcatctgtacgagttaactaagtgtc
+tatcgccaactaaaagacgtctcgatggttctttatgcggacctgtcatatcattgactg
+gcacttgcttacatccaaataacacgtttgttagcggatagtcgttaagtgtgcgcaaga
+tcatgaggcggggggggtaatatttcgccctctacatgataaatgaataagtaagaagat
+gatctttttgtggcggtaccttaagcgtactcctgtcgacgagttactactaaaggaatg
+tagggttctggatctatgaaaagcgacctccatatatatacgggcctaagcggagtaaaa
+taagtgatcaatggactaacattgaaatgttagtattgtcgaccattgagggctggtaaa
+tcttatttacgggcgtgggaaaacgaacgtgatatggtttagcatgggatgcaagcactc
+gttaatgcttactttagttggttgcgggaacaacaggaggctatactaactggtagcgtt
+cttgcttccattatgttattattataattaaaaataagacatatggtagagttgtagtca
+gggtggatcgggttgtctataacgttggaataatcaaaactatcgttaacaaaaacgaaa
+tttaagtcggtgcggtggaatgcgcctacctcatgtgcaccacacattcacagcacaccc
+ctcattataggcaaggaagcaaacaaaaaaaagttaatcgaccgtatccgaccttaaatt
+ttaaaataaatagaaacacttagcggtaatgaaaagataggactaaaattcactagtatc
+ctggaacgaggcaacagagttatctagatggtaacgaggtgctgcatcaagatgtatgat
+ttttggtccgctgtgtggaatacctctattgatatacaagtgactttctcggtaataacg
+cacttcacaatgtgttgtttcttttctatgtattttgcaagagaaagaagcttagtatag
+gtacacctcagagatgtttcgtgtaaatcgtatcacatggtataactgcaggaggaacat
+tatccaaattcaccacaattactaatccacccttttacttttactaaagatatattaatt
+ctcatgttgtctgaattgtataacccggtaccctgggagcgtatcgaaggataccaattg
+aagtcctcgaggcatgttacaacacacgacttccttccgtctattcagacactcaacgag
+actaacttttcctaggtaatcaatgatattgggtaactcgtggcatcttatagttattga
+tccggctcttttgtagatcctgtgcgactcgtgcgctaattaagactggctctcttgcgc
+aggggatacgtttattctacgtacccgatttggttactactaagcggcctttcttcaaac
+ttgcagttgtgacttacattcctatttcttcaaagcagggaagggttacagggagagact
+tattgagatacgattggaatttccatgtacaatcgttaatacgcttgtagaccagcaact
+cagtatagagatccgtttcctaaagggtgagcggtaggggcaaggcaataagaaattact
+aaaaccctagttgttaatataagaacgattcgaaacaataggattgcccaagggggtgcg
+aacatggtgtaaatcaaagagaaataggcattgttaaaacccgcacgtttctagtacgca
+agaggaacgtcggtaaccagttctcaaagatcctaacctaaaaggggcttattctacttt
+ttccgacactcaatggacgagacaaacatgaacggatagctttaggtctcgttgaatgca
+aagaatagaatcgttattattaatcggtttccattatctatatgcggtatagatctccga
+gaggaccctgtaaactagctctgcggtttaactggtgctaatagaccgccactatgttat
+tgcttctagctcctagcgtcttatcatgttatacattaatgtcgcatattggacagtagc
+caggcttggatggatcgccgacaaaaagaaaagactttccctgtaaggacttaactatta
+catataacttggatcattaatctgcaaattagagtaacggtctttcaccagcttcatatt
+ccaacgtggcgctagtcgatatcccatgaagtttaaaactagaattggcagtctcacttc
+acagtgcgtatctatacgacaaaagtggtcgatttgcataaatatcttatcgatattcag
+gttattaccgattccttgctaacgctagaagtcacaccagagtaataataattccagaca
+cctgtgaaataatcggtcactacggatagactagtaacgataatacgtatagtccataaa
+agttgaattttaggggctaaagatattagcaatactggtctagcctaatcgtcgatagca
+aagggctgtgaggatttctcctacattttcgaccaattgtatcgataggaatagttacag
+tcacgcttgtagatgtaagagatgacgttattcttagggttcttaagtcggggggtaatt
+taagaccactagtaaaggtagaggcgtacacagtaaacgatattttgaaatcgtcaaaaa
+aaagtttacaacatcctttaagttagcaactgattttagtggcaaccttaacggttgaat
+tgatctactaatacaggcctacaccgaagggtacagataatgattcttactaccctaaca
+tgatagagtcctgtcctatctcataggtcgacattttaaattcgtaatgagcaacgaaga
+tcgtttcccaatttgcaacattcacttatagacttcaggttatttcgtgctaacattaag
+atagaatataatcagtcgttaagaaactattatccagctttcgtcaaccataaagattaa
+aaactgaaacttggcaagatatgaatagctatcctgctttaaccgatcgtatgagatgct
+ttgtagcaagaaaagtgactagcacttgtgtttagtaaagcgggagagtgcggtaattaa
+tattaatatactattaagctacacagcaaaggctgcaataatgttagtaagtagaacata
+aaggtattctccacaagtaataaatagtgtgagctaattgactaacttaactctcgcgac
+aagtgatgtggataagatgactcatatcgtctttttctgtagtgccgacatcccacctgg
+atcgaacaattccttctagttatcgactttgattacctatcctattaaacagatagggtt
+gtaaagtcagaaaatgatcggcttgcgttggtctaccatagctagagttagaacgcgtag
+atagaggccttttgttgccaacgtgggggtgggatgagtctgggcgagcgtgactttctt
+tcgtgtccgaatttgtttaacatccattagattagatgtttgtgttttgggtctgatgtc
+ctaactactttctcagtgaaactaatgtcatcatccaagtaaaatagtccgatgaagtct
+ccgttttcggccgaagcttgtctataacgtatataaagtcgctgaatttagaacacacct
+tatctatgttgtaaagttactttattccaaaggacgtgcacgaagcgtgagtgtgggaag
+gaacttaaagtcggatcactcttgtcagtgtagataagaatttctttcatacttcactgg
+aatccggcgtatggatatctctaccgcgtcatctggtggtgtctgcggtaaaaagtcttg
+ctgcacgagtctgagaaatttttggtgccatcacatcgtaactgtacaacgaacaaatag
+catcaggccttcttatccagcgtgaagtctaattatttcacaagctttcctaagtatgta
+aatccctcacttaatgatgcttgcgccaatgaggatagaggacattgcatgtacgtagga
+ctattctccaaggggtcttctattttgttagcgaaaattgttacagcctaatgttagagc
+ggcgtacgactttataccagatactttcattagatatgcaaatatccaattaaatcatag
+tagtatcgtggtatggacaatcaaaaaagacccgttgtgatatgatgtttttctagttcg
+ttctcatatatatagatcaacaatgaataatctcatgatctataaccgatgtatatttat
+attccggttgactgctccggtgcaattcactacggacactaatgactaatatggcgcctt
+tcatcagaaacgctaaatatgattaatgaattaagggagtattatctaattattagagag
+tagcagttagtctgatattttcggtgtatgtgttagccgttataatgctgtctttttatc
+agtgagaacagggagtgtgtagtgttgtatgcttcactttatgactctggttatatccct
+cggagaacaagaataagagtacgagaagttcggtcattgaggatgaaatagaaccgctag
+acgaatggactcacgtttataaaactatgtatcacagtactacagctaactctgaagtcc
+gagaagcttttgtaggacaaaacgttataagtacctttcgcagaatacggccgtgcatac
+ctgttataaggcgtagtagggacaccatgctatccctcatatagagctacactaatacca
+ttacatggtgactatcgtttacggccatcatctgtaagcgatcatgcctcgttagcatcc
+gtacaatctcgcatggcgtcactgcagaaaaaccccgtgcggattttgagtcagaactat
+tcgaagcttctcaatccttttccattatggcatagcaagtgacgactcgtcagccatggg
+aataatagcactaatccgattacttatgaattagaacccacatgaatgtgattctgcgaa
+ttgtctaagaatctaatgattttccggtgaatatggttgttgttatttattgaacttata
+ttattaacatcacccttcgttagtgatagtcagctatttccaagaggttccccgagcatt
+tttaccattctctagtcatacaagttggagcgcttttaaatctttaggctgatcaaggcg
+ttttgtctagaattctgcagatgttagattcgtgtgcaatccctcttgcatgtcagtaac
+aggtcacccgtttttcgttacatatgctggtaaaatattcatagtaataactacaatact
+tgatttgttacgtaatgctcgtacataacacaatcgtattccacggaacagtaaagctct
+attattctgatcgagcctaagagaggatcacactacgctattaaagtcacgttcacgaaa
+tctcaaacctcaactgctggtgaccagttatagacagtgtaattccatattacatgtcag
+gcttaagctaacccgagcctttatataagctataatcaagaattagattggagtgcattt
+tagacttatctatcgaaatagtgatagtaagagtttatatgacctgatctagactgatgt
+tctcttccacaacagccttaaggcgtggagcctttcttatactattaggtcgcgtcgaga
+gccctattcgtaatgttaacgacactagactaatatacaatgagctaagaataacacaag
+tcacaagataatttacaaatcatatatctacagtccacaaccatcactagcgattgcaaa
+gcgttattggtactaccgctctaaatcggtatgtgcaagacgcgttaactggttcaagcc
+tctcctgctcgtgagactgaaagaaatcgaaaatatggatgtgcctaattgttcttgtga
+gtcatgtgcaactatacagtttagtttggtcaagactatgcaactattaacagcatgtgc
+gcattgaatatttggtgtcgattgataaatgccccaacgttccatcacgtctataagccg
+tgttactaatgtgtattagtgcatacctattcagaccatagttcaactgttggactgaag
+gcccgtcttggggttcgtgaatgagagtgcagtttcttgtcttttccttaactgacctaa
+atgaaggcaatcggtttatctagagtcatgcttaaggtgaatttcagccaatgggctccc
+attgagctagtatggtgctttacctttgtaagtggtggctttccttggtgtgctgacttt
+aacacggcagagtgattatccgaagaatggataataagacgctggcaatattggctaata
+aagtccgatgagtttcaatcatgactgcgaggagatccatgcggtgtacctaaacctaca
+tcgtatgtatttgctgacgttcattcttgatacataaagatccgatatcggtccactttg
+tttaccaaaagccctaccttcgtaacgatggaaatgtgaatgagagtgaaatacacgatg
+gggatattgccggtgagtacaagttagaccacacattagaactgacctatattcgtcatc
+atagagatggagtatgaattgattctgcgaagtacactggctttacgagtatctagacgc
+cgcggtatatctcccgtcaatactatgaaggtatatatatagaggctgaaaattcatgtt
+caatcctctttctaagagtgagtgggagccccttctgttgtcggagtaaaaaggcattat
+tcctcaaattgtcagaagcaaagtatacgtgatgtttgcttagaacaaaagagttacctt
+agggtaggtaaatctcgattcaccgagagaagtgattttggcggtgtgcgattaattctt
+ttgatgacagatctcattattttatatagctccctctttgtatttagagtttgcgtaggt
+aacctggcaaaaccatatcccggggggagagtgcgctgaacattttatacgatgtgatta
+ctcaaaggataaggttcgaggcctctatactcatggaactatcttataattataatggat
+cgtggctcattccacctatccaaacttctttgtgatctgatgctacgagtgtgaacaaac
+gtacatcttctaaggaatttgggacgtttcatagctcgcatttcattcctgaaaacttaa
+atatttttaaaaattgattctactgcgaggaactaaggtgtagacaagcccttagtaacc
+ggtggatgtcgcttcagttttatagcaaacattattcaatttcagtcttgactgaaatta
+gtttgttagtgttagaggtccatatgtcacatgcatatggtctagatgccattgtacagt
+aataccttagattagtattagcggcatgcgtacttggatttcacttgtaagaatgagctt
+aggacggtcgcctgtagggctgcaaataggaatacttacaatttttgatgacttgttagc
+atatcgctatcacccataaaaaacctgatacttgatgagcgggtgattgagactatgtac
+tgatataattcaatagctccaatagatgaaacagctatgcgcctatttatgtcaaataat
+cgatgtgatacaagcttagagctgaacgagcgcgagtggaattagcggtgatctctatcc
+taaaaagccacgaaatcgatcccagaagctaatacccgaggtgtcaagcttgagttcagt
+taaatttgcatctcatgccccacgaagaatgggtagagagtttgaaggtgcttctggatt
+ttcctaagtacgtggtaaaaatttgatgtaaatgaacacctcctaatggttgtgttaacc
+acaaacccctgggtgaatctgattagccaacccagtgatctgatttcagttgtcaaatct
+cttttttataactaccttttgtttccataatttaaccggatctcataatgaacaaacggg
+tagaataatggtagcacatagcgagcttgtctattcagaaatatggcctactcagaatgt
+attctccaaatcagtgttatgcgaaacgtaattttacgtgtaataatgatgatttcttat
+cggttccttgtactacaatactcttgcccaacaaatactaagcataacagcaaaattcga
+atccccctccttttaataaatggtttttcaatatagccgattcgtattcgttagtctttc
+accaactattaacctggcatctaattaataaaatcaccaaaggactctataatatgacag
+tcacttcggcctcttttaagacagttgattattgcaggtccgcaattgatggtgacatgc
+acaattagttagaatccgactatggagacaattaacaattgtagtgcccatttggtccag
+ttgacttcaaccacgagttataaaggtattttaatttatagtcgatagtaccaacaacaa
+gcacaatcataattatgttagaaaacccagggggtaatgctctaaatccagctttaaggc
+cagagtgcactatgaaatcgccattgatcattgtgtcattcgctgaacttggtgtctagg
+aggtgccgagtgagaatatcagataccttatgaagcaacgattatatctggactagatca
+tgatgatcggaataaaacattgaaataagtccttatcaaggagcataaacattttattta
+atttatacttcgtaaataaattcagaattttttttcaagacattaatctgagtaaatgac
+ggctagaaagggttcctactcgaatcgtagcctacgcatgtgggcagtaacctggcttgc
+gtttttactgaaacaaaggttcaccggaaagaaggctgccacttttagcttcttgacgat
+ctttagcgtcatatttttagattagtcgaaaaacggaaaacaaacttaacgaagctggtt
+gcacggggtaccgagaaaccaaagagcaggacaactccttgatcgggaagaactgaaata
+gacagctgtcattttcattggtcaacttatcaatataacgaccaccgtagtgacgcttgc
+atgaaaatactgaggatgtaaactatagccagtcaggcccgcgtgttgactaattgatga
+agcaaacaaaatagccggtattcgttaaaaggaacgggttgccagctacagatatactct
+aggtatatcccaaacaagagacgtcctttggctgttgtaatcggtcataatacttgtcac
+ataaacaagatcgctgaattaaacattaaacagttagtgatacacaatcgtggttggggc
+tgggatgtgcaataaaaagtcatctatcgtctatcacagagcgacgtaaatttagacaaa
+cattattatttcttgacaatggaatcgataagcgttcctctaacttggtatatatatctc
+gaccccgggattccagccattcttgtatgaagatttaaccatttaactatgcatagttga
+atggtaaggaaaatgatattgactgcaacagattttggatgcaaaaatatttgtgaatta
+ttggttatatactggttgtatagcacaatcattaggtcctagaaggcatactcaacctca
+gcgagagagctagcatgcataattgtaccgcccatattaatattcctgaaatgatttctt
+acattacgcccaatttcagtcatcgaacacccccatcaatttacccgatagagaacgtga
+tcatacgcaataccctatgcgaacgtccactctatagcgtctgtatacaatgattattcg
+ttccatttacaacgttaagtaatttaaacttacataaggacaaggaaatccgcgaacctc
+ctggaatgtatgagttatttatgcagttaacttcgtctcgaccggaactaaaggcgtcgt
+acgaatgaaaggccacttttagaagagacctttgtatccattgtggagaatatcataaat
+tcaagatggggtgtcatgctattcggtcctaaacattcttaatggctgttctattgttag
+tctgatttaaaatggaaccatagcacgaatagttagatagggctcatacccctgtaacga
+tctacaaatccttccccgggtgtgtgcgttagcgacggaaagttttacggtttgtgatca
+aagaacactcacacgtcagattattacactgatacgaattatttcagtcgacagtaattg
+aatagaaacttattaacgccagcacctgacacggtaagtaaggcaggtctgaactgtttg
+actgtaaaaaaatggtaatatttttaaaaatcttgatttctatatcaaatgatgtgtagt
+tttttctctgttattaaaatcccagtgcgcgaaatttagatcgttacgactcacgtacaa
+gatcacacatcacacgcgttagcgaaagcggaatggctaatacagccctacgcaacgtag
+tgggatcaacatatggacgaatttatgctcaatgagccaacctcccccgcattgcggttc
+attttaaggcctgggtaacatctatcgtttagataatcaaaggaatccgactatgcaatt
+gtctgacttcatccgctctcaagtccaatgcaggcgctacgtgtttctttaatcaatacc
+atattgaaatcgtaatacgataattgttgctattgactacaggttatgaaaaaacttact
+ttgcgggtacatgcatatttttgtaccacattattacgcgatatctctcagtgtactcta
+aattaaaccctcttcgaacattttagttcctattcgtaaacacgtgctacgcggcaattt
+gccggtcgtagaatggacaactccagttcaactgcatgtaactcatagctcgcgttagta
+taaattgactagtagccatgggacaaagtaactagtcagcggaaaagatccctttaaaga
+tatatgcaggttgcaagcataaagctcattgctcgaggtgcaccgtggtattccaaaagc
+gtctctatcgtatcttctaattttgggccgtgagaatcgaaactactctgatttgctgca
+cacgttaggtaatatcgcccattttcccgtataagctccgtacttatacgaactacacga
+ccttttaagcattagccgctcatatcgtgattcgtgtacagatgagtctattaaaattac
+agacatactccatatctcgctccttgaactttgaataatgcgctaacttgtactatgaat
+aggcagaacccaactttcccgtttgcgtcaagcggggaaacgatacatgttgtcagattt
+atgattatctagttttagatcacgtttaccgataatcggctgtggtctgagcagtcctac
+actgagtatttacttcagcttcatatcggtccgaaaaaaggttgtgaccgaatgtcaaaa
+tacggagtacgatgggcatcttttttcgagtcgcggttgcagggcagcaaaaggcttaaa
+ccatttttacgatttttactatagcggtcatgaagtgcgaaactgcttgcaaattttcta
+cacacattgtggctcttgtccttgaagcttatggcgaaaatttgaaacatagtataccag
+ggaaagcgcgaattatttggtgactaatagtccgtgggtttgagccatatacctaacgcc
+ataaactacgtggtgctttagatgcaatctaaacagaacagaaagcgtagcgctcatcag
+cacagactaactttttcagtttgagtcgccggagggacttcgagacaagaacgcgtcaag
+tcgcttgcgcggcacggattcgattgggcggctcaatcttgcctaatttctactattgtc
+agctgtacgactgtactaagtgtatagccccaaataaaagaagtatcgatgcgtctttat
+gaccaaaggtcttataattgaagcgcacttccgttcatcaaattaaatcctggcttaccc
+gattctccggaagtctgacctagagattgacgacggccgcgtattattgagacctcttca
+ggattaatcaataacgaagtagttgatctgtttggcgacgtaccttaagccgactccgct
+acacgagtttctactaaaccaatgtagccttatgcttagatgaataccgtcctaattaga
+tattccggcataacagcagtaaattatctgttcaatggacgaacattgaattgttagtat
+tctacacaagtcaggcctcgtaaatattaggtaaggccgtgggataacctacgtgatatg
+cttgagcttgcgttgcaagctctcgttaatcattaatttaggtgcgtgagggttaaacac
+cagcatattctatatgctagacgtcttccttaaaggatcgtagtattataattaataata
+agaaatatggttgacgtctagtcagcgggcatacgctgctctatatactggcattattca
+aaacttgacggtaaaaaaacgaattttaaggcgctcacgtcgaatgagccgaactcatgg
+gaaccaaaatgtcacagaaaacacctctttattgccaagcatgcaataaaaaaaatgtta
+atagtacgtttacgacattttattttataataaagagaaactattacacctattgatatg
+ataggacgtaaattaacgagtagcctgcatagaggcaaatgaggtttctacatggtatag
+acctgatgctgaaacatcgatgagttttggtcccctcgctcgttgaaatctagtcattta
+ctactgtctttcgagctattataccacttcactatgtggtgtttctttgctatgtatggg
+gctagtcaaacatgatgactatagctacaactcagagagcgggcgtgttaagagtatctc
+atgctagaactgcacgacgaacttgatacaaagtaacaacatttacgattccacaaggtg
+actttgaagaaacatagtttaattctctgcttcgatcatttctataaaccggtaccatcg
+cagcggatagatgcataacatttctactactccaggcatcttaaaacacacgtagtactt
+cactagattaagacacgataagtgtataacttggcagtgggaagcaaggagattggcgaa
+ctcctggcatctgttacgttttgttcaggctcggttgttgataatgtccgactcctgcca
+tattgaagactcgctcgagggagatcgggattcgttgattataagtacacgtgttccgta
+atactatgaggcagtgattcaaaatggcacttctgacttacatgactaggtattattacc
+acggaagcgttaaaggcacactcttatggacttaagattgcaagtgccttcttctagcct
+gaattcgcgggttcaacacaaactctctttagacatccgttgcctaaaggctgagacgta
+ggggcaaccctttaactatgtactaaaaaactagttggtaatttaacaacgtgtccaatc
+aagacgatgcaccaacgcggtgcgaaaatcgggttaagcaaacacaaataggaattgtga
+taaaccccaccttgagaggtcgcaagaccaacctcgggaacaacggctctaagagaataa
+cctaaatccggatgagtagactgtgtaactctctaaagggaagtgaaaaaaagctaagca
+tacatttaggtctcctgcattgcattcaattgaatcgtttgtattatgagctgtacagta
+gctatatcagctatagttatcccagaggaacaggtaaactagctctgagcgtgaaatccg
+gatattagaacccctagatgggattgattctagctaatacaggcttatctggttttacag
+ttatctagatgattggtaaggtgaaacgcttggtgccttccaccacttaaacaaaagtat
+tgcccgggaagctattttctaggtattataaagtcgagcattaatatcaatttgacagta
+aaggtctttcaccagcttcatatgccatagggcccatactcgatttaaattgaacggttt
+aacgagtattggaactctcacttataactgagtagctatacgaaaaatctggtccatttc
+cagaaatttattatcgatttgctgcttagtacccaggaagtgataacccttgaaggcaca
+acactgtaataagttttcctgtcacatctgtaatattcggtcactacgcattcacgacta
+aagataattactatactaattaaaagttcaatgttagggccgaatcatagtagaaattct
+cgtctagcctaatcggacttacctatgggctgtgaggatttatcagtatgtggacaaaaa
+tgctagagataggtatagttaaagtcaccatggtacatctatgtgaggaagtttgtagtt
+cgcttctttagtccgggcgtttgggatgacaactactatacgtagagccgtactcaggat
+tagatagtgtgaaagagtcaaataaaagggttaatattaatttaacgttgcaaatgtgtt
+taggccaaacattaaccgttgtagggatattctaatacaggccttcaccgaaccctaatg
+ataatctgtcttaataacattaaatgattgtctccgctacgagctcttagggcctcattt
+taaatgactaatgtccaaagaagagactttcccaatttcaatctgtcacgtatagacggc
+accttagtgagtcatatcattaagatagaagattatcaggagggaagtttctattatcaa
+ccgttacgcaaccataaacttttaaatctcataatggcattgagatcaagagctttcatg
+atggtaaagttcgtatgtgatgctggggagctagatatcggtataccacttcggttgtgg
+taagcccgagtgggccgttagtaatattaatagacgattatccgacaatgcattcgctga
+aataatcttacttaggagaaattaatgctatgagccaaaactatttatgtctgtcacatt
+attgactaaagtatctatcgacaaaactgatgtccataagttgtagcagatagtcggtgt
+atggtgtcaccaatgaaaacctcgagcgaaaaatgaattatagttatccaatttgagtaa
+attgcctattatacagataggcttgtttagtcagataaggttccgcttgaggtgctctaa
+cttagcgagagttagaaagcctagtgagaggcattttggtgccaaactccggctcgcatg
+agtaggccagagagtcactttctttcgtcgaagaagttggtgaacagccttttgattagt
+tgtttgtcttgtggctatgtgctactatataagttagaacgcaaactaatctaatcagca
+aagtaaaataggaccttgaacgagacggggtacgccgttgaggctcgagatagtagataa
+actagaggaatgtagataaaacattagctagggggtttagttactggattacataggaag
+tgcaccatcacggtgtgggggttcgtacgtaaagtcgcatcaatattgtcagtggactta
+acaagttcgtgcataatgaaatcctatacggactttgcatatctctaccgactcatctgg
+tcgtctatgcgggtaattgtattgctccaagtggatgactattttggcgtcccagcacat
+agtaaatgtaaatccttataatagcataagcaattattagactgcgtgaagtcttagtag
+ttctcaagctttacgttgtatgtaaataactcacgtaatcagccgtccccaaatcaccat
+tgaggtcattgaatgtacggagcactattatcaatgcggtatgcgattttctgagcgatt
+attgttaaagacttagcgttgagccccggaacacttgattacagattctttaaggagtta
+tccaaatatcattttaaataatagtagtatcgtgctttggacaataaaaaaagacccgtt
+ctcttatgttgttttgcgacgtacttctctgatatatacttcaactatgaagattctatt
+catcgataacccaggtatatttatatgcccgttcactgcgcagggcaaattatctacgga
+caataatgacgtagttggacccggtaagaactaacgcttaatatgattaaggatgtatgc
+cagtattatcttattatgtcagagtagaagtttctctgagattttccgtcgttgtggtac
+accggatttggctctctttttagaactgagaactcggagtgtgtagtcttgtttccttca
+atttatcaatatgcttttataccgccctcatcaactataacaggacgacaagttccgtct
+tgctccatcatatactaccgatacaccaatcgtatcaagtttagtatacttgctttctct
+cttctacagcttactcgcttgtccgagaagcggttggtgctcataaagttagtagtaaat
+gtacaactagtagccagtccttacctgtttttacgactactacggacaccatgagataca
+gaagttagtgctacaattataccattacatgctcaatatcgttgtcggccataagatcga
+agagtgcatcacgcgtgtgaatacgtaaaatctaccatcccgtcaatgcacaaaaacaca
+ctccccttgttgactaacatcttttacaagaggctaaatcattgtccaggatcgaatacc
+ttgtgtacaatcgtcacccatcggaagaataccacttttccgatgtagtatgatttacaa
+aaaacatctatgtgagtaggccaattgtagtagaatatattcatttgaccgtcattagcc
+ttcttcttaggttgtgtacggatagtaggtacataaaccgtcgtgtggcatacgctgcga
+tttcatacagctgccaacaccttttttaccaggctagagtcagaaaagttggagccatgt
+taaatagttaccatcataaaccactgttgtctactagtctgatcagctttcatgcctgtg
+caagcaatatggattctcacgtaatggtaacaactgttgcgttacttaggctggttaatt
+tgtcagagtaataaatacatgtcttgttgtgtttcctaatcctcggaaagtacacaagcc
+taggaataggaaaagtaaagctcttttattctgatagtgactaactcaggatctaaatac
+gcgattatactaaccttcaccaaagctcaaaaatcatctgctggtgaccagttatagaca
+gggtaattcaatatttaatgtctcccttaacatttcaccagcatggattgaagatagtat
+aaagttttacatggcagtcattgtgtcacggttctatacaaattctgatagttagacggt
+atttgaaatgtgcttctagcatggtatcttacacaactgaatgaacgactggagccgttc
+gtatactatttgcgagcctcgagaccccgtttcctaatgttaacgaatatagtataatat
+aaattgtgatatgaataacacaagtaactacagtttggacaattaattgttctaaactaa
+aaatcattcacttcagatggcatagagttatggctactacacatataaagcggtatgtga
+aacacccgttttagccggaaaccctctactgctcgggacaatgaatgatttccaaaatat
+ggatgtgcagaattgttagtgtgactcaggtccaaatagacactttagtttcgtcaagtc
+gttgcaaagtttaaaaccatcgcagcattctttatttggtctacattgagaaatgaaaaa
+acgtgacagaaagtctagaagaactgtgaataatgtctattactgattaactagtaagac
+attagtgcatctggtccactgaagcacccgcttggcgttaggcaatctctgtgaactgtc
+gtggctgttccggtaatgtacgaaagcaagcctataggttgatcgagtcgcttcattaag
+gtcaatttcacaatatccgatcacattgtgctaggttcgtcctttaccttgcttagtgct
+gcatgtacggggtgtcatgacttgttatcggcagactctttatcccaagaatggataata
+tgtacatggaaagtgtccataattaagtcccttcactgtaaagaatgactgccacgtgat
+ccatgaggtctacagaaaccgacttacttgctttttgatcaacttaattatggattcata
+aagttcagatatcggtacaattggtgtacaatatgaaattaatgaggaaacatggaaatc
+tgaatgacagtgatagaaaagatccccatttgcccggtcagttcatgttacaccactcat
+tagtactgtaagtgtttcgtcagcattgagatccacgatcatgtgtttatgccttcgaaa
+ctggatgtacgacgatcgagacgaagaggtatatataacctaaatactaggtacgttgtt
 agagagacgatgaaaattaatcgtcaatacgctggcgaacactgagggggacccaatgct
 cttctcggtctaaaaaggaatgtgtcagaaattggtcagttcaaaagtagaccggatctt
 tgcggagaacaattcacggaacgtagcgttgggaaatatcctttctaccacacatcggat
@@ -1668,4 +16332,340 @@ ggaagcgctttgtaccttacttcccttttcgttgcgtaatatgaatttcatatagtaagt
 tcaaggcactcatacctccgtgaagagggtagatagactattaaagttgtttaatagtac
 gtattgatggaaatgacccgtaggagatttaccactcaatccacaagattcgctgctgtg
 cattatcaaaacagtgcatgtcgaaacatgggttgggtccttcaaacacgaatccaggta
-gagatacctttgcaattttt
+gagatacctttgcaatttttcgatgaaggcgaccgagataaatgagctataacactgtat
+gtcttttgattgctataaaacacagaaacggatattaatttaggccgtaaccaacatctg
+ttatttgacatagaacagatggtcctttacagcgtattccggccttaatattgaggtcca
+gtgtattgtcctcctttaaagaagttgattgtaactgacttaaataagacatgtcaccca
+ttcactgggttgcaactgctggccctttttgtccatcgcacgctaatgtgataacagtac
+cgccctcacacctgcgtttaaaagacataaatgtcgctatgaaggttattcattaatttt
+agctgttttcttagaaaaggtaaatttaaaattgaaaaggctagaaaactaaagttacga
+caaatgtgtttgtcaagtaggcgggcatcattgagattgtaagaaataaagccataacca
+gccccggaatagaaaatgttaaggaaaggcgatcttctttgaattcttattgtcaagtgc
+agtcatacgttcttatcagaggacattgcaataaaatctaacaccctcccttgtgtggtt
+gggccatttgtacttcgaagcgtccaccatgtgcagaggataacggaatgtggttccgtc
+ccataaacgatcattctcgcccacttagtggcgcggtaaatcgctctcatagaggtaact
+ggcctgtaatgtccaatgttaggctaccttctccaactttagtacaacgaataatgtccg
+attaacaaggagtcaatttgtcatgaccagttcattcaggtacttgtatctatacggacg
+cgttccagagtagtatttgaaattttgaggttctactgataagtttagctatcgctgtat
+gtctgaataagaatttaatgtttatcttcgataaataacaattaacaactcctaggtgat
+acactgtgaagtctgctgttccccaaattacatatgctattttgttcacataccatgaag
+ttaagctaagtgctctataatggcataaacggttatcaaactagctcgaatttcttttat
+tacgccggaagcggattaactgctgtagatcaaacacgttaggatagtgtcgttttcata
+tatatctaaattcggtctaacatgcattacccatgcttgataacgtagcacttcgcagtc
+taattatgtaatgtccgtttaaccaaactttaaaaaagtttatctatcaccagtgatgcc
+tcatcgtgactacccggatctttagcctttagggtctaaacagaactaatattactacgt
+gtcatactccggagcttaaccaggtgaaacttatttgttaaccaaatttagtgacagggt
+agaaatacgtatcaaattaacccagcaatacaataagcatgaaaataattgtaatcgggt
+ttgggccggaatcccgcttggcgaaaacttaatgacatagtgtgatgcattttgcactgg
+attgagccacaaactcaactagcattatgctcaatatttggccagtgttctacggtttga
+aatttataaaggccgcgcaaaagtcttgtagttacaaacgcataaatctcgaacgtaata
+ggtttaattagaacatccgtaggatttctgtttatagtagatttatactaaatgttctga
+ttagattctgacggccttacccatacaattaataaagacgaatatattagttatagttta
+ctatccaaataaattaagcgaatcgaaataaactgtcacgatactgggcagttatcaact
+tatcacttatacagttcggacactctatattggtctgtgagtactctatcaaactaactc
+ataagttaactgcgcttccattaaatttcaatacgttcttgtgctgtgtacaaacctata
+atcgaataaatgacacatatggagatgcataataaaaaaaacggctccatatttctcgtt
+aatcgggcattcttaaggaggagcatctcaccaaaaataacgttcctgataagtcttaac
+tattagaccgtcttcgggaatgaacgaaacctcaagctagcatggtatagttcttgatag
+cgcgtaaattctgataatactgggcggacagctggaaattagttgccagtgcacctacgc
+aaatagtttacataaatcaacgggctccgaacgtaaatacaaagggttagttacatcgca
+acaagatgaaaagcatgtatgtctaccgtcatccgtccctaacaaacataaaggtggtga
+agaatctcgtaggtcaactataactccatccttgaagcaactactccgcgtccgtgtgcg
+tagttcgcaacgagaacactactgaaaaaagctaaacaactctcggtacaaatgcggctt
+gtgtcgataaagttggtggtagtgcacggaataacataacaaggaatattatttattcaa
+attttttgtgactgttatttgttttctgcctagaatgtaaggatgtgttttttgtgacct
+gatagttacgcttatttcaggtccacggtgcgtgagagtgtgtcctataacggcagggga
+gcgaagtagtgtcctttagactattcaaggtagaattttgataacgctctataaaaggta
+gaaaatcatgattgagcaataagaccccaacttatcaaaaaaggagttctcgacagcgcg
+tgtacagtccctataacggctgtatttcctgtgtcacaacaccctcccatcgcactcaaa
+atgtagatttatgatcagacgctaacttgttcttagagaaaaatacacgggatactctgt
+gcaacgatttcattaataaggtgcagcttgggacttttttggccgtaggctttattaaca
+ttcacagtaggtagcgagacttcctatgaaccaatcatgccacgcgttttaacgtttcaa
+atataagctaggaagcgtttgccaggacttctataatgcaccgttttttttagtacttcc
+ttactagccttagtttatgttagagtctttccaattacaaaggattgaatagccaaaatt
+tctacaattctcagcgaacgccagcttaatctaaacacgagcttcaaatattctacatat
+cggcaggagtcaatatataaatatgaaaatcgtaccatcctcgtacttttagaccaaacg
+tcttcggataattaaatcctttttcaattaccacagtacgtgcattagaactactgctat
+gaaagtaaaccttgaaatatagtcctcaagagcgtatccaagtacattgcacgtgtatac
+agtcgtataaacgagttgatgttctgacgctagagcttaccattcgttaaacagataact
+aaaatttaatggctgagtgacttagtgttttcgacaaacgtcgcggatgtagactattgt
+ttataagcaatttttaaaaacatatgttcaaaacggtatgggatatgtcgaattccacag
+gggtttatgtaccatagaagtatgtataaggtactaaaggtttaaatctgtgatattcgg
+ttcggtgaaaatcagactagtcacacttagtgtctgtaaattagattgggtgaaggtaag
+cgatcccgaactctacaaggcatgggatgagattctaccgactccggataacactttacg
+atcgcgcataactctagctcttagataagtttaacttgtcgatctcataaacagttcaaa
+atctgcgatttattgtatcaaatccatcctctatcttctataatcatctgaaccgcgata
+cggcactatgagccaagtgaagattgaatccaagaaagctataattggtttattttagtc
+catttaaattaagtccggtataagtgctctgtacaatatgcagtctcatgggcatatacg
+ttaactaccttttgatacttcgaattggtaaaatatcgactatcgatttgcagtaaaagg
+tgtagagtccaattactctttcctgttacatacgatctcttagtttggacaactagccca
+tgatggcgctcctctagcgcatgaacctactttataattacatctttatcgatgaatttt
+tttagactgcggaggccttgagttttaacagggctgctaaatttcttaagcgattagacg
+gtagcgtcgtacgctacttgcttggaacaggcaccgaaaatattgatctactattgcgtc
+aactctattctgctaatagcgatggcaaatcacagaagccctcttagtgacaatagttgt
+caactatatctaagtcgacctttactgtatcaacgatcacggagagaattaccgaatacg
+aaacctcaggactaaaaaacggaaaggatttgtcgacggtaaatataatacttgttaagg
+gtagcgacacaggtatactttgggtgtaaacgtggtgcttcccggaacgattttcagacc
+agaaaattgttccggtaaccaggaaatctcgtctgcgttaattcgtgttagtaaacttga
+tcttcagactccttcttttcgttgcagcgagacttaaattatatctgcgaaatagtgccc
+cgtgcatacttcagatggtaggagataccatttggcccattgtgactttacgcgattaat
+taaccgacatacatctgttcctgagctatgatcgtctgaataaattacggtctcctcttg
+atacctaatggtttctggagacgtttctcatgttcaaatggatagcaggagatcgcttca
+tcaagtttagctacgcagagcatcaaaatatgtatgggaaagtcgatttccaaaccagaa
+gggataaagagaaataacggacttctccgtagattagcctgatattttgatgggaatcat
+ggcggcacatacgtaagagttgcgtgaacgaatattttggacggcgggagacacatatcg
+gccattcgttaaggtctctatattggacatcacaagcttagcagtatgagctactaacac
+tcaagacattattgattttttcaagatatgtttcattcctctaccgctattcccatacgt
+tcgattcgccgggtgagcgaaaccacgggactgaggttaagctaatcaataacaactcgt
+tgcgatagagacctatgtatactagagagaattccccaacatttttacaaaaacaaagca
+gactaaaatagatacagtccctccatacaattaggaccaacatgttattgccgatcctag
+cacacacaccacaaactcagaacttctgtcttacctatgaaagggtctgcacttctgatt
+gtacgtgtctaattagcattaatattaaaactaattaggataaactataggtacgagctt
+tactataagtcactaggtgttttccgatcgaaaaacgggaccttcaagccttggtaagta
+catttaggataaagaaaaaaaggaaggtacgtgactaatctgtctaaactgacaatagag
+tagtacctacatgcttcatgtcaagtcttaatacgcaagcgctctcgttatactgctcaa
+caaaactcataaagttggactccatcatttagaatcatagggaccaaaacatttatttgc
+tactgtcactttgtaggtgttctattctgaattcctcatattgatacatgaatcggaata
+cctgtggatcccttaggacgcacgtgctttctttacgtcagaatacatattgtcagaatc
+gagaagttccatgcaattaagaattcgcctctttgaaaactcatatccccacatataggg
+tccaccgttattcggaaacgatataataattattccagcgttgagcgtcccttaagagcg
+cattttcgcttggcctttcttctacgactctacaacgcaagtggctgtgtggagtttacc
+acagcgcagcaccccatagaactacctctgagagcgcgagatggtggcagtatgctctgc
+agctagcgtttagaacgcgcccgcgcattaaccagtcatattaaaatggactgtcttaat
+tgtcggcattaggagcaatattaactgatgagggtatcggtcgcagaagtaatgacggaa
+atacgcctctagtccgcagagatacgattacagactcagatcccctaacaagcaaaacga
+ttaaatcggaatcactccccctatgacatatttgaaatacacaagaaaccacgcaacatg
+tcccgcattctcaaccgcgctttataagatgttgagtctgagaattagatgacctaactg
+caagaatcatggcgagtttatctagtaggcaagtctgtaccctagggttcgaacgctgtg
+acgtcgtgatcggtctaaggacttagatgataaccaagaactggtttaccgagtactttc
+actattaggagtaattacatgcgttcaccgcggaatacgacgaaattttttcatatcttt
+atgagcgagatcgtgtcgtctttgcattgcaacagtcgctaccagtaattgctgatcaat
+tatagattcattatacagatgcttacttttctctattcaatactgtcatgagttgttttt
+aaataagcaccagaattatgtcgcctagtataatcttgcttccacttgaatcaatgcgat
+ggacagtattctactgattgcaaagtagtctatttcggcttagcagtacgcatgcctatt
+tttttgcaggcacagaataatatgcaactaggattctcggcatccaattaacaggctaaa
+acaccaccgaaagacaggtaatctacgaagttgatgtttactacagaaagcgaatgatat
+cacttggagaacattttagatgcccccttttaatctagactgagtgtaccaatatatcac
+cggtctaccgaatcagcttgaataaaccactctagtactcatgataaccgagcatacaca
+tgtatttctcaatgcactgaaggtgaactgtttacaccataccttgcgaatcaacgtggc
+gacttatacttctgtctttgagtacagcacaccctaatgaatctaagttagttgttgata
+cgaattgtaatttgactggatctcgcctcctcatctagattcttagagaagatgtttctt
+atagccggtactgtaactttattgatctggtttatggtaatcaacattttacctctattt
+aaacgtccttgcgccgtgcactcaatcctgatcggtttagattcaagcgattatcgagtc
+tggaggccgagaaaagaaatgcacagagtaagctctctattgcgacatctacgtagaaac
+tcgcatttcagatcgagtaagcaactctcattgtgttgattcagtaatacaagattacct
+acgcttctacgaaatatactatagatttagcctacgtcacctttagtgtcgagtcggagc
+tttgaagatcggatgcggtgtggactgtgtataggcaattttgctgcgagctcgtgactt
+ttggttgatgtcgatatcaatgggatacctcaaacgtctttatctctggataactcacat
+tgagtataccggtaaaaatttattctattcatctaaatagtcagtgagggctagggtcgc
+aatcacattaggccacatacacatacttaacatgttctattgacccgacccaactttagt
+agcattgtagccgtttatgcaaatatgccaggcgccaaacactagccagagggcattttg
+ttacatttatttaatcgattattacacagtcggaacacgcctacatgcgttcgacttatt
+tgcgacatggtcaacaattcagtaatttaatccaaaacctaaagtcagagacatgacact
+aaaatcacattaaggtcagttagtgaaggaatggctaaccagctagagaatgcatcatta
+acaggcacttattgtcaaatattttccagatctaagcaacatcacgttaaaaagtacaac
+aatcacttaaaacacatcagtccaggtgtaattagaaagccgcttagtaggcaagcgtag
+gagtataaatgtagacaatagtcgggacttagcagacactggatgcagtcatagaagatc
+ttgcataacacgttagggttagagctacgaacgcccatcattaactgcctaaagcgtgcg
+tgagcttagcgctaacttttccaacacgtttgtgatttcgttcataatgtatcaatttca
+cagtcatatacagggagtgtagaaaaatcgcaattaacatacgttgacctatttttgttc
+agagttcagttagagcctaatgattcgagagcaataatcaggacagcctcataggaagtg
+tcaatcacttagaagctatattattataaatcgctctttactgtcgtcgaaggaacgagc
+gagagagaatcagttgcctgcaactggcttaacaatatgatacataaaaatattttcatc
+accactaagacggtggaattcagacttattggcaacttaggatgggactattaaataacc
+cataagatgttgggataaagttacgaaacgaaagggatatagcctgttagataggaaatc
+cccaataaaacatagccggcctccacagcagtgatctattccgccacgcgatatctttat
+accacgcaatataccaataataaaggttaaatgtggttgcgatttaaaaaagatacatat
+cagttgcaccgcgtagcaaatccgtatgtgaagcgtaacctagaattatagcgtctgcaa
+gttctctaagcttcctctgcaagatacaatatgactttttagcttttttactaccaaatc
+tcagaatcttagaaacaggttggtacgtgctactcggaattcccaaagtaccctgctata
+tatgccattccttcattggtccgggctcaccatggggccatcatagtaatagaaggtagt
+aaaactagttgatttccgacttttaacaatcactatcctgacccagatatgggttccgac
+tggcccttactccagtaagggcagacacacagacaacgagaacttgataactttgaattc
+tcaaatcgatcattgcaacgtgacttatttactagcctactcctataattcatacgtcaa
+atacatttcaacggaggaagataataagtaaatattcactaaataatggtcgaaggagtc
+ctttgccaacataagtccacatatgcgctatagattttttcttggggttcatattcaata
+agataaacagcaagagtatcacgtcagcgagtcattgagatcttggctagcattgtgata
+gcatattctacctaaatggtagtctagcacagagtggataagatatcagttagatataga
+caagtactataacagatctcgcttcgttggattgtatggctagctttgatgatatgattt
+tataaaaattgatccagacctgacctggccaattatattcattttttatgagtaaaaata
+gataaccatgaaaatactcaagccccttaggacgtacaaagtggtaacataaatttcagg
+tgttattctgcaaccacacctgttttgggttttcaaaaaggctaagcagattggttttac
+agataatccctgaacactggtatctcccaacgatgtcgttcccaacccttgctgaccttt
+taagctctgctgaagttttgtaaactaggcggaaaatatgttcgatagatccactcgcct
+gaggtagaaattcgtcttagtaacgcctctttggattacacagaatagtgtactgacacg
+tacactgctgcagcagccatacgctaacattaaaattcgttgagtctacatttgttgtta
+ttcggattatgttattgggaatagtatttttattcccctgcgtgaaaccacatggataga
+ttagcctactcctaaagactcccttttggtctacggttcaattctcttactgagtttatg
+ttcgtaattatatcggcgcagtgaatctcctaattatcaccggagttaccagacgccatg
+aacttatggccagaaacattgcatgtggcctacataggattagtatcaagagtttacgtt
+tgcaacgacatttgaccaacttgaccattcctgcttgtagaccgcgggaactcccctgca
+cgcgactatagaagttggtggtggatgtggcttatgccgcaaatatggttttgaaaaaag
+taatctattgcttgatacctgaattgagacatgtataagggctattgccagatgaaaaac
+tgcatataaggtcaaacaatataagaacattatacataggatcttagcgttcctcaggat
+ggtatacgctataaagtctagcttcagcagctaaggagttttgccagtgcggacttccgc
+tggaagattaggtttaaccgccctgacatcttcataaggtcgggcctgattcaaacccct
+ggagtgccgtctcatacttgaattaatcgatggaaaacttcttctagtctaatattatta
+ttaacaaatgacggttcaataaataacaccgtaagggtgggaaactgttaagtgatgaat
+cattttaacctatcatccattagctacagataatgataccccgatccgactagggggtaa
+gtggttgttccgttaggataaaccatgtaaaacgttagagggtttgtagattaattggta
+ttccagataaatgaggtcagggcgagtgatcaattacactgaaaaattgtcagcttgcgc
+ggtagttgttaagacagtataaatgaaggggattcagaagcaagtttctcgattgactga
+atttataaaccagtcgtcaatcatgatttttgtgtcgattaaagcctaaatggtaattta
+aaccattgatatttatcgagtctataaatatctttggttgtatattacttcacaatcacc
+aattctaaatgattcttccactgtgcgggtggagatatcaggacgggttaaggttgacct
+acatcgttttgatacaacaaaaatcaaagcacatggctggggacttctcgatactatctt
+tgagatagtacgggcaagagtgggtgacgcctccctacattttcaagtctatcggataac
+ttctcggtaaaacgctcgcgatatagttttaaagcattgatttaatccacgcaggagcaa
+gttttaccggtcgaatgagaaaattcaacgtaagtgtcatatccagtcatggttagccaa
+aagcatgggttatccaaaaggaataaaacagctcttcaacaaagagatgaggcttcataa
+cttcgatgaatgcgtatggttctgatatatagatcgatgcatgaggacactttattttag
+ccggcgaattaatggaatccatacgttacttatttggacatgacttctaggtgtttttgc
+tgtcccgtttagcgatatttacagattagtatttcgtttctcatagttaattgtatctag
+atactaactcgttgaagacgcataccttgccatttgtacaggacttaactgttccgtgcg
+taatttgaatttcttataggttcttcaaggcacgaatacctcactcatgaccgttcatac
+tctagttaaggtcgggaatactacgtatgcagggaattgtaacctaggagatttacaact
+ctttaaacaagagtcgctgaggtccaggatcaaaacactgaatctcctaacttcgggtgc
+ctccgtaaatcacctagaaacctactcatacatttgcaattttgagatgtaggcgaaaga
+gagaaatctgctttttaacggtatctcttgggattccttttaaaaacacataacgatagt
+aatgtaccaagtaaccaaaagctgggatgtgtctgtgtactgatccgccgtgtcagagta
+gtccgccatgaatattgacgtcaaggctagtgtcatcaggtattgatgttcattgtaaat
+gaaggaatgaactaatgtcaccaagtaaagggggtgaaaatgctccccagggttctacag
+acatagagatggtcagaacacgacccccctctcaacgcagtgtatttgaaatatatggac
+atatctaccttattctgtaattttagatgtgttctgtgtataccgatattgataagtcaa
+taggcttgattacgtatcttaagacaaatctgtttcgcaagtaggaccgcatctttcaga
+ttgtttctttttatgccataacctgcccaggaattcaaaaggttatcgatacccgatatg
+ctgtgaattattattctaatggccactcattcctgcttatatctggaattggcatgaata
+tcttacaacctaaagtctggcgttgcgccagttctacttcgtaccggacaccatctccag
+tcgttaaccgaaggtgggtacgtcacataaaagttcattagaccacactttgtgccgacg
+tatatagatatattacacgtatagggaatgttttctcctaggtgacccgaccttctacta
+aggttgtacatcgtataatggcccattaactacgaggaaagtggtattgacctggtaatg
+cacgttcttcgatatataccgacgaggtaaagtctactattgcaaagtttgacgttatac
+tgataagtttagatttccctggatcgcgcatgaacaatgtatgcgttatctgccatatat
+aacatgttacaaatccttggggatactatcgctactatcatcggaccaaaattaaatagg
+ctagtgtcttatcagaacatcatgtttaccgaactgatctattttccaatttaagctgat
+attacgtccgcgtatttattttagttccccggatgacgattatctgagctacatcataca
+agttagcatactcgccggtgcattgatttcttatttcgctatatcttcaagttcacaggc
+ttcatatagttccaattagcagtataattaggttttgtaactttaaccatactttataaa
+aggttatattgcacaactgatcaagcatccgctataacccgagctttaccagttagcggc
+taataacaaataagatgacttcgtgtcatacgaccgtcatgatcatgctctaacttaggt
+gggaaccaaatttaggcaatgggtagtaataagtataaaatgataccacatatactataa
+caatgaaattatttgtaatccggtttgccaacgtatcccccttcgcgataaattaatgac
+atagggtcatccatgtgccaatcgtgtgtgccaaaatctcaaattcaattatcatcaata
+ttggccaagtgttataagcgttgaaagtgatataggccgccaaaaagtagtctacttaaa
+aaccaatatttatcgttcgttattgctggtagtacaacatcacgagcatttctcttttga
+gttgatttatactatatctgctgatgtgattatgtcccacttacccagaatattaagaaa
+gtcctagattgtaggtatacttgactataaatataatttaagactatacaaataatctgg
+ctacattatgccatcgtagaaactgataacgtagtaacgtcggacactagattttggtcg
+gggagtaatctagcatactaacgaatttgttaaatccgctgaaagtatatgtcattacct
+gcttggcctgtcttcaatacgtttagactattaaggactcatttcgagatccagtattaa
+ttatacgcatccatatttatactgaagacggattgagttaggacgacaagctaaacaaat
+attaagttaaggattagtattatattgtagaaactcgtcgggttggaacgattcatcatc
+atagaatgcgttacttattcagagagacttaattcggttatgactggcagctcacctgga
+aagtaggtgaaaggcaacagaagaatattgttgactgaattctacgggctacgaacgtaa
+ttacaaagcggttcgtaaagagcataaagatcaatacaatggatctctacagtattacgt
+aaataacatacataaacctggtgttgattcgactagctcatagattaatcattaattgaa
+gctacgaagacgcggaagtctgcggagtgagcaaacagtaatcgactgataaatgcttat
+aatatcgcgcttaaatgccgcatggtgtacattaacgtgggggtagtcaaaggaatatat
+ttactaggaatattagttatgcaaatgttgtgtcaatgtgatgtgttttatccagacatt
+ggatgcatggctgtgggggcacaggatacttaccattagttcacctacaagcggcgtgag
+agggtctcagttttagccagcgcagagaagtacgggcctttagacgattaatgctagaat
+tgtcataaacctcgtgaaaagctagttaataatcatggtgctagaagaacacaacttttc
+tataaaccagttctcgactgacagtcgtaactcactatatcgccgctttgtactgtcgca
+aaaaaacctcacatagaaagaaaaatctactgggtgcatcagtagagatcgtgttctgag
+agataaatacaccggatacgatctgcatcgagttcatgtattaggtcaagcttgggactg
+ttgtgccagtagcattttttaacagtcaaagtagggtgagacacgtcatatcataatata
+tgccatcgaggtttaaagtttatatgataagctagcatgcgttgcaatcgtattcttgaa
+tgctccgtggtttgtactaattcctttatagactgagtgtatcgtacactcggtacaatt
+acaaaggatggaagagcaaataggtcttcaattataacagtaccccaccttaatctaaaa
+accagcttcaattagtattaatttcgccaggagtatatatataaatatctaaagactaaa
+agactcgtacttttacaacttacgtcgtagcataattaaatcatgggtaaatgtcatcag
+taagtgcattagaaatactcctttgtaaggatacagtgaatgtgtctcagcaagtcagta
+gaaatggaaattcatactcgattaaggcctataaaactgttgttggtatctacagagtga
+ttaaaattagtgaatcagattacgaaaatgttttcccgctcgcacttacgcgtttagaca
+aaagtacaggtggtacaattggctgtagtagaattttggtataaaataggtgataaaccg
+gatgggtgtgggcgaattcaaaagcggtttttgttccatagaactatgtagttggttata
+aaggttgtaatctcggagattaggttagggcttaatcagaatagtaacaatttctctatg
+taaagtacagtgggtgatcgtatgagttcacgaactcttaatgccatgcctggacaggat
+aaacaatacgcatataacttgacgatcgagcttatatcgacctatttgagaagtttaacg
+ggtcgatataatatacaggtcttaatagccgattttttctagaaaagcaatcctatatct
+tagttaatcagatcaaccccgtgaacgatatatcagcaaactgaacattgtatacaacat
+tcctttttgtccgggtggggactccatttaaagtatctcacctagaactcagcggtaata
+gatgcagtctcttgcccagttacggtaactaaatgttgatacttagaattgctaaatttt
+agtctagacatttccaggtaaaccggtagacgacaatttctctgtcatctgtcataagat
+cgcttagtgtgctcaaattgcaattgagggccctactatagacaatcatcagacttttta
+attaaatagttttccatgaatgtgttgtcaaggcggaccccttcacttttatcacggctc
+ataaatgtcgtatgactgtagtcggtagcggccttcgagtcttcaggggaaatggaaaag
+aaattaggcttctaagatggactataatcgattaggctaattccgttcgcaaatcacaga
+agcaatcttactcaaaattgttggaatcgatagcgaacgcgaccgtgaatgtttaaaagt
+gctcgcacagaattacccaatacctatcatcacgacttaaatacccaaagcagttgtagt
+cgcgtaatagattaagtctgaagcctagagacaaagggatactgggcggggaaacctgct
+ccttcacggtaacatggtaacaacagaatttggttaaggttaaaacgaaatatactcgga
+gtgaattactgttaggtttcgtcatcggatcaataagtagtttccgtgaagacactctta
+tattagatctccgaaattctgacccgtgcattaggcacttggtaggagattccatttgga
+acttgctcaatgtaagccagtaatgttccgaaataattcgctgcaggagcgaggagccgc
+tgaataaaggaccctcgcatcttgttaccttatggttgagggtcaccgttctctgcgtca
+attccagagctggagatacattcatcaacgttacctacgcacagaataaaaagatcgagc
+gctaactcgttttcctaaacacaacggatttagacaaattaccgaatgcgccggagagta
+gcatcttagtgtcatgcctatcatggcggctcagtacgaagagttcaggcatcgaatatt
+gtggtagcccgcactcaaagttccgccattaggtaagctatatattgtggtcagaacttg
+aggacaactatgagctactaaaaataaacaattttgtcatttgttctagatatgtggcat
+tcatcgaacgcttgtaccagaagttacattcgcagcgtgagcgaataaacccgaatgagc
+gtaacattatcaataacatatagttcagatagagaacgaggtattcgacagagaattacc
+caacattggttattaatctatgcagaataatttagataatgtcactacataatattagga
+ccaaaaggtgattccccagaagacaaaacaataaacaatctcacatattcgctagtacct
+atgtatgggtatgatcttctgattggacggggataatttccaggtatattaaaacttatt
+accataatctagacctaagagaggttatataagtaaagagctgtgttccgatagaaaaac
+ccgaccttaaagacttgcgaagtaaattttgctttaacaaaaaaacctacgtaagggaat
+attctgtataaactgaaaagtcaggtgtaactacatgagtcatgtcttcgattaattaca
+atgcgatctcgttattctgatcaactaatatcataaactgccactacatcttgtacaatc
+attcgcaacaatacttttatgtgctaaggtcacgtgcttcctctgctatgctgatttaat
+cagattcataaaggaatacgaataactctggatccattaccacgcaagggatttatttac
+ggctgattactttttggctgttgacagaactgccatgaaagtaagatgtcgcatcttgca
+taaataatagcacctaatatagccgacaaagtgattccgataacagattttaagttgtcc
+agccttgagactccatgaagaccgcttgggagcttccccgtgattagaagaatctaaatc
+ccaagtggatggggggagtttaaatctcagcaccaacaaatagtacttcctctcagagcg
+cgtcatggtcgaaggagcctatcctgatagaggtttgaaagcgcacgcgcatttaactgt
+catattaaattggaatctcgtaagtgtcggcagtacgacaaattttaactgatgtcggta
+tacggagaagaaggaagcacgcattgaagcagctacgcagaactgagaagatgacactct
+aagatacaattaatacaaaaacgttttaagcccaatctatcaacagatgtaagatgtcta
+atacacaagaataaaaccttcatgtcccgatgtataataacagctttatttctgctggtc
+gaggtgaagtagtggaaattactccatcttgctgcgcgtctttatagtgttggctactct
+gtaaccgacgcgtccatccctctctcctagtgatccgtatatccaattagaggataacca
+acatctgcgttaccgacgaatttaaatttttcgactatttaattccgttcaaacccgtat
+tcgtagtaagtgtttcatagatttatgaccgacatcgtgtacgagttgcagtgcatatgt
+agataccactaattgctgatctaggatacatgctttataaacatgcttacttggctattt
+tatttactgtcatgtgggggtttttattttcaacaagtatgtgctaccattggataatct
+ggcttcaaattgaagatatgcgttccaaacttgtctactgtttgctaagtaggagttgtc
+ccattagaactacgcagcacgtggtttgtgatcgaaaagaataattggcaaatacgaggc
+tagccttcaaatttaatgcagattactcctcagaaacacacgtaagcgacgaacgtgatg
+tttactacacaatgcgtatcatagaaattcgtgataatttttgttccaacctttgaatct
+agactgagtggaaaaagatttcaccgggataccgtttatgctggttttaaaaactcgtcg
+aatcatcttataactgcattcaaatggatttctcaatcatctgtacgtcaactgttttaa
+caataacgtcagaataaaccggcacaatgagacggcggtctttcactacaccacaccctt
+aggattataagtgacgtgtggattcgaattctaaggtgacgggatctacaagcctcagct
+acattaggtctgaagatctttcgtatagccgcgtatgttactgtttggatatgggttatg
+ctaatcaacagttgacagcgagtgaaacggccttgcgacctgaaatctttacggttacct
+tttgattcaagacaggatcgacgatggaccacgtgaaatgaattcaaaactgtaacatcg
+cttgtgcctcagcgaccgagtaacgacaagttcacatcctctatgcaactatcattgtgg
+tcattaaggtattcaagattaactaagagtcgaccatatattctagagttttacaattag
+gaaccgttagtctagactaggagcgtgcaacatcgcaggaggtgtggactgtcttgaccc
+aagttgcctgacacatagtgtcttttgcttcatgtccttagcaatgcgatacctcaatcg
+tagttttatcgggataaataacatggtgtttaaccctattaatggtttctattaatctaa
+attgtaaggcagcccttgggtcgaaagcacattaggccacatacacagtatgaaattgtt
+cgagtgtccagaccataattgactaccatggtacacggtgttgctattatgactcccgca
+aaactcttgacagagggaattttggtacattgatgtaatcgatgatttaacagtaggaac
+tagacgtcatccgttagactgagttccgacatgctcaaattgtcaggatttttatccaat
+aactaatggctctcacatgtaaataaaatcacattaacgtcacttagtgatggattcgct
+aaacagatagactatcattcatgaactggcactgtttcgattatatttgcaacatcgaac
+atacttaaagttaaatacgacatcattcaattaaaaaaattcagtacacctctaatgagt
+atcccgctttggaggaaagagtagcactttaaatggacaatttaggccggactttcctgt
+aaatggatgaagtcattgtacagcttgaataaatcgttagggttagtccttacatccacc
+atatgttaatgaataaagcctgagggaccttagagctaacttgtccaacacgttgctcat
+ttacttaataaggttgaaatgtatcagtaagtgacagcgagtgtagattttgaccattta
+actgaccttcacagttttgtcttcagacgtcacttacaccataatgatgacagagcttgt
+agatgcacacactcattcctagtgtaaatcaagtagtagctagattattataaagagata
+ttttctggcgtcgaacgtaacacagagagagtataaggggcatgataatggcttatcaat
+atgtgtaagaaaaagtttttaatatcatctaactcggtggaatgcacacttatggccaac
+tgaccttgggacgagttaagataccataagaggttgcctgtaagttaagataacaaaggg
+atattccatctttgtgtgct
index 4e4ec722715646f978dacb0388bff3cf19cd1dc2..a161635ffe4361974f65a6165ece81fd25a57d42 100644 (file)
@@ -1,9 +1,13 @@
+! Copyright (C) 2008, 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
 USING: ascii kernel io io.files splitting strings
 io.encodings.ascii hashtables sequences assocs math
-math.statistics namespaces prettyprint math.parser combinators
-arrays sorting formatting grouping fry ;
+math.statistics namespaces math.parser combinators arrays
+sorting formatting grouping fry ;
 IN: benchmark.knucleotide
 
+CONSTANT: knucleotide-in "vocab:benchmark/knucleotide/knucleotide-input.txt"
+
 : discard-lines ( -- )
     readln
     [ ">THREE" head? [ discard-lines ] unless ] when* ;
@@ -34,7 +38,7 @@ IN: benchmark.knucleotide
     tri ;
 
 : knucleotide ( -- )
-    "resource:extra/benchmark/knucleotide/knucleotide-input.txt"
+    knucleotide-in
     ascii [ read-input ] with-file-reader
     process-input ;
 
diff --git a/extra/benchmark/nbody-simd/deploy.factor b/extra/benchmark/nbody-simd/deploy.factor
new file mode 100644 (file)
index 0000000..6055077
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-ui? f }
+    { deploy-word-defs? f }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { deploy-io 2 }
+    { deploy-reflection 1 }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-console? t }
+    { deploy-word-props? f }
+    { deploy-c-types? f }
+    { deploy-name "benchmark.nbody-simd" }
+}
index 39c216959601bdd67574779ab7d980e26d4fd0d3..ee290b144dadd0ceacbe3181e9c35bdf078b9b92 100644 (file)
@@ -1,9 +1,9 @@
-! Copyright (C) 2008, 2009 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien.c-types fry kernel locals math
 math.constants math.functions math.vectors math.vectors.simd
-math.vectors.simd.cords prettyprint combinators.smart sequences
-hints classes.struct specialized-arrays ;
+math.vectors.simd.cords math.parser combinators.smart sequences
+hints classes.struct specialized-arrays io ;
 IN: benchmark.nbody-simd
 
 : solar-mass ( -- x ) 4 pi sq * ; inline
@@ -94,7 +94,9 @@ SPECIALIZED-ARRAY: body
 : nbody ( n -- )
     >fixnum
     <nbody-system>
-    [ energy . ] [ '[ _ 0.01 advance ] times ] [ energy . ] tri ;
+    [ energy number>string print ]
+    [ '[ _ 0.01 advance ] times ]
+    [ energy number>string print ] tri ;
 
 : nbody-main ( -- ) 1000000 nbody ;
 
index 5f9fddf1a8ab9fcef468d41807171a8c0233daf6..fe30aeff10aab85697eba4e821b519dfb1971c2a 100644 (file)
@@ -1,14 +1,15 @@
 USING: tools.deploy.config ;
 H{
+    { deploy-ui? f }
     { deploy-word-defs? f }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { deploy-io 3 }
+    { deploy-reflection 1 }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-console? t }
     { deploy-word-props? f }
-    { deploy-math? f }
-    { deploy-ui? f }
     { deploy-c-types? f }
-    { "stop-after-last-window?" t }
-    { deploy-reflection 1 }
     { deploy-name "benchmark.regex-dna" }
-    { deploy-io 2 }
-    { deploy-threads? f }
-    { deploy-unicode? f }
 }
index 24e77597831e5f180a64ef74eacaf5199d8156a3..af5a5b61aa4c9f9d65e9707d702f282b674f9ad5 100644 (file)
@@ -1,7 +1,7 @@
 ! Copyright (C) 2008, 2009 Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors io io.encodings.ascii io.files kernel sequences
-assocs math.parser namespaces regexp ;
+assocs math.parser namespaces regexp benchmark.knucleotide ;
 IN: benchmark.regex-dna
 
 ! Based on http://shootout.alioth.debian.org/gp4/benchmark.php?test=regexdna&lang=ruby&id=1
@@ -55,6 +55,6 @@ SYMBOL: clen
     length number>string print ;
 
 : regex-dna-main ( -- )
-    "resource:extra/benchmark/regex-dna/regex-dna-test-in.txt" regex-dna ;
+    knucleotide-in regex-dna ;
 
 MAIN: regex-dna-main
diff --git a/extra/benchmark/reverse-complement/deploy.factor b/extra/benchmark/reverse-complement/deploy.factor
new file mode 100644 (file)
index 0000000..c92199d
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-ui? f }
+    { deploy-word-defs? f }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { deploy-io 3 }
+    { deploy-reflection 1 }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-console? t }
+    { deploy-word-props? f }
+    { deploy-c-types? f }
+    { deploy-name "benchmark.reverse-complement" }
+}
diff --git a/extra/benchmark/spectral-norm-simd/authors.txt b/extra/benchmark/spectral-norm-simd/authors.txt
new file mode 100644 (file)
index 0000000..7852139
--- /dev/null
@@ -0,0 +1 @@
+Marc Fauconneau
diff --git a/extra/benchmark/spectral-norm-simd/spectral-norm-simd.factor b/extra/benchmark/spectral-norm-simd/spectral-norm-simd.factor
new file mode 100644 (file)
index 0000000..ce91813
--- /dev/null
@@ -0,0 +1,68 @@
+! Copyright (C) 2010 Marc Fauconneau.
+! See http://factorcode.org/license.txt for BSD license.
+USING: alien.c-types specialized-arrays kernel math
+math.functions math.vectors sequences sequences.private
+prettyprint words typed locals math.vectors.simd
+math.vectors.simd.cords ;
+SPECIALIZED-ARRAYS: double double-4 ;
+IN: benchmark.spectral-norm-simd
+
+:: inner-loop ( u n quot -- seq )
+    n 4 /i iota [| i |
+        n iota [| j | u i j quot call ] [ v+ ] map-reduce
+    ] double-4-array{ } map-as ; inline
+
+: eval-A ( i j -- n )
+    [ >float ] bi@
+    [ drop ] [ + [ ] [ 1 + ] bi * 0.5 * ] 2bi
+    + 1 + ; inline
+
+: vrecip ( u -- v ) double-4{ 1.0 1.0 1.0 1.0 } swap v/ ; inline
+
+:: eval4-A ( i j -- n )
+    i 4 * 0 + j eval-A
+    i 4 * 1 + j eval-A
+    i 4 * 2 + j eval-A
+    i 4 * 3 + j eval-A
+    double-4-boa vrecip ; inline
+
+: (eval-A-times-u) ( u i j -- x )
+    [ swap nth-unsafe ] [ eval4-A ] bi-curry bi* n*v ; inline
+
+: eval-A-times-u ( n u -- seq )
+    [ (eval-A-times-u) ] inner-loop ; inline
+    
+:: eval4-A' ( i j -- n )
+    j i 4 * 0 + eval-A
+    j i 4 * 1 + eval-A
+    j i 4 * 2 + eval-A
+    j i 4 * 3 + eval-A
+    double-4-boa vrecip ; inline
+
+: (eval-At-times-u) ( u i j -- x )
+    [ swap nth-unsafe ] [ eval4-A' ] bi-curry bi* n*v ; inline
+
+: eval-At-times-u ( u n -- seq )
+    [ double-array-cast ] dip [ (eval-At-times-u) ] inner-loop ; inline
+
+: eval-AtA-times-u ( u n -- seq )
+    [ double-array-cast ] dip [ eval-A-times-u ] [ eval-At-times-u ] bi ; inline
+
+: ones ( n -- seq )
+    4 /i [ double-4{ 1.0 1.0 1.0 1.0 } ] double-4-array{ } replicate-as ; inline
+
+:: u/v ( n -- u v )
+    n ones dup
+    10 [
+        drop
+        n eval-AtA-times-u
+        [ n eval-AtA-times-u ] keep
+    ] times ; inline
+
+TYPED: spectral-norm ( n: fixnum -- norm )
+    u/v [ double-array-cast ] bi@ [ v. ] [ norm-sq ] bi /f sqrt ;
+
+: spectral-norm-main ( -- )
+    2000 spectral-norm . ;
+
+MAIN: spectral-norm-main
diff --git a/extra/benchmark/spectral-norm/deploy.factor b/extra/benchmark/spectral-norm/deploy.factor
new file mode 100644 (file)
index 0000000..7ae0b19
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-ui? f }
+    { deploy-word-defs? f }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { deploy-io 2 }
+    { deploy-reflection 1 }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-console? t }
+    { deploy-word-props? f }
+    { deploy-c-types? f }
+    { deploy-name "benchmark.spectral-norm" }
+}
index 93fb8cb562efdf32f56c21642e854cbc6809c3ee..70489456e439e0b2351c13f2f10f735f907d7db5 100644 (file)
@@ -1,8 +1,11 @@
+! Copyright (C) 2008, 2010 Slava Pestov.
+! See http://factorcode.org/license.txt for BSD license.
+!
 ! Factor port of
 ! http://shootout.alioth.debian.org/gp4/benchmark.php?test=spectralnorm&lang=all
-USING: alien.c-types specialized-arrays kernel math
-math.functions math.vectors sequences sequences.private
-prettyprint words typed locals ;
+USING: alien.c-types io kernel math math.functions math.parser
+math.vectors sequences sequences.private specialized-arrays
+typed locals ;
 SPECIALIZED-ARRAY: double
 IN: benchmark.spectral-norm
 
@@ -47,6 +50,6 @@ TYPED: spectral-norm ( n: fixnum -- norm )
     u/v [ v. ] [ norm-sq ] bi /f sqrt ;
 
 : spectral-norm-main ( -- )
-    2000 spectral-norm . ;
+    2000 spectral-norm number>string print ;
 
 MAIN: spectral-norm-main
index 9db3451f265cbcc86bef6ad6f36a335afa74cc09..7353a9a8314272841e6ec2edcb11b7a449ffa074 100644 (file)
@@ -1,10 +1,10 @@
-USING: bson.reader bson.writer byte-arrays io.encodings.binary
+USING: bson.reader bson.writer bson.constants byte-arrays io.encodings.binary
 io.streams.byte-array tools.test literals calendar kernel math ;
 
 IN: bson.tests
 
 : turnaround ( value -- value )
-    assoc>bv >byte-array binary [ H{ } stream>assoc ] with-byte-reader ;
+    assoc>bv >byte-array binary [ H{ } clone stream>assoc ] with-byte-reader ;
 
 [ H{ { "a" "a string" } } ] [ H{ { "a" "a string" } } turnaround ] unit-test
 
@@ -17,6 +17,9 @@ IN: bson.tests
 [ H{ { "a quotation" [ 1 2 + ] } } ]
 [ H{ { "a quotation" [ 1 2 + ] } } turnaround ] unit-test
 
+[ H{ { "ref" T{ dbref f "a" "b" "c" } } } ]
+[ H{ { "ref" T{ dbref f "a" "b" "c" } } } turnaround ] unit-test
+
 [ H{ { "a date" T{ timestamp { year 2009 }
                    { month 7 }
                    { day 11 }
@@ -34,10 +37,12 @@ IN: bson.tests
 ] unit-test
                    
 [ H{ { "nested" H{ { "a" "a string" } { "b" H{ { "a" "a string" } } } } }
+     { "ref" T{ dbref f "a" "b" "c" } }
      { "array" H{ { "a list" { 1 2.234 "hello world" } } } }
      { "quot" [ 1 2 + ] } }
 ]     
 [ H{ { "nested" H{ { "a" "a string" } { "b" H{ { "a" "a string" } } } } }
+     { "ref" T{ dbref f "a" "b" "c" } }
      { "array" H{ { "a list" { 1 2.234 "hello world" } } } }
      { "quot" [ 1 2 + ] } } turnaround ] unit-test
      
index a97b5029b0c3b70f7252f0fb8e24438980f339a3..0c217e1c080ff12f7b1c17154ebdf1a4336217df 100644 (file)
@@ -1,3 +1,5 @@
+! Copyright (C) 2010 Sascha Matzke.
+! See http://factorcode.org/license.txt for BSD license.
 USING: vocabs.loader ;
 
 IN: bson
index 5148413b6104851f9a525f944f0820f96982507e..2d126857c33326a40b3d1c8bd308976a54c3a29e 100644 (file)
@@ -1,5 +1,8 @@
-USING: accessors constructors kernel strings uuid ;
-
+! Copyright (C) 2010 Sascha Matzke.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs calendar combinators
+combinators.short-circuit constructors kernel linked-assocs
+math math.bitwise random strings uuid ;
 IN: bson.constants
 
 : <objid> ( -- objid )
@@ -7,9 +10,33 @@ IN: bson.constants
 
 TUPLE: oid { a initial: 0 } { b initial: 0 } ;
 
-TUPLE: objref ns objid ;
+: <oid> ( -- oid )
+    oid new
+    now timestamp>micros >>a
+    8 random-bits 16 shift HEX: FF0000 mask
+    16 random-bits HEX: FFFF mask
+    bitor >>b ;
+
+TUPLE: dbref ref id db ;
+
+CONSTRUCTOR: dbref ( ref id -- dbref ) ;
+
+: dbref>assoc ( dbref -- assoc )
+    [ <linked-hash> ] dip over
+    {
+        [ [ ref>> "$ref" ] [ set-at ] bi* ]
+        [ [ id>> "$id" ] [ set-at ] bi* ]
+        [ over db>> [
+                [ db>> "$db" ] [ set-at ] bi*
+            ] [ 2drop ] if ]
+    } 2cleave ; inline
+
+: assoc>dbref ( assoc -- dbref )
+    [ "$ref" swap at ] [ "$id" swap at ] [ "$db" swap at ] tri
+    dbref boa ; inline
 
-CONSTRUCTOR: objref ( ns objid -- objref ) ;
+: dbref-assoc? ( assoc -- ? )
+    { [ "$ref" swap key? ] [ "$id" swap key? ] } 1&& ; inline
 
 TUPLE: mdbregexp { regexp string } { options string } ;
 
index 51aa5f3817e32bba1208090fc7e256858ad58203..e0cf0bc4f46c81353cf019931516c0c1167e833b 100644 (file)
-USING: accessors assocs bson.constants calendar fry io io.binary
-io.encodings io.encodings.utf8 kernel math math.bitwise namespaces
-sequences serialize locals ;
+! Copyright (C) 2010 Sascha Matzke.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs bson.constants calendar combinators
+combinators.short-circuit io io.binary kernel math locals
+namespaces sequences serialize strings vectors byte-arrays ;
 
-FROM: kernel.private => declare ;
-FROM: io.encodings.private => (read-until) ;
+FROM: io.encodings.binary => binary ;
+FROM: io.streams.byte-array => with-byte-reader ;
+FROM: typed => TYPED: ;
 
 IN: bson.reader
 
 <PRIVATE
 
 TUPLE: element { type integer } name ;
+
 TUPLE: state
-    { size initial: -1 } exemplar
-    result scope element ;
+    { size initial: -1 }
+    { exemplar assoc }
+    result
+    { scope vector }
+    { elements vector } ;
+
+TYPED: (prepare-elements) ( -- elements-vector: vector )
+    V{ } clone [ T_Object "" element boa swap push ] [ ] bi ; inline
 
 : <state> ( exemplar -- state )
     [ state new ] dip
-    [ clone >>exemplar ] keep
-    clone [ >>result ] [ V{ } clone [ push ] keep >>scope ] bi
-    V{ } clone [ T_Object "" element boa swap push ] keep >>element ; 
-
-PREDICATE: bson-not-eoo < integer T_EOO > ;
-PREDICATE: bson-eoo     < integer T_EOO = ;
-
-PREDICATE: bson-string  < integer T_String = ;
-PREDICATE: bson-object  < integer T_Object = ;
-PREDICATE: bson-oid     < integer T_OID = ;
-PREDICATE: bson-array   < integer T_Array = ;
-PREDICATE: bson-integer < integer T_Integer = ;
-PREDICATE: bson-double  < integer T_Double = ;
-PREDICATE: bson-date    < integer T_Date = ;
-PREDICATE: bson-binary  < integer T_Binary = ;
-PREDICATE: bson-boolean < integer T_Boolean = ;
-PREDICATE: bson-regexp  < integer T_Regexp = ;
-PREDICATE: bson-null    < integer T_NULL = ;
-PREDICATE: bson-ref     < integer T_DBRef = ;
-PREDICATE: bson-binary-bytes < integer T_Binary_Bytes = ;
-PREDICATE: bson-binary-function < integer T_Binary_Function = ;
-PREDICATE: bson-binary-uuid < integer T_Binary_UUID = ;
-PREDICATE: bson-binary-custom < integer T_Binary_Custom = ;
-
-GENERIC: element-read ( type -- cont? )
-GENERIC: element-data-read ( type -- object )
-GENERIC: element-binary-read ( length type -- object )
-
-: get-state ( -- state )
+    {
+        [ clone >>exemplar ]
+        [ clone >>result ]
+        [ V{ } clone [ push ] keep >>scope ]
+    } cleave
+    (prepare-elements) >>elements ;
+
+TYPED: get-state ( -- state: state )
     state get ; inline
 
-: read-int32 ( -- int32 )
+TYPED: read-int32 ( -- int32: integer )
     4 read signed-le> ; inline
 
-: read-longlong ( -- longlong )
+TYPED: read-longlong ( -- longlong: integer )
     8 read signed-le> ; inline
 
-: read-double ( -- double )
+TYPED: read-double ( -- double: float )
     8 read le> bits>double ; inline
 
-: read-byte-raw ( -- byte-raw )
+TYPED: read-byte-raw ( -- byte-raw: byte-array )
     1 read ; inline
 
-: read-byte ( -- byte )
+TYPED: read-byte ( -- byte: integer )
     read-byte-raw first ; inline
 
-: read-cstring ( -- string )
-    "\0" read-until drop "" like ; inline
+TYPED: read-cstring ( -- string: string )
+    "\0" read-until drop >string ; inline
 
-: read-sized-string ( length -- string )
-    read 1 head-slice* "" like ; inline
+TYPED: read-sized-string ( length: integer -- string: string )
+    read 1 head-slice* >string ; inline
 
-: read-element-type ( -- type )
-    read-byte ; inline
+TYPED: push-element ( type: integer name: string state: state -- )
+    [ element boa ] dip elements>> push ; inline
 
-: push-element ( type name -- )
-    element boa get-state element>> push ; inline
+TYPED: pop-element ( state: state -- element: element )
+    elements>> pop ; inline
 
-: pop-element ( -- element )
-    get-state element>> pop ; inline
+TYPED: peek-scope ( state: state -- ht )
+    scope>> last ; inline
 
-: peek-scope ( -- ht )
-    get-state scope>> last ; inline
+: bson-object-data-read ( -- object )
+    read-int32 drop get-state 
+    [ exemplar>> clone dup ] [ scope>> ] bi push ; inline
+
+: bson-binary-read ( -- binary )
+   read-int32 read-byte 
+   {
+        { T_Binary_Bytes [ read ] }
+        { T_Binary_Custom [ read bytes>object ] }
+        { T_Binary_Function [ read ] }
+        [ drop read >string ]
+   } case ; inline
+
+TYPED: bson-regexp-read ( -- mdbregexp: mdbregexp )
+   mdbregexp new
+   read-cstring >>regexp read-cstring >>options ; inline
+
+TYPED: bson-oid-read ( -- oid: oid )
+    read-longlong read-int32 oid boa ; inline
+
+TYPED: element-data-read ( type: integer -- object )
+    {
+        { T_OID [ bson-oid-read ] }
+        { T_String [ read-int32 read-sized-string ] }
+        { T_Integer [ read-int32 ] }
+        { T_Binary [ bson-binary-read ] }
+        { T_Object [ bson-object-data-read ] }
+        { T_Array [ bson-object-data-read ] }
+        { T_Double [ read-double ] }
+        { T_Boolean [ read-byte 1 = ] }
+        { T_Date [ read-longlong millis>timestamp ] }
+        { T_Regexp [ bson-regexp-read ] }
+        { T_NULL [ f ] }
+    } case ; inline
+
+TYPED: bson-array? ( type: integer -- ?: boolean )
+    T_Array = ; inline
+
+TYPED: bson-object? ( type: integer -- ?: boolean )
+    T_Object = ; inline
+
+: check-object ( assoc -- object )
+    dup dbref-assoc? [ assoc>dbref ] when ; inline
+
+TYPED: fix-result ( assoc type: integer -- result )
+    {
+        { T_Array [ values ] }
+        { T_Object [ check-object ] }
+    } case ; inline
+
+TYPED: end-element ( type: integer -- )
+    { [ bson-object? ] [ bson-array? ] } 1||
+    [ get-state pop-element drop ] unless ; inline
+
+TYPED: (>state<) ( -- state: state scope: vector element: element )
+    get-state [  ] [ scope>> ] [ pop-element ] tri ; inline
+
+TYPED: (prepare-result) ( scope: vector element: element -- result )
+    [ pop ] [ type>> ] bi* fix-result ; inline
+
+: bson-eoo-element-read ( -- cont?: boolean )
+    (>state<)
+    [ (prepare-result) ] [  ] [ drop empty? ] 2tri
+    [ 2drop >>result drop f ]
+    [ swap [ name>> ] [ last ] bi* set-at drop t ] if ; inline
+
+TYPED: (prepare-object) ( type: integer -- object )
+    [ element-data-read ] [ end-element ] bi ; inline
+
+:: (read-object) ( type name state -- )
+    state peek-scope :> scope
+    type (prepare-object) name scope set-at ; inline
+
+TYPED: bson-not-eoo-element-read ( type: integer -- cont?: boolean )
+    read-cstring get-state
+    [ push-element ]
+    [ (read-object) t ] 3bi ; inline
+
+TYPED: (element-read) ( type: integer -- cont?: boolean )
+    dup T_EOO > 
+    [ bson-not-eoo-element-read ]
+    [ drop bson-eoo-element-read ] if ; inline
 
 : read-elements ( -- )
-    read-element-type
-    element-read 
+    read-byte (element-read)
     [ read-elements ] when ; inline recursive
 
-GENERIC: fix-result ( assoc type -- result )
-
-M: bson-object fix-result ( assoc type -- result )
-    drop ;
-
-M: bson-array fix-result ( assoc type -- result )
-    drop values ;
-
-GENERIC: end-element ( type -- )
-
-M: bson-object end-element ( type -- )
-    drop ;
-
-M: bson-array end-element ( type -- )
-    drop ;
-
-M: object end-element ( type -- )
-    pop-element 2drop ;
-
-M:: bson-eoo element-read ( type -- cont? )
-    pop-element :> element
-    get-state scope>>
-    [ pop element type>> fix-result ] [ empty? ] bi
-    [ [ get-state ] dip >>result drop f ]
-    [ element name>> peek-scope set-at t ] if ;
-
-M:: bson-not-eoo element-read ( type -- cont? )
-    peek-scope :> scope
-    type read-cstring [ push-element ] 2keep
-    [ [ element-data-read ] [ end-element ] bi ]
-    [ scope set-at t ] bi* ;
-
-: [scope-changer] ( state -- state quot )
-    dup exemplar>> '[ [ [ _ clone ] dip push ] keep ] ; inline
-
-: (object-data-read) ( type -- object )
-    drop
-    read-int32 drop
-    get-state
-    [scope-changer] change-scope
-    scope>> last ; inline
-    
-M: bson-object element-data-read ( type -- object )
-    (object-data-read) ;
-
-M: bson-string element-data-read ( type -- object )
-    drop
-    read-int32 read-sized-string ;
-
-M: bson-array element-data-read ( type -- object )
-    (object-data-read) ;
-    
-M: bson-integer element-data-read ( type -- object )
-    drop
-    read-int32 ;
-
-M: bson-double element-data-read ( type -- double )
-    drop
-    read-double ;
-
-M: bson-boolean element-data-read ( type -- boolean )
-   drop
-   read-byte 1 = ;
-
-M: bson-date element-data-read ( type -- timestamp )
-   drop
-   read-longlong millis>timestamp ;
-
-M: bson-binary element-data-read ( type -- binary )
-   drop
-   read-int32 read-byte element-binary-read ;
-
-M: bson-regexp element-data-read ( type -- mdbregexp )
-   drop mdbregexp new
-   read-cstring >>regexp read-cstring >>options ;
-M: bson-null element-data-read ( type -- bf  )
-    drop f ;
-
-M: bson-oid element-data-read ( type -- oid )
-    drop
-    read-longlong
-    read-int32 oid boa ;
-
-M: bson-binary-bytes element-binary-read ( size type -- bytes )
-    drop read ;
-
-M: bson-binary-custom element-binary-read ( size type -- quot )
-    drop read bytes>object ;
-
 PRIVATE>
 
-USE: tools.continuations
-
 : stream>assoc ( exemplar -- assoc )
-    <state> dup state
-    [ read-int32 >>size read-elements ] with-variable 
-    result>> ; 
+    <state> read-int32 >>size
+    [ state [ read-elements ] with-variable ]
+    [ result>> ] bi ;
index 58604e699034b9c4e5459c973c1f1ef11bfbb6b7..e0d8b9ca89be2d8da1ef636b9e2566b7e7254ea7 100644 (file)
@@ -1 +1 @@
-BSON reader and writer
+BSON (http://en.wikipedia.org/wiki/BSON) reader and writer
index 2ae8737c70bd03d249a71bb93ddf748c01d8effd..0c494c98488baf29d08f17bc4508f91ba973fbee 100644 (file)
-! Copyright (C) 2008 Sascha Matzke.
+! Copyright (C) 2010 Sascha Matzke.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors assocs bson.constants byte-arrays byte-vectors
-calendar fry io io.binary io.encodings io.encodings.binary
-io.encodings.utf8 io.streams.byte-array kernel math math.parser
-namespaces quotations sequences sequences.private serialize strings
-words combinators.short-circuit literals ;
-
-FROM: io.encodings.utf8.private => char>utf8 ;
-FROM: kernel.private => declare ;
-
+USING: accessors arrays assocs bson.constants byte-arrays
+calendar combinators.short-circuit fry hashtables io io.binary
+kernel linked-assocs literals math math.parser namespaces byte-vectors
+quotations sequences serialize strings vectors dlists alien.accessors ;
+FROM: words => word? word ;
+FROM: typed => TYPED: ;
+FROM: combinators => cond ;
 IN: bson.writer
 
 <PRIVATE
 
-SYMBOL: shared-buffer 
-
-CONSTANT: CHAR-SIZE  1
-CONSTANT: INT32-SIZE 4
-CONSTANT: INT64-SIZE 8
+CONSTANT: INT32-SIZE { 0 1 2 3 }
+CONSTANT: INT64-SIZE { 0 1 2 3 4 5 6 7 }
 
-: (buffer) ( -- buffer )
-    shared-buffer get
-    [ BV{ } clone [ shared-buffer set ] keep ] unless*
-    { byte-vector } declare ; inline 
-    
 PRIVATE>
 
-: reset-buffer ( buffer -- )
-    0 >>length drop ; inline
-
-: ensure-buffer ( -- )
-    (buffer) drop ; inline
+TYPED: get-output ( -- stream: byte-vector )
+    output-stream get ; inline
 
-: with-buffer ( ..a quot: ( ..a -- ..b ) -- ..b byte-vector )
-    [ (buffer) [ reset-buffer ] keep dup ] dip
-    with-output-stream* ; inline
-
-: with-length ( ..a quot: ( ..a -- ..b ) -- ..b bytes-written start-index )
-    [ (buffer) [ length ] keep ] dip
+TYPED: with-length ( quot -- bytes-written: integer start-index: integer )
+    [ get-output [ length ] [ ] bi ] dip
     call length swap [ - ] keep ; inline
 
-: (with-length-prefix) ( ..a quot: ( ..a -- ..b ) length-quot: ( bytes-written -- length ) -- ..b )
+: (with-length-prefix) ( quot: ( .. -- .. ) length-quot: ( bytes-written -- length ) -- )
     [ [ B{ 0 0 0 0 } write ] prepose with-length ] dip swap
-    [ call ] dip (buffer) copy ; inline
+    [ call( written -- length ) get-output underlying>> ] dip set-alien-unsigned-4 ; inline
 
-: with-length-prefix ( ..a quot: ( ..a -- ..b ) -- ..b )
-    [ INT32-SIZE >le ] (with-length-prefix) ; inline
+: with-length-prefix ( quot: ( .. -- .. ) -- )
+    [ ] (with-length-prefix) ; inline
     
-: with-length-prefix-excl ( ..a quot: ( ..a -- ..b ) -- ..b )
-    [ INT32-SIZE [ - ] keep >le ] (with-length-prefix) ; inline
+: with-length-prefix-excl ( quot: ( .. -- .. ) -- )
+    [ 4 - ] (with-length-prefix) ; inline
+
+: (>le) ( x n -- )
+    [ nth-byte write1 ] with each ; inline
     
 <PRIVATE
 
-GENERIC: bson-type? ( obj -- type ) 
-GENERIC: bson-write ( obj -- ) 
+TYPED: write-int32 ( int: integer -- ) INT32-SIZE (>le) ; inline
 
-M: t bson-type? ( boolean -- type ) drop T_Boolean ; 
-M: f bson-type? ( boolean -- type ) drop T_Boolean ; 
+TYPED: write-double ( real: float -- ) double>bits INT64-SIZE (>le) ; inline
 
-M: string bson-type? ( string -- type ) drop T_String ; 
-M: integer bson-type? ( integer -- type ) drop T_Integer ; 
-M: assoc bson-type? ( assoc -- type ) drop T_Object ;
-M: real bson-type? ( real -- type ) drop T_Double ; 
-M: tuple bson-type? ( tuple -- type ) drop T_Object ;  
-M: sequence bson-type? ( seq -- type ) drop T_Array ;
-M: timestamp bson-type? ( timestamp -- type ) drop T_Date ;
-M: mdbregexp bson-type? ( regexp -- type ) drop T_Regexp ;
+TYPED: write-cstring ( string: string -- )
+    get-output [ length ] [  ] bi copy 0 write1 ; inline
 
-M: oid bson-type? ( word -- type ) drop T_OID ;
-M: objref bson-type? ( objref -- type ) drop T_Binary ;
-M: word bson-type? ( word -- type ) drop T_Binary ;
-M: quotation bson-type? ( quotation -- type ) drop T_Binary ; 
-M: byte-array bson-type? ( byte-array -- type ) drop T_Binary ; 
-
-: write-int32 ( int -- ) INT32-SIZE >le write ; inline
-: write-double ( real -- ) double>bits INT64-SIZE >le write ; inline
-: write-cstring ( string -- ) B{ } like write 0 write1 ; inline
-: write-longlong ( object -- ) INT64-SIZE >le write ; inline
+: write-longlong ( object -- ) INT64-SIZE (>le) ; inline
 
 : write-eoo ( -- ) T_EOO write1 ; inline
-: write-type ( obj -- obj ) [ bson-type? write1 ] keep ; inline
-: write-pair ( name object -- ) write-type [ write-cstring ] dip bson-write ; inline
-
-M: string bson-write ( obj -- )
-    '[ _ write-cstring ] with-length-prefix-excl ;
 
-M: f bson-write ( f -- )
-    drop 0 write1 ; 
+TYPED: write-header ( name: string object type: integer -- object )
+    write1 [ write-cstring ] dip ; inline
 
-M: t bson-write ( t -- )
-    drop 1 write1 ;
+DEFER: write-pair
 
-M: integer bson-write ( num -- )
-    write-int32 ;
+TYPED: write-byte-array ( binary: byte-array -- )
+    [ length write-int32 ]
+    [ T_Binary_Bytes write1 write ] bi ; inline
 
-M: real bson-write ( num -- )
-    >float write-double ;
-
-M: timestamp bson-write ( timestamp -- )
-    timestamp>millis write-longlong ;
-
-M: byte-array bson-write ( binary -- )
-    [ length write-int32 ] keep
-    T_Binary_Bytes write1
-    write ; 
-
-M: oid bson-write ( oid -- )
-    [ a>> write-longlong ] [ b>> write-int32 ] bi ;
-       
-M: mdbregexp bson-write ( regexp -- )
+TYPED: write-mdbregexp ( regexp: mdbregexp -- )
    [ regexp>> write-cstring ]
-   [ options>> write-cstring ] bi ; 
-    
-M: sequence bson-write ( array -- )
-    '[ _ [ [ write-type ] dip number>string
-           write-cstring bson-write ] each-index
-       write-eoo ] with-length-prefix ;
-
-: write-oid ( assoc -- )
-    [ MDB_OID_FIELD ] dip at
-    [ [ MDB_OID_FIELD ] dip write-pair ] when* ; inline
-
-: skip-field? ( name -- boolean )
-   { $[ MDB_OID_FIELD MDB_META_FIELD ] } member? ; inline
-
-M: assoc bson-write ( assoc -- )
-    '[
-        _  [ write-oid ] keep
-        [ over skip-field? [ 2drop ] [ write-pair ] if ] assoc-each
-        write-eoo
-    ] with-length-prefix ;
-
-: (serialize-code) ( code -- )
-    object>bytes [ length write-int32 ] keep
-    T_Binary_Custom write1
-    write ;
+   [ options>> write-cstring ] bi ; inline
 
-M: quotation bson-write ( quotation -- )
-    (serialize-code) ;
-    
-M: word bson-write ( word -- )
-    (serialize-code) ;
+TYPED: write-sequence ( array: sequence -- )
+   '[
+        _ [ number>string swap write-pair ] each-index
+        write-eoo
+    ] with-length-prefix ; inline recursive
+
+TYPED: write-oid ( oid: oid -- )
+    [ a>> write-longlong ] [ b>> write-int32 ] bi ; inline
+
+: write-oid-field ( assoc -- )
+    [ MDB_OID_FIELD dup ] dip at
+    [ dup oid? [ T_OID write-header write-oid ] [ write-pair ] if ] 
+    [ drop ] if* ; inline
+
+: skip-field? ( name value -- name value boolean )
+    over { [ MDB_OID_FIELD = ] [ MDB_META_FIELD = ] } 1|| ; inline
+
+UNION: hashtables hashtable linked-assoc ;
+
+TYPED: write-assoc ( assoc: hashtables -- )
+    '[ _ [ write-oid-field ] [
+            [ skip-field? [ 2drop ] [ write-pair ] if ] assoc-each 
+         ] bi write-eoo
+    ] with-length-prefix ; inline recursive
+
+UNION: code word quotation ;
+
+TYPED: (serialize-code) ( code: code -- )
+  object>bytes
+  [ length write-int32 ]
+  [ T_Binary_Custom write1 write ] bi ; inline
+
+TYPED: write-string ( string: string -- )
+    '[ _ write-cstring ] with-length-prefix-excl ; inline
+
+TYPED: write-boolean ( bool: boolean -- )
+    [ 1 write1 ] [ 0 write1 ] if ; inline
+
+TYPED: write-pair ( name: string obj -- )
+    {
+        {
+            [ dup { [ hashtable? ] [ linked-assoc? ] } 1|| ]
+            [ T_Object write-header write-assoc ]
+        } {
+            [ dup { [ array? ] [ vector? ] [ dlist? ] } 1|| ]
+            [ T_Array write-header write-sequence ]
+        } {
+            [ dup byte-array? ]
+            [ T_Binary write-header write-byte-array ]
+        } {
+            [ dup string? ]
+            [ T_String write-header write-string ]
+        } {
+            [ dup oid? ]
+            [ T_OID write-header write-oid ]
+        } {
+            [ dup integer? ]
+            [ T_Integer write-header write-int32 ]
+        } {
+            [ dup boolean? ] 
+            [ T_Boolean write-header write-boolean ]
+        } {
+            [ dup real? ]
+            [ T_Double write-header >float write-double ]
+        } {
+            [ dup timestamp? ]
+            [ T_Date write-header timestamp>millis write-longlong ]
+        } {
+            [ dup mdbregexp? ]
+            [ T_Regexp write-header write-mdbregexp ]
+        } {
+            [ dup quotation? ]
+            [ T_Binary write-header (serialize-code) ]
+        } {
+            [ dup word? ]
+            [ T_Binary write-header (serialize-code) ]
+        } {
+            [ dup dbref? ]
+            [ T_Object write-header dbref>assoc write-assoc ]
+        } {
+            [ dup f = ]
+            [ T_NULL write-header drop ]
+        }
+    } cond ;
 
 PRIVATE>
 
-: assoc>bv ( assoc -- byte-vector )
-    [ '[ _ bson-write ] with-buffer ] with-scope ; inline
+TYPED: assoc>bv ( assoc: hashtables -- byte-vector: byte-vector )
+    [ BV{ } clone dup ] dip '[ _ write-assoc ] with-output-stream* ; inline
 
-: assoc>stream ( assoc -- )
-    { assoc } declare bson-write ; inline
+TYPED: assoc>stream ( assoc: hashtables -- )
+    write-assoc ; inline
 
-: mdb-special-value? ( value -- ? )
+TYPED: mdb-special-value? ( value -- ?: boolean )
    { [ timestamp? ] [ quotation? ] [ mdbregexp? ]
-     [ oid? ] [ byte-array? ] } 1|| ; inline
+     [ oid? ] [ byte-array? ] } 1|| ; inline
\ No newline at end of file
index 9e613d54b44f6871f222e302a0e3999c612a7e73..a42c422bb8be58f5a8a20871d5cbe8cf00a564b1 100644 (file)
@@ -2,8 +2,8 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors combinators combinators.short-circuit
 generalizations kernel locals math.order math.ranges
-sequences.parser sequences sorting.functor sorting.slots
-unicode.categories ;
+sequences.parser sequences sequences.generalizations
+sorting.functor sorting.slots unicode.categories ;
 IN: c.lexer
 
 : take-c-comment ( sequence-parser -- seq/f )
index c110349db576e5dfbd43f91df18a490bf27f86da..7d11b116fbfb04155c2998a16e958ae6d986fd50 100644 (file)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2010 Erik Charlebois
 ! See http:// factorcode.org/license.txt for BSD license.
-USING: accessors alien chipmunk.ffi classes.struct game.worlds kernel
-locals math method-chains opengl.gl random sequences specialized-arrays
-specialized-arrays.instances.alien.c-types.void* ui ui.gadgets.worlds
+USING: accessors alien chipmunk.ffi classes.struct game.loop
+game.worlds kernel literals locals math method-chains opengl.gl
+random sequences specialized-arrays ui ui.gadgets.worlds
 ui.pixel-formats ;
+SPECIALIZED-ARRAY: void*
 IN: chipmunk.demo
 
 CONSTANT: image-width      188
@@ -144,7 +145,7 @@ M: chipmunk-world end-game-world
              { windowed double-buffered }
            }
            { pref-dim { 640 480 } }
-           { tick-interval-micros 16666 }
+           { tick-interval-nanos $[ 60 fps ] }
         }
         clone
         open-window
index 51df4e8de6e360f1654d152c7b1928b618a9243c..6701e613249d2fec2f15b7eeb130cb4442c5cf7e 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2009 Slava Pestov, Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs classes classes.tuple
-effects.parser fry generalizations generic.standard kernel
-lexer locals macros parser sequences sets slots vocabs words ;
+effects.parser fry generalizations sequences.generalizations
+generic.standard kernel lexer locals macros parser sequences
+sets slots vocabs words ;
 IN: constructors
 
 ! An experiment
diff --git a/extra/cuda/contexts/contexts.factor b/extra/cuda/contexts/contexts.factor
new file mode 100644 (file)
index 0000000..7a9ab59
--- /dev/null
@@ -0,0 +1,34 @@
+! (c)2010 Joe Groff bsd license
+USING: alien.c-types alien.data continuations cuda cuda.ffi
+cuda.libraries alien.destructors fry kernel namespaces ;
+IN: cuda.contexts
+
+: set-up-cuda-context ( -- )
+    H{ } clone cuda-modules set-global
+    H{ } clone cuda-functions set-global ; inline
+
+: create-context ( device flags -- context )
+    swap
+    [ CUcontext <c-object> ] 2dip
+    [ cuCtxCreate cuda-error ] 3keep 2drop *void* ; inline
+
+: sync-context ( -- )
+    cuCtxSynchronize cuda-error ; inline
+
+: context-device ( -- n )
+    CUdevice <c-object> [ cuCtxGetDevice cuda-error ] keep *int ; inline
+
+: destroy-context ( context -- ) cuCtxDestroy cuda-error ; inline
+
+: clean-up-context ( context -- )
+    [ sync-context ] ignore-errors destroy-context ; inline
+
+DESTRUCTOR: destroy-context
+DESTRUCTOR: clean-up-context
+
+: (with-cuda-context) ( context quot -- )
+    swap '[ _ clean-up-context ] [ ] cleanup ; inline
+
+: with-cuda-context ( device flags quot -- )
+    [ set-up-cuda-context create-context ] dip (with-cuda-context) ; inline
+
index 893058eec5e4642e169ed624a8c51141c553db2a..2e2cdd660f0768c179dd9ca5180336b85cae18cb 100644 (file)
@@ -2,93 +2,22 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.data alien.parser alien.strings
 alien.syntax arrays assocs byte-arrays classes.struct
-combinators continuations cuda.ffi cuda.memory cuda.utils
+combinators continuations cuda.ffi
 destructors fry init io io.backend io.encodings.string
 io.encodings.utf8 kernel lexer locals macros math math.parser
 namespaces opengl.gl.extensions parser prettyprint quotations
-sequences words cuda.libraries ;
+sequences words ;
 QUALIFIED-WITH: alien.c-types c
 IN: cuda
 
-TUPLE: launcher
-{ device integer initial: 0 }
-{ device-flags initial: 0 } ;
+TUPLE: cuda-error code ;
 
-: <launcher> ( device-id -- launcher )
-    launcher new
-        swap >>device ; inline
+: cuda-error ( code -- )
+    dup CUDA_SUCCESS = [ drop ] [ \ cuda-error boa throw ] if ;
 
-TUPLE: function-launcher
-dim-grid dim-block shared-size stream ;
+: cuda-version ( -- n )
+    c:int <c-object> [ cuDriverGetVersion cuda-error ] keep c:*int ;
 
-: (set-up-cuda-context) ( flags device create-quot -- )
-    H{ } clone cuda-modules set-global
-    H{ } clone cuda-functions set
-    call ; inline
+: init-cuda ( -- )
+    0 cuInit cuda-error ; inline
 
-: (with-cuda-context) ( context quot -- )
-    [ '[ _ @ ] ]
-    [ drop '[ [ sync-context ] ignore-errors _ destroy-context ] ] 2bi
-    [ ] cleanup ; inline
-
-: with-cuda-context ( flags device quot -- )
-    [ [ create-context ] (set-up-cuda-context) ] dip (with-cuda-context) ; inline
-
-: with-cuda-program ( flags device quot -- )
-    [ dup cuda-device set ] 2dip
-    '[ cuda-context set _ call ] with-cuda-context ; inline
-
-: with-cuda ( launcher quot -- )
-    init-cuda [
-        [ cuda-launcher set ]
-        [ [ device>> ] [ device-flags>> ] bi ] bi
-    ] [ with-cuda-program ] bi* ; inline
-
-: c-type>cuda-setter ( c-type -- n cuda-type )
-    {
-        { [ dup c:int = ] [ drop 4 [ cuda-int* ] ] }
-        { [ dup c:uint = ] [ drop 4 [ cuda-int* ] ] }
-        { [ dup c:float = ] [ drop 4 [ cuda-float* ] ] }
-        { [ dup c:pointer? ] [ drop 4 [ cuda-int* ] ] }
-        { [ dup c:void* = ] [ drop 4 [ cuda-int* ] ] }
-    } cond ;
-
-<PRIVATE
-: block-dim ( block -- x y z )
-    dup sequence? [ 3 1 pad-tail first3 ] [ 1 1 ] if ; inline
-: grid-dim ( block -- x y )
-    dup sequence? [ 2 1 pad-tail first2 ] [ 1 ] if ; inline
-PRIVATE>
-
-: run-function-launcher ( function-launcher function -- )
-    swap
-    {
-        [ dim-block>> block-dim function-block-shape* ]
-        [ shared-size>> function-shared-size* ]
-        [
-            dim-grid>>
-            [ grid-dim launch-function-grid* ]
-            [ launch-function* ] if*
-        ]
-    } 2cleave ;
-
-: cuda-argument-setter ( offset c-type -- offset' quot )
-    c-type>cuda-setter
-    [ over [ + ] dip ] dip
-    '[ swap _ swap _ call ] ;
-
-MACRO: cuda-arguments ( c-types -- quot: ( args... function -- ) )
-    [ 0 ] dip [ cuda-argument-setter ] map reverse
-    swap '[ _ param-size* ] suffix
-    '[ _ cleave ] ;
-
-: define-cuda-word ( word module-name function-name arguments -- )
-    [
-        '[
-            _ _ cached-function
-            [ nip _ cuda-arguments ]
-            [ run-function-launcher ] 2bi
-        ]
-    ]
-    [ 2nip \ function-launcher suffix c:void function-effect ]
-    3bi define-declared ;
index 5db01e412ac576c84baff215b6539839e3a175f8..8a7adb7b4deff499d7f8524ab08e30bf53acb2d9 100644 (file)
@@ -1,23 +1,24 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.strings cuda cuda.devices
-cuda.memory cuda.syntax cuda.utils destructors io
-io.encodings.string io.encodings.utf8 kernel locals math
-math.parser namespaces sequences byte-arrays strings ;
+USING: accessors alien.c-types alien.strings byte-arrays cuda
+cuda.contexts cuda.devices cuda.libraries cuda.memory cuda.syntax
+destructors io io.encodings.string io.encodings.utf8 kernel locals
+math math.parser namespaces sequences strings ;
 IN: cuda.demos.hello-world
 
-CUDA-LIBRARY: hello vocab:cuda/demos/hello-world/hello.ptx
+CUDA-LIBRARY: hello cuda32 vocab:cuda/demos/hello-world/hello.ptx
 
 CUDA-FUNCTION: helloWorld ( char* string-ptr ) ;
 
 : cuda-hello-world ( -- )
+    init-cuda
     [
         [
-            cuda-launcher get device>> number>string
+            context-device number>string
             "CUDA device " ": " surround write
             "Hello World!" >byte-array [ - ] map-index host>device &cuda-free
 
-            [ { 2 1 } { 6 1 1 } 2<<< helloWorld ]
+            [ { 2 1 } { 6 1 1 } <grid> helloWorld ]
             [ 12 device>host >string print ] bi
         ] with-destructors
     ] with-each-cuda-device ;
index c7e59b515a15b62bead8d6c47d9e1030c8f09189..d217f61c608400c066c7c924ee04d0ad30ec0756 100644 (file)
@@ -1,16 +1,16 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien.c-types cuda cuda.syntax locals ;
+USING: alien.c-types cuda cuda.contexts cuda.libraries cuda.syntax locals ;
 IN: cuda.demos.prefix-sum
 
-CUDA-LIBRARY: prefix-sum vocab:cuda/demos/prefix-sum/prefix-sum.ptx
+CUDA-LIBRARY: prefix-sum cuda32 vocab:cuda/demos/prefix-sum/prefix-sum.ptx
 
 CUDA-FUNCTION: prefix_sum_block ( uint* in, uint* out, uint n ) ;
 
 :: cuda-prefix-sum ( -- )
-    T{ launcher { device 0 } }
-    [
-        ! { 1 1 1 } { 2 1 } 0 3<<< prefix_sum_block
-    ] with-cuda ;
+    init-cuda
+    0 0 [
+        ! { 1 1 1 } { 2 1 } 0 <grid-shared> prefix_sum_block
+    ] with-cuda-context ;
 
 MAIN: cuda-prefix-sum
index 7ad7b32c8d5e5d9563dce96cd7dbb900957a9c71..4e7a50e6f20e4b81e12c7745de488b14da9e1ae7 100644 (file)
@@ -1,9 +1,10 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien.c-types alien.data alien.strings arrays
-assocs byte-arrays classes.struct combinators cuda cuda.ffi
-cuda.syntax cuda.utils fry io io.encodings.utf8 kernel locals
-math math.order math.parser namespaces prettyprint sequences ;
+assocs byte-arrays classes.struct combinators cuda
+cuda.contexts cuda.ffi cuda.libraries fry io io.encodings.utf8
+kernel locals math math.order math.parser namespaces
+prettyprint sequences ;
 IN: cuda.devices
 
 : #cuda-devices ( -- n )
@@ -16,7 +17,7 @@ IN: cuda.devices
     #cuda-devices iota [ n>cuda-device ] map ;
 
 : with-each-cuda-device ( quot -- )
-    [ enumerate-cuda-devices ] dip '[ <launcher> _ with-cuda ] each ; inline
+    [ enumerate-cuda-devices ] dip '[ 0 _ with-cuda-context ] each ; inline
 
 : cuda-device-properties ( n -- properties )
     [ CUdevprop <struct> ] dip
@@ -70,6 +71,9 @@ IN: cuda.devices
 : up/i ( x y -- z )
     [ 1 - + ] keep /i ; inline
 
+: context-device-properties ( -- props )
+    context-device cuda-device-properties ; inline
+
 :: (distribute-jobs) ( job-count per-job-shared max-shared-size max-block-size
                        -- grid-size block-size per-block-shared )
     per-job-shared [ max-block-size ] [ max-shared-size swap /i max-block-size min ] if-zero
@@ -81,6 +85,6 @@ IN: cuda.devices
     grid-size block-size per-block-shared ; inline
 
 : distribute-jobs ( job-count per-job-shared -- launcher )
-    cuda-device get cuda-device-properties 
-    [ sharedMemPerBlock>> ] [ maxThreadsDim>> first ] bi
-    (distribute-jobs) 3<<< ; inline
+    context-device-properties
+    [ sharedMemPerBlock>> ] [ maxThreadsPerBlock>> ] bi
+    (distribute-jobs) <grid-shared> ; inline
index bcbb1ff60a48edf82d97f358fcabe8dd9860b293..c0537bea8dc540348410072cb5309f07ace8b2a3 100644 (file)
@@ -28,15 +28,6 @@ TYPEDEF: void* CUgraphicsResource
 
 SYMBOLS: CUdouble CUlonglong CUulonglong ;
 
-: >cuda-param-type ( c-type -- c-type' )
-    {
-        { CUdeviceptr [ void* ] }
-        { double      [ CUdouble ] }
-        { longlong    [ CUlonglong ] }
-        { ulonglong   [ CUulonglong ] }
-        [ ]
-    } case ;
-
 <<
 : always-8-byte-align ( c-type -- c-type )
     8 >>align 8 >>align-first ;
index c08ee92a8c943a40a5e8a78cf804a7ca38016ba3..8c20efde3b9e229f5e6f9ac4f4bb5513ce3ffc99 100644 (file)
@@ -2,6 +2,8 @@
 USING: alien.c-types alien.syntax cuda.ffi opengl.gl ;
 IN: cuda.gl.ffi
 
+LIBRARY: cuda
+
 FUNCTION: CUresult cuGLCtxCreate ( CUcontext* pCtx, uint Flags, CUdevice device ) ;
 FUNCTION: CUresult cuGraphicsGLRegisterBuffer ( CUgraphicsResource* pCudaResource, GLuint buffer, uint Flags ) ;
 FUNCTION: CUresult cuGraphicsGLRegisterImage ( CUgraphicsResource* pCudaResource, GLuint image, GLenum target, uint Flags ) ;
index 2250c895e0112c14fecd1421ba823a58f4f82582..d4943e1350a4ce9d47eb4551ff3dbde588c36ecf 100644 (file)
@@ -1,17 +1,19 @@
 ! (c)2010 Joe Groff bsd license
-USING: accessors alien.c-types alien.data alien.destructors
-continuations cuda cuda.ffi cuda.gl.ffi cuda.utils destructors
-fry gpu.buffers kernel ;
+USING: accessors alien alien.c-types alien.data alien.destructors
+alien.enums continuations cuda cuda.contexts cuda.ffi
+cuda.gl.ffi destructors fry gpu.buffers kernel ;
 IN: cuda.gl
 
-: create-gl-cuda-context ( flags device -- context )
+: create-gl-cuda-context ( device flags -- context )
+    swap
     [ CUcontext <c-object> ] 2dip
     [ cuGLCtxCreate cuda-error ] 3keep 2drop *void* ; inline
 
-: with-gl-cuda-context ( flags device quot -- )
-    [ [ create-gl-cuda-context ] (set-up-cuda-context) ] dip (with-cuda-context) ; inline 
+: with-gl-cuda-context ( device flags quot -- )
+    [ set-up-cuda-context create-gl-cuda-context ] dip (with-cuda-context) ; inline 
 
 : gl-buffer>resource ( gl-buffer flags -- resource )
+    enum>number
     [ CUgraphicsResource <c-object> ] 2dip
     [ cuGraphicsGLRegisterBuffer cuda-error ] 3keep 2drop *void* ; inline
 
@@ -37,3 +39,17 @@ DESTRUCTOR: free-resource
 
 : with-mapped-resource ( ..a resource quot: ( ..a device-ptr size -- ..b ) -- ..b )
     over [ map-resource ] 2dip '[ _ unmap-resource ] [ ] cleanup ; inline
+
+TUPLE: cuda-buffer
+    { buffer buffer }
+    { resource pinned-c-ptr } ;
+
+: <cuda-buffer> ( upload usage kind size initial-data flags -- buffer )
+    [ <buffer> dup ] dip buffer>resource cuda-buffer boa ; inline
+
+M: cuda-buffer dispose
+    [ [ free-resource ] when* f ] change-resource
+    buffer>> dispose ; inline
+
+: with-mapped-cuda-buffer ( ..a cuda-buffer quot: ( ..a device-ptr size -- ..b ) -- ..b )
+    [ resource>> ] dip with-mapped-resource ; inline
index 93b984291919e9125a7cfaf335bbba5532b2c999..e930745a17d08b23dc3093e2b4182378f96a33c8 100644 (file)
@@ -1,33 +1,81 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data arrays assocs
-cuda.ffi cuda.utils io.backend kernel namespaces sequences ;
+USING: accessors alien.data alien.parser arrays assocs
+byte-arrays classes.struct combinators combinators.short-circuit
+cuda cuda.ffi fry generalizations io.backend kernel macros math
+namespaces sequences variants words ;
+FROM: classes.struct.private => compute-struct-offsets write-struct-slot ;
+QUALIFIED-WITH: alien.c-types c
 IN: cuda.libraries
 
+VARIANT: cuda-abi
+    cuda32 cuda64 ;
+
+SYMBOL: cuda-modules
+SYMBOL: cuda-functions
+
 SYMBOL: cuda-libraries
 cuda-libraries [ H{ } clone ] initialize
 
 SYMBOL: current-cuda-library
 
-TUPLE: cuda-library name path handle ;
+: ?delete-at ( key assoc -- old/key ? )
+    2dup delete-at* [ 2nip t ] [ 2drop f ] if ; inline
 
-: <cuda-library> ( name path -- obj )
-    \ cuda-library new
-        swap >>path
-        swap >>name ;
+: cuda-param-size ( function n -- )
+    cuParamSetSize cuda-error ; inline
 
-: add-cuda-library ( name path -- )
-    normalize-path <cuda-library>
-    dup name>> cuda-libraries get-global set-at ;
+: cuda-vector ( function offset ptr n -- )
+    cuParamSetv cuda-error ; inline
 
-: ?delete-at ( key assoc -- old/key ? )
-    2dup delete-at* [ 2nip t ] [ 2drop f ] if ; inline
+: launch-function-grid ( function width height -- )
+    cuLaunchGrid cuda-error ; inline
 
-ERROR: no-cuda-library name ;
+: function-block-shape ( function x y z -- )
+    cuFuncSetBlockShape cuda-error ; inline
+
+: function-shared-size ( function n -- )
+    cuFuncSetSharedSize cuda-error ; inline
+
+TUPLE: grid
+    { dim-grid read-only }
+    { dim-block read-only }
+    { shared-size read-only initial: 0 }
+    { stream read-only } ;
+
+: <grid> ( dim-grid dim-block -- grid )
+    0 f grid boa ; inline
+
+: <grid-shared> ( dim-grid dim-block shared-size -- grid )
+    f grid boa ; inline
+
+: <grid-shared-stream> ( dim-grid dim-block shared-size stream -- grid )
+    grid boa ; inline
+
+<PRIVATE
+GENERIC: block-dim ( block-size -- x y z ) foldable
+M: integer block-dim 1 1 ; inline
+M: sequence block-dim
+    dup length {
+        { 0 [ drop 1 1 1 ] }
+        { 1 [ first 1 1 ] }
+        { 2 [ first2 1 ] }
+        [ drop first3 ]
+    } case ; inline
+
+GENERIC: grid-dim ( grid-size -- x y ) foldable
+M: integer grid-dim 1 ; inline
+M: sequence grid-dim
+    dup length {
+        { 0 [ drop 1 1 ] }
+        { 1 [ first 1 ] }
+        [ drop first2 ]
+    } case ; inline
+PRIVATE>
 
 : load-module ( path -- module )
     [ CUmodule <c-object> ] dip
-    [ cuModuleLoad cuda-error ] 2keep drop *void* ;
+    [ cuModuleLoad cuda-error ] 2keep drop c:*void* ;
 
 : unload-module ( module -- )
     cuModuleUnload cuda-error ;
@@ -35,6 +83,8 @@ ERROR: no-cuda-library name ;
 : load-cuda-library ( library -- handle )
     path>> load-module ;
 
+ERROR: no-cuda-library name ;
+
 : lookup-cuda-library ( name -- cuda-library )
     cuda-libraries get ?at [ no-cuda-library ] unless ;
 
@@ -44,10 +94,110 @@ ERROR: no-cuda-library name ;
 : unload-cuda-library ( name -- )
     remove-cuda-library handle>> unload-module ;
 
+: launch-function ( function -- ) cuLaunch cuda-error ; inline
+
+: run-grid ( grid function -- )
+    swap
+    {
+        [ dim-block>> block-dim function-block-shape ]
+        [ shared-size>> function-shared-size ]
+        [
+            dim-grid>>
+            [ grid-dim launch-function-grid ]
+            [ launch-function ] if*
+        ]
+    } 2cleave ; inline
+
+<PRIVATE
+: make-param-buffer ( function size -- buffer size )
+    [ cuda-param-size ] [ (byte-array) ] [ ] tri ; inline
+
+: fill-param-buffer ( values... buffer quots... n -- )
+    [ cleave-curry ] [ spread* ] bi ; inline
+
+: pointer-argument-type? ( c-type -- ? )
+    { [ c:void* = ] [ CUdeviceptr = ] [ c:pointer? ] } 1|| ;
+
+: abi-pointer-type ( abi -- type )
+    {
+        { cuda32 [ c:uint ] }
+        { cuda64 [ CUulonglong ] }
+    } case ;
+
+: >argument-type ( c-type abi -- c-type' )
+    swap {
+        { [ dup pointer-argument-type? ] [ drop abi-pointer-type ] }
+        { [ dup c:double    = ] [ 2drop CUdouble ] }
+        { [ dup c:longlong  = ] [ 2drop CUlonglong ] }
+        { [ dup c:ulonglong = ] [ 2drop CUulonglong ] }
+        [ nip ]
+    } cond ;
+
+: >argument-struct-slot ( c-type abi -- slot )
+    >argument-type "cuda-arg" swap { } <struct-slot-spec> ;
+
+: [cuda-arguments] ( c-types abi -- quot )
+    '[ _ >argument-struct-slot ] map
+    [ compute-struct-offsets ]
+    [ [ '[ _ write-struct-slot ] ] [ ] map-as ]
+    [ length ] tri
+    '[
+        [ _ make-param-buffer [ drop @ _ fill-param-buffer ] 2keep ]
+        [ '[ _ 0 ] 2dip cuda-vector ] bi
+    ] ;
+PRIVATE>
+
+MACRO: cuda-arguments ( c-types abi -- quot: ( args... function -- ) )
+    [ [ 0 cuda-param-size ] ] swap '[ _ [cuda-arguments] ] if-empty ;
+
+: get-function-ptr ( module string -- function )
+    [ CUfunction <c-object> ] 2dip
+    [ cuModuleGetFunction cuda-error ] 3keep 2drop c:*void* ;
+
 : cached-module ( module-name -- alien )
     lookup-cuda-library
     cuda-modules get-global [ load-cuda-library ] cache ;
 
 : cached-function ( module-name function-name -- alien )
     [ cached-module ] dip
-    2array cuda-functions get [ first2 get-function-ptr* ] cache ;
+    2array cuda-functions get [ first2 get-function-ptr ] cache ;
+
+MACRO: cuda-invoke ( module-name function-name arguments -- )
+    pick lookup-cuda-library abi>> '[
+        _ _ cached-function
+        [ nip _ _ cuda-arguments ]
+        [ run-grid ] 2bi
+    ] ;
+
+: cuda-global* ( module-name symbol-name -- device-ptr size )
+    [ CUdeviceptr <c-object> c:uint <c-object> ] 2dip
+    [ cached-module ] dip 
+    '[ _ _ cuModuleGetGlobal cuda-error ] 2keep [ c:*uint ] bi@ ; inline
+
+: cuda-global ( module-name symbol-name -- device-ptr )
+    cuda-global* drop ; inline
+
+: define-cuda-function ( word module-name function-name arguments -- )
+    [ '[ _ _ _ cuda-invoke ] ]
+    [ 2nip \ grid suffix c:void function-effect ]
+    3bi define-inline ;
+
+: define-cuda-global ( word module-name symbol-name -- )
+    '[ _ _ cuda-global ] (( -- device-ptr )) define-inline ;
+
+TUPLE: cuda-library name abi path handle ;
+ERROR: bad-cuda-abi abi ;
+
+: check-cuda-abi ( abi -- abi )
+    dup cuda-abi? [ bad-cuda-abi ] unless ; inline
+
+: <cuda-library> ( name abi path -- obj )
+    \ cuda-library new
+        swap >>path
+        swap check-cuda-abi >>abi
+        swap >>name ; inline
+
+: add-cuda-library ( name abi path -- )
+    normalize-path <cuda-library>
+    dup name>> cuda-libraries get-global set-at ;
+
index b9bfd768d82c3517b6fff056902983c63f399717..f3c452093a7ea044e2e2d6e732c82406698bd527 100644 (file)
@@ -1,8 +1,9 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.data alien.destructors assocs
-byte-arrays cuda.ffi cuda.utils destructors fry io.encodings.string
-io.encodings.utf8 kernel locals math namespaces sequences strings ;
+byte-arrays cuda cuda.ffi destructors fry io.encodings.string
+io.encodings.utf8 kernel locals math namespaces sequences
+strings ;
 QUALIFIED-WITH: alien.c-types c
 IN: cuda.memory
 
index 237a87f90099449da38e93a2d4b1a36246d3cce9..09b7786cf96fec22ddcd2466fc0d5a70c2a47948 100644 (file)
@@ -1,23 +1,18 @@
 ! Copyright (C) 2010 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: alien.parser cuda cuda.libraries cuda.utils io.backend
-kernel lexer namespaces parser ;
+USING: alien.parser cuda cuda.libraries io.backend
+fry kernel lexer namespaces parser ;
 IN: cuda.syntax
 
 SYNTAX: CUDA-LIBRARY:
-    scan scan normalize-path
-    [ add-cuda-library ]
-    [ drop current-cuda-library set-global ] 2bi ;
+    scan scan-word scan
+    '[ _ _ add-cuda-library ]
+    [ current-cuda-library set-global ] bi ;
 
 SYNTAX: CUDA-FUNCTION:
-    scan [ create-in current-cuda-library get ] [ ] bi
-    ";" scan-c-args drop define-cuda-word ;
+    scan [ create-in current-cuda-library get ] keep
+    ";" scan-c-args drop define-cuda-function ;
 
-: 2<<< ( dim-grid dim-block -- function-launcher )
-    0 f function-launcher boa ; inline
-
-: 3<<< ( dim-grid dim-block shared-size -- function-launcher )
-    f function-launcher boa ; inline
-
-: 4<<< ( dim-grid dim-block shared-size stream -- function-launcher )
-    function-launcher boa ; inline
+SYNTAX: CUDA-GLOBAL:
+    scan [ create-in current-cuda-library get ] keep
+    define-cuda-global ;
diff --git a/extra/cuda/utils/utils.factor b/extra/cuda/utils/utils.factor
deleted file mode 100644 (file)
index f329313..0000000
+++ /dev/null
@@ -1,97 +0,0 @@
-! Copyright (C) 2010 Doug Coleman.
-! See http://factorcode.org/license.txt for BSD license.
-USING: accessors alien.c-types alien.data alien.strings arrays
-assocs byte-arrays classes.struct combinators cuda.ffi
-io io.backend io.encodings.utf8 kernel math.parser namespaces
-prettyprint sequences ;
-IN: cuda.utils
-
-SYMBOL: cuda-device
-SYMBOL: cuda-context
-SYMBOL: cuda-module
-SYMBOL: cuda-function
-SYMBOL: cuda-launcher
-
-SYMBOL: cuda-modules
-SYMBOL: cuda-functions
-
-ERROR: throw-cuda-error n ;
-
-: cuda-error ( n -- )
-    dup CUDA_SUCCESS = [ drop ] [ throw-cuda-error ] if ;
-
-: init-cuda ( -- )
-    0 cuInit cuda-error ; inline
-
-: cuda-version ( -- n )
-    int <c-object> [ cuDriverGetVersion cuda-error ] keep *int ;
-
-: get-function-ptr* ( module string -- function )
-    [ CUfunction <c-object> ] 2dip
-    [ cuModuleGetFunction cuda-error ] 3keep 2drop *void* ;
-
-: get-function-ptr ( string -- function )
-    [ cuda-module get ] dip get-function-ptr* ;
-
-: with-cuda-function ( string quot -- )
-    [
-        get-function-ptr* cuda-function set
-    ] dip call ; inline
-
-: create-context ( flags device -- context )
-    [ CUcontext <c-object> ] 2dip
-    [ cuCtxCreate cuda-error ] 3keep 2drop *void* ; inline
-
-: sync-context ( -- )
-    cuCtxSynchronize cuda-error ; inline
-
-: destroy-context ( context -- ) cuCtxDestroy cuda-error ; inline
-
-: launch-function* ( function -- ) cuLaunch cuda-error ; inline
-
-: launch-function ( -- ) cuda-function get cuLaunch cuda-error ; inline
-
-: cuda-int* ( function offset value -- )
-    cuParamSeti cuda-error ; inline
-
-: cuda-int ( offset value -- )
-    [ cuda-function get ] 2dip cuda-int* ; inline
-
-: cuda-float* ( function offset value -- )
-    cuParamSetf cuda-error ; inline
-
-: cuda-float ( offset value -- )
-    [ cuda-function get ] 2dip cuda-float* ; inline
-
-: cuda-vector* ( function offset ptr n -- )
-    cuParamSetv cuda-error ; inline
-
-: cuda-vector ( offset ptr n -- )
-    [ cuda-function get ] 3dip cuda-vector* ; inline
-
-: param-size* ( function n -- )
-    cuParamSetSize cuda-error ; inline
-
-: param-size ( n -- )
-    [ cuda-function get ] dip param-size* ; inline
-
-: launch-function-grid* ( function width height -- )
-    cuLaunchGrid cuda-error ; inline
-
-: launch-function-grid ( width height -- )
-    [ cuda-function get ] 2dip
-    cuLaunchGrid cuda-error ; inline
-
-: function-block-shape* ( function x y z -- )
-    cuFuncSetBlockShape cuda-error ; inline
-
-: function-block-shape ( x y z -- )
-    [ cuda-function get ] 3dip
-    cuFuncSetBlockShape cuda-error ; inline
-
-: function-shared-size* ( function n -- )
-    cuFuncSetSharedSize cuda-error ; inline
-
-: function-shared-size ( n -- )
-    [ cuda-function get ] dip
-    cuFuncSetSharedSize cuda-error ; inline
diff --git a/extra/db/info/info.factor b/extra/db/info/info.factor
deleted file mode 100644 (file)
index 4d17b6b..0000000
+++ /dev/null
@@ -1,15 +0,0 @@
-USING: accessors sequences generalizations io.encodings.utf8 db.postgresql parser combinators vocabs.parser db.sqlite
-io.files ;
-IN: db.info
-! having sensative (and likely to change) information directly in source code seems a bad idea
-: get-info ( -- lines ) current-vocab name>> "vocab:" "/dbinfo.txt" surround utf8 file-lines ;
-SYNTAX: get-psql-info <postgresql-db> get-info 5 firstn
-    {
-        [ >>host ]
-        [ >>port ]
-        [ >>username ]
-        [ [ f ] [ ] if-empty >>password ]
-        [ >>database ]
-    } spread suffix! ;
-
-SYNTAX: get-sqlite-info get-info first <sqlite-db> suffix! ;
index 9c60d8ad1a7eedcbd3d8e2f8520674b7ec8114e9..87f977d362a2704345738ba3a4ec758979149f10 100644 (file)
@@ -1,9 +1,9 @@
 USING: kernel fry sequences vocabs.loader help.vocabs ui
 ui.gadgets ui.gadgets.buttons ui.gadgets.packs ui.gadgets.borders
-ui.gadgets.scrollers ui.tools.listener accessors ;
+ui.gadgets.scrollers ui.tools.listener accessors assocs ;
 IN: demos
 
-: demo-vocabs ( -- seq ) "demos" tagged [ second ] map concat [ name>> ] map ;
+: demo-vocabs ( -- seq ) "demos" tagged values concat [ name>> ] map ;
 
 : <run-vocab-button> ( vocab-name -- button )
     dup '[ drop [ _ run ] \ run call-listener ] <border-button> ;
index 5c6b5028f8b51ad56546ccd8984f864e42dc9866..dec94d76bf854cc5223f9b627a30bc9d30910323 100644 (file)
@@ -1,9 +1,9 @@
 ! Copyright (c) 2008 Daniel Ehrenberg.
 ! See http://factorcode.org/license.txt for BSD license.
-USING: words kernel sequences locals locals.parser fry
-locals.definitions accessors parser namespaces continuations
-summary definitions generalizations arrays prettyprint debugger io
-effects tools.annotations effects.parser ;
+USING: words kernel sequences sequences.generalizations locals
+locals.parser fry locals.definitions accessors parser namespaces
+continuations summary definitions generalizations arrays
+prettyprint debugger io effects tools.annotations effects.parser ;
 IN: descriptive
 
 ERROR: descriptive-error args underlying word ;
index 8e285a0904a35625acb1a1e31237aaae582895a3..547b7b9ae926d2b1f234142b2cd947d3e38a7d3b 100644 (file)
@@ -67,7 +67,7 @@ PRIVATE>
 :: ecdsa-sign ( DGST -- sig )
     ec-key-handle :> KEY
     KEY ECDSA_size dup ssl-error <byte-array> :> SIG
-    "uint" <c-object> :> LEN
+    0 <uint> :> LEN
     0 DGST dup length SIG LEN KEY ECDSA_sign ssl-error
     LEN *uint SIG resize ;
 
index 19bb3bfbf919a8e43319602ff5bf748bd62d7141..d2437d9a9bf7926b72bb892a3d5fd7ee1c355c4f 100644 (file)
@@ -2,7 +2,7 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors alien alien.c-types alien.strings alien.syntax arrays
 classes.struct fry io.encodings.ascii io.mmap kernel locals math
-math.intervals sequences specialized-arrays strings typed ;
+math.intervals sequences specialized-arrays strings typed assocs ;
 IN: elf
 
 ! FFI data
@@ -499,7 +499,7 @@ TYPED:: elf-segment-sections ( segment: Elf32/64_Phdr sections: Elf32/64_Shdr-ar
     segment [ p_offset>> dup ] [ p_filesz>> + ] bi [a,b)                            :> segment-interval
     sections [ dup [ sh_offset>> dup ] [ sh_size>> + ] bi [a,b) 2array ] { } map-as :> section-intervals
     section-intervals [ second segment-interval interval-intersect empty-interval = not ]
-    filter [ first ] map ;
+    filter keys ;
 
 TYPED:: virtual-address-segment ( elf: Elf32/64_Ehdr address -- program-header/f )
     elf elf-program-headers elf-loadable-segments [
index f2d02b22a32eb15831f57fa8b40a170ee12f3a9c..f76ee063cd964642ea0dd1bb659849534ebe96ae 100644 (file)
@@ -66,7 +66,7 @@ TUPLE: fluids-world < game-world
 SYMBOL: fluid
 
 : integrate ( world -- )
-    particles>> $[ 60 fps 1000000 /f ] integrate-particles! drop ;
+    particles>> 1/60 integrate-particles! drop ;
 
 : pause ( -- )
     fluid get [ not ] change-paused drop ;
@@ -108,7 +108,7 @@ GAME: fluids {
     { pixel-format-attributes {
         windowed double-buffered T{ depth-bits { value 24 } } } }
     { pref-dim { 1024 768 } }
-    { tick-interval-micros $[ 60 fps ] }
+    { tick-interval-nanos $[ 60 fps ] }
 } ;
 
 fluids-world H{
index 049aa2b4921c7f3dab46be1a8ec74a4efb7d27eb..817379bf575fe78e2411953470df129722e0b413 100644 (file)
@@ -62,7 +62,7 @@ GAME: run-tests {
         { grab-input? t }
         { use-game-input? t }
         { pref-dim { 1024 768 } }
-        { tick-interval-micros $[ 60 fps ] }
+        { tick-interval-nanos $[ 60 fps ] }
     } ;
 
 MAIN: run-tests
diff --git a/extra/game/input/demos/joysticks/authors.txt b/extra/game/input/demos/joysticks/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/game/input/demos/joysticks/deploy.factor b/extra/game/input/demos/joysticks/deploy.factor
new file mode 100644 (file)
index 0000000..8ef5231
--- /dev/null
@@ -0,0 +1,13 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-name "joystick-demo" }
+    { deploy-io 2 }
+    { deploy-word-defs? f }
+    { deploy-c-types? t }
+    { deploy-word-props? f }
+    { deploy-reflection 1 }
+    { deploy-threads? t }
+    { deploy-math? t }
+    { "stop-after-last-window?" t }
+    { deploy-ui? t }
+}
diff --git a/extra/game/input/demos/joysticks/joysticks.factor b/extra/game/input/demos/joysticks/joysticks.factor
new file mode 100644 (file)
index 0000000..ab65369
--- /dev/null
@@ -0,0 +1,145 @@
+USING: ui ui.gadgets sequences kernel arrays math colors
+colors.constants ui.render ui.pens.polygon ui.pens.solid math.vectors
+accessors fry ui.gadgets.packs game.input ui.gadgets.labels
+ui.gadgets.borders alarms calendar locals strings ui.gadgets.buttons
+combinators math.parser assocs threads ;
+IN: game.input.demos.joysticks
+
+CONSTANT: SIZE { 151 151 }
+CONSTANT: INDICATOR-SIZE { 4 4 }
+: FREQUENCY ( -- f ) 30 recip seconds ;
+
+TUPLE: axis-gadget < gadget indicator z-indicator pov ;
+
+M: axis-gadget pref-dim* drop SIZE ;
+
+: (rect-polygon) ( lo hi -- polygon )
+    2dup
+    [ [ second ] [ first  ] bi* swap 2array ]
+    [ [ first  ] [ second ] bi*      2array ] 2bi swapd 4array ;
+
+: indicator-polygon ( -- polygon )
+    { 0 0 } INDICATOR-SIZE (rect-polygon) ;
+
+CONSTANT: pov-polygons
+    V{
+        { pov-neutral    { { 70 75 } { 75 70 } { 80 75 } { 75 80 } } }
+        { pov-up         { { 70 65 } { 75 60 } { 80 65 } } }
+        { pov-up-right   { { 83 60 } { 90 60 } { 90 67 } } }
+        { pov-right      { { 85 70 } { 90 75 } { 85 80 } } }
+        { pov-down-right { { 90 83 } { 90 90 } { 83 90 } } }
+        { pov-down       { { 70 85 } { 75 90 } { 80 85 } } }
+        { pov-down-left  { { 67 90 } { 60 90 } { 60 83 } } }
+        { pov-left       { { 65 70 } { 60 75 } { 65 80 } } }
+        { pov-up-left    { { 67 60 } { 60 60 } { 60 67 } } }
+    }
+
+: <indicator-gadget> ( color -- indicator )
+    indicator-polygon <polygon-gadget> ;
+
+: (>loc) ( axisloc -- windowloc )
+    0.5 v*n { 0.5 0.5 } v+ SIZE v* [ >integer ] map
+    INDICATOR-SIZE 2 v/n v- ;
+
+: (xy>loc) ( x y -- xyloc )
+    2array (>loc) ;
+: (z>loc) ( z -- zloc )
+    0.0 swap 2array (>loc) ;
+
+: (xyz>loc) ( x y z -- xyloc zloc )
+    [ [ 0.0 ] unless* ] tri@
+    [ (xy>loc) ] dip (z>loc) ;
+
+:: move-axis ( gadget x y z -- )
+    x y z (xyz>loc) :> ( xy z )
+    xy gadget   indicator>> loc<<
+    z  gadget z-indicator>> loc<< ;
+
+: move-pov ( gadget pov -- )
+    swap pov>> [ interior>> -rot = COLOR: gray COLOR: white ? >>color drop ]
+    with assoc-each ;
+
+:: add-pov-gadget ( gadget direction polygon -- gadget direction gadget )
+    gadget COLOR: white polygon <polygon-gadget> [ add-gadget ] keep
+    direction swap ;
+
+: add-pov-gadgets ( gadget -- gadget )
+    pov-polygons [ add-pov-gadget ] assoc-map >>pov ;
+
+: <axis-gadget> ( -- gadget )
+    axis-gadget new
+    add-pov-gadgets
+    COLOR: black <indicator-gadget> [ >>z-indicator ] [ add-gadget ] bi
+    COLOR: red   <indicator-gadget> [ >>indicator   ] [ add-gadget ] bi
+    dup [ 0.0 0.0 0.0 move-axis ] [ f move-pov ] bi ;
+
+TUPLE: joystick-demo-gadget < pack axis raxis controller buttons alarm ;
+
+: add-gadget-with-border ( parent child -- parent )
+    { 2 2 } <border> COLOR: gray <solid> >>boundary add-gadget ;
+
+: add-controller-label ( gadget controller -- gadget )
+    [ >>controller ] [ product-string <label> add-gadget ] bi ;
+
+: add-axis-gadget ( gadget shelf -- gadget shelf )
+    <axis-gadget> [ >>axis ] [ add-gadget-with-border ] bi-curry bi* ;
+
+: add-raxis-gadget ( gadget shelf -- gadget shelf )
+    <axis-gadget> [ >>raxis ] [ add-gadget-with-border ] bi-curry bi* ;
+
+:: (add-button-gadgets) ( gadget shelf -- )
+    gadget controller>> read-controller buttons>> length iota [
+        number>string [ drop ] <border-button>
+        shelf over add-gadget drop
+    ] map gadget buttons<< ;
+
+: add-button-gadgets ( gadget shelf -- gadget shelf )
+    [ (add-button-gadgets) ] 2keep ;
+
+: <joystick-demo-gadget> ( controller -- gadget )
+    joystick-demo-gadget new
+    { 0 1 } >>orientation
+    swap add-controller-label
+    <shelf> add-axis-gadget add-raxis-gadget add-gadget
+    <shelf> add-button-gadgets add-gadget ;
+
+: update-buttons ( buttons button-states -- )
+    [ >>selected? drop ] 2each ;
+
+: kill-update-axes ( gadget -- )
+    COLOR: gray <solid> >>interior
+    [ [ stop-alarm ] when* f ] change-alarm
+    relayout-1 ;
+
+: (update-axes) ( gadget controller-state -- )
+    {
+        [ [ axis>>  ] [ [ x>>  ] [ y>>  ] [ z>>  ] tri ] bi* move-axis ]
+        [ [ raxis>> ] [ [ rx>> ] [ ry>> ] [ rz>> ] tri ] bi* move-axis ]
+        [ [ axis>>  ] [ pov>> ] bi* move-pov ]
+        [ [ buttons>> ] [ buttons>> ] bi* update-buttons ]
+        [ drop relayout-1 ]
+    } 2cleave ;
+
+: update-axes ( gadget -- )
+    dup controller>> read-controller
+    [ (update-axes) ] [ kill-update-axes ] if* ;
+
+M: joystick-demo-gadget graft*
+    dup '[ _ update-axes ] FREQUENCY every >>alarm
+    drop ;
+
+M: joystick-demo-gadget ungraft*
+    alarm>> [ stop-alarm ] when* ;
+
+: joystick-window ( controller -- )
+    [ <joystick-demo-gadget> ] [ product-string ] bi
+    open-window ;
+
+: joystick-demo ( -- )
+    [
+        open-game-input
+        100 milliseconds sleep ! It might take a moment to find devices...
+        get-controllers [ joystick-window ] each
+    ] with-ui ;
+
+MAIN: joystick-demo
diff --git a/extra/game/input/demos/joysticks/summary.txt b/extra/game/input/demos/joysticks/summary.txt
new file mode 100644 (file)
index 0000000..e10653c
--- /dev/null
@@ -0,0 +1 @@
+Demonstrate gamepad and joystick input
diff --git a/extra/game/input/demos/joysticks/tags.txt b/extra/game/input/demos/joysticks/tags.txt
new file mode 100755 (executable)
index 0000000..84d4140
--- /dev/null
@@ -0,0 +1 @@
+games
diff --git a/extra/game/input/demos/key-caps/authors.txt b/extra/game/input/demos/key-caps/authors.txt
new file mode 100644 (file)
index 0000000..f13c9c1
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff
diff --git a/extra/game/input/demos/key-caps/key-caps.factor b/extra/game/input/demos/key-caps/key-caps.factor
new file mode 100644 (file)
index 0000000..363c7c8
--- /dev/null
@@ -0,0 +1,177 @@
+USING: game.input game.input.scancodes
+kernel ui.gadgets ui.gadgets.buttons sequences accessors
+words arrays assocs math calendar fry alarms ui
+ui.gadgets.borders ui.gestures literals ;
+IN: game.input.demos.key-caps
+
+CONSTANT: key-locations H{
+    { key-escape        { {   0   0 } {  10  10 } } }
+
+    { key-f1            { {  20   0 } {  10  10 } } }
+    { key-f2            { {  30   0 } {  10  10 } } }
+    { key-f3            { {  40   0 } {  10  10 } } }
+    { key-f4            { {  50   0 } {  10  10 } } }
+
+    { key-f5            { {  65   0 } {  10  10 } } }
+    { key-f6            { {  75   0 } {  10  10 } } }
+    { key-f7            { {  85   0 } {  10  10 } } }
+    { key-f8            { {  95   0 } {  10  10 } } }
+
+    { key-f9            { { 110   0 } {  10  10 } } }
+    { key-f10           { { 120   0 } {  10  10 } } }
+    { key-f11           { { 130   0 } {  10  10 } } }
+    { key-f12           { { 140   0 } {  10  10 } } }
+
+
+    { key-`             { {   0  15 } {  10  10 } } }
+    { key-1             { {  10  15 } {  10  10 } } }
+    { key-2             { {  20  15 } {  10  10 } } }
+    { key-3             { {  30  15 } {  10  10 } } }
+    { key-4             { {  40  15 } {  10  10 } } }
+    { key-5             { {  50  15 } {  10  10 } } }
+    { key-6             { {  60  15 } {  10  10 } } }
+    { key-7             { {  70  15 } {  10  10 } } }
+    { key-8             { {  80  15 } {  10  10 } } }
+    { key-9             { {  90  15 } {  10  10 } } }
+    { key-0             { { 100  15 } {  10  10 } } }
+    { key--             { { 110  15 } {  10  10 } } }
+    { key-=             { { 120  15 } {  10  10 } } }
+    { key-backspace     { { 130  15 } {  20  10 } } }
+
+    { key-tab           { {   0  25 } {  15  10 } } }
+    { key-q             { {  15  25 } {  10  10 } } }
+    { key-w             { {  25  25 } {  10  10 } } }
+    { key-e             { {  35  25 } {  10  10 } } }
+    { key-r             { {  45  25 } {  10  10 } } }
+    { key-t             { {  55  25 } {  10  10 } } }
+    { key-y             { {  65  25 } {  10  10 } } }
+    { key-u             { {  75  25 } {  10  10 } } }
+    { key-i             { {  85  25 } {  10  10 } } }
+    { key-o             { {  95  25 } {  10  10 } } }
+    { key-p             { { 105  25 } {  10  10 } } }
+    { key-[             { { 115  25 } {  10  10 } } }
+    { key-]             { { 125  25 } {  10  10 } } }
+    { key-\             { { 135  25 } {  15  10 } } }
+
+    { key-caps-lock     { {   0  35 } {  20  10 } } }
+    { key-a             { {  20  35 } {  10  10 } } }
+    { key-s             { {  30  35 } {  10  10 } } }
+    { key-d             { {  40  35 } {  10  10 } } }
+    { key-f             { {  50  35 } {  10  10 } } }
+    { key-g             { {  60  35 } {  10  10 } } }
+    { key-h             { {  70  35 } {  10  10 } } }
+    { key-j             { {  80  35 } {  10  10 } } }
+    { key-k             { {  90  35 } {  10  10 } } }
+    { key-l             { { 100  35 } {  10  10 } } }
+    { key-;             { { 110  35 } {  10  10 } } }
+    { key-'             { { 120  35 } {  10  10 } } }
+    { key-return        { { 130  35 } {  20  10 } } }
+
+    { key-left-shift    { {   0  45 } {  25  10 } } }
+    { key-z             { {  25  45 } {  10  10 } } }
+    { key-x             { {  35  45 } {  10  10 } } }
+    { key-c             { {  45  45 } {  10  10 } } }
+    { key-v             { {  55  45 } {  10  10 } } }
+    { key-b             { {  65  45 } {  10  10 } } }
+    { key-n             { {  75  45 } {  10  10 } } }
+    { key-m             { {  85  45 } {  10  10 } } }
+    { key-,             { {  95  45 } {  10  10 } } }
+    { key-.             { { 105  45 } {  10  10 } } }
+    { key-/             { { 115  45 } {  10  10 } } }
+    { key-right-shift   { { 125  45 } {  25  10 } } }
+
+    { key-left-control  { {   0  55 } {  15  10 } } }
+    { key-left-gui      { {  15  55 } {  15  10 } } }
+    { key-left-alt      { {  30  55 } {  15  10 } } }
+    { key-space         { {  45  55 } {  45  10 } } }
+    { key-right-alt     { {  90  55 } {  15  10 } } }
+    { key-right-gui     { { 105  55 } {  15  10 } } }
+    { key-application   { { 120  55 } {  15  10 } } }
+    { key-right-control { { 135  55 } {  15  10 } } }
+
+
+    { key-print-screen  { { 155   0 } {  10  10 } } }
+    { key-scroll-lock   { { 165   0 } {  10  10 } } }
+    { key-pause         { { 175   0 } {  10  10 } } }
+    
+    { key-insert        { { 155  15 } {  10  10 } } }
+    { key-home          { { 165  15 } {  10  10 } } }
+    { key-page-up       { { 175  15 } {  10  10 } } }
+
+    { key-delete        { { 155  25 } {  10  10 } } }
+    { key-end           { { 165  25 } {  10  10 } } }
+    { key-page-down     { { 175  25 } {  10  10 } } }
+
+    { key-up-arrow      { { 165  45 } {  10  10 } } }
+    { key-left-arrow    { { 155  55 } {  10  10 } } }
+    { key-down-arrow    { { 165  55 } {  10  10 } } }
+    { key-right-arrow   { { 175  55 } {  10  10 } } }
+
+
+    { key-keypad-numlock { { 190 15 } {  10  10 } } }
+    { key-keypad-/       { { 200 15 } {  10  10 } } }
+    { key-keypad-*       { { 210 15 } {  10  10 } } }
+    { key-keypad--       { { 220 15 } {  10  10 } } }
+
+    { key-keypad-7       { { 190 25 } {  10  10 } } }
+    { key-keypad-8       { { 200 25 } {  10  10 } } }
+    { key-keypad-9       { { 210 25 } {  10  10 } } }
+    { key-keypad-+       { { 220 25 } {  10  20 } } }
+
+    { key-keypad-4       { { 190 35 } {  10  10 } } }
+    { key-keypad-5       { { 200 35 } {  10  10 } } }
+    { key-keypad-6       { { 210 35 } {  10  10 } } }
+
+    { key-keypad-1       { { 190 45 } {  10  10 } } }
+    { key-keypad-2       { { 200 45 } {  10  10 } } }
+    { key-keypad-3       { { 210 45 } {  10  10 } } }
+    { key-keypad-enter   { { 220 45 } {  10  20 } } }
+
+    { key-keypad-0       { { 190 55 } {  20  10 } } }
+    { key-keypad-.       { { 210 55 } {  10  10 } } }
+}
+
+CONSTANT: KEYBOARD-SIZE { 230 65 }
+CONSTANT: FREQUENCY $[ 1/30 seconds ]
+
+TUPLE: key-caps-gadget < gadget keys alarm ;
+
+: make-key-gadget ( scancode dim array -- )
+    [ 
+        swap [ 
+            " " [ drop ] <border-button>
+            swap [ first >>loc ] [ second >>dim ] bi
+        ] [ execute( -- value ) ] bi*
+    ] dip set-nth ;
+
+: add-keys-gadgets ( gadget -- gadget )
+    key-locations 256 f <array>
+    [ [ make-key-gadget ] curry assoc-each ]
+    [ [ [ add-gadget ] when* ] each ] 
+    [ >>keys ] tri ;
+
+: <key-caps-gadget> ( -- gadget )
+    key-caps-gadget new
+    add-keys-gadgets ;
+
+M: key-caps-gadget pref-dim* drop KEYBOARD-SIZE ;
+
+: update-key-caps-state ( gadget -- )
+    read-keyboard keys>> over keys>> 
+    [ [ selected?<< ] [ drop ] if* ] 2each 
+    relayout-1 ;
+
+M: key-caps-gadget graft*
+    open-game-input
+    dup '[ _ update-key-caps-state ] FREQUENCY every >>alarm
+    drop ;
+
+M: key-caps-gadget ungraft*
+    alarm>> [ stop-alarm ] when*
+    close-game-input ;
+
+M: key-caps-gadget handle-gesture
+    drop [ key-down? ] [ key-up? ] bi or not ;
+
+MAIN-WINDOW: key-caps { { title "Key Caps" } }
+    <key-caps-gadget> { 5 5 } <border> >>gadgets ;
diff --git a/extra/game/input/demos/key-caps/summary.txt b/extra/game/input/demos/key-caps/summary.txt
new file mode 100644 (file)
index 0000000..f7d7a2c
--- /dev/null
@@ -0,0 +1 @@
+Graphical keyboard diagram
diff --git a/extra/game/input/demos/key-caps/tags.txt b/extra/game/input/demos/key-caps/tags.txt
new file mode 100755 (executable)
index 0000000..cb5fc20
--- /dev/null
@@ -0,0 +1 @@
+demos
index b48f01cd82138197e7da2b05d31c7d65603e4f2b..1605c45284795ccab6db5241c145f46da237cf09 100644 (file)
@@ -3,24 +3,24 @@ USING: help.markup help.syntax kernel math ui.gadgets.worlds ;
 IN: game.loop
 
 HELP: fps
-{ $values { "fps" real } { "micros" integer } }
-{ $description "Converts a frames per second value into an interval length in microseconds." } ;
+{ $values { "fps" real } { "nanos" integer } }
+{ $description "Converts a frames per second value into an interval length in nanoseconds." } ;
 
 HELP: <game-loop>
 { $values
-    { "tick-interval-micros" integer } { "delegate" "a " { $link "game.loop-delegates" } }
+    { "tick-interval-nanos" integer } { "delegate" "a " { $link "game.loop-delegates" } }
     { "loop" game-loop }
 }
-{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "delegate" } " every " { $snippet "tick-interval-micros" } " microseconds, and " { $link draw* } " on the same delegate object as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop."
+{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "delegate" } " every " { $snippet "tick-interval-nanos" } " nanoseconds, and " { $link draw* } " on the same delegate object as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop."
 $nl
 "To initialize the game loop with separate tick and draw delegates, use " { $link <game-loop*> } "." } ;
 
 HELP: <game-loop*>
 { $values
-    { "tick-interval-micros" integer } { "tick-delegate" "a " { $link "game.loop-delegates" } } { "draw-delegate" "a " { $link "game.loop-delegates" } }
+    { "tick-interval-nanos" integer } { "tick-delegate" "a " { $link "game.loop-delegates" } } { "draw-delegate" "a " { $link "game.loop-delegates" } }
     { "loop" game-loop }
 }
-{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "tick-delegate" } " every " { $snippet "tick-interval-micros" } " microseconds, and " { $link draw* } " on the " { $snippet "draw-delegate" } " as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop."
+{ $description "Constructs a new stopped " { $link game-loop } " object. When started, the game loop will call the " { $link tick* } " method on the " { $snippet "tick-delegate" } " every " { $snippet "tick-interval-nanos" } " nanoseconds, and " { $link draw* } " on the " { $snippet "draw-delegate" } " as frequently as possible. The " { $link start-loop } " and " { $link stop-loop } " words start and stop the game loop."
 $nl
 "The " { $link <game-loop> } " word provides a shorthand for initializing a game loop that uses the same object for the " { $snippet "tick-delegate" } " and " { $snippet "draw-delegate" } "." } ;
 
@@ -46,7 +46,7 @@ HELP: draw*
 { $values
     { "tick-slice" float } { "delegate" "a " { $link "game.loop-delegates" } }
 }
-{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "draw-delegate" } " object in a tight loop while the game loop is running. The " { $snippet "tick-slice" } " value represents what fraction of the game loop's " { $snippet "tick-interval-micros" } " time period has passed since " { $link tick* } " was most recently called on the " { $snippet "tick-delegate" } "." } ;
+{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "draw-delegate" } " object in a tight loop while the game loop is running. The " { $snippet "tick-slice" } " value represents what fraction of the game loop's " { $snippet "tick-interval-nanos" } " time period has passed since " { $link tick* } " was most recently called on the " { $snippet "tick-delegate" } "." } ;
 
 HELP: game-loop
 { $class-description "Objects of the " { $snippet "game-loop" } " class manage game loops. See " { $link "game.loop" } " for an overview of the game loop library. To construct a game loop, use " { $link <game-loop> } ". To start and stop a game loop, use the " { $link start-loop } " and " { $link stop-loop } " words."
@@ -83,7 +83,7 @@ HELP: tick*
 { $values
     { "delegate" "a " { $link "game.loop-delegates" } }
 }
-{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "tick-delegate" } " object at regular intervals while the game loop is running. The game loop's " { $snippet "tick-interval-micros" } " attribute determines the number of microseconds between invocations of " { $snippet "tick*" } "." } ;
+{ $description "This generic word is called by a " { $link game-loop } " on its " { $snippet "tick-delegate" } " object at regular intervals while the game loop is running. The game loop's " { $snippet "tick-interval-nanos" } " attribute determines the number of nanoseconds between invocations of " { $snippet "tick*" } "." } ;
 
 { draw* tick* } related-words
 
@@ -93,7 +93,7 @@ ARTICLE: "game.loop-delegates" "Game loop delegate"
     tick*
     draw*
 }
-{ $snippet "tick*" } " will be called at a regular interval determined by the game loop's " { $snippet "tick-interval-micros" } " attribute on the tick delegate. " { $snippet "draw*" } " will be invoked on the draw delegate in a tight loop, updating as frequently as possible."
+{ $snippet "tick*" } " will be called at a regular interval determined by the game loop's " { $snippet "tick-interval-nanos" } " attribute on the tick delegate. " { $snippet "draw*" } " will be invoked on the draw delegate in a tight loop, updating as frequently as possible."
 $nl
 "It is possible to change the " { $snippet "tick-delegate" } " and " { $snippet "draw-delegate" } " slots of a game loop while it is running, for example, to use different delegates to control a game while it's in the menu, paused, or running the main game." ;
 
index fa4d4adcb32505cc9ac53eac726d2e3ac09899df..c4c190355bf00d27fe5231c258867054c32dd9f4 100644 (file)
@@ -1,32 +1,31 @@
 ! (c)2009 Joe Groff bsd license
-USING: accessors calendar continuations destructors kernel math
-math.order namespaces system threads ui ui.gadgets.worlds
-sequences ;
+USING: accessors alarms calendar continuations destructors fry
+kernel math math.order namespaces system ui ui.gadgets.worlds ;
 IN: game.loop
 
 TUPLE: game-loop
-    { tick-interval-micros integer read-only }
+    { tick-interval-nanos integer read-only }
     tick-delegate
     draw-delegate
     { last-tick integer }
-    thread 
     { running? boolean }
     { tick-number integer }
     { frame-number integer }
     { benchmark-time integer }
     { benchmark-tick-number integer }
-    { benchmark-frame-number integer } ;
+    { benchmark-frame-number integer }
+    alarm ;
 
 GENERIC: tick* ( delegate -- )
 GENERIC: draw* ( tick-slice delegate -- )
 
 SYMBOL: game-loop
 
-: since-last-tick ( loop -- microseconds )
-    last-tick>> system-micros swap - ;
+: since-last-tick ( loop -- nanos )
+    last-tick>> nano-count swap - ;
 
 : tick-slice ( loop -- slice )
-    [ since-last-tick ] [ tick-interval-micros>> ] bi /f 1.0 min ;
+    [ since-last-tick ] [ tick-interval-nanos>> ] bi /f 1.0 min ;
 
 CONSTANT: MAX-FRAMES-TO-SKIP 5
 
@@ -40,8 +39,8 @@ TUPLE: game-loop-error game-loop error ;
 : game-loop-error ( game-loop error -- )
     [ drop stop-loop ] [ \ game-loop-error boa ?ui-error ] 2bi ;
 
-: fps ( fps -- micros )
-    1,000,000 swap /i ; inline
+: fps ( fps -- nanos )
+    1,000,000,000 swap /i ; inline
 
 <PRIVATE
 
@@ -54,59 +53,60 @@ TUPLE: game-loop-error game-loop error ;
 
 : increment-tick ( loop -- )
     [ 1 + ] change-tick-number
-    dup tick-interval-micros>> [ + ] curry change-last-tick
+    dup tick-interval-nanos>> [ + ] curry change-last-tick
     drop ;
 
 : ?tick ( loop count -- )
-    [ system-micros >>last-tick drop ] [
-        over [ since-last-tick ] [ tick-interval-micros>> ] bi >=
+    [ nano-count >>last-tick drop ] [
+        over [ since-last-tick ] [ tick-interval-nanos>> ] bi >=
         [ [ drop increment-tick ] [ drop tick ] [ 1 - ?tick ] 2tri ]
         [ 2drop ] if
     ] if-zero ;
 
-: (run-loop) ( loop -- )
-    dup running?>>
-    [ [ MAX-FRAMES-TO-SKIP ?tick ] [ redraw ] [ yield (run-loop) ] tri ]
-    [ drop ] if ;
-
-: run-loop ( loop -- )
-    dup game-loop
-    [ [ (run-loop) ] [ game-loop-error ] recover ]
-    with-variable ;
-
-: benchmark-micros ( loop -- micros )
-    system-micros swap benchmark-time>> - ;
+: benchmark-nanos ( loop -- nanos )
+    nano-count swap benchmark-time>> - ;
 
 PRIVATE>
 
-: reset-loop-benchmark ( loop -- )
-    system-micros >>benchmark-time
+: reset-loop-benchmark ( loop -- loop )
+    nano-count >>benchmark-time
     dup tick-number>> >>benchmark-tick-number
-    dup frame-number>> >>benchmark-frame-number
-    drop ;
+    dup frame-number>> >>benchmark-frame-number ;
 
 : benchmark-ticks-per-second ( loop -- n )
-    [ tick-number>> ] [ benchmark-tick-number>> - ] [ benchmark-micros ] tri /f ;
+    [ tick-number>> ] [ benchmark-tick-number>> - ] [ benchmark-nanos ] tri /f ;
 : benchmark-frames-per-second ( loop -- n )
-    [ frame-number>> ] [ benchmark-frame-number>> - ] [ benchmark-micros ] tri /f ;
+    [ frame-number>> ] [ benchmark-frame-number>> - ] [ benchmark-nanos ] tri /f ;
+
+: (game-tick) ( loop -- )
+    dup running?>>
+    [ [ MAX-FRAMES-TO-SKIP ?tick ] [ redraw ] bi ]
+    [ drop ] if ;
+    
+: game-tick ( loop -- )
+    dup game-loop [
+        [ (game-tick) ] [ game-loop-error ] recover
+    ] with-variable ;
 
 : start-loop ( loop -- )
-    system-micros >>last-tick
+    nano-count >>last-tick
     t >>running?
-    [ reset-loop-benchmark ]
-    [ [ run-loop ] curry "game loop" spawn ]
-    [ thread<< ] tri ;
+    reset-loop-benchmark
+    [
+        [ '[ _ game-tick ] f ]
+        [ tick-interval-nanos>> nanoseconds ] bi
+        <alarm>
+    ] keep [ alarm<< ] [ drop start-alarm ] 2bi ;
 
 : stop-loop ( loop -- )
     f >>running?
-    f >>thread
-    drop ;
+    alarm>> stop-alarm ;
 
-: <game-loop*> ( tick-interval-micros tick-delegate draw-delegate -- loop )
-    system-micros f f 0 0 system-micros 0 0
+: <game-loop*> ( tick-interval-nanos tick-delegate draw-delegate -- loop )
+    nano-count f 0 0 nano-count 0 0 f
     game-loop boa ;
 
-: <game-loop> ( tick-interval-micros delegate -- loop )
+: <game-loop> ( tick-interval-nanos delegate -- loop )
     dup <game-loop*> ; inline
 
 M: game-loop dispose
index c10ae4056130bd70c3133b29d6ce9a518828bc43..c169ec8b5dd05e42fc8a9886a45e6889aa84c659 100644 (file)
@@ -6,7 +6,7 @@ IN: game.worlds
 HELP: game-attributes
 { $class-description "Extends the " { $link world-attributes } " tuple class with extra attributes for " { $link game-world } "s:" }
 { $list
-{ { $snippet "tick-interval-micros" } " specifies the number of microseconds between consecutive calls to the world's " { $link tick-game-world } " method by the game loop. An integer greater than zero must be provided." }
+{ { $snippet "tick-interval-nanos" } " specifies the number of nanoseconds between consecutive calls to the world's " { $link tick-game-world } " method by the game loop. An integer greater than zero must be provided." }
 { { $snippet "use-game-input?" } " specifies whether the game world should initialize the " { $vocab-link "game.input" } " library for use by the game. False by default." }
 { { $snippet "use-audio-engine?" } " specifies whether the game world should manage an " { $link audio-engine } " instance. False by default." }
 { { $snippet "audio-engine-device" } " specifies the string name of the OpenAL device the audio engine, if any, should try to open. The default value of " { $link POSTPONE: f } " attempts to open the default OpenAL device." }
index bf05eddc71b589de6316aa5a5846b6fec2ae9e9f..f8b3ae8587bbb00145f8e637090979ab81da5c86 100644 (file)
@@ -7,7 +7,7 @@ IN: game.worlds
 TUPLE: game-world < world
     game-loop
     audio-engine
-    { tick-interval-micros fixnum }
+    { tick-interval-nanos integer }
     { use-game-input? boolean }
     { use-audio-engine? boolean }
     { audio-engine-device initial: f }
@@ -44,7 +44,7 @@ PRIVATE>
 M: game-world begin-world
     dup use-game-input?>> [ open-game-input ] when
     dup use-audio-engine?>> [ dup open-game-audio-engine >>audio-engine ] when
-    dup [ tick-interval-micros>> ] [ ] bi <game-loop>
+    dup [ tick-interval-nanos>> ] [ ] bi <game-loop>
     [ >>game-loop begin-game-world ] keep start-loop ;
 
 M: game-world end-world
@@ -54,7 +54,7 @@ M: game-world end-world
     [ use-game-input?>> [ close-game-input ] when ] tri ;
 
 TUPLE: game-attributes < world-attributes
-    { tick-interval-micros fixnum }
+    { tick-interval-nanos integer }
     { use-game-input? boolean initial: f }
     { use-audio-engine? boolean initial: f }
     { audio-engine-device initial: f }
@@ -62,7 +62,7 @@ TUPLE: game-attributes < world-attributes
 
 M: game-world apply-world-attributes
     {
-        [ tick-interval-micros>> >>tick-interval-micros ]
+        [ tick-interval-nanos>> >>tick-interval-nanos ]
         [ use-game-input?>> >>use-game-input? ]
         [ use-audio-engine?>> >>use-audio-engine? ]
         [ audio-engine-device>> >>audio-engine-device ]
index f23848ce301a4738a8ebe4961ca69983adf0d366..9dedb6410b051b6b0e7f246c7f08bf53bb24274a 100644 (file)
@@ -40,7 +40,7 @@ MEMO: ip-db ( -- seq )
 : filter-overlaps ( alist -- alist' )
     2 clump
     [ first2 [ first second ] [ first first ] bi* < ] filter
-    [ first ] map ;
+    keys ;
 
 MEMO: ip-intervals ( -- interval-map )
     ip-db [ [ [ from>> ] [ to>> ] bi 2array ] keep ] { } map>assoc
index 1487fbf4c7f82c2553b3fdc88a70cf16fdfc68ba..4440fc1d88020a747f07787563a9d6320203d9ac 100644 (file)
@@ -149,6 +149,10 @@ HELP: dynamic-upload
 HELP: gpu-data-ptr
 { $class-description "This class is a union of the " { $link c-ptr } " and " { $link buffer-ptr } " classes. It represents a value that can be supplied either from CPU or GPU memory." } ;
 
+HELP: grow-buffer
+{ $values { "buffer" buffer } { "target-size" integer } }
+{ $description "If the " { $link buffer-size } " of the given " { $link buffer } " is less than " { $snippet "target-size" } ", reallocates the buffer to a size large enough to accommodate " { $snippet "target-size" } " bytes. If the buffer is reallocated, the original contents are lost." } ;
+
 HELP: index-buffer
 { $class-description "This " { $link buffer-kind } " declares that a " { $link buffer } "'s primary use will be to index vertex arrays." } ;
 
@@ -243,6 +247,7 @@ ARTICLE: "gpu.buffers" "Buffer objects"
 { $subsections
     allocate-buffer
     allocate-byte-array
+    grow-buffer
     update-buffer
     read-buffer
     copy-buffer
index 86d51b46ce229176ca39d6120637c29943cd9ccf..6172c8ad8ce616dd789e1fddf8babdd0c9e719c4 100644 (file)
@@ -132,6 +132,13 @@ TYPED:: copy-buffer ( to-buffer-ptr: buffer-ptr from-buffer-ptr: buffer-ptr size
     from-buffer-ptr offset>> to-buffer-ptr offset>>
     size glCopyBufferSubData ;
 
+: (grow-buffer-size) ( target-size old-size -- new-size )
+    [ 2dup > ] [ 2 * ] while nip ; inline
+
+TYPED: grow-buffer ( buffer: buffer target-size: integer -- )
+    over buffer-size 2dup >
+    [ (grow-buffer-size) f allocate-buffer ] [ 3drop ] if ; inline
+
 :: with-mapped-buffer ( ..a buffer access quot: ( ..a alien -- ..b ) -- ..b )
     buffer bind-buffer :> target
     target access gl-access glMapBuffer
index ae5757efcde715e81084f91c5a1e3bf49548bad5..28deff905c39ed1924d7613ed4f2b8721b24f00d 100644 (file)
@@ -311,5 +311,5 @@ GAME: bunny-game {
         { grab-input? t }
         { use-game-input? t }
         { pref-dim { 1024 768 } }
-        { tick-interval-micros $[ 60 fps ] }
+        { tick-interval-nanos $[ 60 fps ] }
     } ;
index bdd1b51deb28cbc3d948ca73ee7f81c4db8aa8ab..9828c97aa77d200cfbf8dbf3d20c21eabb55043a 100644 (file)
@@ -126,5 +126,5 @@ GAME: raytrace-game {
         { use-game-input? t }
         { use-audio-engine? t }
         { pref-dim { 1024 768 } }
-        { tick-interval-micros $[ 60 fps ] }
+        { tick-interval-nanos $[ 60 fps ] }
     } ;
index 1d80a86cf6ac7034a974ad95fca5b060f78f3221..10bddc3752efb7b92c520fe37bcc377965eef2df 100755 (executable)
@@ -552,7 +552,7 @@ SYNTAX: UNIFORM-TUPLE:
     [ [ length ] [ >int-array ] bi glDrawBuffers ] if ;
 
 : bind-named-output-attachments ( program-instance framebuffer attachments -- )
-    rot '[ first _ swap output-index ] sort-with [ second ] map
+    rot '[ first _ swap output-index ] sort-with values
     bind-unnamed-output-attachments ;
 
 : bind-output-attachments ( program-instance framebuffer attachments -- )
index 132e4303e7bb88ff1b111743fb938592dc668fc2..a240aae9452163ff3d4d40cfa2742402c7a669f5 100644 (file)
@@ -176,11 +176,6 @@ M: cube-map-face     texture-data-gl-target
     texture [ texture-gl-target ] [ handle>> ] bi glBindTexture
     texture ; inline
 
-: get-texture-float ( target level enum -- value )
-    0 <float> [ glGetTexLevelParameterfv ] keep *float ; inline
-: get-texture-int ( target level enum -- value )
-    0 <int> [ glGetTexLevelParameteriv ] keep *int ; inline
-
 : ?product ( x -- y )
     dup number? [ product ] unless ; inline
 
index ef71a669ed204b3f7cb6bcd79fba3626aa7e745f..0b6275dba0800f2735ece98452e99d0f4f89c006 100644 (file)
@@ -18,4 +18,4 @@ SPECIALIZED-ARRAY: float
         1.0 0.0 0.5 1.0
         1.0 0.0 1.0 1.0
     }
-] [ { 2 2 } vertex-array byte-array>float-array ] unit-test
+] [ { 2 2 } vertex-array float-array-cast ] unit-test
diff --git a/extra/images/viewer/tags.txt b/extra/images/viewer/tags.txt
new file mode 100644 (file)
index 0000000..700f0dc
--- /dev/null
@@ -0,0 +1 @@
+not tested
diff --git a/extra/images/viewer/viewer-docs.factor b/extra/images/viewer/viewer-docs.factor
new file mode 100644 (file)
index 0000000..1d24bef
--- /dev/null
@@ -0,0 +1,103 @@
+! Copyright (C) 2010 Jon Harper.
+! See http://factorcode.org/license.txt for BSD license.
+USING: help.markup help.syntax kernel strings io.pathnames images 
+models opengl.textures classes ui.gadgets ;
+IN: images.viewer
+
+HELP: <image-gadget>
+{ $values
+    { "object" { $or pathname string image } }
+    { "gadget" image-gadget }
+}
+{ $description "Creates " { $instance image-gadget } " with the given image. See " { $link set-image } "." } ;
+HELP: <image-control>
+{ $values
+    { "model" model }
+    { "gadget" image-control }
+}
+{ $description "Creates " { $instance image-control } " with the given image. See " { $link set-image } "." } ;
+
+HELP: new-image-gadget
+{ $values
+    { "class" class }
+    { "gadget" image-gadget }
+}
+{ $description "Use this if the image is not available when you want to construct the gadget. Don't forget to call "
+{ $link set-image } " before grafting this gadget. You can also use this constructor if you want to extend image-gadget or image-control."
+} ;
+
+HELP: new-image-gadget*
+{ $values
+    { "object" { $or pathname string image } } { "class" class }
+    { "gadget" image-gadget }
+}
+{ $description "Use this constructor when you want to extend image-gadget or image-control." } ;
+
+HELP: set-image
+{ $values
+    { "gadget" image-gadget } { "object" { $or pathname string image } }
+}
+{ $description "Sets the image of this gadget. This word loads the image from disk if the input is a string or a pathname."
+"If the input is a model, gadget has to be " { $instance image-control } "." } ;
+
+HELP: image-control
+{ $var-description "This gadget is like " { $instance image-gadget } ", but it's image must be in " { $instance model } ". It's used to display changing images." } ;
+
+HELP: image-gadget
+{ $var-description "This gadget can render " { $instance image } "." } ;
+
+HELP: image-window
+{ $values
+    { "object" { $or pathname string image } }
+}
+{ $description "Opens a new window displaying the image." } ;
+
+HELP: image.
+{ $values
+    { "object" { $or pathname string image } }
+}
+{ $description "Displays the image in the listener." } ;
+HELP: start-control
+{ $values
+    { "gadget" gadget }
+}
+{ $description "Adds a connection between the gadget and it's model." } ;
+
+HELP: stop-control
+{ $values
+    { "gadget" gadget }
+}
+{ $description "Removes the connection between the gadget and it's model" } ;
+ARTICLE: "images.viewer" "Displaying Images"
+"The " { $vocab-link "images.viewer" } " vocabulary uses the " { $vocab-link "opengl.textures" } 
+" vocabulary to display any instance of " { $link image } "."$nl 
+"An " { $link image-gadget } " can be used for static images and " { $instance image-control } 
+" for changing images (for example a video feed). For changing images, the image should be containted in " { $instance model } 
+". Change the model value with " { $link set-model } " or mutate the image and call "
+{ $link notify-connections } " when you want to update the image. To stop refreshing the image, call " { $link stop-control } "."
+" To start refreshing again, call " { $link start-control } "."
+
+$nl
+"If the " { $link image } " or " { $link model } " containing the image "
+"is available when the object is created, use the following words to create the gadget:"
+{ $subsections <image-gadget> <image-control> }
+"The " { $link image } " or " { $link model }
+" can also be given after the construction of the object. In this case, use "
+{ $link new-image-gadget } " and " { $link set-image } "." 
+" The gadget will automatically detect if the image changes size or format and reallocate a new texture if needed."
+" This means images can be set even after the gadget has been grafted. Grafted gadgets without an image will display a blank screen."
+
+{ $notes "The image can be set after the gadget has been grafted. However, for " { $instance image-gadget } ", this can "
+" be done only once. If your image is changing, you should be using " { $instance image-control } " and " { $instance model } "." 
+$nl
+" Performance will be greatly reduced if you are using images that have more than 512 pixels on one of their"
+" axis." }
+
+
+$nl
+"Utility words for displaying images :"
+{ $subsections
+image. image-window }
+
+;
+ABOUT: "images.viewer"
diff --git a/extra/images/viewer/viewer-tests.factor b/extra/images/viewer/viewer-tests.factor
new file mode 100644 (file)
index 0000000..b59c673
--- /dev/null
@@ -0,0 +1,36 @@
+! Copyright (C) 2010 Jon Harper.
+! See http://factorcode.org/license.txt for BSD license.
+USING: tools.test images.viewer images.viewer.private kernel accessors sequences images
+namespaces ui ui.gadgets.debug math opengl.textures opengl.textures.private 
+models ;
+IN: images.viewer.tests
+
+: (gen-image) ( dim -- bitmap )
+    product 3 * [ 200 ] BV{ } replicate-as ;
+: gen-image ( dim -- image )
+    dup (gen-image) <image> swap >>bitmap swap >>dim 
+    RGB >>component-order ubyte-components >>component-type ;
+
+[ ] [ { 50 50 } gen-image "s" set ] unit-test
+[ ] [ "s" get <image-gadget> "ig" set ] unit-test
+"ig" get [
+   [ t ] [ "ig" get image-gadget-texture single-texture? ] unit-test
+] with-grafted-gadget 
+
+[ ] [ "s" get <model> "m" set ] unit-test
+[ ] [ { 150 150 } gen-image "s1" set ] unit-test
+[ ] [ "m" get <image-control> "ic" set ] unit-test
+"ic" get [
+   [ t ] [ "ic" get image-gadget-texture single-texture? ] unit-test
+   [ { 50 50 } ] [ "ic" get texture>> texture-size ] unit-test
+] with-grafted-gadget
+
+! TODO
+! test that when changing the model, the gadget updates the texture.
+! - same size images (both smaller than 512x512) (updates)
+! test that when changing the model, the gadget creates a new texture.
+! test different cases : 
+! - same size images (both bigger than 512x512) (creates)
+! - different size images (both smaller than 512x512) (creates)
+! - different size images (both bigger than 512x512) (creates)
+! - different size images (1 smaller than, 1 bigger than 512x512)
index c62293bbe7f9e22830ffdbede73e41992f916812..33042f5dd0cca09b815bcf3c9f1b2c5d974770a0 100644 (file)
@@ -1,17 +1,21 @@
 ! Copyright (C) 2007, 2009 Doug Coleman.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors images images.loader io.pathnames kernel
-models namespaces opengl opengl.gl opengl.textures sequences
+models namespaces opengl opengl.gl opengl.textures opengl.textures.private
+sequences math arrays
 strings ui ui.gadgets ui.gadgets.panes ui.images ui.render
-constructors ;
+constructors locals combinators.short-circuit 
+literals destructors ui.gadgets.worlds continuations ;
 IN: images.viewer
 
 TUPLE: image-gadget < gadget image texture ;
+<PRIVATE
+M: image-gadget pref-dim* image>> [ dim>> ] [ { 640 480 } ] if* ;
 
-M: image-gadget pref-dim* image>> dim>> ;
-
+: (image-gadget-texture) ( gadget -- texture )
+    dup image>> { 0 0 } <texture> >>texture texture>> ;
 : image-gadget-texture ( gadget -- texture )
-    dup texture>> [ ] [ dup image>> { 0 0 } <texture> >>texture texture>> ] ?if ;
+    dup texture>> [ ] [ (image-gadget-texture) ] ?if ;
 
 M: image-gadget draw-gadget* ( gadget -- )
     dup image>> [
@@ -20,27 +24,88 @@ M: image-gadget draw-gadget* ( gadget -- )
         drop
     ] if ;
 
-TUPLE: image-control < image-gadget ;
-
-CONSTRUCTOR: image-control ( model -- image-control ) ;
-
-M: image-control pref-dim* image>> [ dim>> ] [ { 640 480 } ] if* ;
-
-M: image-control model-changed
-    swap value>> >>image relayout ;
+: delete-current-texture ( image-gadget -- )
+    [ texture>> [ dispose ] when* ]
+    [ f >>texture drop ] bi ;
 
-! Todo: delete texture on ungraft
+! In unit tests, find-gl-context throws no-world-found when using with-grafted-gadget.
+M: image-gadget ungraft* [ dup find-gl-context delete-current-texture ] [ 2drop ] recover ;
+PRIVATE>
+TUPLE: image-control < image-gadget image-updated? ;
+<PRIVATE
 
-GENERIC: <image-gadget> ( object -- gadget )
+: (bind-2d-texture) ( texture-id -- )
+    [ GL_TEXTURE_2D ] dip glBindTexture ;
+: bind-2d-texture ( single-texture -- )
+    texture>> (bind-2d-texture) ;
+: (update-texture) ( image single-texture -- ) 
+    bind-2d-texture tex-sub-image ;
+! works only for single-texture
+: update-texture ( image-gadget -- )
+    [ image>> ] [ texture>> ] bi
+    (update-texture) ;
+GENERIC: texture-size ( texture -- dim )
+M: single-texture texture-size dim>> ;
 
-M: image <image-gadget>
-    \ image-gadget new
-        swap >>image ;
+:: grid-width ( grid element-quot -- width )
+    grid [ 0 ] [
+        first element-quot [ + ] map-reduce
+    ] if-empty ; inline
+: grid-dim ( grid -- dim )
+    [ [ dim>> first ] grid-width ] [ flip [ dim>> second ] grid-width ] bi 2array ;
+M: multi-texture texture-size 
+    grid>> grid-dim ;
+: same-size? ( image-gadget -- ? )
+    [ texture>> texture-size ] [ image>> dim>> ] bi = ;
+: (texture-format) ( texture-id -- format )
+    (bind-2d-texture) GL_TEXTURE_2D 0
+    GL_TEXTURE_INTERNAL_FORMAT get-texture-int ;
+! works only for single-texture
+: texture-format ( image-gadget -- format/f )
+    texture>> [
+        texture>> [
+            (texture-format)
+        ] [ f ] if*
+    ] [ f ] if* ;
+: same-internal-format? ( image-gadget -- ? ) 
+   [ texture-format ] [ image>> image-format 2drop ] bi = ;
 
-M: string <image-gadget> load-image <image-gadget> ;
-
-M: pathname <image-gadget> string>> load-image <image-gadget> ;
+! TODO: also keep multitextures if possible ?
+: keep-same-texture? ( image-gadget -- ? )
+    { [ texture>> single-texture? ]
+      [ same-size? ]
+      [ same-internal-format? ] } 1&& ;
+: ?update-texture ( image-gadget -- )
+    dup image-updated?>> [
+        f >>image-updated?
+        dup keep-same-texture? [ update-texture ] [ delete-current-texture ] if
+    ] [ drop ] if ;
 
+M: image-control model-changed
+    swap value>> >>image t >>image-updated? relayout ;
+M: image-control draw-gadget* [ ?update-texture ] [ call-next-method ] bi ;
+PRIVATE>
+GENERIC: set-image ( gadget object -- gadget )
+M: image set-image >>image ;
+M: string set-image load-image >>image ;
+M: pathname set-image string>> load-image >>image ;
+M: model set-image [ value>> >>image drop ] [ >>model ] 2bi ;
+: new-image-gadget ( class -- gadget ) new ;
+: new-image-gadget* ( object class -- gadget ) 
+    new-image-gadget swap set-image ;
+: <image-gadget> ( object -- gadget )
+    \ image-gadget new-image-gadget* ;
+: <image-control> ( model -- gadget )
+    \ image-control new-image-gadget* ;
 : image-window ( object -- ) <image-gadget> "Image" open-window ;
 
+! move these words to ui.gadgets because they affect all controls ?
+: stop-control ( gadget -- ) dup model>> [ remove-connection ] [ drop ] if* ;
+: start-control ( gadget -- ) dup model>> [ add-connection ] [ drop ] if* ;
+
 : image. ( object -- ) <image-gadget> gadget. ;
+
+<PRIVATE
+M: image-control graft* start-control ;
+M: image-control ungraft* [ stop-control ] [ call-next-method ] bi ;
+PRIVATE>
diff --git a/extra/io/encodings/detect/authors.txt b/extra/io/encodings/detect/authors.txt
new file mode 100644 (file)
index 0000000..6a1b3e7
--- /dev/null
@@ -0,0 +1 @@
+Joe Groff\r
diff --git a/extra/io/encodings/detect/detect-tests.factor b/extra/io/encodings/detect/detect-tests.factor
new file mode 100644 (file)
index 0000000..c0d560a
--- /dev/null
@@ -0,0 +1,45 @@
+! (c)2010 Joe Groff bsd license\r
+USING: byte-arrays byte-arrays.hex io.encodings.8-bit.koi8-r\r
+io.encodings.8-bit.latin1 io.encodings.binary\r
+io.encodings.detect io.encodings.utf16 io.encodings.utf32\r
+io.encodings.utf8 namespaces tools.test ;\r
+IN: io.encodings.detect.tests\r
+\r
+! UTF encodings with BOMs\r
+[ utf16be ] [ HEX{ FEFF 0031 0032 0033 } detect-byte-array ] unit-test\r
+[ utf16le ] [ HEX{ FFFE 3100 3200 3300 } detect-byte-array ] unit-test\r
+[ utf32be ] [ HEX{ 0000FEFF 00000031 00000032 00000033 } detect-byte-array ] unit-test\r
+[ utf32le ] [ HEX{ FFFE0000 31000000 32000000 33000000 } detect-byte-array ] unit-test\r
+[ utf8 ] [ HEX{ EF BB BF 31 32 33 } detect-byte-array ] unit-test\r
+\r
+! XML prolog\r
+[ utf8 ]\r
+[ """<?xml version="1.0"?>""" >byte-array detect-byte-array ]\r
+unit-test\r
+\r
+[ utf8 ]\r
+[ """<?xml version="1.0" encoding="UTF-8"?>""" >byte-array detect-byte-array ]\r
+unit-test\r
+\r
+[ latin1 ]\r
+[ """<?xml version='1.0' encoding='ISO-8859-1'?>""" >byte-array detect-byte-array ]\r
+unit-test\r
+\r
+[ latin1 ]\r
+[ """<?xml version='1.0' encoding="ISO-8859-1" """ >byte-array detect-byte-array ]\r
+unit-test\r
+\r
+! Default to utf8 if decoding succeeds and there are no nulls\r
+[ utf8 ] [ HEX{ } detect-byte-array ] unit-test\r
+[ utf8 ] [ HEX{ 31 32 33 } detect-byte-array ] unit-test\r
+[ utf8 ] [ HEX{ 31 32 C2 A0 33 } detect-byte-array ] unit-test\r
+[ latin1 ] [ HEX{ 31 32 A0 33 } detect-byte-array ] unit-test\r
+[ koi8-r ] [\r
+    koi8-r default-8bit-encoding [\r
+        HEX{ 31 32 A0 33 } detect-byte-array\r
+    ] with-variable\r
+] unit-test\r
+\r
+[ binary ] [ HEX{ 31 32 33 C2 A0 00 } detect-byte-array ] unit-test\r
+[ binary ] [ HEX{ 31 32 33 C2 A0 00 30 } detect-byte-array ] unit-test\r
+\r
diff --git a/extra/io/encodings/detect/detect.factor b/extra/io/encodings/detect/detect.factor
new file mode 100644 (file)
index 0000000..c8b0175
--- /dev/null
@@ -0,0 +1,50 @@
+! (c)2010 Joe Groff bsd license\r
+USING: accessors byte-arrays byte-arrays.hex combinators\r
+continuations fry io io.encodings io.encodings.8-bit.latin1\r
+io.encodings.ascii io.encodings.binary io.encodings.iana\r
+io.encodings.string io.encodings.utf16 io.encodings.utf32\r
+io.encodings.utf8 io.files io.streams.string kernel literals\r
+math namespaces sequences strings ;\r
+IN: io.encodings.detect\r
+\r
+SYMBOL: default-8bit-encoding\r
+default-8bit-encoding [ latin1 ] initialize\r
+\r
+<PRIVATE\r
+\r
+: prolog-tag ( bytes -- string )\r
+    CHAR: > over index [ 1 + ] [ dup length ] if* head-slice >string ;\r
+\r
+: prolog-encoding ( string -- iana-encoding )\r
+    '[\r
+        _ "encoding=" over start\r
+        10 + swap [ [ 1 - ] dip nth ] [ index-from ] [ swapd subseq ] 2tri\r
+    ] [ drop "UTF-8" ] recover ;\r
+\r
+: detect-xml-prolog ( bytes -- encoding )\r
+    prolog-tag prolog-encoding name>encoding [ ascii ] unless* ;\r
+\r
+: valid-utf8? ( bytes -- ? )\r
+    utf8 decode 1 head-slice* replacement-char swap member? not ;\r
+\r
+PRIVATE>\r
+\r
+: detect-byte-array ( bytes -- encoding )\r
+    {\r
+        { [ dup HEX{ 0000FEFF } head? ] [ drop utf32be ] }\r
+        { [ dup HEX{ FFFE0000 } head? ] [ drop utf32le ] }\r
+        { [ dup HEX{ FEFF } head? ] [ drop utf16be ] }\r
+        { [ dup HEX{ FFFE } head? ] [ drop utf16le ] }\r
+        { [ dup HEX{ EF BB BF } head? ] [ drop utf8 ] }\r
+        { [ dup $[ "<?xml" >byte-array ] head? ] [ detect-xml-prolog ] }\r
+        { [ 0 over member? ] [ drop binary ] }\r
+        { [ dup empty? ] [ drop utf8 ] }\r
+        { [ dup valid-utf8? ] [ drop utf8 ] }\r
+        [ drop default-8bit-encoding get ]\r
+    } cond ;\r
+\r
+: detect-stream ( stream -- sample encoding )\r
+    256 swap stream-read dup detect-byte-array ;\r
+\r
+: detect-file ( file -- encoding )\r
+    binary [ input-stream get detect-stream nip ] with-file-reader ;\r
diff --git a/extra/io/encodings/detect/summary.txt b/extra/io/encodings/detect/summary.txt
new file mode 100644 (file)
index 0000000..23ab1cd
--- /dev/null
@@ -0,0 +1 @@
+Heuristic auto-detection of text encodings and binary files\r
diff --git a/extra/joystick-demo/authors.txt b/extra/joystick-demo/authors.txt
deleted file mode 100644 (file)
index f13c9c1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Joe Groff
diff --git a/extra/joystick-demo/deploy.factor b/extra/joystick-demo/deploy.factor
deleted file mode 100644 (file)
index 8ef5231..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-USING: tools.deploy.config ;
-H{
-    { deploy-name "joystick-demo" }
-    { deploy-io 2 }
-    { deploy-word-defs? f }
-    { deploy-c-types? t }
-    { deploy-word-props? f }
-    { deploy-reflection 1 }
-    { deploy-threads? t }
-    { deploy-math? t }
-    { "stop-after-last-window?" t }
-    { deploy-ui? t }
-}
diff --git a/extra/joystick-demo/joystick-demo.factor b/extra/joystick-demo/joystick-demo.factor
deleted file mode 100644 (file)
index 8201137..0000000
+++ /dev/null
@@ -1,145 +0,0 @@
-USING: ui ui.gadgets sequences kernel arrays math colors
-colors.constants ui.render ui.pens.polygon ui.pens.solid math.vectors
-accessors fry ui.gadgets.packs game.input ui.gadgets.labels
-ui.gadgets.borders alarms calendar locals strings ui.gadgets.buttons
-combinators math.parser assocs threads ;
-IN: joystick-demo
-
-CONSTANT: SIZE { 151 151 }
-CONSTANT: INDICATOR-SIZE { 4 4 }
-: FREQUENCY ( -- f ) 30 recip seconds ;
-
-TUPLE: axis-gadget < gadget indicator z-indicator pov ;
-
-M: axis-gadget pref-dim* drop SIZE ;
-
-: (rect-polygon) ( lo hi -- polygon )
-    2dup
-    [ [ second ] [ first  ] bi* swap 2array ]
-    [ [ first  ] [ second ] bi*      2array ] 2bi swapd 4array ;
-
-: indicator-polygon ( -- polygon )
-    { 0 0 } INDICATOR-SIZE (rect-polygon) ;
-
-CONSTANT: pov-polygons
-    V{
-        { pov-neutral    { { 70 75 } { 75 70 } { 80 75 } { 75 80 } } }
-        { pov-up         { { 70 65 } { 75 60 } { 80 65 } } }
-        { pov-up-right   { { 83 60 } { 90 60 } { 90 67 } } }
-        { pov-right      { { 85 70 } { 90 75 } { 85 80 } } }
-        { pov-down-right { { 90 83 } { 90 90 } { 83 90 } } }
-        { pov-down       { { 70 85 } { 75 90 } { 80 85 } } }
-        { pov-down-left  { { 67 90 } { 60 90 } { 60 83 } } }
-        { pov-left       { { 65 70 } { 60 75 } { 65 80 } } }
-        { pov-up-left    { { 67 60 } { 60 60 } { 60 67 } } }
-    }
-
-: <indicator-gadget> ( color -- indicator )
-    indicator-polygon <polygon-gadget> ;
-
-: (>loc) ( axisloc -- windowloc )
-    0.5 v*n { 0.5 0.5 } v+ SIZE v* [ >integer ] map
-    INDICATOR-SIZE 2 v/n v- ;
-
-: (xy>loc) ( x y -- xyloc )
-    2array (>loc) ;
-: (z>loc) ( z -- zloc )
-    0.0 swap 2array (>loc) ;
-
-: (xyz>loc) ( x y z -- xyloc zloc )
-    [ [ 0.0 ] unless* ] tri@
-    [ (xy>loc) ] dip (z>loc) ;
-
-:: move-axis ( gadget x y z -- )
-    x y z (xyz>loc) :> ( xy z )
-    xy gadget   indicator>> loc<<
-    z  gadget z-indicator>> loc<< ;
-
-: move-pov ( gadget pov -- )
-    swap pov>> [ interior>> -rot = COLOR: gray COLOR: white ? >>color drop ]
-    with assoc-each ;
-
-:: add-pov-gadget ( gadget direction polygon -- gadget direction gadget )
-    gadget COLOR: white polygon <polygon-gadget> [ add-gadget ] keep
-    direction swap ;
-
-: add-pov-gadgets ( gadget -- gadget )
-    pov-polygons [ add-pov-gadget ] assoc-map >>pov ;
-
-: <axis-gadget> ( -- gadget )
-    axis-gadget new
-    add-pov-gadgets
-    COLOR: black <indicator-gadget> [ >>z-indicator ] [ add-gadget ] bi
-    COLOR: red   <indicator-gadget> [ >>indicator   ] [ add-gadget ] bi
-    dup [ 0.0 0.0 0.0 move-axis ] [ f move-pov ] bi ;
-
-TUPLE: joystick-demo-gadget < pack axis raxis controller buttons alarm ;
-
-: add-gadget-with-border ( parent child -- parent )
-    { 2 2 } <border> COLOR: gray <solid> >>boundary add-gadget ;
-
-: add-controller-label ( gadget controller -- gadget )
-    [ >>controller ] [ product-string <label> add-gadget ] bi ;
-
-: add-axis-gadget ( gadget shelf -- gadget shelf )
-    <axis-gadget> [ >>axis ] [ add-gadget-with-border ] bi-curry bi* ;
-
-: add-raxis-gadget ( gadget shelf -- gadget shelf )
-    <axis-gadget> [ >>raxis ] [ add-gadget-with-border ] bi-curry bi* ;
-
-:: (add-button-gadgets) ( gadget shelf -- )
-    gadget controller>> read-controller buttons>> length iota [
-        number>string [ drop ] <border-button>
-        shelf over add-gadget drop
-    ] map gadget buttons<< ;
-
-: add-button-gadgets ( gadget shelf -- gadget shelf )
-    [ (add-button-gadgets) ] 2keep ;
-
-: <joystick-demo-gadget> ( controller -- gadget )
-    joystick-demo-gadget new
-    { 0 1 } >>orientation
-    swap add-controller-label
-    <shelf> add-axis-gadget add-raxis-gadget add-gadget
-    <shelf> add-button-gadgets add-gadget ;
-
-: update-buttons ( buttons button-states -- )
-    [ >>selected? drop ] 2each ;
-
-: kill-update-axes ( gadget -- )
-    COLOR: gray <solid> >>interior
-    [ [ cancel-alarm ] when* f ] change-alarm
-    relayout-1 ;
-
-: (update-axes) ( gadget controller-state -- )
-    {
-        [ [ axis>>  ] [ [ x>>  ] [ y>>  ] [ z>>  ] tri ] bi* move-axis ]
-        [ [ raxis>> ] [ [ rx>> ] [ ry>> ] [ rz>> ] tri ] bi* move-axis ]
-        [ [ axis>>  ] [ pov>> ] bi* move-pov ]
-        [ [ buttons>> ] [ buttons>> ] bi* update-buttons ]
-        [ drop relayout-1 ]
-    } 2cleave ;
-
-: update-axes ( gadget -- )
-    dup controller>> read-controller
-    [ (update-axes) ] [ kill-update-axes ] if* ;
-
-M: joystick-demo-gadget graft*
-    dup '[ _ update-axes ] FREQUENCY every >>alarm
-    drop ;
-
-M: joystick-demo-gadget ungraft*
-    alarm>> [ cancel-alarm ] when* ;
-
-: joystick-window ( controller -- )
-    [ <joystick-demo-gadget> ] [ product-string ] bi
-    open-window ;
-
-: joystick-demo ( -- )
-    [
-        open-game-input
-        100 milliseconds sleep ! It might take a moment to find devices...
-        get-controllers [ joystick-window ] each
-    ] with-ui ;
-
-MAIN: joystick-demo
diff --git a/extra/joystick-demo/summary.txt b/extra/joystick-demo/summary.txt
deleted file mode 100644 (file)
index e10653c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Demonstrate gamepad and joystick input
diff --git a/extra/joystick-demo/tags.txt b/extra/joystick-demo/tags.txt
deleted file mode 100755 (executable)
index 84d4140..0000000
+++ /dev/null
@@ -1 +0,0 @@
-games
diff --git a/extra/key-caps/authors.txt b/extra/key-caps/authors.txt
deleted file mode 100644 (file)
index f13c9c1..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Joe Groff
diff --git a/extra/key-caps/key-caps.factor b/extra/key-caps/key-caps.factor
deleted file mode 100644 (file)
index b236442..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-USING: game.input game.input.scancodes
-kernel ui.gadgets ui.gadgets.buttons sequences accessors
-words arrays assocs math calendar fry alarms ui
-ui.gadgets.borders ui.gestures ;
-IN: key-caps
-
-CONSTANT: key-locations H{
-    { key-escape        { {   0   0 } {  10  10 } } }
-
-    { key-f1            { {  20   0 } {  10  10 } } }
-    { key-f2            { {  30   0 } {  10  10 } } }
-    { key-f3            { {  40   0 } {  10  10 } } }
-    { key-f4            { {  50   0 } {  10  10 } } }
-
-    { key-f5            { {  65   0 } {  10  10 } } }
-    { key-f6            { {  75   0 } {  10  10 } } }
-    { key-f7            { {  85   0 } {  10  10 } } }
-    { key-f8            { {  95   0 } {  10  10 } } }
-
-    { key-f9            { { 110   0 } {  10  10 } } }
-    { key-f10           { { 120   0 } {  10  10 } } }
-    { key-f11           { { 130   0 } {  10  10 } } }
-    { key-f12           { { 140   0 } {  10  10 } } }
-
-
-    { key-`             { {   0  15 } {  10  10 } } }
-    { key-1             { {  10  15 } {  10  10 } } }
-    { key-2             { {  20  15 } {  10  10 } } }
-    { key-3             { {  30  15 } {  10  10 } } }
-    { key-4             { {  40  15 } {  10  10 } } }
-    { key-5             { {  50  15 } {  10  10 } } }
-    { key-6             { {  60  15 } {  10  10 } } }
-    { key-7             { {  70  15 } {  10  10 } } }
-    { key-8             { {  80  15 } {  10  10 } } }
-    { key-9             { {  90  15 } {  10  10 } } }
-    { key-0             { { 100  15 } {  10  10 } } }
-    { key--             { { 110  15 } {  10  10 } } }
-    { key-=             { { 120  15 } {  10  10 } } }
-    { key-backspace     { { 130  15 } {  20  10 } } }
-
-    { key-tab           { {   0  25 } {  15  10 } } }
-    { key-q             { {  15  25 } {  10  10 } } }
-    { key-w             { {  25  25 } {  10  10 } } }
-    { key-e             { {  35  25 } {  10  10 } } }
-    { key-r             { {  45  25 } {  10  10 } } }
-    { key-t             { {  55  25 } {  10  10 } } }
-    { key-y             { {  65  25 } {  10  10 } } }
-    { key-u             { {  75  25 } {  10  10 } } }
-    { key-i             { {  85  25 } {  10  10 } } }
-    { key-o             { {  95  25 } {  10  10 } } }
-    { key-p             { { 105  25 } {  10  10 } } }
-    { key-[             { { 115  25 } {  10  10 } } }
-    { key-]             { { 125  25 } {  10  10 } } }
-    { key-\             { { 135  25 } {  15  10 } } }
-
-    { key-caps-lock     { {   0  35 } {  20  10 } } }
-    { key-a             { {  20  35 } {  10  10 } } }
-    { key-s             { {  30  35 } {  10  10 } } }
-    { key-d             { {  40  35 } {  10  10 } } }
-    { key-f             { {  50  35 } {  10  10 } } }
-    { key-g             { {  60  35 } {  10  10 } } }
-    { key-h             { {  70  35 } {  10  10 } } }
-    { key-j             { {  80  35 } {  10  10 } } }
-    { key-k             { {  90  35 } {  10  10 } } }
-    { key-l             { { 100  35 } {  10  10 } } }
-    { key-;             { { 110  35 } {  10  10 } } }
-    { key-'             { { 120  35 } {  10  10 } } }
-    { key-return        { { 130  35 } {  20  10 } } }
-
-    { key-left-shift    { {   0  45 } {  25  10 } } }
-    { key-z             { {  25  45 } {  10  10 } } }
-    { key-x             { {  35  45 } {  10  10 } } }
-    { key-c             { {  45  45 } {  10  10 } } }
-    { key-v             { {  55  45 } {  10  10 } } }
-    { key-b             { {  65  45 } {  10  10 } } }
-    { key-n             { {  75  45 } {  10  10 } } }
-    { key-m             { {  85  45 } {  10  10 } } }
-    { key-,             { {  95  45 } {  10  10 } } }
-    { key-.             { { 105  45 } {  10  10 } } }
-    { key-/             { { 115  45 } {  10  10 } } }
-    { key-right-shift   { { 125  45 } {  25  10 } } }
-
-    { key-left-control  { {   0  55 } {  15  10 } } }
-    { key-left-gui      { {  15  55 } {  15  10 } } }
-    { key-left-alt      { {  30  55 } {  15  10 } } }
-    { key-space         { {  45  55 } {  45  10 } } }
-    { key-right-alt     { {  90  55 } {  15  10 } } }
-    { key-right-gui     { { 105  55 } {  15  10 } } }
-    { key-application   { { 120  55 } {  15  10 } } }
-    { key-right-control { { 135  55 } {  15  10 } } }
-
-
-    { key-print-screen  { { 155   0 } {  10  10 } } }
-    { key-scroll-lock   { { 165   0 } {  10  10 } } }
-    { key-pause         { { 175   0 } {  10  10 } } }
-    
-    { key-insert        { { 155  15 } {  10  10 } } }
-    { key-home          { { 165  15 } {  10  10 } } }
-    { key-page-up       { { 175  15 } {  10  10 } } }
-
-    { key-delete        { { 155  25 } {  10  10 } } }
-    { key-end           { { 165  25 } {  10  10 } } }
-    { key-page-down     { { 175  25 } {  10  10 } } }
-
-    { key-up-arrow      { { 165  45 } {  10  10 } } }
-    { key-left-arrow    { { 155  55 } {  10  10 } } }
-    { key-down-arrow    { { 165  55 } {  10  10 } } }
-    { key-right-arrow   { { 175  55 } {  10  10 } } }
-
-
-    { key-keypad-numlock { { 190 15 } {  10  10 } } }
-    { key-keypad-/       { { 200 15 } {  10  10 } } }
-    { key-keypad-*       { { 210 15 } {  10  10 } } }
-    { key-keypad--       { { 220 15 } {  10  10 } } }
-
-    { key-keypad-7       { { 190 25 } {  10  10 } } }
-    { key-keypad-8       { { 200 25 } {  10  10 } } }
-    { key-keypad-9       { { 210 25 } {  10  10 } } }
-    { key-keypad-+       { { 220 25 } {  10  20 } } }
-
-    { key-keypad-4       { { 190 35 } {  10  10 } } }
-    { key-keypad-5       { { 200 35 } {  10  10 } } }
-    { key-keypad-6       { { 210 35 } {  10  10 } } }
-
-    { key-keypad-1       { { 190 45 } {  10  10 } } }
-    { key-keypad-2       { { 200 45 } {  10  10 } } }
-    { key-keypad-3       { { 210 45 } {  10  10 } } }
-    { key-keypad-enter   { { 220 45 } {  10  20 } } }
-
-    { key-keypad-0       { { 190 55 } {  20  10 } } }
-    { key-keypad-.       { { 210 55 } {  10  10 } } }
-}
-
-CONSTANT: KEYBOARD-SIZE { 230 65 }
-: FREQUENCY ( -- f ) 30 recip seconds ;
-
-TUPLE: key-caps-gadget < gadget keys alarm ;
-
-: make-key-gadget ( scancode dim array -- )
-    [ 
-        swap [ 
-            " " [ drop ] <border-button>
-            swap [ first >>loc ] [ second >>dim ] bi
-        ] [ execute( -- value ) ] bi*
-    ] dip set-nth ;
-
-: add-keys-gadgets ( gadget -- gadget )
-    key-locations 256 f <array>
-    [ [ make-key-gadget ] curry assoc-each ]
-    [ [ [ add-gadget ] when* ] each ] 
-    [ >>keys ] tri ;
-
-: <key-caps-gadget> ( -- gadget )
-    key-caps-gadget new
-    add-keys-gadgets ;
-
-M: key-caps-gadget pref-dim* drop KEYBOARD-SIZE ;
-
-: update-key-caps-state ( gadget -- )
-    read-keyboard keys>> over keys>> 
-    [ [ selected?<< ] [ drop ] if* ] 2each 
-    relayout-1 ;
-
-M: key-caps-gadget graft*
-    open-game-input
-    dup '[ _ update-key-caps-state ] FREQUENCY every >>alarm
-    drop ;
-
-M: key-caps-gadget ungraft*
-    alarm>> [ cancel-alarm ] when*
-    close-game-input ;
-
-M: key-caps-gadget handle-gesture
-    drop [ key-down? ] [ key-up? ] bi or not ;
-
-MAIN-WINDOW: key-caps { { title "Key Caps" } }
-    <key-caps-gadget> { 5 5 } <border> >>gadgets ;
diff --git a/extra/key-caps/summary.txt b/extra/key-caps/summary.txt
deleted file mode 100644 (file)
index f7d7a2c..0000000
+++ /dev/null
@@ -1 +0,0 @@
-Graphical keyboard diagram
diff --git a/extra/key-caps/tags.txt b/extra/key-caps/tags.txt
deleted file mode 100755 (executable)
index cb5fc20..0000000
+++ /dev/null
@@ -1 +0,0 @@
-demos
diff --git a/extra/key-logger/authors.txt b/extra/key-logger/authors.txt
new file mode 100644 (file)
index 0000000..7c1b2f2
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
diff --git a/extra/key-logger/deploy.factor b/extra/key-logger/deploy.factor
new file mode 100644 (file)
index 0000000..f265164
--- /dev/null
@@ -0,0 +1,15 @@
+USING: tools.deploy.config ;
+H{
+    { deploy-name "key-logger" }
+    { deploy-ui? f }
+    { deploy-c-types? f }
+    { deploy-console? f }
+    { deploy-unicode? f }
+    { "stop-after-last-window?" t }
+    { deploy-io 3 }
+    { deploy-reflection 1 }
+    { deploy-word-props? f }
+    { deploy-math? t }
+    { deploy-threads? t }
+    { deploy-word-defs? f }
+}
diff --git a/extra/key-logger/key-logger.factor b/extra/key-logger/key-logger.factor
new file mode 100644 (file)
index 0000000..471c86c
--- /dev/null
@@ -0,0 +1,35 @@
+! Copyright (C) 2010 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors alarms bit-arrays calendar game.input io
+io.binary io.encodings.binary io.files kernel literals math
+namespaces system threads ;
+IN: key-logger
+
+CONSTANT: frequency $[ 1/30 seconds ]
+
+CONSTANT: path "resource:key-log.txt"
+
+: update-key-caps-state ( -- )
+    read-keyboard keys>>
+    path binary [
+        [ gmt unix-1970 time- duration>nanoseconds >integer ]
+        [ bit-array>integer ] bi*
+        [ 8 >be write ] bi@ flush
+    ] with-file-appender ;
+
+SYMBOL: key-logger
+
+: start-key-logger ( -- )
+    key-logger get-global [
+        [
+            open-game-input
+            [ update-key-caps-state ] frequency every key-logger set-global
+        ] in-thread
+    ] unless ;
+
+: stop-key-logger ( -- )
+    key-logger get-global [ stop-alarm ] when*
+    f key-logger set-global
+    close-game-input ;
+
+MAIN: start-key-logger
index 58c90df6e9438d3cbecf5f8580603d14efaa07ae..ff1547ed27a9eb226017ebbdd270421a2ba1ffe7 100644 (file)
@@ -198,8 +198,8 @@ DEFER: (d)
 
 : bigraded-betti ( u-generators z-generators -- seq )
     [ basis graded ] bi@ tensor bigraded-ker/im-d
-    [ [ [ first ] map ] map ] keep
-    [ [ second ] map 2 head* { 0 0 } prepend ] map
+    [ [ keys ] map ] keep
+    [ values 2 head* { 0 0 } prepend ] map
     rest dup first length 0 <array> suffix
     [ v- ] 2map ;
 
index 27fdeeb618d114a388ed106da3a29d72b2a3148c..9d6bfc8a5a525e71d67817a28df9e68be4156c54 100644 (file)
@@ -32,7 +32,7 @@ TUPLE: function name alien return params ;
     LLVMGetFirstFunction [ (functions) ] { } make [ <function> ] map ;
 
 : function-effect ( function -- effect )
-    [ params>> [ first ] map ] [ return>> void? 0 1 ? ] bi <effect> ;
+    [ params>> keys ] [ return>> void? 0 1 ? ] bi <effect> ;
 
 : install-function ( function -- )
     dup name>> "alien.llvm" create-vocab drop
@@ -53,4 +53,4 @@ TUPLE: function name alien return params ;
     [ normalize-path ] [ file-name ] bi
     [ load-into-jit ] keep install-module ;
     
-<< "alien.llvm" create-vocab drop >>
\ No newline at end of file
+<< "alien.llvm" create-vocab drop >>
index b3f6847c35a755048d33385eb1d064c03e24d590..60a155eae7b3238fa99ff366a668b8a2d3fc1e06 100644 (file)
@@ -1,4 +1,4 @@
-! Copyright (C) 2008 Eduardo Cavazos, Slava Pestov.
+! Copyright (C) 2008, 2010 Eduardo Cavazos, Slava Pestov.
 ! See http://factorcode.org/license.txt for BSD license.
 USING: kernel io.launcher bootstrap.image.download
 mason.common mason.platform ;
@@ -20,8 +20,7 @@ IN: mason.updates
     = not ;
 
 : new-image-available? ( -- ? )
-    boot-image-name need-new-image?
-    [ boot-image-arch download-image t ] [ f ] if ;
+    boot-image-name maybe-download-image ;
 
 : new-code-available? ( -- ? )
     updates-available?
index 26ad8bb4d7549fb7eadf946bbe23284d5a48e63f..5ccd243a54737a444fd2aaab7b0db3f9665b3889 100644 (file)
@@ -1,7 +1,8 @@
 ! (c)Joe Groff bsd license
-USING: accessors classes.struct fry generalizations kernel locals
-math math.combinatorics math.functions math.matrices.simd math.vectors
-math.vectors.simd math.quaternions sequences sequences.private specialized-arrays
+USING: accessors classes.struct fry generalizations kernel
+locals math math.combinatorics math.functions math.matrices.simd
+math.vectors math.vectors.simd math.quaternions sequences
+sequences.generalizations sequences.private specialized-arrays
 typed ;
 FROM: sequences.private => nth-unsafe ;
 FROM: math.quaternions.private => (q*sign) ;
index 93bb0bd836e1d66020e1a03ee0f80dd27bbdd0a6..b78862d225fa10bf784d9f9af6be06dd22525e9d 100644 (file)
@@ -211,7 +211,7 @@ M: model-world apply-world-attributes
              { windowed double-buffered }
            }
            { pref-dim { 1024 768 } }
-           { tick-interval-micros 16666 }
+           { tick-interval-nanos $[ 60 fps ] }
            { use-game-input? t }
            { model-path model-path }
         }
index 399b5c4e8cbccf717e82c6a501dc309e0d149506..9826923df092eb11deb919b21918876814823491 100644 (file)
@@ -247,7 +247,8 @@ CONSTANT: DOC-LARGE H{ { "base_url" "http://www.example.com/test-me" }
 : [bench-quot] ( feat-seq op-word -- quot: ( doc-word -- ) )
     '[ _ swap _
        '[ [ [ _ execute( -- quot ) ] dip
-          [ execute( -- ) ] each _ execute( quot -- quot ) gc benchmark ] with-result ] each
+          [ execute( -- ) ] each _ execute( quot -- quot ) gc
+            benchmark ] with-result ] each
        print-separator ] ; 
 
 : run-serialization-bench ( doc-word-seq feat-seq -- )
@@ -282,7 +283,7 @@ CONSTANT: DOC-LARGE H{ { "base_url" "http://www.example.com/test-me" }
 
     
 : run-benchmarks ( -- )
-    "db" "db" get* "host" "127.0.0.1" get* "port" 27020 get* ensure-number <mdb>
+    "db" "db" get* "host" "127.0.0.1" get* "port" 27017 get* ensure-number <mdb>
     [ print-header
       ! serialization
       { small-doc-prepare medium-doc-prepare
diff --git a/extra/mongodb/cmd/cmd.factor b/extra/mongodb/cmd/cmd.factor
new file mode 100644 (file)
index 0000000..49959d6
--- /dev/null
@@ -0,0 +1,132 @@
+USING: accessors assocs hashtables kernel linked-assocs strings ;
+IN: mongodb.cmd
+
+<PRIVATE
+
+TUPLE: mongodb-cmd 
+    { name string }
+    { const? boolean }
+    { admin? boolean }
+    { auth? boolean }
+    { assoc assoc }
+    { norep? boolean } ;
+
+PRIVATE>
+
+CONSTANT: buildinfo-cmd 
+    T{ mongodb-cmd f "buildinfo" t t f H{ { "buildinfo" 1 } } }
+
+CONSTANT: list-databases-cmd
+    T{ mongodb-cmd f "listDatabases" t t f H{ { "listDatabases" 1 } } }
+
+! Options: { "async" t }
+CONSTANT: fsync-cmd
+    T{ mongodb-cmd f "fsync" f t f H{ { "fsync" 1 } } }
+
+! Value: { "clone" from_host }
+CONSTANT: clone-db-cmd
+    T{ mongodb-cmd f "clone" f f t H{ { "clone" f } } }
+
+! Options { { "fromdb" db } { "todb" db } { fromhost host } }
+CONSTANT: copy-db-cmd
+    T{ mongodb-cmd f "copydb" f f f H{ { "copydb" 1 } } }
+
+CONSTANT: shutdown-cmd
+    T{ mongodb-cmd f "shutdown" t t t H{ { "shutdown" 1 } } t }
+
+CONSTANT: reseterror-cmd
+    T{ mongodb-cmd f "reseterror" t f f H{ { "reseterror" 1 } } }
+
+CONSTANT: getlasterror-cmd
+    T{ mongodb-cmd f "getlasterror" t f f H{ { "getlasterror" 1 } } }
+
+CONSTANT: getpreverror-cmd
+    T{ mongodb-cmd f "getpreverror" t f f H{ { "getpreverror" 1 } } }
+
+CONSTANT: forceerror-cmd
+    T{ mongodb-cmd f "forceerror" t f f H{ { "forceerror" 1 } } }
+
+CONSTANT: drop-db-cmd
+    T{ mongodb-cmd f "dropDatabase" t f f H{ { "dropDatabase" 1 } } }
+
+! Options { { "preserveClonedFilesOnFailure" t/f } { "backupOriginalFiles" t/f } }
+CONSTANT: repair-db-cmd
+    T{ mongodb-cmd f "repairDatabase" f f f H{ { "repairDatabase" 1 } } }
+
+! Options: -1 gets the current profile level; 0-2 set the profile level
+CONSTANT: profile-cmd 
+    T{ mongodb-cmd f "profile" f f f H{ { "profile" 0 } } }
+
+CONSTANT: server-status-cmd
+    T{ mongodb-cmd f "serverStatus" t f f H{ { "serverStatus" 1 } } }
+
+CONSTANT: assertinfo-cmd
+    T{ mongodb-cmd f "assertinfo" t f f H{ { "assertinfo" 1 } } }
+
+CONSTANT: getoptime-cmd
+    T{ mongodb-cmd f "getoptime" t f f H{ { "getoptime" 1 } } }
+
+CONSTANT: oplog-cmd
+    T{ mongodb-cmd f "opLogging" t f f H{ { "opLogging" 1 } } }
+
+! Value: { "deleteIndexes" collection-name }
+! Options: { "index" index_name or "*" }
+CONSTANT: delete-index-cmd
+    T{ mongodb-cmd f "deleteIndexes" f f f H{ { "deleteIndexes" f } } }
+
+! Value: { "create" collection-name }
+! Options: { { "capped" t } { "size" size_in_bytes } { "max" max_number_of_objects } { "autoIndexId" t/f } }
+CONSTANT: create-cmd
+    T{ mongodb-cmd f "drop" f f f H{ { "create" f } } }
+
+! Value { "drop" collection-name }
+CONSTANT: drop-cmd
+    T{ mongodb-cmd f "drop" f f f H{ { "drop" f } } }
+
+! Value { "count" collection-name }
+! Options: { "query" query-object }
+CONSTANT: count-cmd
+    T{ mongodb-cmd f "count" f f f H{ { "count" f } } }
+
+! Value { "validate" collection-name }
+CONSTANT: validate-cmd
+    T{ mongodb-cmd f "validate" f f f H{ { "validate" f } } }
+
+! Value { "collstats" collection-name }
+CONSTANT: collstats-cmd
+    T{ mongodb-cmd f "collstats" f f f H{ { "collstats" f } } }
+
+! Value: { "distinct" collection-name }
+! Options: { "key" key-name }
+CONSTANT: distinct-cmd
+    T{ mongodb-cmd f "distinct" f f f H{ { "distinct" f } } }
+
+! Value: { "filemd5" oid }
+! Options: { "root" bucket-name }
+CONSTANT: filemd5-cmd
+    T{ mongodb-cmd f "filemd5" f f f H{ { "filemd5" f } } }
+
+CONSTANT: getnonce-cmd
+    T{ mongodb-cmd f "getnonce" t f f H{ { "getnonce" 1 } } }
+
+! Options: { { "user" username } { "nonce" nonce } { "key" digest } }
+CONSTANT: authenticate-cmd
+    T{ mongodb-cmd f "authenticate" f f f H{ { "authenticate" 1 } } }
+
+CONSTANT: logout-cmd
+    T{ mongodb-cmd f "logout" t f f H{ { "logout" 1 } } }
+
+! Value: { "findandmodify" collection-name }
+! Options: { { "query" selector } { "sort" sort-spec } 
+!            { "remove" t/f } { "update" modified-object } 
+!            { "new" t/f } }
+CONSTANT: findandmodify-cmd
+    T{ mongodb-cmd f "findandmodify" f f f H{ { "findandmodify" f } } }
+
+: make-cmd ( cmd-stub -- cmd-assoc )
+    dup const?>> [  ] [  
+        clone [ clone <linked-assoc> ] change-assoc
+    ] if ; inline
+
+: set-cmd-opt ( cmd value key -- cmd )
+    pick assoc>> set-at ; inline
index 1d38aa38d521cccf49c4a354cab4476c349ee2fa..2918d58664958a2c2a9731038ed9e624b8c873f6 100644 (file)
@@ -1,9 +1,9 @@
-USING: accessors assocs fry io.encodings.binary io.sockets kernel math
-math.parser mongodb.msg mongodb.operations namespaces destructors
-constructors sequences splitting checksums checksums.md5 
-io.streams.duplex io.encodings.utf8 io.encodings.string combinators.smart
-arrays hashtables sequences.deep vectors locals ;
-
+USING: accessors arrays assocs byte-vectors checksums
+checksums.md5 constructors destructors fry hashtables
+io.encodings.binary io.encodings.string io.encodings.utf8
+io.sockets io.streams.duplex kernel locals math math.parser
+mongodb.cmd mongodb.msg namespaces sequences
+splitting ;
 IN: mongodb.connection
 
 : md5-checksum ( string -- digest )
@@ -15,13 +15,18 @@ TUPLE: mdb-node master? { address inet } remote ;
 
 CONSTRUCTOR: mdb-node ( address master? -- mdb-node ) ;
 
-TUPLE: mdb-connection instance node handle remote local ;
+TUPLE: mdb-connection instance node handle remote local buffer ;
+
+: connection-buffer ( -- buffer )
+    mdb-connection get buffer>> 0 >>length ; inline
+
+USE: mongodb.operations
 
 CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
 
 : check-ok ( result -- errmsg ? )
     [ [ "errmsg" ] dip at ] 
-    [ [ "ok" ] dip at >integer 1 = ] bi ; inline 
+    [ [ "ok" ] dip at ] bi ; inline 
 
 : <mdb-db> ( name nodes -- mdb-db )
     mdb-db new swap >>nodes swap >>name H{ } clone >>collections ;
@@ -33,7 +38,7 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
     nodes>> f swap at ;
 
 : with-connection ( connection quot -- * )
-    [ mdb-connection set ] prepose with-scope ; inline
+    [ mdb-connection ] dip with-variable ; inline
     
 : mdb-instance ( -- mdb )
     mdb-connection get instance>> ; inline
@@ -44,8 +49,9 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
 : namespaces-collection ( -- ns )
     mdb-instance name>> "system.namespaces" "." glue ; inline
 
-: cmd-collection ( -- ns )
-    mdb-instance name>> "$cmd" "." glue ; inline
+: cmd-collection ( cmd -- ns )
+    admin?>> [ "admin"  ] [ mdb-instance name>> ] if
+    "$cmd" "." glue ; inline
 
 : index-ns ( colname -- index-ns )
     [ mdb-instance name>> ] dip "." glue ; inline
@@ -58,15 +64,16 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
     '[ _ write-message read-message ] with-stream* ;
 
 : send-query-1result ( collection assoc -- result )
-    <mdb-query-msg>
-        1 >>return#
-    send-query-plain objects>>
-    [ f ] [ first ] if-empty ;
+    <mdb-query-msg> -1 >>return# send-query-plain
+    objects>> [ f ] [ first ] if-empty ;
+
+: send-cmd ( cmd -- result )
+    [ cmd-collection ] [ assoc>> ] bi send-query-1result ; inline
 
 <PRIVATE
 
 : get-nonce ( -- nonce )
-    cmd-collection H{ { "getnonce" 1 } } send-query-1result 
+    getnonce-cmd make-cmd send-cmd
     [ "nonce" swap at ] [ f ] if* ;
 
 : auth? ( mdb -- ? )
@@ -78,16 +85,14 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
     [ pwd-digest>> ] bi
     3array concat md5-checksum ; inline
 
-: build-auth-query ( -- query-assoc )
-    { "authenticate" 1 }
-    "user"  mdb-instance username>> 2array
-    "nonce" get-nonce 2array
-    3array >hashtable
-    [ [ "nonce" ] dip at calculate-key-digest "key" ] keep
-    [ set-at ] keep ; 
+: build-auth-cmd ( cmd -- cmd )
+    mdb-instance username>> "user" set-cmd-opt
+    get-nonce [ "nonce" set-cmd-opt ] [ ] bi
+    calculate-key-digest "key" set-cmd-opt ; inline
     
 : perform-authentication ( --  )
-    cmd-collection build-auth-query send-query-1result
+    authenticate-cmd make-cmd
+    build-auth-cmd send-cmd
     check-ok [ drop ] [ throw ] if ; inline
 
 : authenticate-connection ( mdb-connection -- )
@@ -98,7 +103,7 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
 : open-connection ( mdb-connection node -- mdb-connection )
    [ >>node ] [ address>> ] bi
    [ >>remote ] keep binary <client>
-   [ >>handle ] dip >>local ;
+   [ >>handle ] dip >>local 4096 <byte-vector> >>buffer ;
 
 : get-ismaster ( -- result )
     "admin.$cmd" H{ { "ismaster" 1 } } send-query-1result ; 
@@ -119,7 +124,7 @@ CONSTRUCTOR: mdb-connection ( instance -- mdb-connection ) ;
 
 : nodelist>table ( seq -- assoc )
    [ [ master?>> ] keep 2array ] map >hashtable ;
-   
+
 PRIVATE>
 
 :: verify-nodes ( mdb -- )
index 78d0b627345c162f16062c896f89ff9fb07526f7..0bd22ee7fe3b9f60f8af2b8a3e0fb744fa684e17 100644 (file)
@@ -1,10 +1,10 @@
 USING: accessors arrays assocs bson.constants combinators
-combinators.smart constructors destructors formatting fry hashtables
-io io.pools io.sockets kernel linked-assocs math mongodb.connection
-mongodb.msg parser prettyprint prettyprint.custom prettyprint.sections
-sequences sets splitting strings
-tools.continuations uuid memoize locals ;
-
+combinators.smart constructors destructors fry hashtables io
+io.pools io.sockets kernel linked-assocs locals math
+mongodb.cmd mongodb.connection mongodb.msg namespaces parser
+prettyprint prettyprint.custom prettyprint.sections sequences
+sets splitting strings ;
+FROM: ascii => ascii? ;
 IN: mongodb.driver
 
 TUPLE: mdb-pool < pool mdb ;
@@ -13,9 +13,9 @@ TUPLE: mdb-cursor id query ;
 
 TUPLE: mdb-collection
 { name string }
-{ capped boolean initial: f }
-{ size integer initial: -1 }
-{ max integer initial: -1 } ;
+{ capped boolean }
+{ size integer }
+{ max integer } ;
 
 CONSTRUCTOR: mdb-collection ( name -- collection ) ;
 
@@ -61,7 +61,7 @@ M: mdb-getmore-msg update-query
     query>> update-query ; 
       
 : make-cursor ( mdb-result-msg mdb-query-msg/mdb-getmore-msg -- mdb-cursor/f )
-    over cursor>> 0 > 
+    over cursor>> 0 >
     [ [ update-query ]
       [ [ cursor>> ] dip <mdb-cursor> ] 2bi
     ] [ 2drop f ] if ;
@@ -84,23 +84,23 @@ M: mdb-getmore-msg verify-query-result
     [ make-cursor ] 2tri
     swap objects>> ;
 
-: make-collection-assoc ( collection assoc -- )
-    [ [ name>> "create" ] dip set-at ]
-    [ [ [ capped>> ] keep ] dip
-      '[ _ _
-         [ [ drop t "capped" ] dip set-at ]
-         [ [ size>> "size" ] dip set-at ]
-         [ [ max>> "max" ] dip set-at ] 2tri ] when
-    ] 2bi ; 
 
 PRIVATE>
 
 SYNTAX: r/ ( token -- mdbregexp )
     \ / [ >mdbregexp ] parse-literal ; 
 
-: with-db ( mdb quot -- )
+: with-db ( mdb quot -- )
     '[ _ mdb-open &dispose _ with-connection ] with-destructors ; inline
-  
+
+: with-mdb ( mdb quot -- )
+    [ <mdb-pool> ] dip
+    [ mdb-pool swap with-variable ] curry with-disposal ; inline
+
+: with-mdb-connection ( quot -- )
+    [ mdb-pool get ] dip 
+    '[ _ with-connection ] with-pooled-connection ; inline
+
 : >id-selector ( assoc -- selector )
     [ MDB_OID_FIELD swap at ] keep
     H{ } clone [ set-at ] keep ;
@@ -115,11 +115,16 @@ GENERIC: create-collection ( name/collection -- )
 M: string create-collection
     <mdb-collection> create-collection ;
 
-M: mdb-collection create-collection
-    [ [ cmd-collection ] dip
-      <linked-hash> [ make-collection-assoc ] keep
-      <mdb-query-msg> 1 >>return# send-query-plain drop ] keep
-      [ ] [ name>> ] bi mdb-instance collections>> set-at ;
+M: mdb-collection create-collection ( collection -- )
+    create-cmd make-cmd over
+    {
+        [ name>> "create" set-cmd-opt ]
+        [ capped>> [ "capped" set-cmd-opt ] when* ]
+        [ max>> [ "max" set-cmd-opt ] when* ]
+        [ size>> [ "size" set-cmd-opt ] when* ]
+    } cleave send-cmd check-ok
+    [ drop [ ] [ name>> ] bi mdb-instance collections>> set-at ]
+    [ throw ] if ;
   
 : load-collection-list ( -- collection-list )
     namespaces-collection
@@ -128,8 +133,12 @@ M: mdb-collection create-collection
 <PRIVATE
 
 : ensure-valid-collection-name ( collection -- )
-    [ ";$." intersect length 0 > ] keep
-    '[ _ "contains invalid characters ( . $ ; )" "." glue throw ] when ; inline
+    [
+        [ ";$." intersect length 0 > ] keep
+        '[ _ "contains invalid characters ( . $ ; )" ":" glue throw ] when
+    ] [
+        [ ascii? ] all? [ "collection names must only contain ascii characters" throw ] unless
+    ] bi ; inline
 
 : build-collection-map ( -- assoc )
     H{ } clone load-collection-list      
@@ -215,21 +224,21 @@ M: mdb-cursor find
     dup empty? [ drop f ] [ first ] if ;
 
 : count ( mdb-query-msg -- result )
-    [ collection>> "count" H{ } clone [ set-at ] keep ] keep
-    query>> [ over [ "query" ] dip set-at ] when*
-    [ cmd-collection ] dip <mdb-query-msg> find-one 
+    [ count-cmd make-cmd ] dip
+    [ collection>> "count" set-cmd-opt ]
+    [ query>> "query" set-cmd-opt ] bi send-cmd 
     [ check-ok nip ] keep '[ "n" _ at >fixnum ] [ f ] if ;
 
 : lasterror ( -- error )
-    cmd-collection H{ { "getlasterror" 1 } } <mdb-query-msg>
-    find-one [ "err" ] dip at ;
+    getlasterror-cmd make-cmd send-cmd
+    [ "err" ] dip at ;
 
 GENERIC: validate. ( collection -- )
 
 M: string validate.
-    [ cmd-collection ] dip
-    "validate" H{ } clone [ set-at ] keep
-    <mdb-query-msg> find-one [ check-ok nip ] keep
+    [ validate-cmd make-cmd ] dip
+    "validate" set-cmd-opt send-cmd
+    [ check-ok nip ] keep
     '[ "result" _ at print ] [  ] if ;
 
 M: mdb-collection validate.
@@ -251,7 +260,7 @@ PRIVATE>
     <mdb-insert-msg> send-message ;
 
 : ensure-index ( index-spec -- )
-    <linked-hash> [ [ uuid1 "_id" ] dip set-at ] keep
+    <linked-hash> [ [ <oid> "_id" ] dip set-at ] keep
     [ { [ [ name>> "name" ] dip set-at ]
         [ [ ns>> index-ns "ns" ] dip set-at ]
         [ [ key>> "key" ] dip set-at ]
@@ -261,11 +270,9 @@ PRIVATE>
     [ index-collection ] dip save ;
 
 : drop-index ( collection name -- )
-    H{ } clone
-    [ [ "index" ] dip set-at ] keep
-    [ [ "deleteIndexes" ] dip set-at ] keep
-    [ cmd-collection ] dip <mdb-query-msg>
-    find-one drop ;
+    [ delete-index-cmd make-cmd ] 2dip
+    [ "deleteIndexes" set-cmd-opt ]
+    [ "index" set-cmd-opt ] bi* send-cmd drop ;
 
 : <update> ( collection selector object -- mdb-update-msg )
     [ check-collection ] 2dip <mdb-update-msg> ;
@@ -278,7 +285,16 @@ PRIVATE>
 
 : update-unsafe ( mdb-update-msg -- )
     send-message ;
+
+: find-and-modify ( collection selector modifier -- mongodb-cmd )
+    [ findandmodify-cmd make-cmd ] 3dip
+    [ "findandmodify" set-cmd-opt ]
+    [ "query" set-cmd-opt ]
+    [ "update" set-cmd-opt ] tri* ; inline
+
+: run-cmd ( cmd -- result )
+    send-cmd ; inline
+
 : delete ( collection selector -- )
     [ check-collection ] dip
     <mdb-delete-msg> send-message-check-error ;
@@ -298,8 +314,7 @@ PRIVATE>
     check-collection drop ;
 
 : drop-collection ( name -- )
-    [ cmd-collection ] dip
-    "drop" H{ } clone [ set-at ] keep
-    <mdb-query-msg> find-one drop ;
+    [ drop-cmd make-cmd ] dip
+    "drop" set-cmd-opt send-cmd drop ;
 
 
diff --git a/extra/mongodb/gridfs/gridfs.factor b/extra/mongodb/gridfs/gridfs.factor
new file mode 100644 (file)
index 0000000..0c5ba6f
--- /dev/null
@@ -0,0 +1,285 @@
+USING: accessors arrays assocs base64 bson.constants
+byte-arrays byte-vectors calendar combinators
+combinators.short-circuit destructors formatting fry hashtables
+io kernel linked-assocs locals math math.parser mongodb.cmd
+mongodb.connection mongodb.driver mongodb.msg namespaces
+sequences splitting strings ;
+FROM: mongodb.driver => update ;
+IN: mongodb.gridfs
+
+CONSTANT: default-chunk-size 262144
+
+TUPLE: gridfs 
+    { bucket string } 
+    { files string }
+    { chunks string } ;
+
+
+<PRIVATE
+
+: gridfs> ( -- gridfs )
+    gridfs get ; inline
+
+: files-collection ( -- str ) gridfs> files>> ; inline
+: chunks-collection ( -- str ) gridfs> chunks>> ; inline
+
+
+: init-gridfs ( gridfs -- )
+    chunks>> "ChunkIdx" H{ { "files_id" 1 } { "n" 1 } } 
+    <index-spec> ensure-index ; inline
+
+PRIVATE>
+
+: <gridfs> ( bucket -- gridfs )
+    [  ] 
+    [ "files" "%s.%s" sprintf  ] 
+    [ "chunks" "%s.%s" sprintf ] tri
+    gridfs boa [ init-gridfs ] keep ;
+
+: with-gridfs ( gridfs quot -- * )
+    [ gridfs ] dip with-variable ; inline
+
+TUPLE: entry 
+    { id oid }
+    { filename string }
+    { content-type string }
+    { length integer }
+    { chunk-size integer }
+    { created timestamp }
+    { aliases array }
+    { metadata hashtable }
+    { md5 string } ;
+
+<PRIVATE
+
+: id>base64 ( id -- str )
+    [ a>> >hex ] [ b>> >hex ] bi 
+    2array "#" join >base64 >string ; inline
+
+: base64>id ( str -- objid )
+    base64> >string "#" split 
+    [ first ] [ second ] bi 
+    [ hex> ] bi@ oid boa ; inline
+    
+PRIVATE>
+
+: <entry> ( name content-type -- entry )
+    entry new 
+    swap >>content-type swap >>filename 
+    <oid> >>id 0 >>length default-chunk-size >>chunk-size 
+    now >>created ; inline
+
+<PRIVATE 
+
+TUPLE: chunk 
+    { id oid }
+    { fileid oid }
+    { n integer }
+    { data byte-array } ;
+
+: at> ( assoc key -- value/f )
+    swap at ; inline
+
+:: >set-at ( assoc value key -- )
+    value key assoc set-at ; inline
+
+: (update-file) ( entry assoc -- entry )
+    { 
+        [ "_id" at> >>id ]
+        [ "filename" at> >>filename ]
+        [ "contentType" at> >>content-type ]
+        [ "length" at> >>length ]
+        [ "chunkSize" at> >>chunk-size ]
+        [ "uploadDate" at> >>created ]
+        [ "aliases" at> >>aliases ]
+        [ "metadata" at> >>metadata ]
+        [ "md5" at> >>md5 ]
+    } cleave ; inline
+
+: assoc>chunk ( assoc -- chunk )
+    [ chunk new ] dip
+    {  
+        [ "_id" at> >>id ]
+        [ "files_id" at> >>fileid ]
+        [ "n" at> >>n ]
+        [ "data" at> >>data ]
+    } cleave ;
+
+: assoc>entry ( assoc -- entry )
+    [ entry new ] dip (update-file) ;
+    
+: entry>assoc ( entry -- assoc )
+    [ H{  } clone ] dip
+    {
+        [ id>> "_id" >set-at ]
+        [ filename>> "filename" >set-at ]
+        [ content-type>> "contentType" >set-at ]
+        [ length>> "length" >set-at ]
+        [ chunk-size>> "chunkSize" >set-at ]
+        [ created>> "uploadDate" >set-at ]
+        [ aliases>> "aliases" >set-at ]
+        [ metadata>> "metadata" >set-at ]
+        [ md5>> "md5" >set-at ]
+        [ drop ]
+    } 2cleave ; inline
+
+: create-entry ( entry -- entry )
+    [ [ files-collection ] dip entry>assoc save ] [ ] bi ;
+
+TUPLE: state bytes count ;
+
+: <state> ( -- state )
+    0 0 state boa ; inline
+
+: get-state ( -- n )
+    state get ; inline
+
+: with-state ( quot -- state )
+    [ <state> state ] dip 
+    [ get-state ] compose 
+    with-variable ; inline
+
+: update-state ( bytes -- )
+    [ get-state ] dip
+    '[ _ + ] change-bytes 
+    [ 1 + ] change-count drop ; inline
+
+:: store-chunk ( chunk entry n -- ) 
+    entry id>> :> id
+    H{ { "files_id" id }
+       { "n" n } { "data" chunk } }
+    [ chunks-collection ] dip save ; inline
+
+:: write-chunks ( stream entry -- length )
+    entry chunk-size>> :> chunk-size
+    [
+        [ 
+            chunk-size stream stream-read dup [
+                [ entry get-state count>> store-chunk ]
+                [ length update-state ] bi 
+            ] when*
+        ] loop
+    ] with-state bytes>> ;
+
+: (entry-selector) ( entry -- selector )
+    id>> "_id" associate ; inline
+
+:: file-md5 ( id -- md5-str )
+    filemd5-cmd make-cmd
+    id "filemd5" set-cmd-opt
+    gridfs> bucket>> "root" set-cmd-opt
+    send-cmd "md5" at> ; inline
+
+: update-entry ( bytes entry -- entry )
+    [ swap >>length dup id>> file-md5 >>md5  ]
+    [ nip [ (entry-selector) ] [  ] bi
+        [ length>> "length" associate "$set" associate 
+          [ files-collection ] 2dip <update> update ]
+        [ md5>> "md5" associate "$set" associate 
+          [ files-collection ] 2dip <update> update ] 2bi 
+    ] 2bi ;
+
+TUPLE: gridfs-input-stream entry chunk n offset cpos ;
+
+: <gridfs-input-stream> ( entry -- stream )
+    [ gridfs-input-stream new ] dip
+    >>entry 0 >>offset 0 >>cpos -1 >>n ;
+
+PRIVATE>
+
+: write-entry ( input-stream entry -- entry )
+    create-entry [ write-chunks ] keep update-entry  ;
+
+: get-entry ( id -- entry )
+    [ files-collection ] dip
+    "_id" associate <query> find-one assoc>entry ;
+
+: open-entry ( entry -- input-stream )
+    <gridfs-input-stream> ;
+
+: entry-contents ( entry -- bytearray )
+    <gridfs-input-stream> stream-contents ;
+
+<PRIVATE
+
+: load-chunk ( stream -- chunk/f )
+    [ entry>> id>> "files_id" associate ]
+    [ n>> "n" associate ] bi assoc-union
+    [ chunks-collection ] dip 
+    <query> find-one dup [ assoc>chunk ] when ;
+
+: exhausted? ( stream -- boolean )
+    [ offset>> ] [ entry>> length>> ] bi = ; inline
+
+: fresh? ( stream -- boolean )
+    [ offset>> 0 = ] [ chunk>> f = ] bi and ; inline
+
+: data-available ( stream -- int/f )
+    [ cpos>> ] [ chunk>> data>> length ] bi 
+    2dup < [ swap - ] [ 2drop f ] if ; inline
+
+: next-chunk ( stream -- available chunk/f )
+    0 >>cpos [ 1 + ] change-n
+    [  ] [ load-chunk ] bi >>chunk
+    [ data-available ] [ chunk>> ] bi ; inline
+
+: ?chunk ( stream -- available chunk/f )
+    dup fresh? [ next-chunk ] [ 
+        dup exhausted? [ drop 0 f ] [  
+            dup data-available [ swap chunk>> ] [ next-chunk ] if*
+        ] if
+    ] if ; inline
+
+: set-stream ( n stream -- )
+    swap { 
+        [ >>offset drop ]
+        [ over entry>> chunk-size>> /mod [ >>n ] [ >>cpos ] bi* drop ]
+        [ drop dup load-chunk >>chunk drop ]
+    } 2cleave ; inline
+
+:: advance-stream ( n stream -- )
+    stream [ n + ] change-cpos [ n + ] change-offset drop ; inline
+
+: read-part ( n stream chunk -- seq/f )
+    [ [ cpos>> swap [ drop ] [ + ] 2bi ] [ data>> ] bi* <slice> ]
+    [ drop advance-stream ] 3bi ; inline
+
+:: (stream-read-partial) ( n stream -- seq/f )
+    stream ?chunk :> chunk :> available
+    chunk [
+        n available < 
+        [ n ] [ available ] if 
+        stream chunk read-part 
+    ] [ f ] if ; inline
+
+:: (stream-read) ( n stream acc -- )
+    n stream (stream-read-partial)
+    {
+        { [ dup not ] [ drop ] }
+        { [ dup length n = ] [ acc push-all ] }
+        { [ dup length n < ] [
+            [ acc push-all ] [ length ] bi
+            n swap - stream acc (stream-read) ]
+        }
+    } cond ; inline recursive 
+
+PRIVATE>
+
+M: gridfs-input-stream stream-element-type drop +byte+ ;
+
+M: gridfs-input-stream stream-read ( n stream -- seq/f )
+    over <byte-vector> [ (stream-read) ] [ ] bi
+    dup empty? [ drop f ] [ >byte-array ] if ;
+
+M: gridfs-input-stream stream-read-partial ( n stream -- seq/f )
+    (stream-read-partial) ;
+
+M: gridfs-input-stream stream-tell ( stream -- n ) 
+    offset>> ;
+
+M: gridfs-input-stream stream-seek ( n seek-type stream -- )
+    swap seek-absolute = 
+    [ set-stream ] 
+    [ "seek-type not supported" throw ] if ;
+
+M: gridfs-input-stream dispose drop ;
index afdb2777fd6c782eab46dadcd2cd69e1ba30d0fc..6bddc2f496ec08a0d9f61adafb8c064b16b1ca2b 100644 (file)
@@ -9,7 +9,7 @@ ARTICLE: "mongodb" "MongoDB factor integration"
   "USING: mongodb.driver ;"
   "\"db\" \"127.0.0.1\" 27017 <mdb>"
   "[ \"mycollection\" [ H{ { \"name\" \"Alfred\" } { \"age\" 57 } } save ] "
-  "                 [ ageIdx [ \"age\" asc ] key-spec <index-spec> ensure-index ]"
+  "                 [ \"ageIdx\" [ \"age\" asc ] key-spec <index-spec> ensure-index ]"
   "                 [ H{ { \"age\" H{ { \"$gt\" 50 } } } } <query> find-one ] tri ] with-db "
   "" }
 { $heading "Highlevel tuple integration" }
index ada0ab42d06dcdc18e41a1141957eaf89d0a462e..ca9393a1086fef65774ff2f9b49f27a1a5ceb651 100644 (file)
@@ -17,52 +17,52 @@ CONSTANT: ResultFlag_ErrSet  2 ! /* { $err : ... } is being returned */
 CONSTANT: ResultFlag_ShardConfigStale 4 !  /* have to update config from the server,  usually $err is also set */
             
 TUPLE: mdb-msg
-{ opcode integer } 
-{ req-id integer initial: 0 }
-{ resp-id integer initial: 0 }
-{ length integer initial: 0 }     
-{ flags integer initial: 0 } ;
+    { opcode integer } 
+    { req-id integer initial: 0 }
+    { resp-id integer initial: 0 }
+    { length integer initial: 0 }     
+    { flags integer initial: 0 } ;
 
 TUPLE: mdb-query-msg < mdb-msg
-{ collection string }
-{ skip# integer initial: 0 }
-{ return# integer initial: 0 }
-{ query assoc }
-{ returnfields assoc }
-{ orderby assoc }
-explain hint ;
+    { collection string }
+    { skip# integer initial: 0 }
+    { return# integer initial: 0 }
+    { query assoc }
+    { returnfields assoc }
+    { orderby assoc }
+    explain hint ;
 
 TUPLE: mdb-insert-msg < mdb-msg
-{ collection string }
-{ objects sequence } ;
+    { collection string }
+    { objects sequence } ;
 
 TUPLE: mdb-update-msg < mdb-msg
-{ collection string }
-{ upsert? integer initial: 0 }
-{ selector assoc }
-{ object assoc } ;
+    { collection string }
+    { upsert? integer initial: 0 }
+    { selector assoc }
+    { object assoc } ;
 
 TUPLE: mdb-delete-msg < mdb-msg
-{ collection string }
-{ selector assoc } ;
+    { collection string }
+    { selector assoc } ;
 
 TUPLE: mdb-getmore-msg < mdb-msg
-{ collection string }
-{ return# integer initial: 0 }
-{ cursor integer initial: 0 }
-{ query mdb-query-msg } ;
+    { collection string }
+    { return# integer initial: 0 }
+    { cursor integer initial: 0 }
+    { query mdb-query-msg } ;
 
 TUPLE: mdb-killcursors-msg < mdb-msg
-{ cursors# integer initial: 0 }
-{ cursors sequence } ;
+    { cursors# integer initial: 0 }
+    { cursors sequence } ;
 
 TUPLE: mdb-reply-msg < mdb-msg
-{ collection string }
-{ cursor integer initial: 0 }
-{ start# integer initial: 0 }
-{ requested# integer initial: 0 }
-{ returned# integer initial: 0 }
-{ objects sequence } ;
+    { collection string }
+    { cursor integer initial: 0 }
+    { start# integer initial: 0 }
+    { requested# integer initial: 0 }
+    { returned# integer initial: 0 }
+    { objects sequence } ;
 
 
 CONSTRUCTOR: mdb-getmore-msg ( collection return# cursor -- mdb-getmore-msg )
index 56e560f07ad924faa86240a29b8f549b0b0304e3..7d16b4c40aafca724c18562520cb85c6b4030c4e 100644 (file)
@@ -1,11 +1,15 @@
 USING: accessors assocs bson.reader bson.writer byte-arrays
-byte-vectors combinators formatting fry io io.binary
-io.encodings.private io.encodings.binary io.encodings.string
-io.encodings.utf8 io.encodings.utf8.private io.files kernel
-locals math mongodb.msg namespaces sequences uuid
-bson.writer.private ;
+byte-vectors combinators formatting fry io io.binary io.encodings.private
+io.encodings.binary io.encodings.string io.encodings.utf8 io.encodings.utf8.private io.files
+kernel locals math mongodb.msg namespaces sequences uuid bson.writer.private ;
+
+FROM: mongodb.connection => connection-buffer ;
+FROM: alien => byte-length ;
+
 IN: mongodb.operations
 
+M: byte-vector byte-length length ;
+
 <PRIVATE
 
 PREDICATE: mdb-reply-op < integer OP_Reply = ;
@@ -16,12 +20,6 @@ PREDICATE: mdb-delete-op < integer OP_Delete = ;
 PREDICATE: mdb-getmore-op < integer OP_GetMore = ;
 PREDICATE: mdb-killcursors-op < integer OP_KillCursors = ;
 
-PRIVATE>
-
-GENERIC: write-message ( message -- )
-
-<PRIVATE
-
 CONSTANT: MSG-HEADER-SIZE 16
 
 SYMBOL: msg-bytes-read 
@@ -40,34 +38,26 @@ SYMBOL: msg-bytes-read
 : read-byte-raw ( -- byte-raw ) 1 [ read le> ] [ change-bytes-read ] bi ; inline
 : read-byte ( -- byte ) read-byte-raw first ; inline
 
-: (read-cstring) ( acc -- )
-    [ read-byte ] dip ! b acc
-    2dup push             ! b acc
-    [ 0 = ] dip      ! bool acc
-    '[ _ (read-cstring) ] unless ; inline recursive
-
-: read-cstring ( -- string )
-    BV{ } clone
-    [ (read-cstring) ] keep
-    [ zero? ] trim-tail
-    >byte-array utf8 decode ; inline
-
-GENERIC: (read-message) ( message opcode -- message )
-
 : copy-header ( message msg-stub -- message )
-    [ length>> ] keep [ >>length ] dip
-    [ req-id>> ] keep [ >>req-id ] dip
-    [ resp-id>> ] keep [ >>resp-id ] dip
-    [ opcode>> ] keep [ >>opcode ] dip
-    flags>> >>flags ;
-
-M: mdb-reply-op (read-message) ( msg-stub opcode -- message )
-    drop
+    {
+        [ length>> >>length ]
+        [ req-id>> >>req-id ]
+        [ resp-id>> >>resp-id ]
+        [ opcode>> >>opcode ]
+        [ flags>> >>flags ]
+    } cleave ; inline
+
+: reply-read-message ( msg-stub -- message )
     [ <mdb-reply-msg> ] dip copy-header
     read-longlong >>cursor
     read-int32 >>start#
     read-int32 [ >>returned# ] keep
-    [ H{ } stream>assoc ] collector [ times ] dip >>objects ;    
+    [ H{ } clone stream>assoc ] collector [ times ] dip >>objects ;    
+
+: (read-message) ( message opcode -- message )
+    OP_Reply = 
+    [ reply-read-message ]
+    [ "unknown message type" throw ] if ; inline
 
 : read-header ( message -- message )
     read-int32 >>length
@@ -77,94 +67,97 @@ M: mdb-reply-op (read-message) ( msg-stub opcode -- message )
     read-int32 >>flags ; inline
 
 : write-header ( message -- )
-    [ req-id>> write-int32 ] keep
-    [ resp-id>> write-int32 ] keep 
-    opcode>> write-int32 ; inline
+    [ req-id>> write-int32 ]
+    [ resp-id>> write-int32 ]
+    [ opcode>> write-int32 ] tri ; inline
 
 PRIVATE>
 
 : read-message ( -- message )
-    mdb-msg new
-    0 >bytes-read
-    read-header
-    [ ] [ opcode>> ] bi (read-message) ;
+    [
+        mdb-msg new 0 >bytes-read read-header
+        [ ] [ opcode>> ] bi (read-message)
+    ] with-scope ;
 
 <PRIVATE
 
-USE: tools.walker
-
-: dump-to-file ( array -- )
-    [ uuid1 "/tmp/mfb/%s.dump" sprintf binary ] dip
-    '[ _ write ] with-file-writer ;
-
-: (write-message) ( message quot -- )    
-    '[ [ [ _ write-header ] dip _ call ] with-length-prefix ] with-buffer
-    ! [ dump-to-file ] keep
-    write flush ; inline
+: (write-message) ( message quot -- )
+    [ connection-buffer dup ] 2dip
+    '[
+        [ _ [ write-header ] [ @ ] bi ] with-length-prefix
+    ] with-output-stream* write flush ; inline
 
 :: build-query-object ( query -- selector )
     H{ } clone :> selector
-    query { [ orderby>> [ "$orderby" selector set-at ] when* ]
-      [ explain>> [ "$explain" selector set-at ] when* ]
-      [ hint>> [ "$hint" selector set-at ] when* ] 
-      [ query>> "query" selector set-at ]
-    } cleave
-    selector ;
+    query {
+        [ orderby>> [ "$orderby" selector set-at ] when* ]
+        [ explain>> [ "$explain" selector set-at ] when* ]
+        [ hint>> [ "$hint" selector set-at ] when* ]
+        [ query>> "query" selector set-at ]
+    } cleave selector ; inline
+
+: write-query-message ( message -- )
+    [
+        {
+            [ flags>> write-int32 ]
+            [ collection>> write-cstring ]
+            [ skip#>> write-int32 ]
+            [ return#>> write-int32 ]
+            [ build-query-object assoc>stream ]
+            [ returnfields>> [ assoc>stream ] when* ]
+        } cleave
+    ] (write-message) ; inline
+
+: write-insert-message ( message -- )
+    [ 
+       [ flags>> write-int32 ]
+       [ collection>> write-cstring ]
+       [ objects>> [ assoc>stream ] each ] tri
+    ] (write-message) ; inline
+
+: write-update-message ( message -- )
+    [
+        { 
+            [ flags>> write-int32 ]
+            [ collection>> write-cstring ]
+            [ upsert?>> write-int32 ]
+            [ selector>> assoc>stream ]
+            [ object>> assoc>stream ]
+        } cleave
+    ] (write-message) ; inline
+
+: write-delete-message ( message -- )
+    [
+       [ flags>> write-int32 ]
+       [ collection>> write-cstring ]
+       [ 0 write-int32 selector>> assoc>stream ] tri
+    ] (write-message) ; inline
+
+: write-getmore-message ( message -- )
+    [
+        {
+           [ flags>> write-int32 ]
+           [ collection>> write-cstring ]
+           [ return#>> write-int32 ]
+           [ cursor>> write-longlong ]
+        } cleave
+    ] (write-message) ; inline
+
+: write-killcursors-message ( message -- )
+    [
+       [ flags>> write-int32 ]
+       [ cursors#>> write-int32 ]
+       [ cursors>> [ write-longlong ] each ] tri
+    ] (write-message) ; inline
 
 PRIVATE>
 
-M: mdb-query-msg write-message ( message -- )
-     dup
-     '[ _ 
-        [ flags>> write-int32 ] keep 
-        [ collection>> write-cstring ] keep
-        [ skip#>> write-int32 ] keep
-        [ return#>> write-int32 ] keep
-        [ build-query-object assoc>stream ] keep
-        returnfields>> [ assoc>stream ] when* 
-     ] (write-message) ;
-M: mdb-insert-msg write-message ( message -- )
-    dup
-    '[ _
-       [ flags>> write-int32 ] keep
-       [ collection>> write-cstring ] keep
-       objects>> [ assoc>stream ] each
-    ] (write-message) ;
-
-M: mdb-update-msg write-message ( message -- )
-    dup
-    '[ _
-       [ flags>> write-int32 ] keep
-       [ collection>> write-cstring ] keep
-       [ upsert?>> write-int32 ] keep
-       [ selector>> assoc>stream ] keep
-       object>> assoc>stream
-    ] (write-message) ;
-
-M: mdb-delete-msg write-message ( message -- )
-    dup
-    '[ _
-       [ flags>> write-int32 ] keep
-       [ collection>> write-cstring ] keep
-       0 write-int32
-       selector>> assoc>stream
-    ] (write-message) ;
-
-M: mdb-getmore-msg write-message ( message -- )
-    dup
-    '[ _
-       [ flags>> write-int32 ] keep
-       [ collection>> write-cstring ] keep
-       [ return#>> write-int32 ] keep
-       cursor>> write-longlong
-    ] (write-message) ;
-
-M: mdb-killcursors-msg write-message ( message -- )
-    dup
-    '[ _
-       [ flags>> write-int32 ] keep
-       [ cursors#>> write-int32 ] keep
-       cursors>> [ write-longlong ] each
-    ] (write-message) ;
-
+: write-message ( message -- )
+    {  
+        { [ dup mdb-query-msg? ] [ write-query-message ] }
+        { [ dup mdb-insert-msg? ] [ write-insert-message ] }
+        { [ dup mdb-update-msg? ] [ write-update-message ] }
+        { [ dup mdb-delete-msg? ] [ write-delete-message ] }
+        { [ dup mdb-getmore-msg? ] [ write-getmore-message ] }
+        { [ dup mdb-killcursors-msg? ] [ write-killcursors-message ] }
+    } cond ;
index 9ea66fba520b875a881b317a55a2a32971c11cba..d24e88f90e3e334ded95eb4348dcfbef3400f4aa 100644 (file)
@@ -42,7 +42,7 @@ DEFER: assoc>tuple
    swap set-at ; inline
 
 : write-field? ( tuple key value -- ? )
-   pick mdb-persistent? [ 
+   pick mdb-persistent? [
       { [ [ 2drop ] dip not ]
         [ drop transient-slot? ] } 3|| not ] [ 3drop t ] if ; inline
 
@@ -54,7 +54,7 @@ CONSTRUCTOR: cond-value ( value quot -- cond-value ) ;
    over [ call( tuple -- assoc ) ] dip 
    [ [ tuple-collection name>> ] [ >toid ] bi ] keep
    [ add-storable ] dip
-   [ tuple-collection name>> ] [ id>> ] bi <objref> ;
+   [ tuple-collection name>> ] [ id>> ] bi <dbref> ;
 
 : write-field ( value quot -- value' )
    <cond-value> {
@@ -78,9 +78,6 @@ CONSTRUCTOR: cond-value ( value quot -- cond-value ) ;
 : prepare-assoc ( tuple -- assoc mirror tuple assoc )
    H{ } clone swap [ <mirror> ] keep pick ; inline
 
-: ensure-mdb-info ( tuple -- tuple )    
-   dup id>> [ <objid> >>id ] unless ; inline
-
 : with-object-map ( quot: ( -- ) -- store-assoc )
    [ H{ } clone dup object-map ] dip with-variable ; inline
 
@@ -92,11 +89,14 @@ PRIVATE>
 
 GENERIC: tuple>storable ( tuple -- storable )
 
+: ensure-oid ( tuple -- tuple )
+   dup id>> [ <oid> >>id ] unless ; inline
+
 M: mdb-persistent tuple>storable ( mdb-persistent -- object-map )
    '[ _ [ tuple>assoc ] write-mdb-persistent drop ] with-object-map ; inline
 
 M: mdb-persistent tuple>assoc ( tuple -- assoc )
-   ensure-mdb-info (tuple>assoc) ;
+   ensure-oid (tuple>assoc) ;
 
 M: tuple tuple>assoc ( tuple -- assoc )
    (tuple>assoc) ;
index ce76a37ff4a3fa248b98ab3faa9de3510b301293..2f235f74a0a9c47c925318b6cd8c49e2bcac1fbb 100644 (file)
@@ -61,9 +61,9 @@ PRIVATE>
  
 : update-tuple ( tuple -- )
     [ tuple-collection name>> ]
-    [ id-selector ]
+    [ ensure-oid id-selector ]
     [ tuple>assoc ] tri
-    <update> update ;
+    <update> >upsert update ;
 
 : save-tuple ( tuple -- )
     update-tuple ;
index a65e459a7c58c22f4644c66d00a3768d536e61e7..ebe60e00f63567afe405032e7d875ddc431353f8 100644 (file)
@@ -3,9 +3,9 @@
 USING: kernel math sequences vectors classes classes.algebra
 combinators arrays words assocs parser namespaces make
 definitions prettyprint prettyprint.backend prettyprint.custom
-quotations generalizations debugger io compiler.units
-kernel.private effects accessors hashtables sorting shuffle
-math.order sets see effects.parser ;
+quotations generalizations sequences.generalizations debugger io
+compiler.units kernel.private effects accessors hashtables
+sorting shuffle math.order sets see effects.parser ;
 FROM: namespaces => set ;
 IN: multi-methods
 
index d28bbdb9043ca01563ef851b2d66f50b09c6f437..8be2970b92b3690dc5e9731b6140452bb9123c89 100644 (file)
@@ -1,5 +1,6 @@
 USING: arrays kernel math opengl opengl.gl opengl.glu
-opengl.demo-support ui ui.gadgets ui.render literals accessors ;
+opengl.demo-support ui ui.gadgets ui.render ui.pixel-formats
+literals accessors ;
 IN: nehe.2
 
 TUPLE: nehe2-gadget < gadget ;
@@ -8,36 +9,45 @@ CONSTANT: width 256
 CONSTANT: height 256
 
 : <nehe2-gadget> (  -- gadget )
-  nehe2-gadget new ;
+    nehe2-gadget new ;
 
 M: nehe2-gadget draw-gadget* ( gadget -- )
-  drop
-  GL_PROJECTION glMatrixMode
-  glLoadIdentity
-  45.0 width height / >float 0.1 100.0 gluPerspective
-  GL_MODELVIEW glMatrixMode
-  glLoadIdentity
-  GL_SMOOTH glShadeModel
-  0.0 0.0 0.0 0.0 glClearColor
-  1.0 glClearDepth
-  GL_DEPTH_TEST glEnable
-  GL_LEQUAL glDepthFunc
-  GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST glHint
-  GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
-  glLoadIdentity
-  -1.5 0.0 -6.0 glTranslatef
-  GL_TRIANGLES [
-    0.0 1.0 0.0 glVertex3f
-    -1.0 -1.0 0.0 glVertex3f
-    1.0 -1.0 0.0 glVertex3f
-  ] do-state
-  3.0 0.0 0.0 glTranslatef
-  GL_QUADS [
-    -1.0 1.0 0.0 glVertex3f
-    1.0 1.0 0.0 glVertex3f
-    1.0 -1.0 0.0 glVertex3f
-    -1.0 -1.0 0.0 glVertex3f
-  ] do-state ;
+    drop
+    GL_PROJECTION glMatrixMode
+    glLoadIdentity
+    45.0 width height / >float 0.1 100.0 gluPerspective
+    GL_MODELVIEW glMatrixMode
+    glLoadIdentity
+    GL_SMOOTH glShadeModel
+    0.0 0.0 0.0 0.0 glClearColor
+    1.0 glClearDepth
+    GL_DEPTH_TEST glEnable
+    GL_LEQUAL glDepthFunc
+    GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST glHint
+    GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
+    glLoadIdentity
+    -1.5 0.0 -6.0 glTranslatef
+    GL_TRIANGLES [
+        0.0 1.0 0.0 glVertex3f
+        -1.0 -1.0 0.0 glVertex3f
+        1.0 -1.0 0.0 glVertex3f
+    ] do-state
+    3.0 0.0 0.0 glTranslatef
+    GL_QUADS [
+        -1.0 1.0 0.0 glVertex3f
+        1.0 1.0 0.0 glVertex3f
+        1.0 -1.0 0.0 glVertex3f
+        -1.0 -1.0 0.0 glVertex3f
+    ] do-state ;
 
-MAIN-WINDOW: run2 { { title "NeHe Tutorial 2" } { pref-dim { $ width $ height } } }
-  <nehe2-gadget> >>gadgets ;
+MAIN-WINDOW: run2
+    {
+        { title "NeHe Tutorial 2" }
+        { pref-dim { $ width $ height } }
+        { pixel-format-attributes {
+            windowed
+            double-buffered
+            T{ depth-bits { value 16 } }
+        } }
+    }
+    <nehe2-gadget> >>gadgets ;
index 0cddcfcaa3ca3b62f1753d5f91283ef4a4050a39..377f1f2a00cdfdc2f0558202bb54ae109b7f68ed 100644 (file)
@@ -1,6 +1,6 @@
 USING: arrays kernel math opengl opengl.gl opengl.glu
-opengl.demo-support ui ui.gadgets ui.render threads accessors
-calendar literals ;
+opengl.demo-support ui ui.gadgets ui.render ui.pixel-formats
+threads accessors calendar literals ;
 IN: nehe.4
 
 TUPLE: nehe4-gadget < gadget rtri rquad thread quit? ;
@@ -10,63 +10,72 @@ CONSTANT: height 256
 : redraw-interval ( -- dt ) 10 milliseconds ;
 
 : <nehe4-gadget> (  -- gadget )
-  nehe4-gadget new
+    nehe4-gadget new
     0.0 >>rtri
     0.0 >>rquad ;
 
 M: nehe4-gadget draw-gadget* ( gadget -- )
-  GL_PROJECTION glMatrixMode
-  glLoadIdentity
-  45.0 width height / >float 0.1 100.0 gluPerspective
-  GL_MODELVIEW glMatrixMode
-  glLoadIdentity
-  GL_SMOOTH glShadeModel
-  0.0 0.0 0.0 0.0 glClearColor
-  1.0 glClearDepth
-  GL_DEPTH_TEST glEnable
-  GL_LEQUAL glDepthFunc
-  GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST glHint
-  GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
-  glLoadIdentity
-  -1.5 0.0 -6.0 glTranslatef
-  dup rtri>> 0.0 1.0 0.0 glRotatef
+    GL_PROJECTION glMatrixMode
+    glLoadIdentity
+    45.0 width height / >float 0.1 100.0 gluPerspective
+    GL_MODELVIEW glMatrixMode
+    glLoadIdentity
+    GL_SMOOTH glShadeModel
+    0.0 0.0 0.0 0.0 glClearColor
+    1.0 glClearDepth
+    GL_DEPTH_TEST glEnable
+    GL_LEQUAL glDepthFunc
+    GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST glHint
+    GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear
+    glLoadIdentity
+    -1.5 0.0 -6.0 glTranslatef
+    dup rtri>> 0.0 1.0 0.0 glRotatef
 
-  GL_TRIANGLES [
-    1.0 0.0 0.0 glColor3f
-    0.0 1.0 0.0 glVertex3f
-    0.0 1.0 0.0 glColor3f
-    -1.0 -1.0 0.0 glVertex3f
-    0.0 0.0 1.0 glColor3f
-    1.0 -1.0 0.0 glVertex3f
-  ] do-state
+    GL_TRIANGLES [
+        1.0 0.0 0.0 glColor3f
+        0.0 1.0 0.0 glVertex3f
+        0.0 1.0 0.0 glColor3f
+        -1.0 -1.0 0.0 glVertex3f
+        0.0 0.0 1.0 glColor3f
+        1.0 -1.0 0.0 glVertex3f
+    ] do-state
 
-  glLoadIdentity
+    glLoadIdentity
 
-  1.5 0.0 -6.0 glTranslatef
-  dup rquad>> 1.0 0.0 0.0 glRotatef
-  0.5 0.5 1.0 glColor3f
-  GL_QUADS [
-    -1.0 1.0 0.0 glVertex3f
-    1.0 1.0 0.0 glVertex3f
-    1.0 -1.0 0.0 glVertex3f
-    -1.0 -1.0 0.0 glVertex3f
-  ] do-state
-  [ 0.2 + ] change-rtri
-  [ 0.15 - ] change-rquad drop ;
+    1.5 0.0 -6.0 glTranslatef
+    dup rquad>> 1.0 0.0 0.0 glRotatef
+    0.5 0.5 1.0 glColor3f
+    GL_QUADS [
+        -1.0 1.0 0.0 glVertex3f
+        1.0 1.0 0.0 glVertex3f
+        1.0 -1.0 0.0 glVertex3f
+        -1.0 -1.0 0.0 glVertex3f
+    ] do-state
+    [ 0.2 + ] change-rtri
+    [ 0.15 - ] change-rquad drop ;
 
 : nehe4-update-thread ( gadget -- )
-  dup quit?>> [ drop ] [
-    redraw-interval sleep
-    dup relayout-1
-    nehe4-update-thread
-  ] if ;
+    dup quit?>> [ drop ] [
+        redraw-interval sleep
+        dup relayout-1
+        nehe4-update-thread
+    ] if ;
 
 M: nehe4-gadget graft* ( gadget -- )
-  f >>quit?
-  [ nehe4-update-thread ] curry in-thread ;
+    f >>quit?
+    [ nehe4-update-thread ] curry in-thread ;
 
 M: nehe4-gadget ungraft* ( gadget -- )
-  t >>quit? drop ;
+    t >>quit? drop ;
 
-MAIN-WINDOW: run4 { { title "NeHe Tutorial 4" } { pref-dim { $ width $ height } } }
-  <nehe4-gadget> >>gadgets ;
+MAIN-WINDOW: run4
+    {
+        { title "NeHe Tutorial 4" }
+        { pref-dim { $ width $ height } }
+        { pixel-format-attributes {
+            windowed
+            double-buffered
+            T{ depth-bits { value 16 } }
+        } }
+    }
+    <nehe4-gadget> >>gadgets ;
index e6f5c6e6bac1beccafbb9c40df7e4b18f4aac5db..9fc19e1cfb873bad834acf2d634ba65e88bb7212 100644 (file)
@@ -1,6 +1,6 @@
 USING: arrays kernel math opengl opengl.gl opengl.glu\r
-opengl.demo-support ui ui.gadgets ui.render threads accessors\r
-calendar literals ;\r
+opengl.demo-support ui ui.gadgets ui.render ui.pixel-formats\r
+threads accessors calendar literals ;\r
 IN: nehe.5\r
 \r
 TUPLE: nehe5-gadget < gadget rtri rquad thread quit? ;\r
@@ -9,116 +9,125 @@ CONSTANT: height 256
 : redraw-interval ( -- dt ) 10 milliseconds ;\r
 \r
 : <nehe5-gadget> (  -- gadget )\r
-  nehe5-gadget new\r
+    nehe5-gadget new\r
     0.0 >>rtri\r
     0.0 >>rquad ;\r
 \r
 M: nehe5-gadget draw-gadget* ( gadget -- )\r
-  GL_PROJECTION glMatrixMode\r
-  glLoadIdentity\r
-  45.0 width height / >float 0.1 100.0 gluPerspective\r
-  GL_MODELVIEW glMatrixMode\r
-  glLoadIdentity\r
-  GL_SMOOTH glShadeModel\r
-  0.0 0.0 0.0 0.0 glClearColor\r
-  1.0 glClearDepth\r
-  GL_DEPTH_TEST glEnable\r
-  GL_LEQUAL glDepthFunc\r
-  GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST glHint\r
-  GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear\r
-  glLoadIdentity\r
-  -1.5 0.0 -6.0 glTranslatef\r
-  dup rtri>> 0.0 1.0 0.0 glRotatef\r
-\r
-  GL_TRIANGLES [\r
-    1.0 0.0 0.0 glColor3f\r
-    0.0 1.0 0.0 glVertex3f\r
-    0.0 1.0 0.0 glColor3f\r
-    -1.0 -1.0 1.0 glVertex3f\r
-    0.0 0.0 1.0 glColor3f\r
-    1.0 -1.0 1.0 glVertex3f\r
-\r
-    1.0 0.0 0.0 glColor3f\r
-    0.0 1.0 0.0 glVertex3f\r
-    0.0 0.0 1.0 glColor3f\r
-    1.0 -1.0 1.0 glVertex3f\r
-    0.0 1.0 0.0 glColor3f\r
-    1.0 -1.0 -1.0 glVertex3f\r
-\r
-    1.0 0.0 0.0 glColor3f\r
-    0.0 1.0 0.0 glVertex3f\r
-    0.0 1.0 0.0 glColor3f\r
-    1.0 -1.0 -1.0 glVertex3f\r
-    0.0 0.0 1.0 glColor3f\r
-    -1.0 -1.0 -1.0 glVertex3f\r
-\r
-    1.0 0.0 0.0 glColor3f\r
-    0.0 1.0 0.0 glVertex3f\r
-    0.0 0.0 1.0 glColor3f\r
-    -1.0 -1.0 -1.0 glVertex3f\r
-    0.0 1.0 0.0 glColor3f\r
-    -1.0 -1.0 1.0 glVertex3f\r
-  ] do-state\r
-\r
-  glLoadIdentity\r
-\r
-  1.5 0.0 -7.0 glTranslatef\r
-  dup rquad>> 1.0 0.0 0.0 glRotatef\r
-  GL_QUADS [\r
-    0.0 1.0 0.0 glColor3f\r
-    1.0 1.0 -1.0 glVertex3f\r
-    -1.0 1.0 -1.0 glVertex3f\r
-    -1.0 1.0 1.0 glVertex3f\r
-    1.0 1.0 1.0 glVertex3f\r
-\r
-    1.0 0.5 0.0 glColor3f\r
-    1.0 -1.0 1.0 glVertex3f\r
-    -1.0 -1.0 1.0 glVertex3f\r
-    -1.0 -1.0 -1.0 glVertex3f\r
-    1.0 -1.0 -1.0 glVertex3f\r
-\r
-    1.0 0.0 0.0 glColor3f\r
-    1.0 1.0 1.0 glVertex3f\r
-    -1.0 1.0 1.0 glVertex3f\r
-    -1.0 -1.0 1.0 glVertex3f\r
-    1.0 -1.0 1.0 glVertex3f\r
-\r
-    1.0 1.0 0.0 glColor3f\r
-    1.0 -1.0 -1.0 glVertex3f\r
-    -1.0 -1.0 -1.0 glVertex3f\r
-    -1.0 1.0 -1.0 glVertex3f\r
-    1.0 1.0 -1.0 glVertex3f\r
-\r
-    0.0 0.0 1.0 glColor3f\r
-    -1.0 1.0 1.0 glVertex3f\r
-    -1.0 1.0 -1.0 glVertex3f\r
-    -1.0 -1.0 -1.0 glVertex3f\r
-    -1.0 -1.0 1.0 glVertex3f\r
-\r
-    1.0 0.0 1.0 glColor3f\r
-    1.0 1.0 -1.0 glVertex3f\r
-    1.0 1.0 1.0 glVertex3f\r
-    1.0 -1.0 1.0 glVertex3f\r
-    1.0 -1.0 -1.0 glVertex3f\r
-  ] do-state \r
-  [ 0.2 + ] change-rtri\r
-  [ 0.15 - ] change-rquad drop ;\r
-\r
-: nehe5-update-thread ( gadget -- )  \r
-  dup quit?>> [\r
-    drop\r
-  ] [\r
-    redraw-interval sleep \r
-    dup relayout-1  \r
-    nehe5-update-thread \r
-  ] if ;\r
+    GL_PROJECTION glMatrixMode\r
+    glLoadIdentity\r
+    45.0 width height / >float 0.1 100.0 gluPerspective\r
+    GL_MODELVIEW glMatrixMode\r
+    glLoadIdentity\r
+    GL_SMOOTH glShadeModel\r
+    0.0 0.0 0.0 0.0 glClearColor\r
+    1.0 glClearDepth\r
+    GL_DEPTH_TEST glEnable\r
+    GL_LEQUAL glDepthFunc\r
+    GL_PERSPECTIVE_CORRECTION_HINT GL_NICEST glHint\r
+    GL_COLOR_BUFFER_BIT GL_DEPTH_BUFFER_BIT bitor glClear\r
+    glLoadIdentity\r
+    -1.5 0.0 -6.0 glTranslatef\r
+    dup rtri>> 0.0 1.0 0.0 glRotatef\r
+\r
+    GL_TRIANGLES [\r
+        1.0 0.0 0.0 glColor3f\r
+        0.0 1.0 0.0 glVertex3f\r
+        0.0 1.0 0.0 glColor3f\r
+        -1.0 -1.0 1.0 glVertex3f\r
+        0.0 0.0 1.0 glColor3f\r
+        1.0 -1.0 1.0 glVertex3f\r
+\r
+        1.0 0.0 0.0 glColor3f\r
+        0.0 1.0 0.0 glVertex3f\r
+        0.0 0.0 1.0 glColor3f\r
+        1.0 -1.0 1.0 glVertex3f\r
+        0.0 1.0 0.0 glColor3f\r
+        1.0 -1.0 -1.0 glVertex3f\r
+\r
+        1.0 0.0 0.0 glColor3f\r
+        0.0 1.0 0.0 glVertex3f\r
+        0.0 1.0 0.0 glColor3f\r
+        1.0 -1.0 -1.0 glVertex3f\r
+        0.0 0.0 1.0 glColor3f\r
+        -1.0 -1.0 -1.0 glVertex3f\r
+\r
+        1.0 0.0 0.0 glColor3f\r
+        0.0 1.0 0.0 glVertex3f\r
+        0.0 0.0 1.0 glColor3f\r
+        -1.0 -1.0 -1.0 glVertex3f\r
+        0.0 1.0 0.0 glColor3f\r
+        -1.0 -1.0 1.0 glVertex3f\r
+    ] do-state\r
+\r
+    glLoadIdentity\r
+\r
+    1.5 0.0 -7.0 glTranslatef\r
+    dup rquad>> 1.0 0.0 0.0 glRotatef\r
+    GL_QUADS [\r
+        0.0 1.0 0.0 glColor3f\r
+        1.0 1.0 -1.0 glVertex3f\r
+        -1.0 1.0 -1.0 glVertex3f\r
+        -1.0 1.0 1.0 glVertex3f\r
+        1.0 1.0 1.0 glVertex3f\r
+\r
+        1.0 0.5 0.0 glColor3f\r
+        1.0 -1.0 1.0 glVertex3f\r
+        -1.0 -1.0 1.0 glVertex3f\r
+        -1.0 -1.0 -1.0 glVertex3f\r
+        1.0 -1.0 -1.0 glVertex3f\r
+\r
+        1.0 0.0 0.0 glColor3f\r
+        1.0 1.0 1.0 glVertex3f\r
+        -1.0 1.0 1.0 glVertex3f\r
+        -1.0 -1.0 1.0 glVertex3f\r
+        1.0 -1.0 1.0 glVertex3f\r
+\r
+        1.0 1.0 0.0 glColor3f\r
+        1.0 -1.0 -1.0 glVertex3f\r
+        -1.0 -1.0 -1.0 glVertex3f\r
+        -1.0 1.0 -1.0 glVertex3f\r
+        1.0 1.0 -1.0 glVertex3f\r
+\r
+        0.0 0.0 1.0 glColor3f\r
+        -1.0 1.0 1.0 glVertex3f\r
+        -1.0 1.0 -1.0 glVertex3f\r
+        -1.0 -1.0 -1.0 glVertex3f\r
+        -1.0 -1.0 1.0 glVertex3f\r
+\r
+        1.0 0.0 1.0 glColor3f\r
+        1.0 1.0 -1.0 glVertex3f\r
+        1.0 1.0 1.0 glVertex3f\r
+        1.0 -1.0 1.0 glVertex3f\r
+        1.0 -1.0 -1.0 glVertex3f\r
+    ] do-state\r
+    [ 0.2 + ] change-rtri\r
+    [ 0.15 - ] change-rquad drop ;\r
+\r
+: nehe5-update-thread ( gadget -- )\r
+    dup quit?>> [\r
+        drop\r
+    ] [\r
+        redraw-interval sleep\r
+        dup relayout-1\r
+        nehe5-update-thread\r
+    ] if ;\r
 \r
 M: nehe5-gadget graft* ( gadget -- )\r
-  f >>quit?\r
-  [ nehe5-update-thread ] curry in-thread ;\r
+    f >>quit?\r
+    [ nehe5-update-thread ] curry in-thread ;\r
 \r
 M: nehe5-gadget ungraft* ( gadget -- )\r
-  t >>quit? drop ;\r
-\r
-MAIN-WINDOW: run5 { { title "NeHe Tutorial 5" } { pref-dim { $ width $ height } } }\r
-  <nehe5-gadget> >>gadgets ;\r
+    t >>quit? drop ;\r
+\r
+MAIN-WINDOW: run5\r
+    {\r
+        { title "NeHe Tutorial 5" }\r
+        { pref-dim { $ width $ height } }\r
+        { pixel-format-attributes {\r
+            windowed\r
+            double-buffered\r
+            T{ depth-bits { value 16 } }\r
+        } }\r
+    }\r
+    <nehe5-gadget> >>gadgets ;\r
index 9204fa55f124473314b2f452a7ff8e0e5fb9cd0a..9417a868a0c0e089d04b9e345bad8a99c8783252 100644 (file)
@@ -124,7 +124,7 @@ MEMO: perlin-noise-map-coords ( dim -- coords )
 
 TYPED:: perlin-noise-map ( table: byte-array transform: matrix4 coords: float-4-array -- map: float-array )
     coords [| coord | table transform coord m4.v perlin-noise ] data-map( float-4 -- c:float )
-    byte-array>float-array ;
+    float-array-cast ;
 
 : perlin-noise-image ( table transform dim -- image )
     [ perlin-noise-map-coords perlin-noise-map ] [ 5/7. 0.5 float-map>image ] bi ;
index 056376237030f1f4f136896ef8a64bf5124ede7f..10f5259bdc4146382612eee01836f17554acb482 100644 (file)
@@ -2,7 +2,7 @@
 ! The contents of this file are licensed under the Simplified BSD License
 ! A copy of the license is available at http://factorcode.org/license.txt
 USING: grouping kernel math math.ranges project-euler.common
-sequences sequences.cords ;
+sequences sequences.cords assocs ;
 IN: project-euler.206
 
 ! http://projecteuler.net/index.php?section=problems&id=206
@@ -31,7 +31,7 @@ CONSTANT: hi 1389026570
 
 : form-fitting? ( n -- ? )
     number>digits 2 group [ first ] map
-    { 1 2 3 4 5 6 7 8 9 0 } = ;
+    { 1 2 3 4 5 6 7 8 9 0 } sequence= ;
 
 : candidates ( -- seq )
     lo lo 40 + [ hi 100 <range> ] bi@ cord-append ;
index dcae438679e80c4eacd9e2adbd7e17e0ab1a8899..5d97284551e01cc92dcf0891705718688d65d8a5 100644 (file)
@@ -48,4 +48,4 @@ PRIVATE>
     ] unless ;
 
 : stop-site-watcher ( -- )
-    running-site-watcher get [ cancel-alarm ] when* ;
+    running-site-watcher get [ stop-alarm ] when* ;
index 0c1a5c07d17d21e0073ddfb824ea2a84b309966b..fcb76c413503b9de83f6af47a9d3831ae5b8afc9 100644 (file)
@@ -2,10 +2,11 @@
 ! See http://factorcode.org/license.txt for BSD license.
 USING: accessors arrays assocs combinators.short-circuit
 continuations fry kernel namespaces quotations sequences sets
-generalizations slots locals.types splitting math
-locals.rewrite.closures generic words combinators locals smalltalk.ast
-smalltalk.compiler.lexenv smalltalk.compiler.assignment
-smalltalk.compiler.return smalltalk.selectors smalltalk.classes ;
+generalizations sequences.generalizations slots locals.types
+splitting math locals.rewrite.closures generic words combinators
+locals smalltalk.ast smalltalk.compiler.lexenv
+smalltalk.compiler.assignment smalltalk.compiler.return
+smalltalk.selectors smalltalk.classes ;
 IN: smalltalk.compiler
 
 GENERIC: compile-ast ( lexenv ast -- quot )
index d8bc90bf737297991ecc8ce385801b1bd0794a36..e1051cf21b8b52d4d0d8bada9eb4bf3f0f566782 100644 (file)
@@ -298,5 +298,5 @@ GAME: terrain-game {
         { use-game-input? t }
         { grab-input? t }
         { pref-dim { 1024 768 } }
-        { tick-interval-micros $[ 60 fps ] }
+        { tick-interval-nanos $[ 60 fps ] }
     } ;
index e5d4f408ff388730ac5a88d6a0c8c9885a4994f2..839d9690c2d6dea2b17f583610438313d20e452c 100644 (file)
@@ -55,7 +55,7 @@ M: tetris-gadget graft* ( gadget -- )
     [ [ tick ] curry 100 milliseconds every ] keep alarm<< ;
 
 M: tetris-gadget ungraft* ( gadget -- )
-    [ cancel-alarm f ] change-alarm drop ;
+    [ stop-alarm f ] change-alarm drop ;
 
 : tetris-window ( -- ) 
     [
index 3d9289a28c667fe758fe5d3f91994d41a8f0fc20..1fa86389a12b7c6ab7f8064378b19a63f3f82bca 100755 (executable)
@@ -187,47 +187,4 @@ VM_C_API char *alien_offset(cell obj, factor_vm *parent)
        return parent->alien_offset(obj);
 }
 
-/* For FFI callbacks receiving structs by value */
-cell factor_vm::from_value_struct(void *src, cell size)
-{
-       byte_array *bytes = allot_byte_array(size);
-       memcpy(bytes->data<void>(),src,size);
-       return tag<byte_array>(bytes);
-}
-
-VM_C_API cell from_value_struct(void *src, cell size, factor_vm *parent)
-{
-       return parent->from_value_struct(src,size);
-}
-
-/* On some x86 OSes, structs <= 8 bytes are returned in registers. */
-cell factor_vm::from_small_struct(cell x, cell y, cell size)
-{
-       cell data[2];
-       data[0] = x;
-       data[1] = y;
-       return from_value_struct(data,size);
-}
-
-VM_C_API cell from_small_struct(cell x, cell y, cell size, factor_vm *parent)
-{
-       return parent->from_small_struct(x,y,size);
-}
-
-/* On OS X/PPC, complex numbers are returned in registers. */
-cell factor_vm::from_medium_struct(cell x1, cell x2, cell x3, cell x4, cell size)
-{
-       cell data[4];
-       data[0] = x1;
-       data[1] = x2;
-       data[2] = x3;
-       data[3] = x4;
-       return from_value_struct(data,size);
-}
-
-VM_C_API cell from_medium_struct(cell x1, cell x2, cell x3, cell x4, cell size, factor_vm *parent)
-{
-       return parent->from_medium_struct(x1, x2, x3, x4, size);
-}
-
 }
index 2b530c6b83836af3550702eae20995b7297d3c3e..cd0120db6f010784116c8c5f6530f84c2080456c 100755 (executable)
@@ -4,8 +4,5 @@ namespace factor
 VM_C_API char *alien_offset(cell object, factor_vm *vm);
 VM_C_API char *pinned_alien_offset(cell object, factor_vm *vm);
 VM_C_API cell allot_alien(void *address, factor_vm *vm);
-VM_C_API cell from_value_struct(void *src, cell size, factor_vm *vm);
-VM_C_API cell from_small_struct(cell x, cell y, cell size, factor_vm *vm);
-VM_C_API cell from_medium_struct(cell x1, cell x2, cell x3, cell x4, cell size, factor_vm *vm);
 
 }
index 162d9272c6ca9a93a2941fdfcaa7087082519478..ddff576befd3814290e8f574d37add9b64a87109 100755 (executable)
@@ -60,4 +60,11 @@ inline cell popcount(cell x)
        return x;
 }
 
+inline bool bitmap_p(u8 *bitmap, cell index)
+{
+       cell byte = index >> 3;
+       cell bit = index & 7;
+       return (bitmap[byte] & (1 << bit)) != 0;
+}
+
 }
index 1986b5d35cea9333491ee228316a1dc74579bcea..fb1b44c91e95f658e9d19f2b73641ff02057a82b 100644 (file)
@@ -10,6 +10,11 @@ byte_array *factor_vm::allot_byte_array(cell size)
        return array;
 }
 
+VM_C_API cell allot_byte_array(cell size, factor_vm *parent)
+{
+       return tag<byte_array>(parent->allot_byte_array(size));
+}
+
 void factor_vm::primitive_byte_array()
 {
        cell size = unbox_array_size();
@@ -30,16 +35,18 @@ void factor_vm::primitive_resize_byte_array()
        ctx->push(tag<byte_array>(reallot_array(array.untagged(),capacity)));
 }
 
-void growable_byte_array::append_bytes(void *elts, cell len)
+void growable_byte_array::grow_bytes(cell len)
 {
-       cell new_size = count + len;
-       factor_vm *parent = elements.parent;
-       if(new_size >= array_capacity(elements.untagged()))
-               elements = parent->reallot_array(elements.untagged(),new_size * 2);
-
-       memcpy(&elements->data<u8>()[count],elts,len);
-
        count += len;
+       if(count >= array_capacity(elements.untagged()))
+               elements = elements.parent->reallot_array(elements.untagged(),count * 2);
+}
+
+void growable_byte_array::append_bytes(void *elts, cell len)
+{
+       cell old_count = count;
+       grow_bytes(len);
+       memcpy(&elements->data<u8>()[old_count],elts,len);
 }
 
 void growable_byte_array::append_byte_array(cell byte_array_)
index a96baff6ec33d64a2b796c3be4e880d4d5745f1c..f0faac248c8047fe15799dc085b68aec5ca5197e 100755 (executable)
@@ -7,6 +7,7 @@ struct growable_byte_array {
 
        explicit growable_byte_array(factor_vm *parent,cell capacity = 40) : count(0), elements(parent->allot_byte_array(capacity),parent) { }
 
+       void grow_bytes(cell len);
        void append_bytes(void *elts, cell len);
        void append_byte_array(cell elts);
 
@@ -20,4 +21,6 @@ template<typename Type> byte_array *factor_vm::byte_array_from_value(Type *value
        return data;
 }
 
+VM_C_API cell allot_byte_array(cell size, factor_vm *parent);
+
 }
index bb716cbc6dd3ad7bb9465eb588b07329a74843ca..64c17d8661ccd2e3d033d7fbfa23ed8455530028 100755 (executable)
@@ -108,7 +108,25 @@ stack_frame *factor_vm::frame_successor(stack_frame *frame)
        return (stack_frame *)((cell)frame - frame->size);
 }
 
-/* Allocates memory */
+cell factor_vm::frame_offset(stack_frame *frame)
+{
+       char *entry_point = (char *)frame_code(frame)->entry_point();
+       char *return_address = (char *)FRAME_RETURN_ADDRESS(frame,this);
+       if(return_address)
+               return return_address - entry_point;
+       else
+               return (cell)-1;
+}
+
+void factor_vm::set_frame_offset(stack_frame *frame, cell offset)
+{
+       char *entry_point = (char *)frame_code(frame)->entry_point();
+       if(offset == (cell)-1)
+               FRAME_RETURN_ADDRESS(frame,this) = NULL;
+       else
+               FRAME_RETURN_ADDRESS(frame,this) = entry_point + offset;
+}
+
 cell factor_vm::frame_scan(stack_frame *frame)
 {
        switch(frame_type(frame))
@@ -120,13 +138,7 @@ cell factor_vm::frame_scan(stack_frame *frame)
                                obj = obj.as<word>()->def;
 
                        if(obj.type_p(QUOTATION_TYPE))
-                       {
-                               char *return_addr = (char *)FRAME_RETURN_ADDRESS(frame,this);
-                               char *quot_entry_point = (char *)frame_code(frame)->entry_point();
-
-                               return tag_fixnum(quot_code_offset_to_scan(
-                                       obj.value(),(cell)(return_addr - quot_entry_point)));
-                       }    
+                               return tag_fixnum(quot_code_offset_to_scan(obj.value(),frame_offset(frame)));
                        else
                                return false_object;
                }
@@ -138,9 +150,6 @@ cell factor_vm::frame_scan(stack_frame *frame)
        }
 }
 
-namespace
-{
-
 struct stack_frame_accumulator {
        factor_vm *parent;
        growable_array frames;
@@ -159,8 +168,6 @@ struct stack_frame_accumulator {
        }
 };
 
-}
-
 void factor_vm::primitive_callstack_to_array()
 {
        data_root<callstack> callstack(ctx->pop(),this);
@@ -209,9 +216,9 @@ void factor_vm::primitive_set_innermost_stack_frame_quot()
        jit_compile_quot(quot.value(),true);
 
        stack_frame *inner = innermost_stack_frame(callstack.untagged());
-       cell offset = (char *)FRAME_RETURN_ADDRESS(inner,this) - (char *)inner->entry_point;
+       cell offset = frame_offset(inner);
        inner->entry_point = quot->entry_point;
-       FRAME_RETURN_ADDRESS(inner,this) = (char *)quot->entry_point + offset;
+       set_frame_offset(inner,offset);
 }
 
 void factor_vm::primitive_callstack_bounds()
index deaa41e4b8ef7b282ffdae7b1cabefab41c1fcaa..8b48d3672f8f38a142fcefaed54e606bd5eac72e 100644 (file)
@@ -12,12 +12,12 @@ Iteration is driven by visit_*() methods. Some of them define GC roots:
 - visit_context_code_blocks()
 - visit_callback_code_blocks() */
  
-template<typename Visitor> struct code_block_visitor {
+template<typename Fixup> struct code_block_visitor {
        factor_vm *parent;
-       Visitor visitor;
+       Fixup fixup;
 
-       explicit code_block_visitor(factor_vm *parent_, Visitor visitor_) :
-               parent(parent_), visitor(visitor_) {}
+       explicit code_block_visitor(factor_vm *parent_, Fixup fixup_) :
+               parent(parent_), fixup(fixup_) {}
 
        code_block *visit_code_block(code_block *compiled);
        void visit_object_code_block(object *obj);
@@ -26,33 +26,31 @@ template<typename Visitor> struct code_block_visitor {
        void visit_uninitialized_code_blocks();
 };
 
-template<typename Visitor>
-code_block *code_block_visitor<Visitor>::visit_code_block(code_block *compiled)
+template<typename Fixup>
+code_block *code_block_visitor<Fixup>::visit_code_block(code_block *compiled)
 {
-       return visitor(compiled);
+       return fixup.fixup_code(compiled);
 }
 
-template<typename Visitor>
+template<typename Fixup>
 struct call_frame_code_block_visitor {
        factor_vm *parent;
-       Visitor visitor;
+       Fixup fixup;
 
-       explicit call_frame_code_block_visitor(factor_vm *parent_, Visitor visitor_) :
-               parent(parent_), visitor(visitor_) {}
+       explicit call_frame_code_block_visitor(factor_vm *parent_, Fixup fixup_) :
+               parent(parent_), fixup(fixup_) {}
 
        void operator()(stack_frame *frame)
        {
-               cell offset = (cell)FRAME_RETURN_ADDRESS(frame,parent) - (cell)frame->entry_point;
-
-               code_block *new_block = visitor(parent->frame_code(frame));
-               frame->entry_point = new_block->entry_point();
-
-               FRAME_RETURN_ADDRESS(frame,parent) = (void *)((cell)frame->entry_point + offset);
+               cell offset = parent->frame_offset(frame);
+               code_block *compiled = fixup.fixup_code(parent->frame_code(frame));
+               frame->entry_point = compiled->entry_point();
+               parent->set_frame_offset(frame,offset);
        }
 };
 
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_object_code_block(object *obj)
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_object_code_block(object *obj)
 {
        switch(obj->type())
        {
@@ -60,9 +58,9 @@ void code_block_visitor<Visitor>::visit_object_code_block(object *obj)
                {
                        word *w = (word *)obj;
                        if(w->code)
-                               w->code = visitor(w->code);
+                               w->code = visit_code_block(w->code);
                        if(w->profiling)
-                               w->profiling = visitor(w->profiling);
+                               w->profiling = visit_code_block(w->profiling);
 
                        parent->update_word_entry_point(w);
                        break;
@@ -71,24 +69,24 @@ void code_block_visitor<Visitor>::visit_object_code_block(object *obj)
                {
                        quotation *q = (quotation *)obj;
                        if(q->code)
-                               parent->set_quot_entry_point(q,visitor(q->code));
+                               parent->set_quot_entry_point(q,visit_code_block(q->code));
                        break;
                }
        case CALLSTACK_TYPE:
                {
                        callstack *stack = (callstack *)obj;
-                       call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
+                       call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
                        parent->iterate_callstack_object(stack,call_frame_visitor);
                        break;
                }
        }
 }
 
-template<typename Visitor>
+template<typename Fixup>
 struct embedded_code_pointers_visitor {
-       Visitor visitor;
+       Fixup fixup;
 
-       explicit embedded_code_pointers_visitor(Visitor visitor_) : visitor(visitor_) {}
+       explicit embedded_code_pointers_visitor(Fixup fixup_) : fixup(fixup_) {}
 
        void operator()(instruction_operand op)
        {
@@ -96,29 +94,29 @@ struct embedded_code_pointers_visitor {
                if(type == RT_ENTRY_POINT
                        || type == RT_ENTRY_POINT_PIC
                        || type == RT_ENTRY_POINT_PIC_TAIL)
-                       op.store_code_block(visitor(op.load_code_block()));
+                       op.store_code_block(fixup.fixup_code(op.load_code_block()));
        }
 };
 
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_embedded_code_pointers(code_block *compiled)
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_embedded_code_pointers(code_block *compiled)
 {
        if(!parent->code->uninitialized_p(compiled))
        {
-               embedded_code_pointers_visitor<Visitor> visitor(this->visitor);
-               compiled->each_instruction_operand(visitor);
+               embedded_code_pointers_visitor<Fixup> operand_visitor(fixup);
+               compiled->each_instruction_operand(operand_visitor);
        }
 }
 
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_context_code_blocks()
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_context_code_blocks()
 {
-       call_frame_code_block_visitor<Visitor> call_frame_visitor(parent,visitor);
+       call_frame_code_block_visitor<Fixup> call_frame_visitor(parent,fixup);
        parent->iterate_active_callstacks(call_frame_visitor);
 }
 
-template<typename Visitor>
-void code_block_visitor<Visitor>::visit_uninitialized_code_blocks()
+template<typename Fixup>
+void code_block_visitor<Fixup>::visit_uninitialized_code_blocks()
 {
        std::map<code_block *, cell> *uninitialized_blocks = &parent->code->uninitialized_blocks;
        std::map<code_block *, cell>::const_iterator iter = uninitialized_blocks->begin();
@@ -128,7 +126,7 @@ void code_block_visitor<Visitor>::visit_uninitialized_code_blocks()
        for(; iter != end; iter++)
        {
                new_uninitialized_blocks.insert(std::make_pair(
-                       visitor(iter->first),
+                       fixup.fixup_code(iter->first),
                        iter->second));
        }
 
index baf763357c5911f379c928160d708ab10141dd06..f20e2da37292d5c6a5a8c1dd12cbb16d03d19f69 100644 (file)
@@ -43,11 +43,22 @@ struct code_block
                return size;
        }
 
+       template<typename Fixup> cell size(Fixup fixup) const
+       {
+               return size();
+       }
+
        void *entry_point() const
        {
                return (void *)(this + 1);
        }
 
+       /* GC info is stored at the end of the block */
+       gc_info *block_gc_info() const
+       {
+               return (gc_info *)((u8 *)this + size() - sizeof(gc_info));
+       }
+
        void flush_icache()
        {
                factor::flush_icache((cell)this,size());
index 0b8b473e8b3704fd10c5487e1e09c6c551bdfba9..4a9eec59675529a50e3bd6b9b328f1f93ea7b9a3 100644 (file)
@@ -3,15 +3,17 @@ namespace factor
 
 struct must_start_gc_again {};
 
-template<typename TargetGeneration, typename Policy> struct data_workhorse {
+template<typename TargetGeneration, typename Policy> struct gc_workhorse : no_fixup {
        factor_vm *parent;
        TargetGeneration *target;
        Policy policy;
+       code_heap *code;
 
-       explicit data_workhorse(factor_vm *parent_, TargetGeneration *target_, Policy policy_) :
+       explicit gc_workhorse(factor_vm *parent_, TargetGeneration *target_, Policy policy_) :
                parent(parent_),
                target(target_),
-               policy(policy_) {}
+               policy(policy_),
+               code(parent->code) {}
 
        object *resolve_forwarding(object *untagged)
        {
@@ -39,8 +41,10 @@ template<typename TargetGeneration, typename Policy> struct data_workhorse {
                return newpointer;
        }
 
-       object *operator()(object *obj)
+       object *fixup_data(object *obj)
        {
+               parent->check_data_pointer(obj);
+
                if(!policy.should_copy_p(obj))
                {
                        policy.visited_object(obj);
@@ -59,17 +63,18 @@ template<typename TargetGeneration, typename Policy> struct data_workhorse {
                        return forwarding;
                }
        }
-};
 
-template<typename TargetGeneration, typename Policy>
-inline static slot_visitor<data_workhorse<TargetGeneration,Policy> > make_data_visitor(
-       factor_vm *parent,
-       TargetGeneration *target,
-       Policy policy)
-{
-       return slot_visitor<data_workhorse<TargetGeneration,Policy> >(parent,
-               data_workhorse<TargetGeneration,Policy>(parent,target,policy));
-}
+       code_block *fixup_code(code_block *compiled)
+       {
+               if(!code->marked_p(compiled))
+               {
+                       code->set_marked_p(compiled);
+                       parent->mark_stack.push_back((cell)compiled + 1);
+               }
+
+               return compiled;
+       }
+};
 
 struct dummy_unmarker {
        void operator()(card *ptr) {}
@@ -92,7 +97,8 @@ struct collector {
        data_heap *data;
        code_heap *code;
        TargetGeneration *target;
-       slot_visitor<data_workhorse<TargetGeneration,Policy> > data_visitor;
+       gc_workhorse<TargetGeneration,Policy> workhorse;
+       slot_visitor<gc_workhorse<TargetGeneration,Policy> > data_visitor;
        cell cards_scanned;
        cell decks_scanned;
        cell code_blocks_scanned;
@@ -102,7 +108,8 @@ struct collector {
                data(parent_->data),
                code(parent_->code),
                target(target_),
-               data_visitor(make_data_visitor(parent_,target_,policy_)),
+               workhorse(parent,target,policy_),
+               data_visitor(parent,workhorse),
                cards_scanned(0),
                decks_scanned(0),
                code_blocks_scanned(0) {}
index 5e52c70b0c852cd1385b9865e7e2d2d99da02873..9d26062a5c498895b9b7ec2f527f26be4118284b 100644 (file)
 
 namespace factor {
 
-template<typename Block> struct forwarder {
-       mark_bits<Block> *forwarding_map;
+struct compaction_fixup {
+       mark_bits<object> *data_forwarding_map;
+       mark_bits<code_block> *code_forwarding_map;
+       const object **data_finger;
+       const code_block **code_finger;
 
-       explicit forwarder(mark_bits<Block> *forwarding_map_) :
-               forwarding_map(forwarding_map_) {}
+       explicit compaction_fixup(
+               mark_bits<object> *data_forwarding_map_,
+               mark_bits<code_block> *code_forwarding_map_,
+               const object **data_finger_,
+               const code_block **code_finger_) :
+               data_forwarding_map(data_forwarding_map_),
+               code_forwarding_map(code_forwarding_map_),
+               data_finger(data_finger_),
+               code_finger(code_finger_) {}
 
-       Block *operator()(Block *block)
+       object *fixup_data(object *obj)
        {
-               return forwarding_map->forward_block(block);
+               return data_forwarding_map->forward_block(obj);
        }
-};
-
-static inline cell tuple_size_with_forwarding(mark_bits<object> *forwarding_map, object *obj)
-{
-       /* The tuple layout may or may not have been forwarded already. Tricky. */
-       object *layout_obj = (object *)UNTAG(((tuple *)obj)->layout);
-       tuple_layout *layout;
 
-       if(layout_obj < obj)
+       code_block *fixup_code(code_block *compiled)
        {
-               /* It's already been moved up; dereference through forwarding
-               map to get the size */
-               layout = (tuple_layout *)forwarding_map->forward_block(layout_obj);
+               return code_forwarding_map->forward_block(compiled);
        }
-       else
+
+       object *translate_data(const object *obj)
        {
-               /* It hasn't been moved up yet; dereference directly */
-               layout = (tuple_layout *)layout_obj;
+               if(obj < *data_finger)
+                       return fixup_data((object *)obj);
+               else
+                       return (object *)obj;
        }
 
-       return tuple_size(layout);
-}
-
-struct compaction_sizer {
-       mark_bits<object> *forwarding_map;
+       code_block *translate_code(const code_block *compiled)
+       {
+               if(compiled < *code_finger)
+                       return fixup_code((code_block *)compiled);
+               else
+                       return (code_block *)compiled;
+       }
 
-       explicit compaction_sizer(mark_bits<object> *forwarding_map_) :
-               forwarding_map(forwarding_map_) {}
+       cell size(object *obj)
+       {
+               if(data_forwarding_map->marked_p(obj))
+                       return obj->size(*this);
+               else
+                       return data_forwarding_map->unmarked_block_size(obj);
+       }
 
-       cell operator()(object *obj)
+       cell size(code_block *compiled)
        {
-               if(!forwarding_map->marked_p(obj))
-                       return forwarding_map->unmarked_block_size(obj);
-               else if(obj->type() == TUPLE_TYPE)
-                       return align(tuple_size_with_forwarding(forwarding_map,obj),data_alignment);
+               if(code_forwarding_map->marked_p(compiled))
+                       return compiled->size(*this);
                else
-                       return obj->size();
+                       return code_forwarding_map->unmarked_block_size(compiled);
        }
 };
 
 struct object_compaction_updater {
        factor_vm *parent;
-       mark_bits<code_block> *code_forwarding_map;
-       mark_bits<object> *data_forwarding_map;
+       compaction_fixup fixup;
        object_start_map *starts;
 
-       explicit object_compaction_updater(factor_vm *parent_,
-               mark_bits<object> *data_forwarding_map_,
-               mark_bits<code_block> *code_forwarding_map_) :
+       explicit object_compaction_updater(factor_vm *parent_, compaction_fixup fixup_) :
                parent(parent_),
-               code_forwarding_map(code_forwarding_map_),
-               data_forwarding_map(data_forwarding_map_),
+               fixup(fixup_),
                starts(&parent->data->tenured->starts) {}
 
        void operator()(object *old_address, object *new_address, cell size)
        {
-               cell payload_start;
-               if(old_address->type() == TUPLE_TYPE)
-                       payload_start = tuple_size_with_forwarding(data_forwarding_map,old_address);
-               else
-                       payload_start = old_address->binary_payload_start();
-
-               memmove(new_address,old_address,size);
+               slot_visitor<compaction_fixup> slot_forwarder(parent,fixup);
+               slot_forwarder.visit_slots(new_address);
 
-               slot_visitor<forwarder<object> > slot_forwarder(parent,forwarder<object>(data_forwarding_map));
-               slot_forwarder.visit_slots(new_address,payload_start);
-
-               code_block_visitor<forwarder<code_block> > code_forwarder(parent,forwarder<code_block>(code_forwarding_map));
+               code_block_visitor<compaction_fixup> code_forwarder(parent,fixup);
                code_forwarder.visit_object_code_block(new_address);
 
                starts->record_object_start_offset(new_address);
        }
 };
 
-template<typename SlotForwarder>
+template<typename Fixup>
 struct code_block_compaction_relocation_visitor {
        factor_vm *parent;
        code_block *old_address;
-       slot_visitor<SlotForwarder> slot_forwarder;
-       code_block_visitor<forwarder<code_block> > code_forwarder;
+       Fixup fixup;
 
        explicit code_block_compaction_relocation_visitor(factor_vm *parent_,
                code_block *old_address_,
-               slot_visitor<SlotForwarder> slot_forwarder_,
-               code_block_visitor<forwarder<code_block> > code_forwarder_) :
+               Fixup fixup_) :
                parent(parent_),
                old_address(old_address_),
-               slot_forwarder(slot_forwarder_),
-               code_forwarder(code_forwarder_) {}
+               fixup(fixup_) {}
 
        void operator()(instruction_operand op)
        {
@@ -109,16 +103,25 @@ struct code_block_compaction_relocation_visitor {
                switch(op.rel_type())
                {
                case RT_LITERAL:
-                       op.store_value(slot_forwarder.visit_pointer(op.load_value(old_offset)));
-                       break;
+                       {
+                               cell value = op.load_value(old_offset);
+                               if(immediate_p(value))
+                                       op.store_value(value);
+                               else
+                                       op.store_value(RETAG(fixup.fixup_data(untag<object>(value)),TAG(value)));
+                               break;
+                       }
                case RT_ENTRY_POINT:
                case RT_ENTRY_POINT_PIC:
                case RT_ENTRY_POINT_PIC_TAIL:
-                       op.store_code_block(code_forwarder.visit_code_block(op.load_code_block(old_offset)));
-                       break;
                case RT_HERE:
-                       op.store_value(op.load_value(old_offset) - (cell)old_address + (cell)op.parent_code_block());
-                       break;
+                       {
+                               cell value = op.load_value(old_offset);
+                               cell offset = TAG(value);
+                               code_block *compiled = (code_block *)UNTAG(value);
+                               op.store_value((cell)fixup.fixup_code(compiled) + offset);
+                               break;
+                       }
                case RT_THIS:
                case RT_CARDS_OFFSET:
                case RT_DECKS_OFFSET:
@@ -131,26 +134,27 @@ struct code_block_compaction_relocation_visitor {
        }
 };
 
-template<typename SlotForwarder>
+template<typename Fixup>
 struct code_block_compaction_updater {
        factor_vm *parent;
-       slot_visitor<SlotForwarder> slot_forwarder;
-       code_block_visitor<forwarder<code_block> > code_forwarder;
+       Fixup fixup;
+       slot_visitor<Fixup> data_forwarder;
+       code_block_visitor<Fixup> code_forwarder;
 
        explicit code_block_compaction_updater(factor_vm *parent_,
-               slot_visitor<SlotForwarder> slot_forwarder_,
-               code_block_visitor<forwarder<code_block> > code_forwarder_) :
+               Fixup fixup_,
+               slot_visitor<Fixup> data_forwarder_,
+               code_block_visitor<Fixup> code_forwarder_) :
                parent(parent_),
-               slot_forwarder(slot_forwarder_),
+               fixup(fixup_),
+               data_forwarder(data_forwarder_),
                code_forwarder(code_forwarder_) {}
 
        void operator()(code_block *old_address, code_block *new_address, cell size)
        {
-               memmove(new_address,old_address,size);
+               data_forwarder.visit_code_block_objects(new_address);
 
-               slot_forwarder.visit_code_block_objects(new_address);
-
-               code_block_compaction_relocation_visitor<SlotForwarder> visitor(parent,old_address,slot_forwarder,code_forwarder);
+               code_block_compaction_relocation_visitor<Fixup> visitor(parent,old_address,fixup);
                new_address->each_instruction_operand(visitor);
        }
 };
@@ -196,8 +200,12 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p)
        data_forwarding_map->compute_forwarding();
        code_forwarding_map->compute_forwarding();
 
-       slot_visitor<forwarder<object> > slot_forwarder(this,forwarder<object>(data_forwarding_map));
-       code_block_visitor<forwarder<code_block> > code_forwarder(this,forwarder<code_block>(code_forwarding_map));
+       const object *data_finger = tenured->first_block();
+       const code_block *code_finger = code->allocator->first_block();
+
+       compaction_fixup fixup(data_forwarding_map,code_forwarding_map,&data_finger,&code_finger);
+       slot_visitor<compaction_fixup> data_forwarder(this,fixup);
+       code_block_visitor<compaction_fixup> code_forwarder(this,fixup);
 
        code_forwarder.visit_uninitialized_code_blocks();
 
@@ -206,20 +214,18 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p)
 
        /* Slide everything in tenured space up, and update data and code heap
        pointers inside objects. */
-       object_compaction_updater object_updater(this,data_forwarding_map,code_forwarding_map);
-       compaction_sizer object_sizer(data_forwarding_map);
-       tenured->compact(object_updater,object_sizer);
+       object_compaction_updater object_updater(this,fixup);
+       tenured->compact(object_updater,fixup,&data_finger);
 
        /* Slide everything in the code heap up, and update data and code heap
        pointers inside code blocks. */
-       code_block_compaction_updater<forwarder<object> > code_block_updater(this,slot_forwarder,code_forwarder);
-       standard_sizer<code_block> code_block_sizer;
-       code->allocator->compact(code_block_updater,code_block_sizer);
+       code_block_compaction_updater<compaction_fixup> code_block_updater(this,fixup,data_forwarder,code_forwarder);
+       code->allocator->compact(code_block_updater,fixup,&code_finger);
 
-       slot_forwarder.visit_roots();
+       data_forwarder.visit_roots();
        if(trace_contexts_p)
        {
-               slot_forwarder.visit_contexts();
+               data_forwarder.visit_contexts();
                code_forwarder.visit_context_code_blocks();
        }
 
@@ -229,10 +235,56 @@ void factor_vm::collect_compact_impl(bool trace_contexts_p)
        current_gc->event->ended_compaction();
 }
 
+struct code_compaction_fixup {
+       mark_bits<code_block> *code_forwarding_map;
+       const code_block **code_finger;
+
+       explicit code_compaction_fixup(mark_bits<code_block> *code_forwarding_map_,
+               const code_block **code_finger_) :
+               code_forwarding_map(code_forwarding_map_),
+               code_finger(code_finger_) {}
+
+       object *fixup_data(object *obj)
+       {
+               return obj;
+       }
+
+       code_block *fixup_code(code_block *compiled)
+       {
+               return code_forwarding_map->forward_block(compiled);
+       }
+
+       object *translate_data(const object *obj)
+       {
+               return fixup_data((object *)obj);
+       }
+
+       code_block *translate_code(const code_block *compiled)
+       {
+               if(compiled >= *code_finger)
+                       return fixup_code((code_block *)compiled);
+               else
+                       return (code_block *)compiled;
+       }
+
+       cell size(object *obj)
+       {
+               return obj->size();
+       }
+
+       cell size(code_block *compiled)
+       {
+               if(code_forwarding_map->marked_p(compiled))
+                       return compiled->size(*this);
+               else
+                       return code_forwarding_map->unmarked_block_size(compiled);
+       }
+};
+
 struct object_grow_heap_updater {
-       code_block_visitor<forwarder<code_block> > code_forwarder;
+       code_block_visitor<code_compaction_fixup> code_forwarder;
 
-       explicit object_grow_heap_updater(code_block_visitor<forwarder<code_block> > code_forwarder_) :
+       explicit object_grow_heap_updater(code_block_visitor<code_compaction_fixup> code_forwarder_) :
                code_forwarder(code_forwarder_) {}
 
        void operator()(object *obj)
@@ -241,10 +293,6 @@ struct object_grow_heap_updater {
        }
 };
 
-struct dummy_slot_forwarder {
-       object *operator()(object *obj) { return obj; }
-};
-
 /* Compact just the code heap, after growing the data heap */
 void factor_vm::collect_compact_code_impl(bool trace_contexts_p)
 {
@@ -252,8 +300,11 @@ void factor_vm::collect_compact_code_impl(bool trace_contexts_p)
        mark_bits<code_block> *code_forwarding_map = &code->allocator->state;
        code_forwarding_map->compute_forwarding();
 
-       slot_visitor<dummy_slot_forwarder> slot_forwarder(this,dummy_slot_forwarder());
-       code_block_visitor<forwarder<code_block> > code_forwarder(this,forwarder<code_block>(code_forwarding_map));
+       const code_block *code_finger = code->allocator->first_block();
+
+       code_compaction_fixup fixup(code_forwarding_map,&code_finger);
+       slot_visitor<code_compaction_fixup> data_forwarder(this,fixup);
+       code_block_visitor<code_compaction_fixup> code_forwarder(this,fixup);
 
        code_forwarder.visit_uninitialized_code_blocks();
 
@@ -261,14 +312,13 @@ void factor_vm::collect_compact_code_impl(bool trace_contexts_p)
                code_forwarder.visit_context_code_blocks();
 
        /* Update code heap references in data heap */
-       object_grow_heap_updater updater(code_forwarder);
-       each_object(updater);
+       object_grow_heap_updater object_updater(code_forwarder);
+       each_object(object_updater);
 
        /* Slide everything in the code heap up, and update code heap
        pointers inside code blocks. */
-       code_block_compaction_updater<dummy_slot_forwarder> code_block_updater(this,slot_forwarder,code_forwarder);
-       standard_sizer<code_block> code_block_sizer;
-       code->allocator->compact(code_block_updater,code_block_sizer);
+       code_block_compaction_updater<code_compaction_fixup> code_block_updater(this,fixup,data_forwarder,code_forwarder);
+       code->allocator->compact(code_block_updater,fixup,&code_finger);
 
        update_code_roots_for_compaction();
        callbacks->update();
index 25fe0e5280cc43a82617111119e981303ec6424b..8ec3363662652c3c194d4d3b9f4be7668f97d6e8 100644 (file)
@@ -55,6 +55,41 @@ void context::fix_stacks()
                reset_retainstack();
 }
 
+void context::scrub_stacks(gc_info *info, cell index)
+{
+       u8 *bitmap = info->gc_info_bitmap();
+
+       {
+               cell base = info->scrub_d_base(index);
+
+               for(cell loc = 0; loc < info->scrub_d_count; loc++)
+               {
+                       if(bitmap_p(bitmap,base + loc))
+                       {
+#ifdef DEBUG_GC_MAPS
+                               std::cout << "scrubbing datastack location " << loc << std::endl;
+#endif
+                               ((cell *)datastack)[-loc] = 0;
+                       }
+               }
+       }
+
+       {
+               cell base = info->scrub_r_base(index);
+
+               for(cell loc = 0; loc < info->scrub_r_count; loc++)
+               {
+                       if(bitmap_p(bitmap,base + loc))
+                       {
+#ifdef DEBUG_GC_MAPS
+                               std::cout << "scrubbing retainstack location " << loc << std::endl;
+#endif
+                               ((cell *)retainstack)[-loc] = 0;
+                       }
+               }
+       }
+}
+
 context::~context()
 {
        delete datastack_seg;
index 80dbf14740f229abc78427b223439ea8ecd8d93c..4aa7d7c221b215af99c37155db37cf355569bb32 100644 (file)
@@ -36,9 +36,6 @@ struct context {
        set-context-object primitives */
        cell context_objects[context_object_count];
 
-       /* temporary area used by FFI code generation */
-       s64 long_long_return;
-
        context(cell datastack_size, cell retainstack_size, cell callstack_size);
        ~context();
 
@@ -48,6 +45,7 @@ struct context {
        void reset_context_objects();
        void reset();
        void fix_stacks();
+       void scrub_stacks(gc_info *info, cell index);
 
        cell peek()
        {
index 9b28215bb835d7a236b2a7837a6796b3ebb1dd97..3648ba7f4827c7acf00a75694048beab30384c66 100755 (executable)
@@ -126,85 +126,6 @@ void factor_vm::init_data_heap(cell young_size, cell aging_size, cell tenured_si
        set_data_heap(new data_heap(young_size,aging_size,tenured_size));
 }
 
-/* Size of the object pointed to by an untagged pointer */
-cell object::size() const
-{
-       if(free_p()) return ((free_heap_block *)this)->size();
-
-       switch(type())
-       {
-       case ARRAY_TYPE:
-               return align(array_size((array*)this),data_alignment);
-       case BIGNUM_TYPE:
-               return align(array_size((bignum*)this),data_alignment);
-       case BYTE_ARRAY_TYPE:
-               return align(array_size((byte_array*)this),data_alignment);
-       case STRING_TYPE:
-               return align(string_size(string_capacity((string*)this)),data_alignment);
-       case TUPLE_TYPE:
-               {
-                       tuple_layout *layout = (tuple_layout *)UNTAG(((tuple *)this)->layout);
-                       return align(tuple_size(layout),data_alignment);
-               }
-       case QUOTATION_TYPE:
-               return align(sizeof(quotation),data_alignment);
-       case WORD_TYPE:
-               return align(sizeof(word),data_alignment);
-       case FLOAT_TYPE:
-               return align(sizeof(boxed_float),data_alignment);
-       case DLL_TYPE:
-               return align(sizeof(dll),data_alignment);
-       case ALIEN_TYPE:
-               return align(sizeof(alien),data_alignment);
-       case WRAPPER_TYPE:
-               return align(sizeof(wrapper),data_alignment);
-       case CALLSTACK_TYPE:
-               return align(callstack_object_size(untag_fixnum(((callstack *)this)->length)),data_alignment);
-       default:
-               critical_error("Invalid header",(cell)this);
-               return 0; /* can't happen */
-       }
-}
-
-/* The number of cells from the start of the object which should be scanned by
-the GC. Some types have a binary payload at the end (string, word, DLL) which
-we ignore. */
-cell object::binary_payload_start() const
-{
-       if(free_p()) return 0;
-
-       switch(type())
-       {
-       /* these objects do not refer to other objects at all */
-       case FLOAT_TYPE:
-       case BYTE_ARRAY_TYPE:
-       case BIGNUM_TYPE:
-       case CALLSTACK_TYPE:
-               return 0;
-       /* these objects have some binary data at the end */
-       case WORD_TYPE:
-               return sizeof(word) - sizeof(cell) * 3;
-       case ALIEN_TYPE:
-               return sizeof(cell) * 3;
-       case DLL_TYPE:
-               return sizeof(cell) * 2;
-       case QUOTATION_TYPE:
-               return sizeof(quotation) - sizeof(cell) * 2;
-       case STRING_TYPE:
-               return sizeof(string);
-       /* everything else consists entirely of pointers */
-       case ARRAY_TYPE:
-               return array_size<array>(array_capacity((array*)this));
-       case TUPLE_TYPE:
-               return tuple_size(untag<tuple_layout>(((tuple *)this)->layout));
-       case WRAPPER_TYPE:
-               return sizeof(wrapper);
-       default:
-               critical_error("Invalid header",(cell)this);
-               return 0; /* can't happen */
-       }
-}
-
 data_heap_room factor_vm::data_room()
 {
        data_heap_room room;
diff --git a/vm/fixup.hpp b/vm/fixup.hpp
new file mode 100644 (file)
index 0000000..c92661a
--- /dev/null
@@ -0,0 +1,44 @@
+namespace factor
+{
+
+template<typename T>
+struct identity {
+       T operator()(T t)
+       {
+               return t;
+       }
+};
+
+struct no_fixup {
+       object *fixup_data(object *obj)
+       {
+               return obj;
+       }
+
+       code_block *fixup_code(code_block *compiled)
+       {
+               return compiled;
+       }
+
+       object *translate_data(const object *obj)
+       {
+               return fixup_data((object *)obj);
+       }
+
+       code_block *translate_code(const code_block *compiled)
+       {
+               return fixup_code((code_block *)compiled);
+       }
+
+       cell size(object *obj)
+       {
+               return obj->size();
+       }
+
+       cell size(code_block *compiled)
+       {
+               return compiled->size();
+       }
+};
+
+}
index 4c725bcf4f401961ff7b4e5605dbd1d0eedcc73f..7d7807ef9ab71dcb5d4df8e0132c7d775f2c5033 100644 (file)
@@ -23,8 +23,8 @@ template<typename Block> struct free_list_allocator {
        cell largest_free_block();
        cell free_block_count();
        void sweep();
-       template<typename Iterator, typename Sizer> void compact(Iterator &iter, Sizer &sizer);
-       template<typename Iterator, typename Sizer> void iterate(Iterator &iter, Sizer &sizer);
+       template<typename Iterator, typename Fixup> void compact(Iterator &iter, Fixup fixup, const Block **finger);
+       template<typename Iterator, typename Fixup> void iterate(Iterator &iter, Fixup fixup);
        template<typename Iterator> void iterate(Iterator &iter);
 };
 
@@ -155,14 +155,17 @@ template<typename Block, typename Iterator> struct heap_compactor {
        mark_bits<Block> *state;
        char *address;
        Iterator &iter;
+       const Block **finger;
 
-       explicit heap_compactor(mark_bits<Block> *state_, Block *address_, Iterator &iter_) :
-               state(state_), address((char *)address_), iter(iter_) {}
+       explicit heap_compactor(mark_bits<Block> *state_, Block *address_, Iterator &iter_, const Block **finger_) :
+               state(state_), address((char *)address_), iter(iter_), finger(finger_) {}
 
        void operator()(Block *block, cell size)
        {
                if(this->state->marked_p(block))
                {
+                       *finger = block;
+                       memmove((Block *)address,block,size);
                        iter(block,(Block *)address,size);
                        address += size;
                }
@@ -172,11 +175,11 @@ template<typename Block, typename Iterator> struct heap_compactor {
 /* The forwarding map must be computed first by calling
 state.compute_forwarding(). */
 template<typename Block>
-template<typename Iterator, typename Sizer>
-void free_list_allocator<Block>::compact(Iterator &iter, Sizer &sizer)
+template<typename Iterator, typename Fixup>
+void free_list_allocator<Block>::compact(Iterator &iter, Fixup fixup, const Block **finger)
 {
-       heap_compactor<Block,Iterator> compactor(&state,first_block(),iter);
-       iterate(compactor,sizer);
+       heap_compactor<Block,Iterator> compactor(&state,first_block(),iter,finger);
+       iterate(compactor,fixup);
 
        /* Now update the free list; there will be a single free block at
        the end */
@@ -185,34 +188,26 @@ void free_list_allocator<Block>::compact(Iterator &iter, Sizer &sizer)
 
 /* During compaction we have to be careful and measure object sizes differently */
 template<typename Block>
-template<typename Iterator, typename Sizer>
-void free_list_allocator<Block>::iterate(Iterator &iter, Sizer &sizer)
+template<typename Iterator, typename Fixup>
+void free_list_allocator<Block>::iterate(Iterator &iter, Fixup fixup)
 {
        Block *scan = first_block();
        Block *end = last_block();
 
        while(scan != end)
        {
-               cell size = sizer(scan);
+               cell size = fixup.size(scan);
                Block *next = (Block *)((cell)scan + size);
                if(!scan->free_p()) iter(scan,size);
                scan = next;
        }
 }
 
-template<typename Block> struct standard_sizer {
-       cell operator()(Block *block)
-       {
-               return block->size();
-       }
-};
-
 template<typename Block>
 template<typename Iterator>
 void free_list_allocator<Block>::iterate(Iterator &iter)
 {
-       standard_sizer<Block> sizer;
-       iterate(iter,sizer);
+       iterate(iter,no_fixup());
 }
 
 }
index 849ef07084493e7d31a81437e77c4c3106e9ebbc..19d8b576a5bcbf7b77cb7ca8ec50814276ae1628 100644 (file)
@@ -3,17 +3,9 @@
 namespace factor
 {
 
-inline static code_block_visitor<code_workhorse> make_code_visitor(factor_vm *parent)
-{
-       return code_block_visitor<code_workhorse>(parent,code_workhorse(parent));
-}
-
 full_collector::full_collector(factor_vm *parent_) :
-       collector<tenured_space,full_policy>(
-               parent_,
-               parent_->data->tenured,
-               full_policy(parent_)),
-       code_visitor(make_code_visitor(parent_)) {}
+       collector<tenured_space,full_policy>(parent_,parent_->data->tenured,full_policy(parent_)),
+       code_visitor(parent,workhorse) {}
 
 void full_collector::trace_code_block(code_block *compiled)
 {
index ba859e28c93c63a6cd63d9b379b4800ee52a30ce..82a057ddbfb726a5077d5971c20b60b601627b90 100644 (file)
@@ -25,26 +25,8 @@ struct full_policy {
        }
 };
 
-struct code_workhorse {
-       factor_vm *parent;
-       code_heap *code;
-
-       explicit code_workhorse(factor_vm *parent_) : parent(parent_), code(parent->code) {}
-
-       code_block *operator()(code_block *compiled)
-       {
-               if(!code->marked_p(compiled))
-               {
-                       code->set_marked_p(compiled);
-                       parent->mark_stack.push_back((cell)compiled + 1);
-               }
-
-               return compiled;
-       }
-};
-
 struct full_collector : collector<tenured_space,full_policy> {
-       code_block_visitor<code_workhorse> code_visitor;
+       code_block_visitor<gc_workhorse<tenured_space,full_policy> > code_visitor;
 
        explicit full_collector(factor_vm *parent_);
        void trace_code_block(code_block *compiled);
index 599ed3cd31ef7bbedd2369930ce3927218793d51..766940a2d7160ab1152446c3b95a5b4f9ea3c72d 100755 (executable)
--- a/vm/gc.cpp
+++ b/vm/gc.cpp
@@ -194,8 +194,54 @@ void factor_vm::gc(gc_op op, cell requested_bytes, bool trace_contexts_p)
        current_gc = NULL;
 }
 
+/* primitive_minor_gc() is invoked by inline GC checks, and it needs to fill in
+uninitialized stack locations before actually calling the GC. See the comment
+in compiler.cfg.stacks.uninitialized for details. */
+
+struct call_frame_scrubber {
+       factor_vm *parent;
+       context *ctx;
+
+       explicit call_frame_scrubber(factor_vm *parent_, context *ctx_) :
+               parent(parent_), ctx(ctx_) {}
+
+       void operator()(stack_frame *frame)
+       {
+               cell return_address = parent->frame_offset(frame);
+               if(return_address == (cell)-1)
+                       return;
+
+               code_block *compiled = parent->frame_code(frame);
+               gc_info *info = compiled->block_gc_info();
+
+               assert(return_address < compiled->size());
+               int index = info->return_address_index(return_address);
+               if(index != -1)
+                       ctx->scrub_stacks(info,index);
+       }
+};
+
+void factor_vm::scrub_context(context *ctx)
+{
+       call_frame_scrubber scrubber(this,ctx);
+       iterate_callstack(ctx,scrubber);
+}
+
+void factor_vm::scrub_contexts()
+{
+       std::set<context *>::const_iterator begin = active_contexts.begin();
+       std::set<context *>::const_iterator end = active_contexts.end();
+       while(begin != end)
+       {
+               scrub_context(*begin);
+               begin++;
+       }
+}
+
 void factor_vm::primitive_minor_gc()
 {
+       scrub_contexts();
+
        gc(collect_nursery_op,
                0, /* requested size */
                true /* trace contexts? */);
@@ -215,36 +261,6 @@ void factor_vm::primitive_compact_gc()
                true /* trace contexts? */);
 }
 
-void factor_vm::inline_gc(cell gc_roots_)
-{
-       cell stack_pointer = (cell)ctx->callstack_top;
-
-       if(to_boolean(gc_roots_))
-       {
-               tagged<array> gc_roots(gc_roots_);
-
-               cell capacity = array_capacity(gc_roots.untagged());
-               for(cell i = 0; i < capacity; i++)
-               {
-                       cell spill_slot = untag_fixnum(array_nth(gc_roots.untagged(),i));
-                       cell *address = (cell *)(spill_slot + stack_pointer);
-                       data_roots.push_back(data_root_range(address,1));
-               }
-
-               primitive_minor_gc();
-
-               for(cell i = 0; i < capacity; i++)
-                       data_roots.pop_back();
-       }
-       else
-               primitive_minor_gc();
-}
-
-VM_C_API void inline_gc(cell gc_roots, factor_vm *parent)
-{
-       parent->inline_gc(gc_roots);
-}
-
 /*
  * It is up to the caller to fill in the object's fields in a meaningful
  * fashion!
index 39a69e34f4c0678ee93ffd964fcc74a5754df26a..f6e9a875a63c04bbf165b155f9421885af6f89a0 100755 (executable)
--- a/vm/gc.hpp
+++ b/vm/gc.hpp
@@ -52,6 +52,4 @@ struct gc_state {
        void start_again(gc_op op_, factor_vm *parent);
 };
 
-VM_C_API void inline_gc(cell gc_roots, factor_vm *parent);
-
 }
diff --git a/vm/gc_info.cpp b/vm/gc_info.cpp
new file mode 100644 (file)
index 0000000..b937d0a
--- /dev/null
@@ -0,0 +1,19 @@
+#include "master.hpp"
+
+namespace factor
+{
+
+int gc_info::return_address_index(cell return_address)
+{
+       u32 *return_address_array = return_addresses();
+
+       for(cell i = 0; i < return_address_count; i++)
+       {
+               if(return_address == return_address_array[i])
+                       return i;
+       }
+
+       return -1;
+}
+
+}
diff --git a/vm/gc_info.hpp b/vm/gc_info.hpp
new file mode 100644 (file)
index 0000000..d5229a1
--- /dev/null
@@ -0,0 +1,51 @@
+namespace factor
+{
+
+struct gc_info {
+       u32 scrub_d_count;
+       u32 scrub_r_count;
+       u32 gc_root_count;
+       u32 return_address_count;
+
+       cell total_bitmap_size()
+       {
+               return return_address_count * (scrub_d_count + scrub_r_count + gc_root_count);
+       }
+
+       cell total_bitmap_bytes()
+       {
+               return ((total_bitmap_size() + 7) / 8);
+       }
+
+       u32 *return_addresses()
+       {
+               return (u32 *)((u8 *)this - return_address_count * sizeof(u32));
+       }
+
+       u8 *gc_info_bitmap()
+       {
+               return (u8 *)return_addresses() - total_bitmap_bytes();
+       }
+
+       cell scrub_d_base(cell index)
+       {
+               return index * scrub_d_count;
+       }
+
+       cell scrub_r_base(cell index)
+       {
+               return return_address_count * scrub_d_count +
+                       index * scrub_r_count;
+       }
+
+       cell spill_slot_base(cell index)
+       {
+               return return_address_count * scrub_d_count
+                       + return_address_count * scrub_r_count
+                       + index * gc_root_count;
+       }
+
+       int return_address_index(cell return_address);
+};
+
+}
index ccce96a952c56970c8b728293989347173338bc6..4643d897797bee7e66325dc7683b7f6ab304284d 100755 (executable)
@@ -55,70 +55,66 @@ void factor_vm::load_code_heap(FILE *file, image_header *h, vm_parameters *p)
        code->allocator->initial_free_list(h->code_size);
 }
 
-struct data_fixupper {
-       cell offset;
+struct startup_fixup {
+       cell data_offset;
+       cell code_offset;
 
-       explicit data_fixupper(cell offset_) : offset(offset_) {}
+       explicit startup_fixup(cell data_offset_, cell code_offset_) :
+               data_offset(data_offset_), code_offset(code_offset_) {}
 
-       object *operator()(object *obj)
+       object *fixup_data(object *obj)
        {
-               return (object *)((char *)obj + offset);
+               return (object *)((cell)obj + data_offset);
        }
-};
-
-struct code_fixupper {
-       cell offset;
-
-       explicit code_fixupper(cell offset_) : offset(offset_) {}
 
-       code_block *operator()(code_block *compiled)
+       code_block *fixup_code(code_block *obj)
        {
-               return (code_block *)((char *)compiled + offset);
+               return (code_block *)((cell)obj + code_offset);
        }
-};
 
-static inline cell tuple_size_with_fixup(cell offset, object *obj)
-{
-       tuple_layout *layout = (tuple_layout *)((char *)UNTAG(((tuple *)obj)->layout) + offset);
-       return tuple_size(layout);
-}
+       object *translate_data(const object *obj)
+       {
+               return fixup_data((object *)obj);
+       }
 
-struct fixup_sizer {
-       cell offset;
+       code_block *translate_code(const code_block *compiled)
+       {
+               return fixup_code((code_block *)compiled);
+       }
 
-       explicit fixup_sizer(cell offset_) : offset(offset_) {}
+       cell size(const object *obj)
+       {
+               return obj->size(*this);
+       }
 
-       cell operator()(object *obj)
+       cell size(code_block *compiled)
        {
-               if(obj->type() == TUPLE_TYPE)
-                       return align(tuple_size_with_fixup(offset,obj),data_alignment);
-               else
-                       return obj->size();
+               return compiled->size(*this);
        }
 };
 
-struct object_fixupper {
+struct start_object_updater {
        factor_vm *parent;
-       cell data_offset;
-       slot_visitor<data_fixupper> data_visitor;
-       code_block_visitor<code_fixupper> code_visitor;
+       startup_fixup fixup;
+       slot_visitor<startup_fixup> data_visitor;
+       code_block_visitor<startup_fixup> code_visitor;
 
-       object_fixupper(factor_vm *parent_, cell data_offset_, cell code_offset_) :
+       start_object_updater(factor_vm *parent_, startup_fixup fixup_) :
                parent(parent_),
-               data_offset(data_offset_),
-               data_visitor(slot_visitor<data_fixupper>(parent_,data_fixupper(data_offset_))),
-               code_visitor(code_block_visitor<code_fixupper>(parent_,code_fixupper(code_offset_))) {}
+               fixup(fixup_),
+               data_visitor(slot_visitor<startup_fixup>(parent_,fixup_)),
+               code_visitor(code_block_visitor<startup_fixup>(parent_,fixup_)) {}
 
        void operator()(object *obj, cell size)
        {
                parent->data->tenured->starts.record_object_start_offset(obj);
 
+               data_visitor.visit_slots(obj);
+
                switch(obj->type())
                {
                case ALIEN_TYPE:
                        {
-                               cell payload_start = obj->binary_payload_start();
-                               data_visitor.visit_slots(obj,payload_start);
 
                                alien *ptr = (alien *)obj;
 
@@ -130,22 +126,11 @@ struct object_fixupper {
                        }
                case DLL_TYPE:
                        {
-                               cell payload_start = obj->binary_payload_start();
-                               data_visitor.visit_slots(obj,payload_start);
-
                                parent->ffi_dlopen((dll *)obj);
                                break;
                        }
-               case TUPLE_TYPE:
-                       {
-                               cell payload_start = tuple_size_with_fixup(data_offset,obj);
-                               data_visitor.visit_slots(obj,payload_start);
-                               break;
-                       }
                default:
                        {
-                               cell payload_start = obj->binary_payload_start();
-                               data_visitor.visit_slots(obj,payload_start);
                                code_visitor.visit_object_code_block(obj);
                                break;
                        }
@@ -155,44 +140,51 @@ struct object_fixupper {
 
 void factor_vm::fixup_data(cell data_offset, cell code_offset)
 {
-       slot_visitor<data_fixupper> data_workhorse(this,data_fixupper(data_offset));
+       startup_fixup fixup(data_offset,code_offset);
+       slot_visitor<startup_fixup> data_workhorse(this,fixup);
        data_workhorse.visit_roots();
 
-       object_fixupper fixupper(this,data_offset,code_offset);
-       fixup_sizer sizer(data_offset);
-       data->tenured->iterate(fixupper,sizer);
+       start_object_updater updater(this,fixup);
+       data->tenured->iterate(updater,fixup);
 }
 
-struct code_block_fixup_relocation_visitor {
+struct startup_code_block_relocation_visitor {
        factor_vm *parent;
-       cell code_offset;
-       slot_visitor<data_fixupper> data_visitor;
-       code_fixupper code_visitor;
+       startup_fixup fixup;
+       slot_visitor<startup_fixup> data_visitor;
 
-       code_block_fixup_relocation_visitor(factor_vm *parent_, cell data_offset_, cell code_offset_) :
+       startup_code_block_relocation_visitor(factor_vm *parent_, startup_fixup fixup_) :
                parent(parent_),
-               code_offset(code_offset_),
-               data_visitor(slot_visitor<data_fixupper>(parent_,data_fixupper(data_offset_))),
-               code_visitor(code_fixupper(code_offset_)) {}
+               fixup(fixup_),
+               data_visitor(slot_visitor<startup_fixup>(parent_,fixup_)) {}
 
        void operator()(instruction_operand op)
        {
                code_block *compiled = op.parent_code_block();
-               cell old_offset = op.rel_offset() + (cell)compiled->entry_point() - code_offset;
+               cell old_offset = op.rel_offset() + (cell)compiled->entry_point() - fixup.code_offset;
 
                switch(op.rel_type())
                {
                case RT_LITERAL:
-                       op.store_value(data_visitor.visit_pointer(op.load_value(old_offset)));
-                       break;
+                       {
+                               cell value = op.load_value(old_offset);
+                               if(immediate_p(value))
+                                       op.store_value(value);
+                               else
+                                       op.store_value(RETAG(fixup.fixup_data(untag<object>(value)),TAG(value)));
+                               break;
+                       }
                case RT_ENTRY_POINT:
                case RT_ENTRY_POINT_PIC:
                case RT_ENTRY_POINT_PIC_TAIL:
-                       op.store_code_block(code_visitor(op.load_code_block(old_offset)));
-                       break;
                case RT_HERE:
-                       op.store_value(op.load_value(old_offset) + code_offset);
-                       break;
+                       {
+                               cell value = op.load_value(old_offset);
+                               cell offset = TAG(value);
+                               code_block *compiled = (code_block *)UNTAG(value);
+                               op.store_value((cell)fixup.fixup_code(compiled) + offset);
+                               break;
+                       }
                case RT_UNTAGGED:
                        break;
                default:
@@ -202,30 +194,28 @@ struct code_block_fixup_relocation_visitor {
        }
 };
 
-struct code_block_fixupper {
+struct startup_code_block_updater {
        factor_vm *parent;
-       cell data_offset;
-       cell code_offset;
+       startup_fixup fixup;
 
-       code_block_fixupper(factor_vm *parent_, cell data_offset_, cell code_offset_) :
-               parent(parent_),
-               data_offset(data_offset_),
-               code_offset(code_offset_) {}
+       startup_code_block_updater(factor_vm *parent_, startup_fixup fixup_) :
+               parent(parent_), fixup(fixup_) {}
 
        void operator()(code_block *compiled, cell size)
        {
-               slot_visitor<data_fixupper> data_visitor(parent,data_fixupper(data_offset));
+               slot_visitor<startup_fixup> data_visitor(parent,fixup);
                data_visitor.visit_code_block_objects(compiled);
 
-               code_block_fixup_relocation_visitor code_visitor(parent,data_offset,code_offset);
+               startup_code_block_relocation_visitor code_visitor(parent,fixup);
                compiled->each_instruction_operand(code_visitor);
        }
 };
 
 void factor_vm::fixup_code(cell data_offset, cell code_offset)
 {
-       code_block_fixupper fixupper(this,data_offset,code_offset);
-       code->allocator->iterate(fixupper);
+       startup_fixup fixup(data_offset,code_offset);
+       startup_code_block_updater updater(this,fixup);
+       code->allocator->iterate(updater,fixup);
 }
 
 /* Read an image file from disk, only done once during startup */
index 3324cfb366179a28926b8d7c0e405ea910827976..b98c6f54ff8d0fda2c67225ef95df1c6142e7ad2 100644 (file)
@@ -116,6 +116,11 @@ void jit::compute_position(cell offset_)
 /* Allocates memory */
 code_block *jit::to_code_block()
 {
+       /* Emit dummy GC info */
+       code.grow_bytes(alignment_for(code.count + 4,data_alignment));
+       u32 dummy_gc_info = 0;
+       code.append_bytes(&dummy_gc_info,sizeof(u32));
+
        code.trim();
        relocation.trim();
        parameters.trim();
index 5e7ca0279f73582e1476c895ff4e8dc4939169c7..b0edb4be164d7691e6446cf80334859af555fcfc 100644 (file)
@@ -23,6 +23,11 @@ inline static cell align(cell a, cell b)
        return (a + (b-1)) & ~(b-1);
 }
 
+inline static cell alignment_for(cell a, cell b)
+{
+       return align(a,b) - a;
+}
+
 static const cell data_alignment = 16;
 
 #define WORD_SIZE (signed)(sizeof(cell)*8)
@@ -98,7 +103,10 @@ struct object {
        cell header;
 
        cell size() const;
+       template<typename Fixup> cell size(Fixup fixup) const;
+
        cell binary_payload_start() const;
+       template<typename Fixup> cell binary_payload_start(Fixup fixup) const;
 
        cell *slots() const { return (cell *)this; }
 
index 5115f9a8214489045451d054ac8ec724c6bfea77..b3b73ba1ea86aba00d6123d8ea77e44f0a264e1a 100644 (file)
@@ -40,7 +40,7 @@ template<typename Block> struct mark_bits {
                forwarding = NULL;
        }
 
-       cell block_line(Block *address)
+       cell block_line(const Block *address)
        {
                return (((cell)address - start) / data_alignment);
        }
@@ -50,7 +50,7 @@ template<typename Block> struct mark_bits {
                return (Block *)(line * data_alignment + start);
        }
 
-       std::pair<cell,cell> bitmap_deref(Block *address)
+       std::pair<cell,cell> bitmap_deref(const Block *address)
        {
                cell line_number = block_line(address);
                cell word_index = (line_number / mark_bits_granularity);
@@ -58,18 +58,18 @@ template<typename Block> struct mark_bits {
                return std::make_pair(word_index,word_shift);
        }
 
-       bool bitmap_elt(cell *bits, Block *address)
+       bool bitmap_elt(cell *bits, const Block *address)
        {
                std::pair<cell,cell> position = bitmap_deref(address);
                return (bits[position.first] & ((cell)1 << position.second)) != 0;
        }
 
-       Block *next_block_after(Block *block)
+       Block *next_block_after(const Block *block)
        {
                return (Block *)((cell)block + block->size());
        }
 
-       void set_bitmap_range(cell *bits, Block *address)
+       void set_bitmap_range(cell *bits, const Block *address)
        {
                std::pair<cell,cell> start = bitmap_deref(address);
                std::pair<cell,cell> end = bitmap_deref(next_block_after(address));
@@ -99,12 +99,12 @@ template<typename Block> struct mark_bits {
                }
        }
 
-       bool marked_p(Block *address)
+       bool marked_p(const Block *address)
        {
                return bitmap_elt(marked,address);
        }
 
-       void set_marked_p(Block *address)
+       void set_marked_p(const Block *address)
        {
                set_bitmap_range(marked,address);
        }
@@ -123,7 +123,7 @@ template<typename Block> struct mark_bits {
 
        /* We have the popcount for every mark_bits_granularity entries; look
        up and compute the rest */
-       Block *forward_block(Block *original)
+       Block *forward_block(const Block *original)
        {
 #ifdef FACTOR_DEBUG
                assert(marked_p(original));
@@ -141,7 +141,7 @@ template<typename Block> struct mark_bits {
                return new_block;
        }
 
-       Block *next_unmarked_block_after(Block *original)
+       Block *next_unmarked_block_after(const Block *original)
        {
                std::pair<cell,cell> position = bitmap_deref(original);
                cell bit_index = position.second;
@@ -168,7 +168,7 @@ template<typename Block> struct mark_bits {
                return (Block *)(this->start + this->size);
        }
 
-       Block *next_marked_block_after(Block *original)
+       Block *next_marked_block_after(const Block *original)
        {
                std::pair<cell,cell> position = bitmap_deref(original);
                cell bit_index = position.second;
index a111a86b699be1d910347f1de2ef28f28adffa84..b8ababeb2da5ad7c499816fded34700ef2beea7e 100755 (executable)
@@ -75,6 +75,7 @@ namespace factor
 #include "platform.hpp"
 #include "primitives.hpp"
 #include "segments.hpp"
+#include "gc_info.hpp"
 #include "contexts.hpp"
 #include "run.hpp"
 #include "objects.hpp"
@@ -89,6 +90,8 @@ namespace factor
 #include "bitwise_hacks.hpp"
 #include "mark_bits.hpp"
 #include "free_list.hpp"
+#include "fixup.hpp"
+#include "tuples.hpp"
 #include "free_list_allocator.hpp"
 #include "write_barrier.hpp"
 #include "object_start_map.hpp"
@@ -100,7 +103,6 @@ namespace factor
 #include "gc.hpp"
 #include "debug.hpp"
 #include "strings.hpp"
-#include "tuples.hpp"
 #include "words.hpp"
 #include "float_bits.hpp"
 #include "io.hpp"
@@ -115,6 +117,7 @@ namespace factor
 #include "data_roots.hpp"
 #include "code_roots.hpp"
 #include "generic_arrays.hpp"
+#include "callstack.hpp"
 #include "slot_visitor.hpp"
 #include "collector.hpp"
 #include "copying_collector.hpp"
@@ -124,7 +127,6 @@ namespace factor
 #include "code_block_visitor.hpp"
 #include "compaction.hpp"
 #include "full_collector.hpp"
-#include "callstack.hpp"
 #include "arrays.hpp"
 #include "math.hpp"
 #include "byte_arrays.hpp"
index a418cbff1b43d53bf701f903b966901204d74cee..737b35ab85735d11f9f4f39d699bbcac295b2991 100755 (executable)
@@ -491,10 +491,9 @@ s64 factor_vm::to_signed_8(cell obj)
        }
 }
 
-VM_C_API s64 *to_signed_8(cell obj, factor_vm *parent)
+VM_C_API void to_signed_8(cell obj, s64 *out, factor_vm *parent)
 {
-       parent->ctx->long_long_return = parent->to_signed_8(obj);
-       return &parent->ctx->long_long_return;
+       *out = parent->to_signed_8(obj);
 }
 
 cell factor_vm::from_unsigned_8(u64 n)
@@ -525,10 +524,9 @@ u64 factor_vm::to_unsigned_8(cell obj)
        }
 }
 
-VM_C_API s64 *to_unsigned_8(cell obj, factor_vm *parent)
+VM_C_API void to_unsigned_8(cell obj, u64 *out, factor_vm *parent)
 {
-       parent->ctx->long_long_return = parent->to_unsigned_8(obj);
-       return &parent->ctx->long_long_return;
+       *out = parent->to_unsigned_8(obj);
 }
  
 VM_C_API cell from_float(float flo, factor_vm *parent)
index c2444b98f988b889857dfec224512f00cdab2b39..13934048cdce68968b8666785147ac30dc597152 100644 (file)
@@ -90,8 +90,8 @@ VM_C_API cell from_unsigned_cell(cell integer, factor_vm *vm);
 VM_C_API cell from_signed_8(s64 n, factor_vm *vm);
 VM_C_API cell from_unsigned_8(u64 n, factor_vm *vm);
 
-VM_C_API s64 *to_signed_8(cell obj, factor_vm *vm);
-VM_C_API s64 *to_unsigned_8(cell obj, factor_vm *vm);
+VM_C_API void to_signed_8(cell obj, s64 *out, factor_vm *parent);
+VM_C_API void to_unsigned_8(cell obj, u64 *out, factor_vm *parent);
 
 VM_C_API fixnum to_fixnum(cell tagged, factor_vm *vm);
 VM_C_API cell to_cell(cell tagged, factor_vm *vm);
index 6b007f5d420f220c13130dcbd5f582df93dc8c53..a370e3f7129d4447e87c4afbf9ece1d04d00bcd6 100644 (file)
@@ -82,13 +82,13 @@ void factor_vm::primitive_size()
        ctx->push(allot_cell(object_size(ctx->pop())));
 }
 
-struct slot_become_visitor {
+struct slot_become_fixup : no_fixup {
        std::map<object *,object *> *become_map;
 
-       explicit slot_become_visitor(std::map<object *,object *> *become_map_) :
+       explicit slot_become_fixup(std::map<object *,object *> *become_map_) :
                become_map(become_map_) {}
 
-       object *operator()(object *old)
+       object *fixup_data(object *old)
        {
                std::map<object *,object *>::const_iterator iter = become_map->find(old);
                if(iter != become_map->end())
@@ -99,9 +99,9 @@ struct slot_become_visitor {
 };
 
 struct object_become_visitor {
-       slot_visitor<slot_become_visitor> *workhorse;
+       slot_visitor<slot_become_fixup> *workhorse;
 
-       explicit object_become_visitor(slot_visitor<slot_become_visitor> *workhorse_) :
+       explicit object_become_visitor(slot_visitor<slot_become_fixup> *workhorse_) :
                workhorse(workhorse_) {}
 
        void operator()(object *obj)
@@ -111,9 +111,9 @@ struct object_become_visitor {
 };
 
 struct code_block_become_visitor {
-       slot_visitor<slot_become_visitor> *workhorse;
+       slot_visitor<slot_become_fixup> *workhorse;
 
-       explicit code_block_become_visitor(slot_visitor<slot_become_visitor> *workhorse_) :
+       explicit code_block_become_visitor(slot_visitor<slot_become_fixup> *workhorse_) :
                workhorse(workhorse_) {}
 
        void operator()(code_block *compiled, cell size)
@@ -160,7 +160,7 @@ void factor_vm::primitive_become()
 
        /* Update all references to old objects to point to new objects */
        {
-               slot_visitor<slot_become_visitor> workhorse(this,slot_become_visitor(&become_map));
+               slot_visitor<slot_become_fixup> workhorse(this,slot_become_fixup(&become_map));
                workhorse.visit_roots();
                workhorse.visit_contexts();
 
index d4dd44bed1a59b81cc78b5bdc50b04dedfb8ed75..4223f94a570d78e13d33e889de4502c938b5d54b 100644 (file)
@@ -1,6 +1,100 @@
 namespace factor
 {
 
+/* Size of the object pointed to by an untagged pointer */
+template<typename Fixup>
+cell object::size(Fixup fixup) const
+{
+       if(free_p()) return ((free_heap_block *)this)->size();
+
+       switch(type())
+       {
+       case ARRAY_TYPE:
+               return align(array_size((array*)this),data_alignment);
+       case BIGNUM_TYPE:
+               return align(array_size((bignum*)this),data_alignment);
+       case BYTE_ARRAY_TYPE:
+               return align(array_size((byte_array*)this),data_alignment);
+       case STRING_TYPE:
+               return align(string_size(string_capacity((string*)this)),data_alignment);
+       case TUPLE_TYPE:
+               {
+                       tuple_layout *layout = (tuple_layout *)fixup.translate_data(untag<object>(((tuple *)this)->layout));
+                       return align(tuple_size(layout),data_alignment);
+               }
+       case QUOTATION_TYPE:
+               return align(sizeof(quotation),data_alignment);
+       case WORD_TYPE:
+               return align(sizeof(word),data_alignment);
+       case FLOAT_TYPE:
+               return align(sizeof(boxed_float),data_alignment);
+       case DLL_TYPE:
+               return align(sizeof(dll),data_alignment);
+       case ALIEN_TYPE:
+               return align(sizeof(alien),data_alignment);
+       case WRAPPER_TYPE:
+               return align(sizeof(wrapper),data_alignment);
+       case CALLSTACK_TYPE:
+               return align(callstack_object_size(untag_fixnum(((callstack *)this)->length)),data_alignment);
+       default:
+               critical_error("Invalid header in size",(cell)this);
+               return 0; /* can't happen */
+       }
+}
+
+inline cell object::size() const
+{
+       return size(no_fixup());
+}
+
+/* The number of cells from the start of the object which should be scanned by
+the GC. Some types have a binary payload at the end (string, word, DLL) which
+we ignore. */
+template<typename Fixup>
+cell object::binary_payload_start(Fixup fixup) const
+{
+       if(free_p()) return 0;
+
+       switch(type())
+       {
+       /* these objects do not refer to other objects at all */
+       case FLOAT_TYPE:
+       case BYTE_ARRAY_TYPE:
+       case BIGNUM_TYPE:
+       case CALLSTACK_TYPE:
+               return 0;
+       /* these objects have some binary data at the end */
+       case WORD_TYPE:
+               return sizeof(word) - sizeof(cell) * 3;
+       case ALIEN_TYPE:
+               return sizeof(cell) * 3;
+       case DLL_TYPE:
+               return sizeof(cell) * 2;
+       case QUOTATION_TYPE:
+               return sizeof(quotation) - sizeof(cell) * 2;
+       case STRING_TYPE:
+               return sizeof(string);
+       /* everything else consists entirely of pointers */
+       case ARRAY_TYPE:
+               return array_size<array>(array_capacity((array*)this));
+       case TUPLE_TYPE:
+               {
+                       tuple_layout *layout = (tuple_layout *)fixup.translate_data(untag<object>(((tuple *)this)->layout));
+                       return tuple_size(layout);
+               }
+       case WRAPPER_TYPE:
+               return sizeof(wrapper);
+       default:
+               critical_error("Invalid header in binary_payload_start",(cell)this);
+               return 0; /* can't happen */
+       }
+}
+
+inline cell object::binary_payload_start() const
+{
+       return binary_payload_start(no_fixup());
+}
+
 /* Slot visitors iterate over the slots of an object, applying a functor to
 each one that is a non-immediate slot. The pointer is untagged first. The
 functor returns a new untagged object pointer. The return value may or may not equal the old one,
@@ -17,12 +111,12 @@ Iteration is driven by visit_*() methods. Some of them define GC roots:
 - visit_roots()
 - visit_contexts() */
 
-template<typename Visitor> struct slot_visitor {
+template<typename Fixup> struct slot_visitor {
        factor_vm *parent;
-       Visitor visitor;
+       Fixup fixup;
 
-       explicit slot_visitor<Visitor>(factor_vm *parent_, Visitor visitor_) :
-               parent(parent_), visitor(visitor_) {}
+       explicit slot_visitor<Fixup>(factor_vm *parent_, Fixup fixup_) :
+               parent(parent_), fixup(fixup_) {}
 
        cell visit_pointer(cell pointer);
        void visit_handle(cell *handle);
@@ -35,35 +129,36 @@ template<typename Visitor> struct slot_visitor {
        void visit_callback_roots();
        void visit_literal_table_roots();
        void visit_roots();
+       void visit_callstack_object(callstack *stack);
+       void visit_callstack(context *ctx);
        void visit_contexts();
        void visit_code_block_objects(code_block *compiled);
        void visit_embedded_literals(code_block *compiled);
 };
 
-template<typename Visitor>
-cell slot_visitor<Visitor>::visit_pointer(cell pointer)
+template<typename Fixup>
+cell slot_visitor<Fixup>::visit_pointer(cell pointer)
 {
        if(immediate_p(pointer)) return pointer;
 
-       object *untagged = untag<object>(pointer);
-       untagged = visitor(untagged);
+       object *untagged = fixup.fixup_data(untag<object>(pointer));
        return RETAG(untagged,TAG(pointer));
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_handle(cell *handle)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_handle(cell *handle)
 {
        *handle = visit_pointer(*handle);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_object_array(cell *start, cell *end)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_object_array(cell *start, cell *end)
 {
        while(start < end) visit_handle(start++);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_slots(object *ptr, cell payload_start)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_slots(object *ptr, cell payload_start)
 {
        cell *slot = (cell *)ptr;
        cell *end = (cell *)((cell)ptr + payload_start);
@@ -75,20 +170,23 @@ void slot_visitor<Visitor>::visit_slots(object *ptr, cell payload_start)
        }
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_slots(object *ptr)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_slots(object *obj)
 {
-       visit_slots(ptr,ptr->binary_payload_start());
+       if(obj->type() == CALLSTACK_TYPE)
+               visit_callstack_object((callstack *)obj);
+       else
+               visit_slots(obj,obj->binary_payload_start(fixup));
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_stack_elements(segment *region, cell *top)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_stack_elements(segment *region, cell *top)
 {
        visit_object_array((cell *)region->start,top + 1);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_data_roots()
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_data_roots()
 {
        std::vector<data_root_range>::const_iterator iter = parent->data_roots.begin();
        std::vector<data_root_range>::const_iterator end = parent->data_roots.end();
@@ -97,8 +195,8 @@ void slot_visitor<Visitor>::visit_data_roots()
                visit_object_array(iter->start,iter->start + iter->len);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_bignum_roots()
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_bignum_roots()
 {
        std::vector<cell>::const_iterator iter = parent->bignum_roots.begin();
        std::vector<cell>::const_iterator end = parent->bignum_roots.end();
@@ -108,16 +206,16 @@ void slot_visitor<Visitor>::visit_bignum_roots()
                cell *handle = (cell *)(*iter);
 
                if(*handle)
-                       *handle = (cell)visitor(*(object **)handle);
+                       *handle = (cell)fixup.fixup_data(*(object **)handle);
        }
 }
 
-template<typename Visitor>
+template<typename Fixup>
 struct callback_slot_visitor {
        callback_heap *callbacks;
-       slot_visitor<Visitor> *visitor;
+       slot_visitor<Fixup> *visitor;
 
-       explicit callback_slot_visitor(callback_heap *callbacks_, slot_visitor<Visitor> *visitor_) :
+       explicit callback_slot_visitor(callback_heap *callbacks_, slot_visitor<Fixup> *visitor_) :
                callbacks(callbacks_), visitor(visitor_) {}
 
        void operator()(code_block *stub)
@@ -126,15 +224,15 @@ struct callback_slot_visitor {
        }
 };
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_callback_roots()
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_callback_roots()
 {
-       callback_slot_visitor<Visitor> callback_visitor(parent->callbacks,this);
+       callback_slot_visitor<Fixup> callback_visitor(parent->callbacks,this);
        parent->callbacks->each_callback(callback_visitor);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_literal_table_roots()
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_literal_table_roots()
 {
        std::map<code_block *, cell> *uninitialized_blocks = &parent->code->uninitialized_blocks;
        std::map<code_block *, cell>::const_iterator iter = uninitialized_blocks->begin();
@@ -151,8 +249,8 @@ void slot_visitor<Visitor>::visit_literal_table_roots()
        parent->code->uninitialized_blocks = new_uninitialized_blocks;
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_roots()
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_roots()
 {
        visit_handle(&parent->true_object);
        visit_handle(&parent->bignum_zero);
@@ -167,8 +265,73 @@ void slot_visitor<Visitor>::visit_roots()
        visit_object_array(parent->special_objects,parent->special_objects + special_object_count);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_contexts()
+template<typename Fixup>
+struct call_frame_slot_visitor {
+       factor_vm *parent;
+       slot_visitor<Fixup> *visitor;
+
+       explicit call_frame_slot_visitor(factor_vm *parent_, slot_visitor<Fixup> *visitor_) :
+               parent(parent_), visitor(visitor_) {}
+
+       /*
+       next  -> [entry_point]
+                [size]
+                [return address] -- x86 only, backend adds 1 to each spill location
+                [spill area]
+                ...
+       frame -> [entry_point]
+                [size]
+       */
+       void operator()(stack_frame *frame)
+       {
+               cell return_address = parent->frame_offset(frame);
+               if(return_address == (cell)-1)
+                       return;
+
+               code_block *compiled = visitor->fixup.translate_code(parent->frame_code(frame));
+               gc_info *info = compiled->block_gc_info();
+
+               assert(return_address < compiled->size());
+               int index = info->return_address_index(return_address);
+               if(index == -1)
+                       return;
+
+#ifdef DEBUG_GC_MAPS
+               std::cout << "call frame code block " << compiled << " with offset " << return_address << std::endl;
+#endif
+               u8 *bitmap = info->gc_info_bitmap();
+               cell base = info->spill_slot_base(index);
+               cell *stack_pointer = (cell *)(parent->frame_successor(frame) + 1);
+
+               for(cell spill_slot = 0; spill_slot < info->gc_root_count; spill_slot++)
+               {
+                       if(bitmap_p(bitmap,base + spill_slot))
+                       {
+#ifdef DEBUG_GC_MAPS
+                               std::cout << "visiting spill slot " << spill_slot << std::endl;
+#endif
+                               visitor->visit_handle(&stack_pointer[spill_slot]);
+                       }
+               }
+       }
+};
+
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_callstack_object(callstack *stack)
+{
+       call_frame_slot_visitor<Fixup> call_frame_visitor(parent,this);
+       parent->iterate_callstack_object(stack,call_frame_visitor);
+}
+
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_callstack(context *ctx)
+{
+       call_frame_slot_visitor<Fixup> call_frame_visitor(parent,this);
+       parent->iterate_callstack(ctx,call_frame_visitor);
+}
+
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_contexts()
 {
        std::set<context *>::const_iterator begin = parent->active_contexts.begin();
        std::set<context *>::const_iterator end = parent->active_contexts.end();
@@ -179,16 +342,16 @@ void slot_visitor<Visitor>::visit_contexts()
                visit_stack_elements(ctx->datastack_seg,(cell *)ctx->datastack);
                visit_stack_elements(ctx->retainstack_seg,(cell *)ctx->retainstack);
                visit_object_array(ctx->context_objects,ctx->context_objects + context_object_count);
-
+               visit_callstack(ctx);
                begin++;
        }
 }
 
-template<typename Visitor>
+template<typename Fixup>
 struct literal_references_visitor {
-       slot_visitor<Visitor> *visitor;
+       slot_visitor<Fixup> *visitor;
 
-       explicit literal_references_visitor(slot_visitor<Visitor> *visitor_) : visitor(visitor_) {}
+       explicit literal_references_visitor(slot_visitor<Fixup> *visitor_) : visitor(visitor_) {}
 
        void operator()(instruction_operand op)
        {
@@ -197,20 +360,20 @@ struct literal_references_visitor {
        }
 };
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_code_block_objects(code_block *compiled)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_code_block_objects(code_block *compiled)
 {
        visit_handle(&compiled->owner);
        visit_handle(&compiled->parameters);
        visit_handle(&compiled->relocation);
 }
 
-template<typename Visitor>
-void slot_visitor<Visitor>::visit_embedded_literals(code_block *compiled)
+template<typename Fixup>
+void slot_visitor<Fixup>::visit_embedded_literals(code_block *compiled)
 {
        if(!parent->code->uninitialized_p(compiled))
        {
-               literal_references_visitor<Visitor> visitor(this);
+               literal_references_visitor<Fixup> visitor(this);
                compiled->each_instruction_operand(visitor);
        }
 }
index 8a3ee56e271880235809b6bf4b9b26814b41436e..147647b5283767fc70795b389ac9028f8ba1744a 100755 (executable)
--- a/vm/vm.hpp
+++ b/vm/vm.hpp
@@ -317,10 +317,11 @@ struct factor_vm
        void collect_compact(bool trace_contexts_p);
        void collect_growing_heap(cell requested_bytes, bool trace_contexts_p);
        void gc(gc_op op, cell requested_bytes, bool trace_contexts_p);
+       void scrub_context(context *ctx);
+       void scrub_contexts();
        void primitive_minor_gc();
        void primitive_full_gc();
        void primitive_compact_gc();
-       void inline_gc(cell gc_roots);
        void primitive_enable_gc_events();
        void primitive_disable_gc_events();
        object *allot_object(cell type, cell size);
@@ -595,6 +596,8 @@ struct factor_vm
        cell frame_executing_quot(stack_frame *frame);
        stack_frame *frame_successor(stack_frame *frame);
        cell frame_scan(stack_frame *frame);
+       cell frame_offset(stack_frame *frame);
+       void set_frame_offset(stack_frame *frame, cell offset);
        void primitive_callstack_to_array();
        stack_frame *innermost_stack_frame(callstack *stack);
        void primitive_innermost_stack_frame_executing();
@@ -615,9 +618,6 @@ struct factor_vm
        void primitive_dlclose();
        void primitive_dll_validp();
        char *alien_offset(cell obj);
-       cell from_value_struct(void *src, cell size);
-       cell from_small_struct(cell x, cell y, cell size);
-       cell from_medium_struct(cell x1, cell x2, cell x3, cell x4, cell size);
 
        // quotations
        void primitive_jit_compile();