source code
/* The Computer Language Benchmarks Game
https://salsa.debian.org/benchmarksgame-team/benchmarksgame/
contributed by Ralph Ganszky
for Swift 3.0+
using multiple threads by splitting workload in
random number generation and building output string.
random number get generated as Int32 like in gcc-7
by Jeremy Zerfas and normalized in a later step.
*/
import Foundation
import Dispatch
let linewidth = 60
let bufferLines = 10240
let rndBufSize = (bufferLines * linewidth)
let writeBufSize = (bufferLines * (linewidth + 1))
let IM: Int32 = 139968
let IA: Int32 = 3877
let IC: Int32 = 29573
var seed: Int32 = 42
typealias AminoAcid = (prob: Double, sym: String)
typealias CumAcid = (cprob: Int32, sym: Int8)
// String to repeat
let alu = "GGCCGGGCGCGGTGGCTCACGCCTGTAATCCCAGCACTTTGGGAGGCCGAGGCGGGCGGATCACCTGAGGTCAGGAGTTC" +
"GAGACCAGCCTGGCCAACATGGTGAAACCCCGTCTCTACTAAAAATACAAAAATTAGCCGGGCGTGGTGGCGCGCGCCTG" +
"TAATCCCAGCTACTCGGGAGGCTGAGGCAGGAGAATCGCTTGAACCCGGGAGGCGGAGGTTGCAGTGAGCCGAGATCGCG" +
"CCACTGCACTCCAGCCTGGGCGACAGAGCGAGACTCCGTCTCAAAAA"
// Amino acids and their probabilities
var iub = [
AminoAcid(0.27, "a"),
AminoAcid(0.12, "c"),
AminoAcid(0.12, "g"),
AminoAcid(0.27, "t"),
AminoAcid(0.02, "B"),
AminoAcid(0.02, "D"),
AminoAcid(0.02, "H"),
AminoAcid(0.02, "K"),
AminoAcid(0.02, "M"),
AminoAcid(0.02, "N"),
AminoAcid(0.02, "R"),
AminoAcid(0.02, "S"),
AminoAcid(0.02, "V"),
AminoAcid(0.02, "W"),
AminoAcid(0.02, "Y"),
]
var homosapiens = [
AminoAcid(0.3029549426680, "a"),
AminoAcid(0.1979883004921, "c"),
AminoAcid(0.1975473066391, "g"),
AminoAcid(0.3015094502008, "t"),
]
// Allocate some resources to buffer data and
// handle ownership by semaphores
let nBufs = 4 // need to be a power of two
var bufs = [UnsafeMutablePointer<Int32>]()
var cBufs = [UnsafeMutablePointer<Int8>]()
var pSemaphore = [DispatchSemaphore]()
var wSemaphore = [DispatchSemaphore]()
for _ in 0..<nBufs {
bufs.append(UnsafeMutablePointer<Int32>.allocate(capacity: rndBufSize))
cBufs.append(UnsafeMutablePointer<Int8>.allocate(capacity: writeBufSize))
pSemaphore.append(DispatchSemaphore(value: 1))
wSemaphore.append(DispatchSemaphore(value: 1))
}
defer {
for i in 0..<nBufs {
bufs[i].deallocate()
cBufs[i].deallocate()
}
}
// Let's have some queues to produce data, consume it
// and to syncronize data ownership
let cQueue = DispatchQueue(label: "Consumer", attributes: .concurrent)
let pQueue = DispatchQueue(label: "Producer", attributes: [])
let wQueue = DispatchQueue(label: "Writer", attributes: [])
let group = DispatchGroup()
// Binary search on acids
func bsearch(e: Int32, acids: [CumAcid]) -> Int8 {
var low = 0
var high = acids.count - 1
while low <= high {
let mid = low + (high - low) / 2
if acids[mid].cprob >= e {
high = mid - 1
} else {
low = mid + 1
}
}
return acids[high + 1].sym
}
// Build a block in fasta format
func buildFastaBlockFromString(s: String) -> String {
// Build block of linewidth characters wide string
let block = String(repeating: s, count: linewidth)
let blockUP = block.withCString{ s in s }
var blockNl = UnsafeMutablePointer<Int8>.allocate(capacity: (block.utf16.count)+s.utf16.count*linewidth-1)
defer {
blockNl.deallocate()
}
var blockIn = blockNl
for i in 0..<s.utf16.count {
let beg = blockUP.advanced(by: i*linewidth)
blockIn.assign(from: beg, count: linewidth)
blockIn = blockIn.advanced(by: linewidth)
if i < s.utf16.count - 1 {
blockIn[0] = "\n".utf8.map{Int8($0)}[0]
blockIn = blockIn.advanced(by: 1)
}
}
// Recreate String
return String(cString: blockNl)
}
// random
func random() -> Int32 {
seed = (seed * IA + IC) % IM
return seed
}
// Producer task
func genRandom(n: Int, block: Int) {
for i in 0..<min(n, rndBufSize) {
bufs[block][i] = random()
}
}
// Consumer task
func consumeRandom(n: Int, block: Int, acids: [CumAcid]) {
var bufPos = 0
var lineCounter = 0
for i in 0..<min(n, rndBufSize) {
let c = bsearch(e: bufs[block][i], acids: acids)
cBufs[block][bufPos] = c
lineCounter += 1
bufPos += 1
if lineCounter == linewidth {
cBufs[block][bufPos] = 10
bufPos += 1
lineCounter = 0
}
}
}
// Print random amino acid sequences
func randomFasta(n: Int, acids: [AminoAcid]) {
// Adjust probability to cumulative
var cumulative = 0.0
var cumAcid = [CumAcid](repeating: (0, 0), count: acids.count)
for (i, acid) in acids.enumerated() {
cumulative += acid.prob
cumAcid[i].cprob = Int32(cumulative*Double(IM))
cumAcid[i].sym = acid.sym.utf16.map{Int8($0)}[0]
}
let junks = (n + rndBufSize - 1) / rndBufSize
let remainder = n % rndBufSize
var deferedWrite = [Int]()
var writeBlock = 0
group.enter()
pQueue.async {
for i in 0..<junks-1 {
let block = i % bufs.count
pSemaphore[block].wait()
genRandom(n: rndBufSize, block: block)
cQueue.async(group: group) {
wSemaphore[block].wait()
consumeRandom(n: rndBufSize, block: block, acids: cumAcid)
pSemaphore[block].signal()
wQueue.async(group: group) {
if block != writeBlock {
deferedWrite.append(block)
} else {
print(String(cString: cBufs[block]), terminator: "")
writeBlock = (writeBlock + 1) & (nBufs-1)
wSemaphore[block].signal()
if deferedWrite.count > 0 {
while deferedWrite.contains(writeBlock) {
let blk = writeBlock
print(String(cString: cBufs[blk]), terminator: "")
writeBlock = (writeBlock + 1) & (nBufs-1)
deferedWrite.remove(at: deferedWrite.index(of: blk)!)
wSemaphore[blk].signal()
}
}
}
}
}
}
group.leave()
}
group.wait()
genRandom(n: remainder, block: 0)
consumeRandom(n: remainder, block: 0, acids: cumAcid)
let last = String(cString: cBufs[0])
var stringRemainder = remainder+(remainder/linewidth)
if stringRemainder % (linewidth+1) == 0 {
stringRemainder -= 1
}
print(last[last.startIndex..<last.index(last.startIndex, offsetBy: stringRemainder)])
}
// Print alu string in fasta format
func repeatFasta(n: Int, alu: String) {
var aluLen = n + n / linewidth
let aluSize = alu.utf16.count + 1
if aluLen > aluSize {
for _ in 0..<aluLen/aluSize {
print(alu)
}
aluLen -= (aluLen / aluSize) * aluSize
}
// Remove newline at the end because print adds it anyhow
if n % linewidth == 0 {
aluLen -= 1
}
if aluLen > 0 {
print(alu[alu.startIndex..<alu.index(alu.startIndex, offsetBy: aluLen)])
}
}
// Read command line parameters
let n: Int
if CommandLine.arguments.count > 1 {
n = Int(CommandLine.arguments[1]) ?? 1000
} else {
n = 1000
}
// Build block of linewidth characters wide string
let aluBlock = buildFastaBlockFromString(s: alu)
print(">ONE Homo sapiens alu")
repeatFasta(n: 2*n, alu: aluBlock)
print(">TWO IUB ambiguity codes")
randomFasta(n: 3*n, acids: iub)
print(">THREE Homo sapiens frequency")
randomFasta(n: 5*n, acids: homosapiens)
notes, command-line, and program output
NOTES:
64-bit Ubuntu quad core
Swift version 6.0
(swift-6.0-RELEASE)
Target: x86_64-unknown-linux-gnu
Wed, 18 Sep 2024 23:14:14 GMT
MAKE:
/opt/src/swift-6.0-RELEASE/usr/bin/swiftc fasta.swift-3.swift -Ounchecked -wmo -o fasta.swift-3.swift_run
fasta.swift-3.swift:114:17: warning: 'assign(from:count:)' is deprecated: renamed to 'update(from:count:)'
112 | for i in 0..<s.utf16.count {
113 | let beg = blockUP.advanced(by: i*linewidth)
114 | blockIn.assign(from: beg, count: linewidth)
| |- warning: 'assign(from:count:)' is deprecated: renamed to 'update(from:count:)'
| `- note: use 'update(from:count:)' instead
115 | blockIn = blockIn.advanced(by: linewidth)
116 | if i < s.utf16.count - 1 {
fasta.swift-3.swift:107:9: warning: variable 'blockNl' was never mutated; consider changing to 'let' constant
105 | let block = String(repeating: s, count: linewidth)
106 | let blockUP = block.withCString{ s in s }
107 | var blockNl = UnsafeMutablePointer<Int8>.allocate(capacity: (block.utf16.count)+s.utf16.count*linewidth-1)
| `- warning: variable 'blockNl' was never mutated; consider changing to 'let' constant
108 | defer {
109 | blockNl.deallocate()
fasta.swift-3.swift:197:70: warning: 'index(of:)' is deprecated: renamed to 'firstIndex(of:)'
195 | print(String(cString: cBufs[blk]), terminator: "")
196 | writeBlock = (writeBlock + 1) & (nBufs-1)
197 | deferedWrite.remove(at: deferedWrite.index(of: blk)!)
| |- warning: 'index(of:)' is deprecated: renamed to 'firstIndex(of:)'
| `- note: use 'firstIndex(of:)' instead
198 | wSemaphore[blk].signal()
199 | }
fasta.swift-3.swift:182:67: warning: reference to captured var 'cumAcid' in concurrently-executing code; this is an error in the Swift 6 language mode
180 |
181 | wSemaphore[block].wait()
182 | consumeRandom(n: rndBufSize, block: block, acids: cumAcid)
| `- warning: reference to captured var 'cumAcid' in concurrently-executing code; this is an error in the Swift 6 language mode
183 | pSemaphore[block].signal()
184 | wQueue.async(group: group) {
fasta.swift-3.swift:186:33: warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
184 | wQueue.async(group: group) {
185 |
186 | if block != writeBlock {
| `- warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
187 | deferedWrite.append(block)
188 | } else {
fasta.swift-3.swift:187:25: warning: mutation of captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
185 |
186 | if block != writeBlock {
187 | deferedWrite.append(block)
| `- warning: mutation of captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
188 | } else {
189 | print(String(cString: cBufs[block]), terminator: "")
fasta.swift-3.swift:190:25: warning: mutation of captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
188 | } else {
189 | print(String(cString: cBufs[block]), terminator: "")
190 | writeBlock = (writeBlock + 1) & (nBufs-1)
| `- warning: mutation of captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
191 | wSemaphore[block].signal()
192 | if deferedWrite.count > 0 {
fasta.swift-3.swift:190:39: warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
188 | } else {
189 | print(String(cString: cBufs[block]), terminator: "")
190 | writeBlock = (writeBlock + 1) & (nBufs-1)
| `- warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
191 | wSemaphore[block].signal()
192 | if deferedWrite.count > 0 {
fasta.swift-3.swift:192:28: warning: reference to captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
190 | writeBlock = (writeBlock + 1) & (nBufs-1)
191 | wSemaphore[block].signal()
192 | if deferedWrite.count > 0 {
| `- warning: reference to captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
193 | while deferedWrite.contains(writeBlock) {
194 | let blk = writeBlock
fasta.swift-3.swift:193:35: warning: reference to captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
191 | wSemaphore[block].signal()
192 | if deferedWrite.count > 0 {
193 | while deferedWrite.contains(writeBlock) {
| `- warning: reference to captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
194 | let blk = writeBlock
195 | print(String(cString: cBufs[blk]), terminator: "")
fasta.swift-3.swift:193:57: warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
191 | wSemaphore[block].signal()
192 | if deferedWrite.count > 0 {
193 | while deferedWrite.contains(writeBlock) {
| `- warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
194 | let blk = writeBlock
195 | print(String(cString: cBufs[blk]), terminator: "")
fasta.swift-3.swift:194:43: warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
192 | if deferedWrite.count > 0 {
193 | while deferedWrite.contains(writeBlock) {
194 | let blk = writeBlock
| `- warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
195 | print(String(cString: cBufs[blk]), terminator: "")
196 | writeBlock = (writeBlock + 1) & (nBufs-1)
fasta.swift-3.swift:196:33: warning: mutation of captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
194 | let blk = writeBlock
195 | print(String(cString: cBufs[blk]), terminator: "")
196 | writeBlock = (writeBlock + 1) & (nBufs-1)
| `- warning: mutation of captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
197 | deferedWrite.remove(at: deferedWrite.index(of: blk)!)
198 | wSemaphore[blk].signal()
fasta.swift-3.swift:196:47: warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
194 | let blk = writeBlock
195 | print(String(cString: cBufs[blk]), terminator: "")
196 | writeBlock = (writeBlock + 1) & (nBufs-1)
| `- warning: reference to captured var 'writeBlock' in concurrently-executing code; this is an error in the Swift 6 language mode
197 | deferedWrite.remove(at: deferedWrite.index(of: blk)!)
198 | wSemaphore[blk].signal()
fasta.swift-3.swift:197:33: warning: mutation of captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
195 | print(String(cString: cBufs[blk]), terminator: "")
196 | writeBlock = (writeBlock + 1) & (nBufs-1)
197 | deferedWrite.remove(at: deferedWrite.index(of: blk)!)
| `- warning: mutation of captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
198 | wSemaphore[blk].signal()
199 | }
fasta.swift-3.swift:197:57: warning: reference to captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
195 | print(String(cString: cBufs[blk]), terminator: "")
196 | writeBlock = (writeBlock + 1) & (nBufs-1)
197 | deferedWrite.remove(at: deferedWrite.index(of: blk)!)
| `- warning: reference to captured var 'deferedWrite' in concurrently-executing code; this is an error in the Swift 6 language mode
198 | wSemaphore[blk].signal()
199 | }
16.44s to complete and log all make actions
COMMAND LINE:
./fasta.swift-3.swift_run 25000000
(TRUNCATED) PROGRAM OUTPUT:
>ONE Homo sapiens alu
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
ACAGAGCGAGACTCCGTCTCAAAAAGGCCGG