forked from josiahseaman/skittle
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathFastaReader.cpp
332 lines (298 loc) · 22.2 KB
/
FastaReader.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
#include <QtGui>
#include "FastaReader.h"
#include "BasicTypes.h"
#include "glwidget.h"
#include "UiVariables.h"
#include "SkittleUtil.h"
#include <string>
#include <cctype>
#include <QDebug>
#include <QThread>
#include <QString>
#include <qtconcurrentrun.h>
#include <QApplication>
#include <QDebug>
/** *********************
FastaReader is the file reader for sequence files (FASTA format) usually ending in .fa.
The first line starts with > and a name then the rest of the file is ACGT or acgt. The
character N is used to fill in unsequenced regions. Capitalization is discarded by default
since it is meant to mark "junk sequences". All letters are capitalized for easy reading and
so that equivalence checks A == a work in the rest of the program.
FastaReader uses a progress bar dialog and is optimized for reading large files quickly. It reads
an entire file into memory, which makes reading the full 3GB human genome a big memory hog.
FastaReader provides a string pointer (string*) to the rest of the program through the seq() method.
The string is not ever copied, as it may be very large. There are several unused read methods left
over from experimentation with optimal memory management.
FastaReader is created inside the constructor of glWidget so that there is a reader for
every mdiChildWindow. Each reader can only have one file open at a time.
The actions: openAction and addViewAction in MainWindow start a cascade that leads to the creation
of a new FastaReader.
*********************/
FastaReader::FastaReader( GLWidget* gl, UiVariables* gui)
{
glWidget = gl;
ui = gui;
sequence = logo();//string("AATCGATCGTACGCTACGATCGCTACGCAGCTAGGACGGATT");//
bytesInFile = 0;
progressBar = NULL;
cancelled = false;
connect(this, SIGNAL(newFileRead(const string*)), glWidget, SLOT(displayString(const string*)));
}
FastaReader::~FastaReader()
{
sequence.clear();
sequence.resize(0);
}
bool FastaReader::readFile(QString fileName)
{
string file = fileName.toStdString();
//Make sure that we were requested to open a file
if(file.empty())
{
return false;
}
ui->print(file);
setupProgressBar();
//Parse the name of the chromosome from the file name and send it to glwidget to be stored
storeChrName(file);
//Clear out anything that may be left in the sequence string and set initial pad character
sequence.clear();
sequence = "";
sequence.reserve(5);
sequence = string(">");
//Clear out anything that may be in the ifstream then open the new file
wordfile.clear();
wordfile.open(file.c_str(), ifstream::in | ifstream::binary);
//See if we opened the file successfully
if(wordfile.fail())
{
ErrorBox msg("Could not read the file. Either Skittle doesn't have file permissions or the file does not exist.");
return false;
}
//Get how many characters are in the file
wordfile.seekg(0, ios::beg);
int begin = wordfile.tellg();
wordfile.seekg(0, ios::end);
int end = wordfile.tellg();
bytesInFile = end - begin;
//Discovered Reserve is different than malloc by creating a memory iterator
//The iterator takes old size, then virtually allocates a new vector to new size while at the same time copying start/end memory to this new location
//Then it destroys the old vector and walks through physical storage looking for a contiguous slot open, then dumps into the start and end location of new slot
sequence.reserve(bytesInFile);
//Start progress bar at 0
int progress = bytesInFile / 20;
progressBar->setValue(progress);
QApplication::processEvents();
//Return to the beginning of the file
wordfile.seekg(0, ios::beg);
//Skip the first line of the file as this is the chromosome name/info
wordfile.ignore(500, '\n');
//Read in the rest of the file
char current;
int i = 0;
cancelled = false;
do
{
//If the cancel button was pushed, go ahead and exit fasta reader
if(cancelled){
return false;
}
//Read the next character
wordfile >> current;
//If it is a letter, uppercase it
current = upperCase(current);
//if(current == 65 || current == 67 || current == 71 || current == 84 || current == 78) //A C G T N
if(current != '\n' && current != '\r')
{
sequence.push_back(current);
}
if(i != 0 && i % progress == 0)
{
progressBar->setValue(progressBar->value() + 5);
QApplication::processEvents();
}
i++;
}
while(!wordfile.eof() && !wordfile.fail() && !cancelled);
//Close up everything
progressBar->reset();
progressBar->close();
if(progressBar)
{
delete progressBar;
progressBar = NULL;
}
wordfile.close();
ui->print("Done loading file!");
emit newFileRead(seq());
return true;
}
char FastaReader::upperCase(char& c)
{
if( (int)c >= 97 && (int)c <= 122 )
return (char)((int)c - 32);
else
return c;
}
void FastaReader::cancel()
{
cancelled = true;
}
void FastaReader::setupProgressBar()
{
//Setup the progress bar by initially wiping it if one already exists
if(progressBar)
{
delete progressBar;
progressBar = NULL;
}
//Then setup a new progress bar
progressBar = new QProgressDialog("Loading File...", "Cancel", 0, 100);
connect(progressBar, SIGNAL(canceled()), this, SLOT(cancel()));
progressBar->show();
}
void FastaReader::storeChrName(string path)
{
string name = trimPathFromFilename(path);
glWidget->chromosomeName = name;
emit fileNameChanged(name);
}
const string* FastaReader::seq()
{
return &sequence;
}
/** Currently a hard coded logo is used to start up a new FastaReader. This ensures that if the user
selects cancel on the open file dialog the display is not left blank.
*/
string FastaReader::logo()
{
return string(
">TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
TTTTTTTTGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCGGGGGGGG\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAATTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTGGGGGGGGGGGGGGGG\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
CCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCC\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
AAAAAAAATTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
GGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAGGGGGGGG\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTGGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTT\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
TTTTTTTTAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
GGGGGGGGTTTTTTTTGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGAAAAAAAAGGGGGGGGGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGG\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
CCCCCCCCGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGGGGGGGGGTTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
TTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCCCCCCCCCAAAAAAAATTTTTTTTGGGGGGGGGGGGGGGGCCCCCCCCTTTTTTTTAAAAAAAAAAAAAAAACCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
GGGGGGGGTTTTTTTTAAAAAAAAAAAAAAAAGGGGGGGGTTTTTTTTCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAACCCCCCCCAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCC\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCGGGGGGGGTTTTTTTTTTTTTTTTAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGGGGGGGGCCCCCCCCGGGGGGGGTTTTTTTT\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
CCCCCCCCAAAAAAAACCCCCCCCCCCCCCCCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC\
TTTTTTTTGGGGGGGGCCCCCCCCTTTTTTTTGGGGGGGGCCCCCCCCGGGGGGGGAAAAAAAACCCCCCCCGGGGGGGGCCCCCCCCGGGGGGGGCCCCCCCCAAAAAAAATTTTTTTTCCCCCCCC");
}