How it works
+ +Why is gRNA design important?
+The efficiency of CRISPR systems for genome editing is determined by the gRNA and its corresponding target sequence information. Specific motifs or GC contents of the sequence can have an impact.
+From 26fd46eaf7ceb7ed0c07a99302e5de6d093e6c70 Mon Sep 17 00:00:00 2001 From: <> Date: Wed, 25 Sep 2024 09:02:11 +0000 Subject: [PATCH] Deployed 0f2942f with MkDocs version: 1.6.1 --- .nojekyll | 0 1_Predict/1_howworks/index.html | 1407 ++++ 1_Predict/2_predict_cas9/index.html | 1642 ++++ 1_Predict/3_predict_be/index.html | 1349 ++++ 1_Predict/4_predict_pe/index.html | 1899 +++++ 1_Predict/5_DeepPrime-Off/index.html | 1799 +++++ 2_Design/1_Design_intro/index.html | 1349 ++++ 2_Design/2_SynonymousPE/index.html | 2203 ++++++ 3_Database/1_database_intro/index.html | 1406 ++++ .../2_Genome_resource_background/index.html | 1455 ++++ .../3_Metadata from databases/index.html | 1815 +++++ 3_Database/4_Download_files/index.html | 1435 ++++ 404.html | 1273 ++++ 4_Analysis/1_analysis_intro/index.html | 1349 ++++ 5_Utils/1_utils_intro/index.html | 1349 ++++ 5_Utils/2_download_files/index.html | 1349 ++++ .../Genome-wide_KO_library/index.html | 1460 ++++ assets/contents/en_0_1_1_CRISPR_history.svg | 1 + assets/contents/en_0_1_2_CRISPR_machanism.svg | 1 + .../en_1_1_1_High-throughput_screening.svg | 1 + assets/contents/en_1_1_2_SHAP_analysis.svg | 1 + .../contents/en_1_1_3_SHAP_feature_value.svg | 1 + assets/contents/en_1_1_4_SHAP_force_plot.svg | 1 + .../en_1_4_1_DeepPrime_architecture.svg | 1 + .../contents/en_1_4_2_DeepPrime_input_ex1.svg | 1 + .../contents/en_1_4_3_DeepPrime_input_ex2.svg | 1 + .../contents/en_1_4_4_DeepPrime_input_ex3.svg | 1 + .../en_1_4_5_prime_editing_complex.svg | 1 + assets/contents/en_2_2_1_codon_frame.svg | 1 + assets/contents/ko_2_2_2_Synony_example_1.svg | 1 + assets/contents/ko_2_2_3_Synony_example_2.svg | 1 + assets/contents/ko_2_2_4_Synony_example_3.svg | 1 + assets/images/dna.jpg | Bin 0 -> 880776 bytes assets/images/favicon.png | Bin 0 -> 1870 bytes assets/images/illustration.png | Bin 0 -> 95237 bytes assets/images/logo.png | Bin 0 -> 95237 bytes assets/javascripts/bundle.d6f25eb3.min.js | 16 + assets/javascripts/bundle.d6f25eb3.min.js.map | 7 + assets/javascripts/lunr/min/lunr.ar.min.js | 1 + assets/javascripts/lunr/min/lunr.da.min.js | 18 + assets/javascripts/lunr/min/lunr.de.min.js | 18 + assets/javascripts/lunr/min/lunr.du.min.js | 18 + assets/javascripts/lunr/min/lunr.el.min.js | 1 + assets/javascripts/lunr/min/lunr.es.min.js | 18 + assets/javascripts/lunr/min/lunr.fi.min.js | 18 + assets/javascripts/lunr/min/lunr.fr.min.js | 18 + assets/javascripts/lunr/min/lunr.he.min.js | 1 + assets/javascripts/lunr/min/lunr.hi.min.js | 1 + assets/javascripts/lunr/min/lunr.hu.min.js | 18 + assets/javascripts/lunr/min/lunr.hy.min.js | 1 + assets/javascripts/lunr/min/lunr.it.min.js | 18 + assets/javascripts/lunr/min/lunr.ja.min.js | 1 + assets/javascripts/lunr/min/lunr.jp.min.js | 1 + assets/javascripts/lunr/min/lunr.kn.min.js | 1 + assets/javascripts/lunr/min/lunr.ko.min.js | 1 + assets/javascripts/lunr/min/lunr.multi.min.js | 1 + assets/javascripts/lunr/min/lunr.nl.min.js | 18 + assets/javascripts/lunr/min/lunr.no.min.js | 18 + assets/javascripts/lunr/min/lunr.pt.min.js | 18 + assets/javascripts/lunr/min/lunr.ro.min.js | 18 + assets/javascripts/lunr/min/lunr.ru.min.js | 18 + assets/javascripts/lunr/min/lunr.sa.min.js | 1 + .../lunr/min/lunr.stemmer.support.min.js | 1 + assets/javascripts/lunr/min/lunr.sv.min.js | 18 + assets/javascripts/lunr/min/lunr.ta.min.js | 1 + assets/javascripts/lunr/min/lunr.te.min.js | 1 + assets/javascripts/lunr/min/lunr.th.min.js | 1 + assets/javascripts/lunr/min/lunr.tr.min.js | 18 + assets/javascripts/lunr/min/lunr.vi.min.js | 1 + assets/javascripts/lunr/min/lunr.zh.min.js | 1 + assets/javascripts/lunr/tinyseg.js | 206 + assets/javascripts/lunr/wordcut.js | 6708 +++++++++++++++++ .../workers/search.6ce7567c.min.js | 42 + .../workers/search.6ce7567c.min.js.map | 7 + assets/stylesheets/main.8c3ca2c6.min.css | 1 + assets/stylesheets/main.8c3ca2c6.min.css.map | 1 + assets/stylesheets/palette.06af60db.min.css | 1 + .../stylesheets/palette.06af60db.min.css.map | 1 + getting_started/index.html | 1450 ++++ index.html | 1444 ++++ installation/index.html | 1491 ++++ introduction/index.html | 1567 ++++ overrides/_base.html | 261 + overrides/_main.html | 48 + overrides/_partials/_language.html | 59 + overrides/home.html | 310 + search/search_index.json | 1 + sitemap.xml | 79 + sitemap.xml.gz | Bin 0 -> 446 bytes 89 files changed, 38541 insertions(+) create mode 100644 .nojekyll create mode 100644 1_Predict/1_howworks/index.html create mode 100644 1_Predict/2_predict_cas9/index.html create mode 100644 1_Predict/3_predict_be/index.html create mode 100644 1_Predict/4_predict_pe/index.html create mode 100644 1_Predict/5_DeepPrime-Off/index.html create mode 100644 2_Design/1_Design_intro/index.html create mode 100644 2_Design/2_SynonymousPE/index.html create mode 100644 3_Database/1_database_intro/index.html create mode 100644 3_Database/2_Genome_resource_background/index.html create mode 100644 3_Database/3_Metadata from databases/index.html create mode 100644 3_Database/4_Download_files/index.html create mode 100644 404.html create mode 100644 4_Analysis/1_analysis_intro/index.html create mode 100644 5_Utils/1_utils_intro/index.html create mode 100644 5_Utils/2_download_files/index.html create mode 100644 6_Application_notes/Genome-wide_KO_library/index.html create mode 100644 assets/contents/en_0_1_1_CRISPR_history.svg create mode 100644 assets/contents/en_0_1_2_CRISPR_machanism.svg create mode 100644 assets/contents/en_1_1_1_High-throughput_screening.svg create mode 100644 assets/contents/en_1_1_2_SHAP_analysis.svg create mode 100644 assets/contents/en_1_1_3_SHAP_feature_value.svg create mode 100644 assets/contents/en_1_1_4_SHAP_force_plot.svg create mode 100644 assets/contents/en_1_4_1_DeepPrime_architecture.svg create mode 100644 assets/contents/en_1_4_2_DeepPrime_input_ex1.svg create mode 100644 assets/contents/en_1_4_3_DeepPrime_input_ex2.svg create mode 100644 assets/contents/en_1_4_4_DeepPrime_input_ex3.svg create mode 100644 assets/contents/en_1_4_5_prime_editing_complex.svg create mode 100644 assets/contents/en_2_2_1_codon_frame.svg create mode 100644 assets/contents/ko_2_2_2_Synony_example_1.svg create mode 100644 assets/contents/ko_2_2_3_Synony_example_2.svg create mode 100644 assets/contents/ko_2_2_4_Synony_example_3.svg create mode 100644 assets/images/dna.jpg create mode 100644 assets/images/favicon.png create mode 100644 assets/images/illustration.png create mode 100644 assets/images/logo.png create mode 100644 assets/javascripts/bundle.d6f25eb3.min.js create mode 100644 assets/javascripts/bundle.d6f25eb3.min.js.map create mode 100644 assets/javascripts/lunr/min/lunr.ar.min.js create mode 100644 assets/javascripts/lunr/min/lunr.da.min.js create mode 100644 assets/javascripts/lunr/min/lunr.de.min.js create mode 100644 assets/javascripts/lunr/min/lunr.du.min.js create mode 100644 assets/javascripts/lunr/min/lunr.el.min.js create mode 100644 assets/javascripts/lunr/min/lunr.es.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.fr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.he.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hu.min.js create mode 100644 assets/javascripts/lunr/min/lunr.hy.min.js create mode 100644 assets/javascripts/lunr/min/lunr.it.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ja.min.js create mode 100644 assets/javascripts/lunr/min/lunr.jp.min.js create mode 100644 assets/javascripts/lunr/min/lunr.kn.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ko.min.js create mode 100644 assets/javascripts/lunr/min/lunr.multi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.nl.min.js create mode 100644 assets/javascripts/lunr/min/lunr.no.min.js create mode 100644 assets/javascripts/lunr/min/lunr.pt.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ro.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ru.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sa.min.js create mode 100644 assets/javascripts/lunr/min/lunr.stemmer.support.min.js create mode 100644 assets/javascripts/lunr/min/lunr.sv.min.js create mode 100644 assets/javascripts/lunr/min/lunr.ta.min.js create mode 100644 assets/javascripts/lunr/min/lunr.te.min.js create mode 100644 assets/javascripts/lunr/min/lunr.th.min.js create mode 100644 assets/javascripts/lunr/min/lunr.tr.min.js create mode 100644 assets/javascripts/lunr/min/lunr.vi.min.js create mode 100644 assets/javascripts/lunr/min/lunr.zh.min.js create mode 100644 assets/javascripts/lunr/tinyseg.js create mode 100644 assets/javascripts/lunr/wordcut.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js create mode 100644 assets/javascripts/workers/search.6ce7567c.min.js.map create mode 100644 assets/stylesheets/main.8c3ca2c6.min.css create mode 100644 assets/stylesheets/main.8c3ca2c6.min.css.map create mode 100644 assets/stylesheets/palette.06af60db.min.css create mode 100644 assets/stylesheets/palette.06af60db.min.css.map create mode 100644 getting_started/index.html create mode 100644 index.html create mode 100644 installation/index.html create mode 100644 introduction/index.html create mode 100644 overrides/_base.html create mode 100644 overrides/_main.html create mode 100644 overrides/_partials/_language.html create mode 100644 overrides/home.html create mode 100644 search/search_index.json create mode 100644 sitemap.xml create mode 100644 sitemap.xml.gz diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/1_Predict/1_howworks/index.html b/1_Predict/1_howworks/index.html new file mode 100644 index 0000000..1c201c3 --- /dev/null +++ b/1_Predict/1_howworks/index.html @@ -0,0 +1,1407 @@ + + + +
+ + + + + + + + + + + + + + + + + + + + + + +Why is gRNA design important?
+The efficiency of CRISPR systems for genome editing is determined by the gRNA and its corresponding target sequence information. Specific motifs or GC contents of the sequence can have an impact.
+DeepSpCas9 is a prediction model developed to evaluate to indel frequency introduced by sgRNAs at specific target sites mediated by the SpCas9 (Kim et al. SciAdv 2019). The model was developed on tensorflow (version >= 2.6). Any dependent packages will be installed along with the GenET package.
+from genet.predict import SpCas9
+
+# Put the target context (30bp) that you want to find Cas9 activity in the list.
+# Input seq: 4bp 5' context + 20 guide + 3bp PAM + 3bp 3' context
+
+spcas = SpCas9()
+
+list_target = [
+ 'TCACCTTCGTTTTTTTCCTTCTGCAGGAGG',
+ 'CCTTCGTTTTTTTCCTTCTGCAGGAGGACA',
+ 'CTTTCAAGAACTCTTCCACCTCCATGGTGT',
+ ]
+
+df_out = spcas.predict(list_target)
+
+>>> df_out
+
+ | Target | +Spacer | +SpCas9 | +
---|---|---|---|
0 | +TCACCTTCGTTTTTTTCCTTCTGCAGGAGG | +CTTCGTTTTTTTCCTTCTGC | +2.801172 | +
1 | +CCTTCGTTTTTTTCCTTCTGCAGGAGGACA | +CGTTTTTTTCCTTCTGCAGG | +2.253288 | +
2 | +CTTTCAAGAACTCTTCCACCTCCATGGTGT | +CAAGAACTCTTCCACCTCCA | +53.43182 | +
Alternatively, you can identify all possible SpCas9 target sites within an extensive gene sequence and obtain predictive scores. +
from genet.predict import SpCas9
+
+# Put the whole sequence context that you want to find Cas9 target site.
+gene = 'ttcagctctacgtctcctccgagagccgcttcaacaccctggccgagttggttcatcatcattcaacggtggccgacgggctcatcaccacgctccattatccagccccaaagcgcaacaagcccactgtctatggtgtgtcccccaactacgacaagtgggagatggaacgcacggacatcaccatgaagcacaagctgggcgggggccagtacggggaggtgtacgagggcgtgtggaagaaatacagcctgacggtggccgtgaagaccttgaaggtagg'
+
+spcas = SpCas9()
+df_out = spcas.search(gene)
+
+>>> df_out.head()
+
+ | Target | +Spacer | +Strand | +Start | +End | +SpCas9 | +
---|---|---|---|---|---|---|
0 | +CCTCCGAGAGCCGCTTCAACACCCTGGCCG | +CGAGAGCCGCTTCAACACCC | ++ | +15 | +45 | +67.39446 | +
1 | +GCCGCTTCAACACCCTGGCCGAGTTGGTTC | +CTTCAACACCCTGGCCGAGT | ++ | +24 | +54 | +27.06508 | +
2 | +CCGAGTTGGTTCATCATCATTCAACGGTGG | +GTTGGTTCATCATCATTCAA | ++ | +42 | +72 | +34.11356 | +
3 | +AGTTGGTTCATCATCATTCAACGGTGGCCG | +GGTTCATCATCATTCAACGG | ++ | +45 | +75 | +76.43662 | +
4 | +TCATCATCATTCAACGGTGGCCGACGGGCT | +CATCATTCAACGGTGGCCGA | ++ | +52 | +82 | +29.63767 | +
DeepSpCas9 is a prediction model developed to evaluate to indel frequency introduced by sgRNAs at specific target sites mediated by the SpCas9 PAM variants (Kim et al. Nat.Biotechnol. 2020). The model was developed on tensorflow (version >= 2.6). Any dependent packages will be installed along with the GenET package.
+from genet.predict import CasVariant
+
+# Available Cas9 variants:
+# SpCas9-NG, SpCas9-NRCH, SpCas9-NRRH, SpCas9-NRTH, SpCas9-Sc++, SpCas9-SpCas9, SpCas9-SpG, SpCas9-SpRY, SpCas9-VRQR
+cas_ng = CasVariant('SpCas9-NG')
+
+# Put the target context (30bp) that you want to find Cas9 activity in the list.
+# Input seq: 4bp 5' context + 20 guide + 3bp PAM + 3bp 3' context
+
+list_target30 = [
+ 'TCACCTTCGTTTTTTTCCTTCTGCAGGAGG',
+ 'CCTTCGTTTTTTTCCTTCTGCAGGAGGACA',
+ 'CTTTCAAGAACTCTTCCACCTCCATGGTGT',
+ ]
+
+df_out = cas_ng.predict(list_target30)
+
+>>> df_out
+
+ | Target | +Spacer | +SpCas9-NG | +
---|---|---|---|
0 | +TCACCTTCGTTTTTTTCCTTCTGCAGGAGG | +CTTCGTTTTTTTCCTTCTGC | +0.618299 | +
1 | +CCTTCGTTTTTTTCCTTCTGCAGGAGGACA | +CGTTTTTTTCCTTCTGCAGG | +1.134845 | +
2 | +CTTTCAAGAACTCTTCCACCTCCATGGTGT | +CAAGAACTCTTCCACCTCCA | +36.74358 | +
Similarly, in CasVariants, you can also utilize the 'search' method. It automatically identifies targets corresponding to each PAM variant and calculates predictive scores. For instance, SpCas9-NRCH identifies NG+NA+NNG PAMs.
+from genet.predict import CasVariant
+
+# Put the whole sequence context that you want to find Cas9Variants target site.
+gene = 'ttcagctctacgtctcctccgagagccgcttcaacaccctggccgagttggttcatcatcattcaacggtggccgacgggctcatcaccacgctccattatccagccccaaagcgcaacaagcccactgtctatggtgtgtcccccaactacgacaagtgggagatggaacgcacggacatcaccatgaagcacaagctgggcgggggccagtacggggaggtgtacgagggcgtgtggaagaaatacagcctgacggtggccgtgaagaccttgaaggtagg'
+
+
+cas_ng = CasVariant('SpCas9-NRCH')
+df_out = cas_ng.search(gene)
+
+>>> df_out.head()
+
+ | Target | +Spacer | +Strand | +Start | +End | +SpCas9-NRCH | +
---|---|---|---|---|---|---|
0 | +TCAGCTCTACGTCTCCTCCGAGAGCCGCTT | +CTCTACGTCTCCTCCGAGAG | ++ | +1 | +31 | +26.43327 | +
1 | +CAGCTCTACGTCTCCTCCGAGAGCCGCTTC | +TCTACGTCTCCTCCGAGAGC | ++ | +2 | +32 | +40.16034 | +
2 | +CTACGTCTCCTCCGAGAGCCGCTTCAACAC | +GTCTCCTCCGAGAGCCGCTT | ++ | +7 | +37 | +47.06001 | +
3 | +TACGTCTCCTCCGAGAGCCGCTTCAACACC | +TCTCCTCCGAGAGCCGCTTC | ++ | +8 | +38 | +20.26012 | +
4 | +CGTCTCCTCCGAGAGCCGCTTCAACACCCT | +TCCTCCGAGAGCCGCTTCAA | ++ | +10 | +40 | +45.58047 | +
Coming soon
+ + + + + + + + + + + + + + + ++DeepPrime is a prediction model for evaluating prime editing guideRNAs (pegRNAs) that target specific target sites for prime editing (Yu et al. Cell 2023). DeepSpCas9 prediction score is calculated simultaneously and requires tensorflow (version >=2.6). DeepPrime was developed on pytorch.
+To use DeepPrime, you need to prepare a DNA sequence containing the intended prime editing and surrounding context information as input. Intended prime editing can only involve 1-3nt substitution, insertion, or deletion, and it is not possible to introduce multiple edit types in combination. The position where prime editing is introduced is indicated in parentheses, and the original and prime-edited sequences are separated using '/'.
+Some example inputs are as follows:
+ +# Example 1: 1bp substitution (T to A)
+input_seq = 'CTCACGTGAGCTCTTTGAGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCT(T/A)CAGCTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCAT'
+
# Example 2: 3bp insertion (CTT insertion)
+input_seq = 'CTCACGTGAGCTCTTTGAGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCT(/CTT)TCAGCTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCAT'
+
# Example 3: 2bp deletion (TC deletion)
+input_seq = 'CTCACGTGAGCTCTTTGAGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCT(TC/)AGCTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCAT'
+
If you have prepared the input as described above, you can use DeepPrime as follows. When you input the target sequence and editing informations into DeepPrime and run it, it designs all possible types of pegRNAs for the given sequence and automatically calculates their corresponding biofeatures. You can check the calculated biofeatures using .features
.
from genet.predict import DeepPrime
+
+input_seq = 'CTCACGTGAGCTCTTTGAGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCT(T/A)CAGCTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCAT'
+
+pegrna = DeepPrime(input_seq)
+
+# check designed pegRNAs
+>>> pegrna.features.head()
+
+ | ID | +Spacer | +RT-PBS | +PBS_len | +RTT_len | +RT-PBS_len | +Edit_pos | +Edit_len | +RHA_len | +Target | +... | +deltaTm_Tm4-Tm2 | +GC_count_PBS | +GC_count_RTT | +GC_count_RT-PBS | +GC_contents_PBS | +GC_contents_RTT | +GC_contents_RT-PBS | +MFE_RT-PBS-polyT | +MFE_Spacer | +DeepSpCas9_score | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | +SampleName | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGG | +7 | +35 | +42 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +... | +-340.105 | +5 | +16 | +21 | +71.42857 | +45.71429 | +50 | +-10.4 | +-0.6 | +45.96754 | +
1 | +SampleName | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGG | +8 | +35 | +43 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +... | +-340.105 | +6 | +16 | +22 | +75 | +45.71429 | +51.16279 | +-10.4 | +-0.6 | +45.96754 | +
2 | +SampleName | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGGT | +9 | +35 | +44 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +... | +-340.105 | +6 | +16 | +22 | +66.66667 | +45.71429 | +50 | +-10.4 | +-0.6 | +45.96754 | +
3 | +SampleName | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGGTG | +10 | +35 | +45 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +... | +-340.105 | +7 | +16 | +23 | +70 | +45.71429 | +51.11111 | +-10.4 | +-0.6 | +45.96754 | +
4 | +SampleName | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGGTGT | +11 | +35 | +46 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +... | +-340.105 | +7 | +16 | +23 | +63.63636 | +45.71429 | +50 | +-10.4 | +-0.6 | +45.96754 | +
Next, select model PE system and run DeepPrime +
pe2max_output = pegrna.predict(pe_system='PE2max', cell_type='HEK293T')
+
+>>> pe2max_output.head()
+
+ | ID | +PE2max_score | +Spacer | +RT-PBS | +PBS_len | +RTT_len | +RT-PBS_len | +Edit_pos | +Edit_len | +RHA_len | +Target | +
---|---|---|---|---|---|---|---|---|---|---|---|
0 | +SampleName | +0.904387 | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGG | +7 | +35 | +42 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +
1 | +SampleName | +2.375938 | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGG | +8 | +35 | +43 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +
2 | +SampleName | +2.61238 | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGGT | +9 | +35 | +44 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +
3 | +SampleName | +3.641537 | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGGTG | +10 | +35 | +45 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +
4 | +SampleName | +3.768321 | +AAGACAACACCCTTGCCTTG | +CGTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCAAGGGTGT | +11 | +35 | +46 | +34 | +1 | +1 | +ATAAAAGACAACACCCTTGCCTTGTGGAGTTTTCAAAGCTCCCAGA... | +
When the target, PBS, and RT template sequences are accurately inputted, DeepPrimeGuideRNA
predicts the DeepPrime score of the corresponding pegRNA. For example, let's assume we have the following target and pegRNA:
To obtain the DeepPrime score of the pegRNA above, you can execute the code as follow; similar to .predict
method in DeepPrime
, you can specify pe_system
and cell_type
.
from genet.predict import DeepPrimeGuideRNA
+
+target = 'TTTAAGGTTTCAGTTGACATTTGCAGGTTATAGTTCTTCTCAGTTTCTGGGAGCTTTGAAAACTCCACAAGGCA'
+pbs = 'AATGTCAAC'
+rtt = 'AGAAACTGAGACGAACTATAACCTGCA'
+edit_len = 1
+edit_pos = 16
+edit_type = 'sub'
+
+pegrna = DeepPrimeGuideRNA('pegRNA_test', target=target, pbs=pbs, rtt=rtt,
+ edit_len=edit_len, edit_pos=edit_pos, edit_type=edit_type)
+
+pe2max_score = pegrna.predict('PE2max')
+print(pe2max_score) # 8.23717212677002
+
The inputs for DeepPrimeGuideRNA
are configured as follows:
Input | +Type | +Description | +
---|---|---|
sID | +str | +Name of sample or pegRNA | +
target | +str | +4nt additional context sequence must be included in the 5' direction. The Protospacer (region to which the guide sequence is attached) is oriented in the 5'->3' direction and the target sequence must be 74nt in length. | +
pbs | +str | +The PBS sequence from the pegRNA. Both T (DNA) and U (RNA) forms are acceptable. | +
rtt | +str | +The RT template sequence from the pegRNA. Both T (DNA) and U (RNA) forms are acceptable. | +
edit_len | +int | +Select one of 1, 2, or 3 according to the intended prime editing. | +
edit_pos | +int | +Select one from 1-40 according to the intended prime editing. | +
edit_type | +str | +Select one from 'sub', 'ins', 'del' according to the intended prime editing. | +
Cell type | +PE system | +Model | +
---|---|---|
HEK293T | +PE2 | +DeepPrime_base | +
HEK293T | +NRCH_PE2 | +DeepPrime-FT: HEK293T, NRCH-PE2 with Optimized scaffold | +
HEK293T | +NRCH_PE2max | +DeepPrime-FT: HEK293T, NRCH-PE2max with Optimized scaffold | +
HEK293T | +PE2 | +DeepPrime-FT: HEK293T, PE2 with Conventional scaffold | +
HEK293T | +PE2max-e | +DeepPrime-FT: HEK293T, PE2max with Optimized scaffold and epegRNA | +
HEK293T | +PE2max | +DeepPrime-FT: HEK293T, PE2max with Optimized scaffold | +
HEK293T | +PE4max-e | +DeepPrime-FT: HEK293T, PE4max with Optimized scaffold and epegRNA | +
HEK293T | +PE4max | +DeepPrime-FT: HEK293T, PE4max with Optimized scaffold | +
A549 | +PE2max-e | +DeepPrime-FT: A549, PE2max with Optimized scaffold and epegRNA | +
A549 | +PE2max | +DeepPrime-FT: A549, PE2max with Optimized scaffold | +
A549 | +PE4max-e | +DeepPrime-FT: A549, PE4max with Optimized scaffold and epegRNA | +
A549 | +PE4max | +DeepPrime-FT: A549, PE4max with Optimized scaffold | +
DLD1 | +NRCH_PE4max | +DeepPrime-FT: DLD1, NRCH-PE4max with Optimized scaffold | +
DLD1 | +PE2max | +DeepPrime-FT: DLD1, PE2max with Optimized scaffold | +
DLD1 | +PE4max | +DeepPrime-FT: DLD1, PE4max with Optimized scaffold | +
HCT116 | +PE2 | +DeepPrime-FT: HCT116, PE2 with Optimized scaffold | +
HeLa | +PE2max | +DeepPrime-FT: HeLa, PE2max with Optimized scaffold | +
MDA-MB-231 | +PE2 | +DeepPrime-FT: MDA-MB-231, PE2 with Optimized scaffold | +
NIH3T3 | +NRCH_PE4max | +DeepPrime-FT: NIH3T3, NRCH-PE4max with Optimized scaffold | +
ClinVar database contains mutations that are clinically evaluated to be pathogenic and related to human diseases(Laudrum et al. NAR 2018). GenET utilized the NCBI efect module to access ClinVar records to retrieve related variant data such as the genomic sequence, position, and mutation pattern. Using this data, GenET designs and evaluates pegRNAs that target the variant using DeepPrime.
+from genet import database as db
+
+# Accession (VCV) or variantion ID is available
+cv_record = db.GetClinVar('VCV000428864.3')
+
+print(cv_record.seq()) # default context length = 60nt
+
+>>> output: # WT sequence, Alt sequence
+('GGTCACTCACCTGGAGTGAGCCCTGCTCCCCCCTGGCTCCTTCCCAGCCTGGGCATCCTTGAGTTCCAAGGCCTCATTCAGCTCTCGGAACATCTCGAAGCGCTCACGCCCACGGATCTGC',
+ 'GGTCACTCACCTGGAGTGAGCCCTGCTCCCCCCTGGCTCCTTCCCAGCCTGGGCATCCTTGTTCCAAGGCCTCATTCAGCTCTCGGAACATCTCGAAGCGCTCACGCCCACGGATCTGCAG')
+
In addition, various information other than the sequence can be obtained from the record.
+ +Clinvar records obtained through this process is used to design all possible pegRNAs within the genet.predict module's pecv_score function.
+ + + + + + + + + + + + + + + + +To use DeepPrime-Off, you need to prepare pegRNA and thier feature informations in a specific format as an input. Also, DeepPrime-Off uses Cas-OFFinder to find off-target candidates for each pegRNA spacer.
+import pandas as pd
+from genet.predict import DeepPrimeOff
+
+dp_off = DeepPrimeOff()
+
+dp_off.setup(
+ features=df_features,
+ cas_offinder_result='OFFinder_output.txt',
+ ref_genome='Homo sapiens',
+ download_fasta=True,
+ custom_genome=None,
+)
+
ID | +Spacer | +RT-PBS | +PBS_len | +RTT_len | +RT-PBS_len | +Edit_pos | +Edit_len | +RHA_len | +Target | +... | +deltaTm_Tm4-Tm2 | +GC_count_PBS | +GC_count_RTT | +GC_count_RT-PBS | +GC_contents_PBS | +GC_contents_RTT | +GC_contents_RT-PBS | +MFE_RT-PBS-polyT | +MFE_Spacer | +DeepSpCas9_score | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
48_ABL1_ex4_pos6C_A_rank3 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTAGATCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +27 | +1 | +13 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +... | +-345.645 | +7 | +20 | +27 | +70 | +50 | +54 | +-10.7 | +-5.9 | +42.90589 | +
66_ABL1_ex4_pos8C_A_rank3 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTATAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +29 | +1 | +11 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +... | +-345.645 | +7 | +20 | +27 | +70 | +50 | +54 | +-14.3 | +-5.9 | +42.90589 | +
69_ABL1_ex4_pos8C_G_rank3 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTACAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +29 | +1 | +11 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +... | +-345.645 | +7 | +21 | +28 | +70 | +52.5 | +56 | +-14.3 | +-5.9 | +42.90589 | +
72_ABL1_ex4_pos8C_T_rank3 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTAAAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +29 | +1 | +11 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +... | +-345.645 | +7 | +20 | +27 | +70 | +50 | +54 | +-14.3 | +-5.9 | +42.90589 | +
96_ABL1_ex4_pos11C_G_rank3 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACCTAGAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +32 | +1 | +8 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +... | +-345.645 | +7 | +21 | +28 | +70 | +52.5 | +56 | +-15.5 | +-5.9 | +42.90589 | +
... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +
11476_ABL1_ex9_pos100A_C_rank1 | +CAGGAATCCAGTATCTCAGA | +ATGGGTACGTTACCGTCTGAGATACTGG | +10 | +18 | +28 | +10 | +1 | +8 | +GTTCCAGGAATCCAGTATCTCAGACGGTAAAGTACCCATCCCGGGG... | +... | +-483.811 | +5 | +9 | +14 | +50 | +50 | +50 | +-3.3 | +-1.3 | +55.85136 | +
11479_ABL1_ex9_pos100A_G_rank1 | +CAGGAATCCAGTATCTCAGA | +GGGTACCTTACCGTCTGAGATACTGG | +10 | +16 | +26 | +10 | +1 | +6 | +GTTCCAGGAATCCAGTATCTCAGACGGTAAAGTACCCATCCCGGGG... | +... | +-320.805 | +5 | +9 | +14 | +50 | +56.25 | +53.84615 | +-3.6 | +-1.3 | +55.85136 | +
The predict
function can be executed after setup is completed. The features
DataFrame, internally created by the DeepPrimeOff
object during setup, is used as input for the DeepPrime-Off model. Therefore, if the setup
is not completed properly, the model will not be able to find the required input and will raise an error.
ID | +DeepPrime-Off_score | +Spacer | +RT-PBS | +PBS_len | +RTT_len | +RT-PBS_len | +Edit_pos | +Edit_len | +RHA_len | +Target | +Off-target | +Off-context | +Location | +Position | +Strand | +MM_num | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
48_ABL1_ex4_pos6C_A_rank3 | +0 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTAGATCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +27 | +1 | +13 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +TtCCTGTCTgTGTGGGCTGATGG | +TTATTTCCTGTCTGTGTGGGCTGATGGTCCTTCAATCATTGAAGTC... | +1 dna:chromosome chromosome:GRCh38:1:1:2489564... | +1.66E+08 | ++ | +2 | +
66_ABL1_ex4_pos8C_A_rank3 | +0 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTATAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +29 | +1 | +11 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +TtCCTGTCTgTGTGGGCTGATGG | +TTATTTCCTGTCTGTGTGGGCTGATGGTCCTTCAATCATTGAAGTC... | +1 dna:chromosome chromosome:GRCh38:1:1:2489564... | +1.66E+08 | ++ | +2 | +
69_ABL1_ex4_pos8C_G_rank3 | +0 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTACAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +29 | +1 | +11 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +TtCCTGTCTgTGTGGGCTGATGG | +TTATTTCCTGTCTGTGTGGGCTGATGGTCCTTCAATCATTGAAGTC... | +1 dna:chromosome chromosome:GRCh38:1:1:2489564... | +1.66E+08 | ++ | +2 | +
72_ABL1_ex4_pos8C_T_rank3 | +0 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACGTAAAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +29 | +1 | +11 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +TtCCTGTCTgTGTGGGCTGATGG | +TTATTTCCTGTCTGTGTGGGCTGATGGTCCTTCAATCATTGAAGTC... | +1 dna:chromosome chromosome:GRCh38:1:1:2489564... | +1.66E+08 | ++ | +2 | +
96_ABL1_ex4_pos11C_G_rank3 | +0 | +TGCCTGTCTCTGTGGGCTGA | +GAGGAGACCTAGAGCTGAAGGAAACAGGGAACAGCCTTCAGCCCAC... | +10 | +40 | +50 | +32 | +1 | +8 | +AGCTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCA... | +TtCCTGTCTgTGTGGGCTGATGG | +TTATTTCCTGTCTGTGTGGGCTGATGGTCCTTCAATCATTGAAGTC... | +1 dna:chromosome chromosome:GRCh38:1:1:2489564... | +1.66E+08 | ++ | +2 | +
... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +... | +
11476_ABL1_ex9_pos100A_C_rank1 | +0 | +CAGGAATCCAGTATCTCAGA | +ATGGGTACGTTACCGTCTGAGATACTGG | +10 | +18 | +28 | +10 | +1 | +8 | +GTTCCAGGAATCCAGTATCTCAGACGGTAAAGTACCCATCCCGGGG... | +gAGGAgcCCAGTATCTCAGATGG | +AGTGAGAGGAGCCCAGTATCTCAGATGGAAATGCAGAAATCACCTG... | +Y dna:chromosome chromosome:GRCh38:Y:2781480:5... | +26339822 | +- | +3 | +
11479_ABL1_ex9_pos100A_G_rank1 | +0 | +CAGGAATCCAGTATCTCAGA | +GGGTACCTTACCGTCTGAGATACTGG | +10 | +16 | +26 | +10 | +1 | +6 | +GTTCCAGGAATCCAGTATCTCAGACGGTAAAGTACCCATCCCGGGG... | +gAGGAgcCCAGTATCTCAGATGG | +AGTGAGAGGAGCCCAGTATCTCAGATGGAAATGCAGAAATCACCTG... | +Y dna:chromosome chromosome:GRCh38:Y:2781480:5... | +26339822 | +- | +3 | +
Prime editing efficiency is determined by various factors beyond RT-PBS. One well-known factor is the inhibitory effect by the mismatch repair (MMR) system. To prevent prime editing efficiency inhibition by MMR, a strategy of introducing additional mutations into pegRNA can be used (Chen et al., 2021, Cell).
+However, introducing additional mutations may not only reduce the impact of MMR but also decrease the activity of pegRNA. Moreover, if the target site for genome editing lies within the protein coding sequence (CDS) region, it is necessary to introduce synonymous (silent) mutations that do not affect protein function. Considering these factors, designing and selecting which mutations to introduce additionally into pegRNA can be a rather cumbersome task.
+SynonymousPE
module in GenETGenET's SynonymousPE provides the functionality to easily design pegRNAs with additional mutations introduced. Specifically, it identifies possible synonymous mutations that align with the CDS, making it useful for biological research applications.
+Furthermore, SynonymousPE is directly compatible with DeepPrime, allowing for the creation of pegRNAs with synonymous mutations directly from pegRNAs designed in DeepPrime.
+from genet.predict import DeepPrime
+from genet.design import SynonymousPE
+
+# DeepPrime pipeline
+seq_wt = 'CTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCAGCTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCATTCAACGGTGGCCGACGGGC'
+seq_ed = 'CTTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCAGCTCTACGTCTCCTCCAAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCATTCAACGGTGGCCGACGGGC'
+
+pegrna = DeepPrime('ABL1_ex4_pos21G_A', seq_wt, seq_ed, edit_type='sub', edit_len=1)
+
+pe2max_output = pegrna.predict(pe_system='PE2max', cell_type='HEK293T')
+
+
+# Select a pegRNA record that you want to add synonymous mutation
+dp_record = pe2max_output.iloc[9]
+
+# Setup SynonymousPE input parameters
+synony_pegrna = SynonymousPE(dp_record, ref_seq=seq_wt,
+ frame=0, cds_start=45, cds_end=121)
+
+# print selected RTT containing synonymous mutation
+print(synony_pegrna.extension)
+
You can find more detailed information about the usage of DeepPrime in the documentation of the genet.predict module documentation. In the provided example, a synonymous mutation was introduced into one of the many designed pegRNAs. Since each pegRNA may have different regions and lengths for RTT, the types of additional mutations that can be introduced may also vary.
+It is recommended to first select appropriate pegRNAs based on DeepPrime scores and then further optimize them using SynonymousPE.
+de_record
: pd.Series
+An object containing information about the pegRNA. When designed using DeepPrime, if you retrieve a specific index from the resulting DataFrame, you can use it directly.
ref_seq
: str
+The DNA sequence information that serves as the target for the pegRNA. SynonymousPE assumes the presence of a CDS within this sequence and introduces synonymous mutations according to predefined rules. The genetic sequence used as the reference for frame, cds_start, and cds_end is defined below.
frame
: int
+This value represents the frame of the reference sequence (ref_seq). It is determined by the codon frame of the CDS and is expressed as 0, 1, or 2. For example, if the CDS sequence starts from the beginning of a codon (3bp), you would input frame as 0. It's crucial to input the correct frame, as an inaccurate frame could lead to synonymous mutations resulting in a completely different amino acid sequence.
cds_start
: int
+ref_seq
Indicates the position where the CDS starts in the ref_seq.
cds_end
: int
+ref_seq
Indicates the position where the CDS ends in the ref_seq.
adj_rha
: bool
+When a synonymous mutation occurs in the RHA of the RT template, the efficiency of prime editing may significantly decrease if the RHA becomes too short. As an alternative, you can artificially extend the length of the RT template. adj_rha is an option to specify whether to extend the length of the RT template by the same amount as the shortening of the RHA when it becomes too short (default: True). If adj_rha is set to False, regardless of where the synonymous mutation occurs, the length of the RT template remains the same as that of the original pegRNA.
SynonymousPE
input examplesThe information regarding the frame and CDS positioning in SynonymousPE can be somewhat complex to grasp at first use.
+from genet.design import SynonymousPE
+
+# pegRNA record & ref_seq
+dp_record = dp_record
+ref_seq = 'CTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCATTCAACGGTGGCCGACGGGCTCATCACCACGCTCCATTATCCAGCCCCAAAGCGCAACAAGCCCA'
+
+# Setup SynonymousPE
+synony_pegrna = SynonymousPE(dp_record, ref_seq=ref_seq, frame=0, cds_start=0, cds_end=121)
+
from genet.design import SynonymousPE
+
+# pegRNA record & ref_seq
+dp_record = dp_record
+ref_seq = 'CTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCATTCAACGGTGGCCGACGGGCTCATCACCACGCTCCATTATCCAGCCCCAAAGCGCAACAAGCCCACT'
+
+# Setup SynonymousPE
+synony_pegrna = SynonymousPE(dp_record, ref_seq=ref_seq, frame=2, cds_start=0, cds_end=121)
+
from genet.design import SynonymousPE
+
+# pegRNA record & ref_seq
+dp_record = dp_record
+ref_seq = 'TTGCCTGTCTCTGTGGGCTGAAGGCTGTTCCCTGTTTCCTTCAGCTCTACGTCTCCTCCGAGAGCCGCTTCAACACCCTGGCCGAGTTGGTTCATCATCATTCAACGGTGGCCGACGGGCT'
+
+# Setup SynonymousPE
+synony_pegrna = SynonymousPE(dp_record, ref_seq=ref_seq, frame=1, cds_start=44, cds_end=121)
+
SynonymousPE
s mutation PriorityWhen introducing a 1bp point mutation into the pegRNA RT template, there may be multiple synonymous mutations. SynonymousPE
assigns priority scores to each possible mutation and selects the RT template with the highest priority mutation for additional incorporation, providing it as .extension
. The criteria for determining the priority of SynonymousPE
are as follows.
stack
: Introduction of synonymous mutationsThis functionality allows for the insertion of multiple synonymous mutations into a single RT template. By default, SynonymousPE
selects the highest priority mutation among those introducing only one synonymous mutation into the RT template and provides it as .extension
. However, if you wish to introduce two or more synonymous mutations simultaneously, you can use the .stack
method.
from genet.design import SynonymousPE
+
+# Create a SynonymousPE object
+synony_pegrna = design.SynonymousPE(dp_record, ref_seq=seq_wt, frame=0)
+
+# Generate an RT template with up to three synonymous mutations introduced
+three_syn = synony_pegrna.stack(num=3)
+
.stack
+It incorporates possible synonymous mutations in order of assigned priority. When each synonymous mutation is introduced individually, there is no change in the amino acid sequence. However, when two mutations are introduced simultaneously, there may be a change in the amino acid sequence. In such cases, the process moves on to the next priority mutation.
Below are the objects available for accessing key results.
+Name | +Type | +Description | +
---|---|---|
.extension |
+str | +Selected RT-PBS sequence containing recommanded synonymous mutation. | +
.synonymous |
+pd.DataFrame | +Table of available synonymous mutations and corresponding informations for given pegRNA. | +
.mutations |
+pd.DataFrame | +Table of all available additional mutations and corresponding informations for given pegRNA. | +
.rec |
+pd.Series | +Record of pegRNA from input. | +
다음과 같이 값을 확인할 수 있다.
+from genet.design import SynonymousPE
+
+# Create a SynonymousPE object
+synony_pegrna = design.SynonymousPE(dp_record, ref_seq=seq_wt, frame=0)
+
+# Check for available synonymous mutations for introduction
+synony_pegrna.synonymous
+
Results:
+Codon_WT | +Codon_Mut | +Codon_MutPos | +Codon_RefStart | +Codon_RefEnd | +RTT_DNA_frame | +RTT_DNA_Strand | +AminoAcid_WT | +AminoAcid_Mut | +Silent_check | +Mut_pos | +Mut_refpos | +PAM_Mut | +Priority | +Edit_class | +RTT_DNA_Mut | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTCGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +5 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +5 | +62 | +CG | +1 | +PAM_edit | +CCGTCGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTAGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +5 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +5 | +62 | +AG | +2 | +PAM_edit | +CCGTAGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTTGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +5 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +5 | +62 | +TG | +2 | +PAM_edit | +CCGTTGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAAGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +8 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +8 | +65 | +GG | +15 | +RHA_edit | +CCGTGGAAGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAACCGCAGTCAGATCCTAGCGTCGAGCCC | +11 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +11 | +68 | +GG | +18 | +RHA_edit | +CCGTGGAGGAACCGCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCCCAGTCAGATCCTAGCGTCGAGCCC | +14 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +14 | +71 | +GG | +20 | +RHA_edit | +CCGTGGAGGAGCCCCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCACAGTCAGATCCTAGCGTCGAGCCC | +14 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +14 | +71 | +GG | +21 | +RHA_edit | +CCGTGGAGGAGCCACAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCTCAGTCAGATCCTAGCGTCGAGCCC | +14 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +14 | +71 | +GG | +21 | +RHA_edit | +CCGTGGAGGAGCCTCAGTCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAATCAGATCCTAGCGTCGAGCCC | +17 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +17 | +74 | +GG | +24 | +RHA_edit | +CCGTGGAGGAGCCGCAATCAGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCTGATCCTAGCGTCGAGCCC | +20 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +20 | +77 | +GG | +26 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCTGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCCGATCCTAGCGTCGAGCCC | +20 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +20 | +77 | +GG | +27 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCCGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCGGATCCTAGCGTCGAGCCC | +20 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +20 | +77 | +GG | +27 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCGGATCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGACCCTAGCGTCGAGCCC | +23 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +23 | +80 | +GG | +30 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGACCCTAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCAAGCGTCGAGCCC | +26 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +26 | +83 | +GG | +32 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCAAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCGAGCGTCGAGCCC | +26 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +26 | +83 | +GG | +33 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCGAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCCAGCGTCGAGCCC | +26 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +26 | +83 | +GG | +33 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCCAGCGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGTGTCGAGCCC | +29 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +29 | +86 | +GG | +36 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGTGTCGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTGGAGCCC | +32 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +32 | +89 | +GG | +38 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTGGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTAGAGCCC | +32 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +32 | +89 | +GG | +39 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTAGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTTGAGCCC | +32 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +32 | +89 | +GG | +39 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTTGAGCCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAACCC | +35 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +35 | +92 | +GG | +42 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAACCC | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCG | +38 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +38 | +95 | +GG | +44 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCG | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCA | +38 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +38 | +95 | +GG | +45 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCA | +
GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCC | +GCCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCT | +38 | +58 | +97 | +1 | ++ | +VEEPQSDPSVEP | +VEEPQSDPSVEP | +TRUE | +38 | +95 | +GG | +45 | +RHA_edit | +CCGTGGAGGAGCCGCAGTCAGATCCTAGCGTCGAGCCT | +
Below are the objects containing parameters and other detailed information used for design within the code.
+Name | +Type | +Description | +
---|---|---|
.sID |
+str | +Sample ID from pegRNA record. | +
.rtpbs_dna |
+str | +Reverse complementary DNA sequence of RT-PBS. | +
.pbs_dna |
+str | +Reverse complementary DNA sequence of PBS. | +
.rtt_dna |
+str | +Reverse complementary DNA sequence of RT template | +
.rtt_len |
+int | +Length of RT template | +
.wt_seq |
+str | +WT target sequence (74nt) | +
.ed_seq |
+str | +Prime-edited target sequence (74nt) | +
.edit_pos |
+int | +Position of intended prime editing. Start from nick site. | +
.ref_seq |
+str | +Reference target sequence from input. | +
.frame |
+int | +Frame of coding sequence (CDS) from input. | +
.cds_start |
+int | +Start position of CDS | +
.cds_end |
+int | +End position of CDS | +
.strand |
+str | +Strand of pegRNA. It should '+' or '-'. | +
.rtt_frame |
+int | +Frame of RT template. | +
.codon_le |
+int | +Length of left end (LE) of codon sequence. | +
.codon_re |
+int | +Length of right end (RE) of codon sequence. | +
.codon_RTT |
+str | +Codon sequence with RT template. | +
You can check the values as follows.
+ + + + + + + + + + + + + + + + +The genome information of many organisms, including humans, is publicly available for research purposes in databases such as NCBI and Ensembl. Each database provides various methods to access and utilize the data through web pages or servers, but the abundance of commands and resources can make it challenging to use. Especially when dealing with large-scale data, programming-based data analysis is necessary, which can be daunting for novice bioinformaticians like myself.
+Recently, most bioinformatics and data science tasks are conducted using Python. However, there hasn't been a satisfactory development of Python packages or pipelines for working with genome databases. The excellent Biopython
library, developed by talented developers, supports NCBI's Entrez
, allowing us to access NCBI's genome resources using Python scripts. However, Entrez
has limitations in terms of speed because it requires communication with the server for each record.
genmet.database
module
To utilize genome resources effectively, there are foundational concepts one must understand. Here, we introduce the minimum knowledge required to utilize the genet.database
Genome resource를 제공하는 database는 여러 개가 존재한다. 그 중 대표적으로 몇 개를 소개한다.
+아마 genomic data를 다루는 연구자들이라면 위 3개의 database는 어디선가 들어봤을 가능성이 높다. genet.database
에서는 NCBI를 기본 database로 참조하여 데이터를 가져온다. 가장 유명하기도 하고, 무엇보다 개발자인 내가 가장 익숙한 DB이기 때문이다.
Human genome project와 그 이후 꾸준한 연구의 결과로 우리는 human의 reference genome을 얻어냈다. 이는 현재 우리가 흔히 사용하는 GRCh38
(Genome Reference Consortium Human Build 38, also known as hg38)로 공개되어 있다.
인간 뿐만 아니라 다른 생물들 또한 reference genome이 존재한다. 쥐, 돼지, 개와 같은 포유류는 물론이고, 식물, 박테리아, 그리고 바이러스에 이르기까지 분류상 모든 종류의 생물들에 대해 reference genome이 존재할 수 있다. 2023년 12월 기준, NCBI에는 300만 종 이상의 reference genome이 등록되어 있으며, 이는 꾸준히 늘어나고 있다.
+우리 인간도 개개인이 조금씩 다른 genomic sequence를 가지고 있지만 연구에서는 reference genome을 사용하는 것처럼, 다른 종에 대한 연구를 할 때에도 대표적인 reference genome을 사용하는 경우가 많다.
+단순히 세포에서 genomic DNA를 뽑아서 sequencing을 하면 ATGC의 서열 정보만 알 수 있다. 하지만 그 서열에 담긴 의미가 무엇인지는 연구자들이 분석하고 분류하는 작업이 필요하다. 어떤 영역의 유전자 서열이 어떤 단백질을 코딩하고 있는지 등의 생물학적 기능을 정리해놓은 것을 annotation이라고 한다.
+대표적인 정보는 아래와 같다 (표로 추가 정리 필요!).
+Annotation 정보가 담겨있는 feature file (GFF3 등)의 파일 의미와 기본적인 구조를 설명한다.
+GenBank 파일의 의미와 기본적인 구조를 설명한다.
+ + + + + + + + + + + + + + + +NCBI와 같은 database에는 수 만가지 이상의 종에서의 genomic sequence data와 annodation 정보가 정리되어 있다. GenET은 이런 database에서 원하는 정보를 손 쉽게 찾아오고, 원하는 genome editing을 위한 정보로 변환할 수 있다.
+genet.database
module은 각 database에서 주요 정보가 정리되어 있는 metadata file을 기반으로 원하는 파일을 찾고, 서버에서 다운로드 받는다. NCBI
인스턴스를 생성하면 설치된 metadata file을 찾고, 만약 없다면 자동으로 FTP 서버에서 다운로드 받는다.
만약 metadata file을 다운로드 받았거나, 이미 이전에 genet.database
module을 사용해서 다운로드 받았다면, .meta
변수를 호출해서 지금 참조하는 데이터 summary를 볼 수 있다. 2023년 12월 8일 기준, 344258개의 genome data가 들어있다.
#assembly_accession | +bioproject | +biosample | +wgs_master | +refseq_category | +taxid | +species_taxid | +organism_name | +infraspecific_name | +isolate | +... | +replicon_count | +scaffold_count | +contig_count | +annotation_provider | +annotation_name | +annotation_date | +total_gene_count | +protein_coding_gene_count | +non_coding_gene_count | +pubmed_id | +
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
GCF_003969965.1 | +PRJNA224116 | +SAMN09788411 | +RXWR00000000.1 | +na | +287 | +287 | +Pseudomonas aeruginosa | +strain=MRSN11281 | +na | +... | +0 | +48 | +48 | +NCBI RefSeq | +NCBI Prokaryotic Genome Annotation Pipeline (P... | +####### | +5925 | +5797 | +65 | +na | +
GCF_003970495.1 | +PRJNA224116 | +SAMN05978001 | +RXWW00000000.1 | +na | +45972 | +45972 | +Staphylococcus pasteuri | +strain=DSM 10656 | +na | +... | +0 | +93 | +93 | +NCBI RefSeq | +NCBI Prokaryotic Genome Annotation Pipeline (P... | +####### | +2456 | +2341 | +68 | +na | +
GCF_003970195.1 | +PRJNA224116 | +SAMN10589305 | +RXYG00000000.1 | +na | +2496849 | +2496849 | +Pseudomonas sp. C 49-2 | +strain=C 49-2 | +na | +... | +0 | +41 | +41 | +NCBI RefSeq | +NCBI Prokaryotic Genome Annotation Pipeline (P... | +####### | +5896 | +5771 | +62 | +na | +
GCF_003968025.1 | +PRJNA224116 | +SAMN09788318 | +RXTA00000000.1 | +na | +287 | +287 | +Pseudomonas aeruginosa | +strain=MRSN8915 | +na | +... | +0 | +329 | +329 | +NCBI RefSeq | +NCBI Prokaryotic Genome Annotation Pipeline (P... | +####### | +6851 | +6597 | +59 | +na | +
만약 다른 pipeline에 metadata를 사용하기 위해 다운로드 받고 싶다면, 아래와 같이 직접 지정된 경로에 다운로드 받을 수 있다. 만약 download_path
를 따로 지정해주지 않는다면, genet.database.metadata 아래에 자동으로 저장된다. 또한 convert
가 True
(default) 라면, 다운로드한 metadata file (.txt)를 parquet 파일로 변환해준다. Parquet 형식은 용량과 데이터 읽기/쓰기 속도에 유리하므로 convert 하는 것을 추천한다.
+
from genet.database import NCBI
+
+ncbi = NCBI()
+ncbi.download(download_path='YOUR_PATH', convert=True)
+
각 database의 metadata는 수시로 업데이트 된다. 따라서 너무 오래된 metadata를 이용해서 최신 genomic data를 찾으려 하면 원하는 정보를 얻을 수 없을 수도 있다. 현재 가상환경에서 설치된 genet
이 참조하는 database의 metadaata 버전 (created data)을 확인하려면, 아래의 코드를 실행하면 된다.
만약 최신 metadata를 새로 다운 받아서 참조하는 데이터를 최신 버전으로 업데이트하고 싶다면, update()
를 사용할 수 있다.
대부분의 경우에는 연구하고자 하는 종(e.g. Homo sapiens)이 정해져 있는 경우가 많다. 이러한 경우에는 GetGenome
을 이용해서 특정 종에 대한 reference genome을 가져오고, 이에 대한 data parsing을 진행할 수 있다. 예시로, 아래와 같이 사용할 수 있다.
from genet.database import GetGenome
+
+genome = GetGenome('Homo sapiens')
+
+>>> genome.info # metadata 정보를 담고 있는 변수, pd.Series
+
Index | +Data | +
---|---|
#assembly_accession | +GCF_000001405.40 | +
bioproject | +PRJNA168 | +
biosample | +na | +
wgs_master | +na | +
refseq_category | +reference genome | +
taxid | +9606 | +
species_taxid | +9606 | +
organism_name | +Homo sapiens | +
infraspecific_name | +na | +
isolate | +na | +
version_status | +latest | +
assembly_level | +Chromosome | +
release_type | +Patch | +
genome_rep | +Full | +
seq_rel_date | +2022/02/03 | +
asm_name | +GRCh38.p14 | +
asm_submitter | +Genome Reference Consortium | +
gbrs_paired_asm | +GCA_000001405.29 | +
paired_asm_comp | +different | +
ftp_path | +https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/0... | +
excluded_from_refseq | +na | +
… | ++ |
total_gene_count | +59652 | +
protein_coding_gene_count | +20080 | +
non_coding_gene_count | +22158 | +
pubmed_id | +10508508;11780052;7219534;10830953;15496913;12… | +
'Homo sapiens'는 현재 'GCF_000001405.40' (흔히 GRCh38라고 알려져 있는 assembly)가 reference genome으로 지정되어 있기 때문에, GetGenome
에서는 자동으로 이 데이터를 가져온다.
+하지만 만약 최근 새로 등록된 'GCF_009914755.1' (T2T-CHM13)를 이용하고 싶다면, GetGenome
에서 category
를 '#assembly_accession' (GCF_XXXXXXXXX.XX) 로 변경하고 NCBI에 등록된 ID를 찾아서 검색한다. 예를 들어, 아래와 같이 T2T-CHM13를 검색해서 정보를 가져올 수 있다.
from genet.database import GetGenome
+
+genome = GetGenome(id='GCF_009914755.1', category='#assembly_accession')
+
+>>> genome.info # metadata 정보를 담고 있는 변수, pd.Series
+
Index | +Data | +
---|---|
#assembly_accession | +GCF_009914755.1 | +
bioproject | +PRJNA807723 | +
biosample | +SAMN03255769 | +
wgs_master | +na | +
refseq_category | +na | +
taxid | +9606 | +
species_taxid | +9606 | +
organism_name | +Homo sapiens | +
infraspecific_name | +na | +
isolate | +na | +
version_status | +latest | +
assembly_level | +Complete Genome | +
release_type | +Major | +
genome_rep | +Full | +
seq_rel_date | +2022/01/24 | +
asm_name | +T2T-CHM13v2.0 | +
asm_submitter | +T2T Consortium | +
gbrs_paired_asm | +GCA_009914755.4 | +
paired_asm_comp | +different | +
ftp_path | +https://ftp.ncbi.nlm.nih.gov/genomes/all/GCF/0... | +
excluded_from_refseq | +na | +
… | ++ |
total_gene_count | +58360 | +
protein_coding_gene_count | +20077 | +
non_coding_gene_count | +20992 | +
pubmed_id | +35357919 | +
만약 reference genome이 지정되지 않은 종이라면, 'organism_name'으로 검색할 수 없다. 예를 들어, 'Pseudomonas aeruginosa'라는 종은 reference가 지정된 것이 없고, 등록된 assembly data만 100개 이상이 있다.
+genome = GetGenome('Pseudomonas aeruginosa')
+>>> genome.info
+
+# ValueError occured (2023.12.9. 기준)
+ValueError: [Info] There are no defined reference genome.
+ Please use "#assembly_accession" as category.
+ You should select specific genome depending on your research purpose.
+ Available accessions: ['GCF_003969965.1', 'GCF_003968025.1', ... ]
+
이 때에는 자신이 보고자 하는 데이터의 정확한 '#assembly_accession'을 지정해서 검색해야 한다.
+ + + + + + + + + + + + + + + +GetGenome
으로 원하는 genome data에 데이터 정보를 가져왔다면, NCBI에 해당 genome data에 대해 접근할 수 있는 데이터들을 확인하고, 내가 원하는 경로에 다운로드 받을 수 있다. 우선 어떤 파일들을 다운로드 받을 수 있는지 확인하려면, content()
method를 활용해보자.
from genet.database import GetGenome
+
+genome = GetGenome('Homo sapiens')
+list_contents = genome.contents()
+
+>>> list_contents
+
+['README.txt',
+ 'Annotation_comparison',
+ 'GCF_000001405.40_GRCh38.p14_assembly_structure',
+ 'GCF_000001405.40-RS_2023_10_annotation_report.xml',
+ 'annotation_hashes.txt',
+ 'RefSeq_transcripts_alignments',
+ 'GCF_000001405.40_GRCh38.p14_assembly_regions.txt',
+ 'GCF_000001405.40_GRCh38.p14_assembly_report.txt',
+ 'GCF_000001405.40_GRCh38.p14_assembly_stats.txt',
+ 'GCF_000001405.40_GRCh38.p14_cds_from_genomic.fna.gz',
+ 'GCF_000001405.40_GRCh38.p14_feature_count.txt.gz',
+ 'GCF_000001405.40_GRCh38.p14_feature_table.txt.gz',
+ 'GCF_000001405.40_GRCh38.p14_genomic.fna.gz',
+ 'GCF_000001405.40_GRCh38.p14_genomic.gbff.gz',
+ 'GCF_000001405.40_GRCh38.p14_genomic.gff.gz',
+ 'GCF_000001405.40_GRCh38.p14_genomic.gtf.gz',
+ 'GCF_000001405.40_GRCh38.p14_genomic_gaps.txt.gz',
+ 'GCF_000001405.40_GRCh38.p14_protein.faa.gz',
+ 'GCF_000001405.40_GRCh38.p14_protein.gpff.gz',
+ 'GCF_000001405.40_GRCh38.p14_pseudo_without_product.fna.gz',
+ 'GCF_000001405.40_GRCh38.p14_rm.out.gz',
+ 'GCF_000001405.40_GRCh38.p14_rm.run',
+ 'GCF_000001405.40_GRCh38.p14_rna.fna.gz',
+ 'GCF_000001405.40_GRCh38.p14_rna.gbff.gz',
+ 'GCF_000001405.40_GRCh38.p14_rna_from_genomic.fna.gz',
+ 'GCF_000001405.40_GRCh38.p14_translated_cds.faa.gz',
+ 'README_GCF_000001405.40-RS_2023_10',
+ 'assembly_status.txt',
+ 'md5checksums.txt',
+ 'GRCh38_major_release_seqs_for_alignment_pipelines']
+
위에 있는 파일들이 이 genome에 대해서 다운로드 받을 수 있는 파일들이다. 각 파일들의 자세한 설명에 대해서는 NCBI에서 제공하는 공식 설명서나, 위 파일에서 README.txt
를 다운로드 받아서 확인해보자. 위 파일 중 다운로드 받고 싶은 파일이 있다면, 직접 FTP 서버에서 다운로드 받아도 되지만, download()
method를 사용해서 간편하게 원하는 경로에 다운로드 받을 수 있다.
download()
에서 path
는 현재 작업 경로 (current working directory)가 기본값으로 설정되어 있다. 따라서 파일 이름만 정확히 입력하면, 지금 cwd
에 똑같은 이름의 파일이 다운로드 된다.
coming soon
+ + + + + + + + + + + + + + + +Comming soon
+ + + + + + + + + + + + + + + +Comming soon
+ + + + + + + + + + + + + + + +Genome-wide knockout (KO) screening using CRISPR Cas9 is widely utilized in various research fields. Its advantage lies in the ability to observe the cellular properties, morphology, and functions when a gene loses its function in a single experiment. Consequently, well-known genome-wide KO libraries such as GecKO and Brunello are already available for purchase on AddGene.
+However, both of the mentioned libraries are designed based on the human reference genome. If you wish to conduct experiments in cells derived from a different species, you would need to create a new library. For instance, during the COVID-19 era, Vero cell lines derived from monkeys were widely used for studying SARS-CoV-2. As Vero cells are not of human origin, libraries like Brunello cannot be used.
+To create a new library, you need to design a guide RNA (gRNA) showing high activity for each of the 20,000 genes. Although models like DeepSpCas9 are available as web tools, obtaining results for all 20,000 genes may be challenging. However, using GenET's 'database' and 'predict' modules, you can easily create your own genome-wide KO library.
+By utilizing the 'GetGene' class in GenET's 'database,' you can effortlessly retrieve NCBI information for your desired gene by simply entering the gene symbol.
+ +When examining the contents within the seq_record
, you can observe information related to the BRCA1 gene, including its sequence and the position of each region (exon, intron, UTR, etc.). As we need to design gRNA within exons for knockout purposes, we should extract only the exon information. Using the .exon()
method will retrieve and return exon information as a list.
Inside the list_exon
, there are sequence features of each exon of BRCA1. Extracting information from these features and using it as input for gRNA design allows the creation of all possible gRNAs for each exon.
+
>>> list_exon
+
+[SeqFeature(FeatureLocation(ExactPosition(92500), ExactPosition(92713), strand=1), type='exon'),
+ SeqFeature(FeatureLocation(ExactPosition(93868), ExactPosition(93967), strand=1), type='exon'),
+ SeqFeature(FeatureLocation(ExactPosition(102204), ExactPosition(102258), strand=1), type='exon'),
+ SeqFeature(FeatureLocation(ExactPosition(111450), ExactPosition(111528), strand=1), type='exon'),
+ SeqFeature(FeatureLocation(ExactPosition(113027), ExactPosition(113116), strand=1), type='exon'),
+......
+]
+
For example, you can easily retrieve the first exon, and within it, obtain the sequence along with the start and end positions of that exon within the BRCA1 gene.
+# Retrieve the entire genomic sequence of BRCA1
+brca1_seq = str(brca1.seq_record.seq)
+
+# Obtain information for the first exon among multiple exons
+exon_1 = list_exon[0]
+
+# Get the start and end positions of Exon 1
+start = exon_1.location.start
+end = exon_1.location.end
+
+# Select only the Exon 1 sequence from the BRCA1 genomic sequence
+brca1_exon1_seq = brca1_seq[start:end]
+
from genet.database import GetGene
+
+brca1 = GetGene('BRCA1')
+brca1_seq = str(brca1.seq_record.seq)
+
+list_exon = brca1.exons()
+list_ex_seq = []
+
+for ex in list_exon:
+ start = ex.location.start
+ end = ex.location.end
+
+ exon_seq = brca1_seq[start:end]
+
+ list_ex_seq.append(exon_seq)
+
Now, within list_ex_seq
, you have the information for each exon sequence of BRCA1.
By using the .search
method in the predict.SpCas9
module, it automatically designs all possible gRNAs from the given sequence and provides the predicted scores.
Let's predict the DeepSpCas9 scores for all possible gRNAs that can be created from the sequences contained in the list_ex_seq obtained above.
+import pandas as pd
+from genet.predict import SpCas9
+
+# Load DeepSpCas9 model
+cas_model = SpCas9()
+list_out = []
+
+# Predict Cas9 scores
+for ex_seq in list_ex_seq:
+ output = cas_model.search(ex_seq)
+
+ list_out.append(output)
+
+# Combine the result dataframes
+results = pd.concat(list_out)
+
+# Save results as .csv file
+results.to_csv('PATH_to_save', index=False)
+
So far, we have obtained scores for all possible gRNAs that can be created for BRCA1. By adding a one-line loop code for all other gene symbols, the materials for the genome-wide KO library are now complete.
+ + + + + + + + + + + + + + + +xr zMVO+-V*29v;_DKpl9f`W(#|s0vaE7Mxqtayg+ayJO0mkCD%z^}s^8V_)gPYgJRhnN zt*NQKQ=41|t@EoptT(HF*C5}}-N@5e+C2mD)&~4m3+oRg^rdP7JqmQ?*`UT^Q{Fk?1Cch$h74hot>!8<{{hs|N z0}cb*Zyvo_A2b?V7}6e^9#$J39Z?(^d@J+z^{Djdi!q6@o^i49t_hKe&Pn0Pjw#`( zj%ktU&Kc2}?swwvdS|6(U(G$38<>}$A6ZaYm{` &{l$dye-_A4ER9{3!o%@{{hT^=+H&;~k%!U%L@|#Cuu$clT=! z1P)#tDjvQ&GCkTo_B{T15_L*;T5!gG*8UmudGd?Vm))=4U;lnfIHx(Uz7V>2bE$Q? z_1*3JSn9X#RQrL+r=fYs2gPp8>ycf93q<_}%+Q?a#(vx4(b?t^*MO6bglb8ypV9 zx!G{R0EWONz{LY!1h)tX3BaFQBxEGS;4hMbjEn+#2T6^*!*us96Bh@Un3x*m|L+_8 zeFKo;;RB=q48jCJ$sjN?$loDA3?wHA*iEkU?+pTl ~wW} z9fd|Gu_!f}o7-$keGR;oh8&xCtYW!VuR-#*YBSp@Zsnk3CktP>^EjkJLDrqWzK%=s ztgpb)%{26#pWY;Ur7;XpWv2L{jL+&WX&%}-61@HoeRw>5Hx24*9aou#&Aw;3+R{l* zE@zWTcgNUB-eC7J_0p!iy!p6{1AT0(p`@*y<-;R7gJ706D?h4)T(iVRd~NFLV-X?l zOvVyldZ$povHbxz #TjEtIDBqvH8_adS%U%ABm%D0!iM_R6Ys5e8lHi zWx8+|{hQNolZQra-o R3YWtdJ?@4K6)+Ri33`^Hm5fA@tgI_ zO6!~QUh>Qoo=q*j=5;BybD=x>CUtcRbGL!R!4w$}5P +4>(w;$yDlbzhZoUCh z!uN^11a7}W#}=?a;rt^@vC9 ?};sg}{ ?dUAkMTv4FKw+C(Fl`j|6=+q-KQ~i9_bSW~FCsx*znV$~_ zVA2^xdPBM=5+f)rBN;s1Dd8#2c;lJy%AYf)L@dFNuIb03y;YoQzu41qwl36GlQ6~= zL>>C@(T0(OCJMTNo82=2bR?7jdyGI4DS-?YwDGi2748V(Nx4bHzLg{0Z;{XWylw6K zt YwEK=SsT1)9EEaUAPZc%9O=gz_Old*@fw#rh$ z$cZ30a5U128>{&_)3)CB49_x6>Xb-zq`p6Uy2)s~QpqOa>dUVHJ0HJ= #(u(YKTLy z< jT7%}OPX-3tO`9Ty6rB1<<(4!A5Lq} z>M<4c^)`wx1*~WUx+X=`d5p9480U5V(9hTN{U`AS#Q;NNU~t|2UZVDWRGBOh7=WP~ z)3)1jGFUPs8F>sjRSLR3`dw(#{*|)T=J30Iw;}Qp{F@j6A s%2gdk0^BPEN8B_J-L zO$q0V{Zg*MY7ZyYAP*l>^OK@|Wk{Fe2r@6d720tx3;&7RiI!R<8K3V6dnS|`?GA>j z2oj-6;LgNUA-uSDWB06P0v?D4JX1gpJSSH}A#9llV48Z|rlE(E9(BderVReRBcbL{ z$lgMVCBe%U8rA#W{ihOdAErlS;UsVqh2_jq%A!i}5peQyI8F+hI}9~RP6=Ve;345@ zF}H aUurQpkAettk3 *k)m4LrL2qGZ?RyLCd)vrDx6KY>*Y!*rVVbRceU83azpS77`C-h-w6-lB z)0@w`1NU^3YRXrGPU8|BUL2-HaU9TKI !?Au6mx!!%o zbl;~TSfsgCIJ#ov)=G1+X`lbMnzyWKFuL@&aGQBC>%|`)O&rFY 6%3M$8y|&4BjLFbq}qIi zB0_2-HjF8PR+B>~jt9rLlUyagQQD)cg$}dow^w=&q*uIf5TpWRFaR@2P6U-rxZUQG zA1<*cll0`NLLZt*Yy7+Thohw6qaxGAJa!I|Ir)+|2uEd*SpcdD5Hc)?Zaf5&7R+;T z)SbR%a RUJ(~+1OlNT<1_((q01gJN0O3<04b5p#nJqw*&Q2ABd?#9*Y!a|;+ z_2rDy`yNyUSCWOu?`J91yz2Q4dQQD=hHL4x!v)1c3)Bzz*7Y|Xv^EK;`=p-DarF+Z zJBF4vCa1moK09b&*dFu*_ux;F*HgLMOae^TF-X{xvHsqr(@!LA1AWd=hWH}}qxRay zWbqVZV;z|&GIj_}1yKSD%ZIW>0G7=BXe3eWKDL@od)FA+dsFmLc^ z!pN{pT8`D0n;b#-kH1DM= (|!1s-t^aT}NC@E9{lz03KNw$Sq`Jz*t0v zMOoh2@I4(i&yw<=n-Pim=QkFY?XBze^kjEfR2mU0X7pxOfjkbS33vjfIul=Fn4)JY zd4DWs$e6sv_4k9(TZ}d@|J3P~&V_6zlYWWB?@yS*4zw|)c6UABet*F?qDn4bf>g9e z*8|ghSRJAPkjFTKd?8MK(osu`(TXXs$FYgx0@wAt_mN2B{(Sdrda}&2@L+JQF3WbI zyd?w%7$g2vK4N-8R&QmgOe27R6-5v!<)ef__sI8#5CfEivtTg-_8Q@YRyr%+rG2a$ zgZ;0{-4>>Y3g<-fss)^M(%EZbqDmO6EFF- # z44T)%+^H-_6%U*3r(Wpi%d-WZb+Df2ouwUGppOzvMQIgB_Y`<|IZpg1wcq*h`y@3r zp7Dz)$zz+#Toaw*9k2y-4kI}Htp^^uy;rIv{f!eYB2D5{pOK^K)~S;`?t~$+^!g>6 z*LA*5XL&C>P7U<=E#DYs>;`u@bXoh*vsWDUr^V+M`_`T PitACc%w7Nvr#9;?NG?h~CJ~Uh>`Ck2LSv=To$A2S_ zBEoo$qlxbOUDh|Qor&TGhQWqw-qz;=_yx)d5vqLn2vR%*NUktM09Fx+>4zc&2+*Vg zPyxPXiS3+wE ?i6BzZ$L xg9ls3Pny2G> zEi7%eGr_oPH1n(+o6t`R;AKD !aV^U*PeZFF!jBQd=A;H)l4O=cR7d7Ir>q>~O1-4YU<&obW%{UXAy;%$aT3 zneFpgysf=X!)_K?8$lZzO8}(lVEV^dYJR;5s-k)P!QCFfqVTm#Au_QnlwcN~W(<`H zLuX~+pkbR$s=^$~Wpa2KVEh)sAw?%Zz@!f#H^8K{67~7#9NvGMxwCG=8-EY8=-k8p z-MHDQ6a~P+90n>Ii+@AO$dCzXs_0SnwAH9F3Pk^g4V9oExt=97W(5$5Vdo1^!XPa1 zrk?S#2(q$J$WtLwTFF2gog7Lj!57AkxG<7x!E A@h)^M3{x&fs~77o(e|k!R3B-yuAl0gd)q Yf_t|%n#P*kXiZv;aqR@XRDJhlC%spr zX^WdSzyDsWU(oFCpv2~>MDSO$pAEt`vcdBQv1=#eCv8h>)~V>r!YBPPEc#B=BDrGo z0v?xrwcP==to^kUKGscFoDMB7Y>EV0*nEk<)#;M8+Uv~noqp9Zp?>^DA>HjsQlYu! zqS$O~V#cdT7iz!93Cn&)LQ_{J5kGv)*8K{CYS#?DRd_Up+p*m3V%JfZAw V859`MNfhzD z_~pJXlwt{JLn*-{5Ka`H(YTZnBLiHK7MK%60YDWx3xnw=ZiG2Dm~{&4gBiDUuuGI@ zXh*z7e(%G_i%7e5`=j#5cLh|8gLHx(68N%FIL`o6V*WdU?M{~WglGHA4Zho-su|O8 zdtU{w+pwAAOkG6=xEFa|i}$xmEw08%R)?RJdbi2hatL6ViBqva1}2>k4gm;=RB~k1 z2k|m6__pB)48V_GK**Pot1;g4J|Us#5k2o4{>;V6!!kirfB zh2@A}yBAI$lGRw;0}=IZgAr+O)Ks`tMkB2WnK)Ab11MiaB!Hp>?Vk*EpLACx7M2&^ zgF~TfjtAVGr$&qc$ILD35 <44VLzACFYz(VrZHZrecK= z=qX)tXFi$Sb{R!{&;}*}1pIb^k^E0zxgz-%)TD|aAQOla%^FBHV%xm;Q6l(uhnXth z-Zm^22SqdxMw0?ql2d~26(8Y-W{=YJd`(<6-1@noPij53=ZK!h!gXzTrKqss`!6>M zF~+Q)RR^O(lX<9eH(-#QDh$dem>ZR&IQwcj_)@ncKtm~bB6vT>hlYVWUQR?neYMsx z|1!{3xRQ_SxOnxFLuSQ s14tyw5fKh-(jtx%nPpd<0jT^W7WQ>nSC|Q zI`>0jCEK#Gm)Eaz6HaQ_l@?d7%vYhA-sfJ?E+wZV%7?@`cXl*goEdZF-)VY|I4+5p zEcIw#yMHdTn>E#5R=8W%Yb}0GoU0Baqv41}Sf*IY5W+yg<{6NV0Qo_>4yF~2n041u zi`W|49p;= F@$-zZlcAshmq=>9oM^v>HHQM&up@16V9=e}=hj(=rivLl6r%f{H+ zs{k+zRDBegW>2Tg2e$`e6+vSoF9AlebC!5WAQLf)Bn1Xglce?tCmngrLPR72ZEIvn zlY+;mft$!;!_(zp)u$zYda{+85^qCUE!=%X)o!ubXo)RX(%JeoJA1iFP2I5&vwf!4 z%(0auh~lk?vYe!pZx^QxVQ!wqV4p^>Qead^cZO;4*x+{u |Eg5z!Sy%-P zggge11^}IkE$9iuQv8b4aLx9e6Piw_(v$Ct6h^;Fu(wuDl!?`8Q+|UcCTi>HjMlO_ z3c7z!mJP`h^|q0wl(l3|78}D3nHbh&vl?*KqFgT%nu)sBu`fm0@zFIFH%D! 4Xg5#G{neeh3C;S}H7n_~TqX*Zj^p z=VkZLR)_w)YMXZHW-R17Q?j=shSY>r_ue#|CS@(;Io5gQF8Q;k-^y1tWZ578#w$tn z6PLPn#B~zg?q)Et+z@H?eBET~T^&Vhzh>uN8LnW^c7%zcsGxi1dVuJhi1I_H^k@0c zJbzNQo5-gQVPn>FZppmk4Ru!%Iy9# BJjwhQgCswXq zWSY}kxIyq?Ye!A(Bh_Bty3*3m*Sc>R; ey)1WYDu zer>7#y0o+YPxkbeeO*(9@H1ZJ$4f62d-kgKnc5EKj@MORDKINu;M^*sj5l=a*ilUo zO0mZ$V4b6crwhoyz+fSi8-||D0bnR6ClzDXbO9^C5pF4eljV_v-b4VZjkMGCA?jAg zhUJk{qSH!LQnVp3RvIu@B?7|;A0H^|17SIuGLu8hq}uJzKtVZ$j6FipDuM_VmO>WM zB5#E+NJOJ`N#Z~CZM$5FQTDs&gYLzD3Ojn!vSO#>Z9;46#q?W_!aEWx{xoX+6s->V zb8L1k$z`%~OC;~j=c=wlo(D5eBG2FJ6E#Dc_-2w6(j`Uy0)j=?Tt-K6uT+~})oE5d z%dw~3Uu^effh+~?Cq0s#XQ7`SE!}l${iDRg^74H8&*!Ah*BqXHm1J`RrEES6^$p!R zv;Y$1KnZYC2o}^j2Ur2JaKMr;EP{-kpA&_^*CCJzKTCf8C+#1aZ9I5fmTX)rL*=xz7&iQuWswU6N3=;%M3(ecz z{dkl2ekFeTf@Oo6K+%t6B7VmAO4*&h$P+!5Q$6YBnQh2T&^NDc+dLlW=^A4w*=bm% zOPjBjP$wk?6E|hR5? 3r;i zpe3KCw?7%n<^N1ime5?|IaKP~6diiCNm@C6-!CYAZ+P*YicSzx8L1wNA(0h&SFea6 zFLOoWp};jH<--RHQtVObeCTH=6)c}3$QYRT!V$`-GBCEtgQ+1p#R?yEu<}A_SW*Fa zB;XaGV{pRVZM8nEU6#1KQ!Z>L`wqr>BVXeqFp!jYL<5ZSATsuPF0CH(?*gYUR>3 z3@>oE<^qT2bupy?>u8Fgy<3y%3oGv7uF?J1MZKK8$*oks<-{Mcm56vfv+#Y!PbvsS zSc9ceyAh}y0)XFQR*}lR!%sO)wf$b$i|NM;aV4;TwCX)Ev$I$|S4cNXt* CRPiTkYL%3z-J4?SH0jhw`B>+dp6dD40&i$g3&iBLtY 1nu2If0GEnQ1pOv$eZ2Y-H`pevenPwa}PhQJvwDUv5J`IX>(d!wz+R&N_ zDg_qJ7=xr1moa*>7Qs&15UNWGb_3eNo_Y;EjV>N |led&gh(UW_%m%->t{P%!F>o3QeFDaslAc*d`sx$J~2 zm=j5 )CZdT}=3z zbw&FNQ!1*8tI$V2@f!ieT(${SY0;`0rlTLI8p@5X)7fip)i_QZ?>s-PHeAnSg{P*a zVIeVC7`_%6c`P;qhyi2nI~6T*bx=P803iq#ETclgz=X35^fs75uyn>k3KfK>-e}OM zz-M5qSetNZ8NwP=f&}qUif@1cR$_bz<|b|-6p`{^pC|xYA}u7fnGCD4$6xI`-|6_O zEfu@s>A{)xVIg KM^sNbvL6b*_x0N?i<+cw)wMV+?RF`3Z#3?7 z9rKzC{vG)2Nxpcu(O34qM=DVUu8WaVjjB>y(_MBn3;inzjTKNne6U^vjDnR9m2d!x zjTyxQi3llX49kwCp)VOvxLVG4SQ2=#UN?11WaFh1-K1!?Pu$u3<-L-g>*u`nNo!IM z+TOjuTodl_`2ITRN@J*=7_@n^Cb8ZTvXw~W)#p-dfGQhvqM-*{C`)CqP>g^GQ~<(H zqH-A>`Xh3+Tj)FM+kq}(5r6x>Qe&;IQD^2kUW3I)^dc*lr`=vK)^I%_g9`Z!n;(eC zRj_vJC61IovuLaj0xMq7o }? fF%S9 z5MjXrhisYvSnc3r0^JDMu0R3S!x2C%29H*k83I;EnD_{Nhh;hk-li-^^rNavqU6DP zDk+*B8v~LOu=xNDz!hN1tgODefh9sPyJ1Cn0HF;mGFI)X$q_Di>P4{_eD)V5hI zmGhgc|6*WrOmnuDO;8~KK*OPg6S0$4(#bgciCL!Qw7#w9JBS^x9&I!CdBB|QCRt_@ zuaIdfIM!tOY3td7Yg4|!d*|NTB=?nIvpVjj{O<8)FMC1yr^QZ_^X8FfZ*dWyT^<)z zXM1_lqWub1e52~#rIII0x4vHMm}v>+N)T_Dkrhd+VAybuueP~oKQO6(W$oNKm}qiQ zR9RLVz_UUQHo-}}NMu*z&)}a_II-S3O(b|f^W@_T`P0?L@t@42V@dc~I~~LXGmU0W z5*Dka9rN{-Y~|b$Bdv#$bRN$|lr=vU*LKFaHD@;{mnmpu+X`5YMR_^UurX{CQ?ytW z1~HU-^BZWj7*4VuX1e9QDEkXI% Gq`8x6>Va>=&p94o9la$`F$0es6cm*?ulc$S8jEmE$ 5i0;K TjYgrRhm?&vY?Ho1}Dt(ukz6>j0ic|Rk zbsGArFK~uxxzSix%PNc$>=qV4;Ddn_thgfqJRCS`36q);MnhWR=08QvOlY|rD`MF5 zKBV@n=c4kF*#~tY6W4lNZzly+Rf&cXm*5lMqxmYuw{=1rombLrEF{;m)iZStgZg7{ z!PF*9O_`qthYYqks4zkOZjIh2Pq4QsDfHmZ8uJ&sAtU9{6t`BFpA~A;E>DVweeJIZ z%M=EWgP(}l%&`~??@M#7Nx3ZUi{R^Dg5?hwsE6ST;xU<+0F&gZC{)=EF=vO6W7F&{ zF}&|uOM_ejGr5drctxdY9j+s18q8lmAe?*AHEYI@b;SlN9=rbWM|nl;Zd3B)X48Sh z#$xoY|E;5klR|;YOV*NZM08Rv1{=st%ZVp^WitW 3Z`QgyFI!(E^IeG0XB9$R4LCI w|pUsM$SM`YaN*(dgPO)_D zEZbN~N9H5>&-Zg*#Rbkc2|>6!_Lx8q2Q}eTW_9k)Zc?i5ZRORLR8yr3+xRja_3z zj~JlEO8}U`o)tV=%qSA1EAnOVRO}5A4M)hbkR_ta07YdK6x6X%poGl`!GLu$nXuHG zsDoxFhTo`-V09IgM8=yh`yJ`BscU}-|GsM%e2@1* >Cg-S)Fdb>Dh%MfD_+xpZ z!K_pAgrR4GWH7Lb20HoD+zMVb2V0!j2SJLUW<6oK^IChw|A+I*e3AR{Lm4~EVVppS zRX E-rA-4k1nXy2Yn~b zN4AehPGDwR&Q|2KhF_pfM0mFG9RIn}Ba}^O^TK(E>)UKcLFe1AD%4o~#HG#b828D* zI)Q^#TXn?9`9|Z5yyrEiYmBVo6|KTlTLDO?UgDQE(F{IMt-rn6SQE$y@ hQO%*cNr^ zk=hY9Z^_44Kljx<-3Ck0=LMXGqMtMy@|8NiW!@qykB}XkK?BL|skPVXIxSwVxH@{& z^L1{E=hbwB{-s^l4PCpwn@K&c 031wjFbhI7VWc`BD7pSycz>ndCOJbRKnL9a4l^6f48 z4sU6e`Nst|v+dRks`3dYJIcrkQ0qsx(yA|@6H55)<=R!!MZadfh@|}FJOXO6(3?t) zk>GY-7)z`D)`5`y_q~F~1#Pjz#j;cHxLM8ZXw8^;gTji>(tguNUh*Clzce!~6@~Wz zBpLvTZuc9Q-{F~5&q42r``1j`^h7jw4aRQ%U5Mxs4bS2DcN3C$ze1DMchw9Ja$K4m zYw0o@ogcZ2wXXV0IyYoCA1Bh_2!TC4iZ)DI*6O1Wc1BPbQ6&AB?3(}(sH|mX(=`b9 zqAHU`%mS}3%q_l!e7ImZdo-KwP7p9PJ1e|Qyvgu+xc5w*>gn{W$YzP~oNo-3+N~=} zp8~S}0_uMO;jOM|Olzi PLhsUxLMO;+tG$SrcB-lIa^5(t6tEb1e6E;O%#JtC2 zBYm9CWq37r Ndo6dtn&*k$8VlvG z#|x)&kuhtGa+=GcNEw$NQBl4ns9Pwu-|(xJG-YY05VJZAmIpcUYK)J8i`*hq2hI z)sA0o|7_y6r>(Pcvq*3Z9n0K6%bt Uk{TfV0M+@LD; zRL9?rvFs(uMrrY~-LIFNK{ewDO&02JU*;3t==__ycH691tk{lQ&9{|QZD)_Q-yF|> zf%_4h^*7~}iYHh6h_|DS!EF+U0qLON0YwoBn))$Z;;&^4XKTxPjvAY*LSyho`@zLS zf{HobDBeIAP@*?v9!q0oN;zV( &pcuUBEGZpGtf3l#dfyipg|r@1bOMyLp*;!diJ0 cz5$6dT?nwhd(1 zov_cDWsvm`G{k|~E|&8!^)_F7GmfNp_%CZ^3J%`y(ebfx?7HyJUsPh|9C^pv(2_dM znl41Hhq-C)1iPdw`X{kqysRj!32fe(H$6$*K%U$6AJ-Ia|1-uAEg>6V9J;l4xg79g zY>}SC{>Q (?w(GuMaq`gDF)jLjD5hY@eyaEc&L}tbb=sPNf!8(dW>;aLbn^ zZB48J&f9arhD%G_0{%M{pMtE>xk82t9J79E&EKz5%r^b%Bc3W<{8$SWJiN!Wx4I+e zVJ`g1LXY)xg`Y!CQa=lQmW`Y+&xC< (0F-$RAX013{X z?`~mQz5+%2FWk>ILW1ADB>%Q|9Ta)$dCuC9=lmi_JV|JyTjc0M%!mGtJP}@4x+Q=O ztk5PGiDC|C%Td6x^P|Ruc1Iku4lN8 M9+R&3)hnc0A>K>yK2nD#bx3_ z27MoCz^-Nt5Dq|6{#CzWtYC-Afbt8Rh!I^9kp}i~KxHD9n=z*RnPwyQ^l!oLVNe0a zIDu^~qqanlA^~dGj|rjA%(?1Zd-v-9Q6Em#9a^dBZ1Grq5!6#Gf659OAPQnATFf>I zWQa#q(1gq6q?H4Z9R}3bgK~SblX9;Pp@N8Aky8)H+ieR{4O`+K)8~GEgdGm10)vJ; z6^P^-vmlI~cB6I7iIHcasQBan$H8o5-1Qy%!3>R$wjCdw@`zL=BRVtLXx!6p|LQjK zHo24YeW}ImjfxhHY%ok1hMfhDh3sXN@h%h3&^gQu>ZqKnL|ImWz#Nw!ws&HyjH9i{ zB(pGrnj)Dj8OrvQtTb877N0BKDK|XNzb ~`(@BI6V7Z18-W=T?i~ zMCl0G%dqF;Qlt5Gx&^+0dM$;)OJj!9%Urtd&jTpWUcPE-aq4qUaS@gODm8hTsH%*3 ziPQa7MOS}W>A1^qOt{I;F+eV(`ik?5p?>O=zbo6*(}k&6^^;s_Z~xraFm|E-bL2Lo zNEJkXag(rI!#mV#p?xH;gG;Ay&5k6m?Z?)q+5p6Is51GPO8tWI=}J|k*avMI3tY{hp{T!))8(`sQJF3YBWKJykrP#i2>k&5XhOo zd}M`y>fjXPLK|yyuKaFphE?{0WTB`Rv&&w7=X3sS%1?k0rwJYVqs&)DIT~W>)i*i} z_C^{eidleK(b*ylc&m=Of 0>TRIv!P`lRtEJ8H zPgnKo?bna;Fw>(I_UNxTm3Z2f fhAT(TjOVZkF_if(Z z!9)`EHlaMLeR>U&8Aol%_3&c2(&Dq!S+ek)Iq^)em%w@lcb5KvaQ6Px*Q~9>mVYv~ z?-+avQOksDc_~X&p{!0>#WHk~B z69-Bf&}-o26Q-=!$B18hIIl}EDLHk@MBZ6bh+HTc002I+2-M^N!jUEw%M5?U3}E`v zz@ShBxt=42PXP4TpuJ&6Auw97B20t@o75l-t~3-<;w_BmcI;RT@#FrOloB*e)EpoK z0I~7{%qX~JK-i&duC04nC)%DiboSSFsIG@bUKH^mBGtQt-+noi*H=bzP~t178cRK6 zqo9*#saElrC(V4y(N__)Fww<6#;r4J*W8?4;6FX_X(F!YYAICIv06U-iyhH(q#Utv z%Xxq6(d=4V#QD(!v%JI8pw#sER)zx#_Kn?(Sl@3>ZJwI^NL%A+@d_)!TQ*OtKc{Ay zU0&aD{isK3oaC(DW=IlLImF^*({w(3Htq6*>`c>-&B-l|HY8@>Q?U#G4wyb#)Z*Mo z^CdB*jzuGjY_~+59_l##rup?3SUr)*)}TTRRJ(Po_MJ%>e9St{v!}A|(cBr#5|9t> zewR4^ome{0&*6o>0jDgs+o^EX^BMI51dFauu>~6gEK_XZYCyOVJd%_w5(>#Dr*s4< z@0>k8!d00sA_uTyjKYKDvJ2FK1sZCzPu)lIf-Ggq02+zHLik2O&xJw3xK9{9)3E8K zM*yqa4sagC+nnZo&4=}Y^DhOQQxSabQM)8P`@e;}^Es5avW0K{--0rnk2DhqX9gfS zD0`xzf>`(qx0ZqNQ?V}BCcUJ!k0aAhM2r~J20nkZ-E1*r& U;Kkq8hk}2wSu6CB*8 z(GKxb4-Cb7)rMvr4d`9rkX2H}8k}_21!?t$Q9OwsB bO-%vxMi5H&`$kbw_=K6x-s$SpH;4WP`RsLNQ z8)CPBrT1p9YRB@ w0^S^En$j3q|$|0^UyBbpLiP#s;z0`)egiGK$K@tX-TE z`_bn4SQS9^fL0qL4=M#lyG7Ste(Q)WHiq`akg37oL%5}4I(keVW0!&uFox Mj)Pn-G}6qvdR#?Ot5|!<-`Ysg#j2R6B)4H6bbgr1DGLlD>!B(?dBh5BAzj( z0OXXUDF7`fJew%Iz`gaS)T=Ft|O#d^lSnAsG5ry4>(UhT>pF}rg_a6 zC2uNQz2fmTBk3d0J7b}_)!v7Oks0yQ%_r4z(r*M*>Q6$x2|frw4X!ZSk$3jWCD_|I z1WD|?`1*fwbk CwP4oFV%9y+bI$(lee#qRH~s^vUY}=%Shc|!Z^AK{NFHvPu?kw1bsBf<96bGR zWU@ArDL379l)mFrW_%GSmvR#F)qkWUABtbKxJiGsU)jA$_a1baerJ`-eF|o{6 z{(Nq>aHl;G<3paZp5)vmC^iwXMByc}>ap(ByU4_v+}__jf!0XLEB1BLv&8$u>6Kxq z34%|!u=3!bl#$o^#<{-ZMP)}<8yS_4e@8Fb<#YW-uN-gUixT*8EalFK(JGR>yh?z% zV{F83qXk(T#ZNZcF@A7vMZ5Y%eqc0cp1+5 `DT@8Uu1EPcVQ5#*XcDn$VU z^v6WQ{ #>?r8BcTdVh&Y5?2^fnQFmN{bIdq?;ax+SWKZPSp zV>>GWIO3r|l0bTyz)VRF@+>WMoDgrCEPqm$u6DNR)Lixh8x~#nhxMcA%+C1ej`bbE zx#9hol^cG7p9Vj6HA>$;inrmu@ycj4n_$-^jUL5x3s^!*fV9BF)Uyj(wkDG|;?qj3F# z-+1+Kmg=eYb+0{}oN`Uci;?Rm#C1>Yr)Ioj-YsouJl0Iyz1xv6oDp>(?tNQxNH*c$ z*j?UAEwSa}aCok=S?PHI$5zHCgGPrsj1HAISr{(8<7hlDd@Ia;_w{2!XNzTG`m(i; zUZ?q41^*P2>S|Wo=Q_;~+xf>zcyaesm@d-{2>v+Vpob5oKQ)iv9jwo|?#?x@XFVg* zHV&y^9e}bWFvrpaID(2glmd*`AcY-$7yr RVr79L@P4jpta{AV_LE24A-Wyu; nLZ^5}na-6Wq?^8>U)3?g4-@qOUc+zf@pZQuUD#dgolRn5S z9<)=SBo63kPu?K3%O@hWz~|Vvk|~>A+|D;%E?+ zfWuNy=)u1Ly<7pK{fV-!w&1H2;6&)j<&5#B7^r|OnzwqNa;$U@wq5V;X=6F|s!AiD zb>iooQ=r?YZE9@eZu9qULTHN_ ^NOPYbiJ1 zy`>!f#|%4i fW`rGX95C2WuHhif97{ zgr69KyKVQ&6aJ2suL8DO{{f~$4FgJUs+~A5by{17-D3kkXl1f4mF`^WVevSWzm(a2 zd?kABId$o!CBG~z%pc11R5+HDARaze-zxA>^doDGXwLv`^zCO@t11eM8)U^&0?OS5 z5oDO8iB$(aH(v&8MQxEk>-*eofkV?1KC1n2JFF4Sy?-e$VV)!DbHa~p6XYlw;A53% zB`&X_{X*ktY4B5_k4EfbuFv$rd3Btbv&g)Y^{hkB!Yw&_Dq>ujOq(W?^O=B?)8@xg z!}#d^%%=Lv9^#vqp1;OU4Vi2le1<>gj&)BqJ}2Tyum3dfMFoqomGBT16gnY3w|;H9 zM(*%TgXcAaeWL4_fC?^_)iQm{vq#?=#;Wn4nQ{&-of=`ZE}9I=!s39CbVf9=uUMnQ ze8M1|K?Vtcgal)w!_z@u4+?(qjIEj(gRN4sM3^`|0ApX_;XY*TBjz`^dhb*oVM>6_ z1x0c{gYuSRqJV0P5-=)`ALEYqiR3066(Hmp8`xL*8CoUdo)|kAIZ7^0Vst1qL1v^i zy9LX^iACU!&tSs>u(dWQk`WVIuZ)chO3YGfqfgdv98X~NoSE;u3pTZr|7I%|o&SBk zu6gp<72VmzIHB*XzG`Ow%x&qw>{Zr^cC6d^O=_pjmfMM@RQ6CDJN;~Nuzcx4XxF5` zY 9&{43;a+K-l`|ZvdtC)~B`@Ec{=zDXR^`{Nq zz)@+uUUawi>eRvI{b`rR`nrD6o-?(7a{CJ-Y96C&G5-;P@)m_4u`XOXF)a5TSvCG0 zo0O0gVhuVP07)xrn2!7Fjlo-TcQKa{kw%g9<*k#d`c{AMUKi(>^9#BUhu^Eqvi$rG zxb1ovCrU2#w5jPVDM(UX}aPuI3%OKHv4F%r>1js(`Asu+l)xXlY|u@#6&xVR+($ z1VrLpI%Sx5JzWRRM*CfzXH!NE4cm(v$vACB*KOf_5`Tq{%M!xb%0d~j39xCfn8w=s z_?)^&{3l$k{o-We-jwLi=BXPK{TWs0y*i!CeNN0F<#8wQ`aZ{c-sijGOZzk!v6nF~ zq;+7;^(*hHdOQF(#bh*<1<=a_0^ uy5s#amj=?diBP;|HjIy?w~qJew>o;veO zv9uK$N8{Bc%+J6893W6a0pS~NGJpWx)D{K-rAh!*2|KYlkRTbIzLA!OtRYCFND?J5 zfs9@peGVHIJ|Hm2qqI*)jn#hTmeiejL*+M&<4x_+#((XoGceP`FvSk(Y0kK};?oIf}g*40S_#wzwXJ!idbyK2iONSt@J+E1`x54!_)_)sxOY8!WyrMO)!Z z34+R5Y7vNBI6&tyivqjSPf~Ga=W*Gj=Y3JoZ8^u2xZ!#-fz$a;C6jvTfa=IvL{Gx| zXAd@MUb^JB94EX<>kKU2h_%8EQ%bntm&WW!SoZFyqJm>r%d=a?$r!6owfeB=L-O@X zKKrU~j&yBRQ8ZJn3nC7&!Q0*!bESyMrMy;6!8XTYLX1fp3yRl^nZ_A#dji34>q`}z z+P-freq|h|`ug}S75}YB{(ucrv`;SzeVXsM_NAyiCSkOtBEotnOlIP!eS?r)%4nG% z>6cPt;4-%aYT_-nM#P#4iP-#>bdXs9f|3OKrbuBRN=^{`&t(as+=QTpL!Xb1jjBX} z5hEuLdI-btLAnwwE%QLMJP#UpGXjY_aO8nbln?-)0iRm{3b9p_i;#x3D28a9iK6h+ zH}eA6z^F9bv1XkRyB+M{0r>!2STQ|WK8RwZ)O+;&2MA?NgxTS(o!fG@m%T-||D!#1 zE9G%ct#@AC*;=vEV^u@YU1s`2>s$B-m1{|ssLA=D16@T~=Sq& L?3!*Ra9@1wC#19%p%Ug0VE6iqs zrB{N9OYaADxbWmW-|CjN4dO7X*>=Q>vp;Y5kq&p_KVTt`z;Ac|V!e%n!f(&fGIDZZ zm!F(*aXR|Pv(hbIr~d$AW{6URZdGO=3)p2mQz%B$*l@|58-T>aG$hD*% lmU1Yhrj8Z`EVlIh0LK5nG7#_w z&A-I0CvK5C=;od_3Us(ytHwO)sFL9rpm7KMB?Q1vkao=p8m^WlmDiO-4Yy?|;8u?h zBt@k|#bP7juEqP4ghwPUlfgbrB*&Y9!XAw<+~;S@bb%|K$}{7jfZY=i3S jWdiEU>Ebd)Ksn~6%?^U{{Bz8#Q!!gr)I zv3KLPT1bBqGSz3A6P1}Zxj1uDAFnbnVOXuRx6eQ?d}$ZCX2Iq?90<(`q$yE)Ze>WA zpX?ZiN8uXqHn7MgqW@>}saCdOy2|+Qq@?Vc2@5mCcT&SAi>e@s*9b8lL8E-qri2~q zUh`0;lepXA`_f=hCd<**fIIe%t `QC1!vZ$rI>C5pL-!4Z*#uj2l^-AC zsgie^_q^EmA?*wA+N{{2Q2d%as`&n&++5zqdx@$LugIv_=oLCN-T6DDV2a}#_qo*J z V~f~vUDT}#-~EIppRn{Q5`aO`#K}q%$4ku=qb2F @1{jy`5vOOVw)BBTNrM%LMq=Rvb1df#dfHCq$AJU7g^%(xl*iugw zM $`>)5r>%SFw^L;M}Fy1^G-?JRUG2e(;RAMdb+vU z?_~Hlqb3g3kM8TuqmE*(cM@mr*(HVeVb1E&R^0L5`?v9w9oIt#$qf6oA}d~&baeDq zPi){LnbNuQd~i)?Uj9|SKfF87DOzG40bG4j`8!=VYpeaXk~7w*CfLaqy|GxCG<^39 zPl|}a1Hq+<3?;Q}ZYdf>N#~|`eNnim%w|1~V-u@Wt*cfvD|TJxY+=1?Lwgwc+93I? znn!<=!EL@^--yXyEyn>JoR4Fp{+sPG{;S7etRes%jRCvqCbP*;%Jj6u1g6s91uzjK zSqW;31`#K)>IWpq01$9YO%E6y76;j0kp9IdRbruM`1UV0M7l^43rY 5s8 zdXVx1Q9lAj1&n0*L><)r%rNAO8Iix}# 70--QJn5 z8JzJ>KlU**${iDwTTFZ;Tc){x8JJ|1xB3ix9+~lyGbHLRGLpB$<=^Rc_`|wb_{X2| zTQ#kO*?1J26bs4Nv8POjvAotz%X#Id5nfD@UT1QU0G=!vlhf=YI>QQo8?!MP-?m04 z=dRL$@lLXo>Ai(*rnv^crpFr-b%a#7ZS3~Jd4`=t8g=v@b~ deEY$@(n%@t2Nq&!iF_$Af$G@YtrNcQ2M1sn#79joh|>Pt59i=o7+x zIeqgcX!T%(f&BWVLzQw%e8+wopewntrFw3>kwkme_o=|dun|>eWPEh(hwFi%8DXzi z7qC1H !XGN1<1D3rGFXT8Dkw?pA|c2uH|G%9tu|^dR%NT)%SI2p8HbOr_4) zM3u3{!gt!U4y7*ZI-T?8U&s+X@S)h6RYcbhw(+8hjyME)ZE+K?pWeRLpLgz`TfNuz zP8#V*W;4j)mZ8)_og~{4&)%7I|9HaDpjVd}y+J65$v?)CP(C?_Yf0Lcl<_$_p*^Ib zObmVX?I>svD`>JqF;-jtBw|ACT3k)ug%FV~@Ph+N(Riq8Hi3z7(|B)Jp#-OkYm)ig zbIj7|=Z@-Sc~~kB>j_L%ZKZ++BBojNLoM+rA^*Ve0S1tBK{sV2$R|5veb}wE@_tsu zBVxKQ6!c7=O~->ESRUfIhj=GV<=p7eG}-xj_<8+(=7XmJZr8}`GJ=q=iR!QjaX6@~ zW1tfyVk*Q3=7_HdN$H{nftn~vd;pyic#ztHQgl#+z!HB`-$Bkan~B`4)t4nEk*bNt zS40j?$I3n#`pu%$kEzSJ9vNwo^BEUb-*|g838K6|Ve-N;n?MaIY&05B2m l}5Igz(Zo!YIa@G6#tdWCzc+)-R z=8cet`k94s^D5a@!SEX$Fe>bxiq%iWl+H})7!;tSk?ie*40j6qHd8AJ4pu9?P#Agwe*Bwj6J(aXXl|BCcifD~ zCc@IMPWhc!;%dd_AC;%0{{faP_alcjqGMk~9Y|#jb(a3_mvMf$^&sxj(kDA~G4xz| z4E{hth9gUOeA*>-w%4JmerAV}_C~`<9obYj!Kr=Ht9fdQ{$v3^p%nu_H$%Zv!~m^X zjHD vQDCBZxw bNV>UzO?C0O@%a;u5wknaMvDuzi3B=Y-t_i);pZ9#P>M>p0*I2 )YiDLh9eGg1m3Q*8vB{CY|$I-ITy?2hmCBPC{Y$OoG(tTbDcJP965s3 zR<-si4u{D% $I-5^ zE-?;sP3_F!h5Z}00u-(9#GdtwVYHoTRi^k%iIlj`VqNh9n8+vlPCIKI7qTQC&D;DA zp3_CQxsIzeVyUTz-VbH(+sbL@J0in`tBwSPUb-~CKx}JV+@CjE@?k2JwT_*vf3Rer zU)|swq2deR`{8|7(d@rlBXjP>86nE2txZu|H*+}e;(KN)b%tc56OHs?GDo_%sZcM% zrTns<@gao$fw`aOzk; l- ~01YKxoDSr00Cf}wQ#n|^tCjX;%GBCWZEGpAA-ASRfkXcl6-eO1 z8ZAa6Y6o^z@{xWa3sIcS3#mv#ORaeUM*%Y+CW1#1HI5ZV*i93js)2!BjoYX =f;DllhyGX(H*CZ)o$10nxXqXg|*e1z304t_DdZ;P5u7ZMoc}~tB&PVvMf 60>V#&0E0gH8^p4E7623>9*>rGf9a;s9y~Z$#}3j#EmU}JnM`5sB*u7W{c2E z# +o_M=wmGMZt6r#1r;EI#4-1T(7?P z!y~`5>f^8&Lga82_sMsBXIVAn=hmqA&FiarG#MyqvJye2Lf|N9>I2rnUKJ%$VXkz@ zdA7Io>Ql3KW~bHNj05`v9JcIB;b{{7_t*QZ(#Xhm#C%!E8SA0tTRRhvr)rl1Qx^~H zo8%0<$dc&Y*{#rDo_?nz$A>&x209#x*C~DP4(4~um>-_^_iRa<>hoIDLB0e4pUF|R zQa^)Mgb46|BV7mp5~wgNsStVxf`-(R&;v-L-tz|&(QDkOC6^yfpshdiZ+E&xAe0%@ zr$G0TILL@vC4mfjIH?3c2!*4t0`cIS2G42L5^GRuK9Yd(p78bVGkP{*Q%JlN&_6>Y zDbF01k`T7eQ3V72*&FHE4l*bNKBTE7F+8)%SZFexJ8Vgop(%rHhC}fiIJO3g8kD>d zI$1y~)v4j;X|M8@?b`R{DL-}35g1~G&m=F8ZC$8nJ D_=7p%rE)yI z4!53tqWRIEw%GY5; zdEB>bZDSx3h4{AUH)iAO=$1Sd`qkW?A)F6KXmVLk!oALVVY&9Xh4aFrt0_b?(7Hc= ztMgUz`H|wxRO;1#K!xkcsnJwcLz7WgEvtBv@>~1GAqBTI^Q()!Gc%_e7!B32+ 1+AVh 7cXC#7)nN-P5^KYks7b+n;39MHpCZsat+bwc2?RXvMil=R+G7x_#B!D=Ad zl$fA#y|LF+ga2y}4_}5UoU~##OeBLlf-EH-m4^>)C?=exNk_?-WKEEiuf*2D)>u&+ z!C{@pu0WwpJkOqfdw^~(L6(R@N(O)r0xArRBh*-tX*I)Mcs^rhq@kCruI`s}-!C+O zQeMlEE+|9_YDP=P4`#N2V;mR-h^~*)1N;OtcsuV)HDi@GpBtWt2pf03=A$D(A>+N6 zt+-m|Y*=YOP>K2;`@wEtEg{g-5sv+tO~rJ~Owxl-;9X10U2&U&xyLrbd^%!sY1hJT zJ=VUczC%*i9fg3TvbFM)0cBXn@Z=V&?^CgK{VMNSr$_-DO%K_@5~t{+#zsd5s=`Fr z6RzGP{$bCS?+vN4_MGy6e2t5=nfi0erqr95^8fnZJW2LZ_x<@o;c)T8+a=QEYNV?= z_b1r>;)#so(TDE|@nQu(Hw^?2arz2m&*4pG*&0?rAWKL}BIxjfK;rXh8Snt$Gx)O{ zx+xATBY=Z0s{}&@6tc+bE7eDLA$~;BznYGVs(M`R4^m3SR(>!s3Z1$4*x!uoGaa*K zwEhPqq(uJwo2qw^)G)g5oIPFI_o_GH+lQ&}4XB@2)^fTM-`88SqJ90J5AjIL3=6PM z<&b(nNylg*;#P0zNdlhHVv=G$v4G^ntckgw-B;gKd)Ll$#%>mP_c>V`Z5#dv%z0P0 zcXSTyFa17oWSl6A!Y7T#CL@5cD~!7*xIUT3TQr!~W%zbc0Z?E>Kbtt;7V^2H+Ui%i zLjDIJH)~YS9t;FtarFov=)FRZvRL;0Fz-LLDl@&-?YK(m6g`NE^oc_Jc~om43=3;a z;Co|bPf_a2_s~01jd_`tnVaeTb8cw5CXf60N*pBwP(szfh~|}sXCwr`#8F7i7~o)w z7F`b8tfBUuFp7imkG=NfiyQr8@yUYpE}4Rt%5$9~eKgrz0xk| SQIMEr4&NbnEqd4IEXnpQx=a521Y~^yG9xG^w 3qzM9eO=xp&) zTO=lNhD%C`kIK_%qmw<2`)Kp2`bm*Cpr?+8^U8c_lgZ2Q!)GVWkD7YjJC1w3>mRFB z1~hbk(%=+Y>Ou iVOc)~$5Uup;`KRtlS2iiwax$#3AFY=6Z&L7#I+aGpCsQD~5 zpHE$X_}n)MTG2Ya#1Qcz4^bX_n8`kb?cU39^^Z>dS0YHaUPR~H_Yn?)b1%!9%z`Xm zD}Q+_b6lz?l*DG&z 5I)X0oH!D5M}goYz9;DaNyZw z*j^F3^#FNxE6WSM>DKF7Q<)de T wON?QpfSO@)>(Y;6nmx-jNUi17P7|ZNv(h|p z;@kJmsfukA^QygnQ6)?n_rd18EAp4Y_rG5*6-#?wWqh|@^i25KSLaQ!|FPMh#?Sdc zw@BW@2xHhvIBq4%f^+)00%Z K7j3FGbvI12d7)*v9{2;0E;_57@ybI1-0j|p$ z7F~s2r6f+GK0~U@`oDe;d^7pbJ+hb=9w$b1FRmu3^ksf4=K!lTs!P?-QO(`!%D9P* zczORDj~7ikVz#EQv}2^AQE$%3acnd0lgh9A-W{W#YhcUvDVCDzNC3G0$*3}r)yiYk zboj~EbiUg@9 RA>OTKo2Xi* zS03Zk5}Jl4UH(i`%MSkXI^-Lxy++A=YH#^PkAShULWNIn-g0U}LgJ^y@3_>{Pi0mJ znzyBD=H;_wuAHv;T8x&PW0M-KTTTYkCvXKg)a#BP{i|Ld-TW!TG(SMP{VeBIr<6tL zq)@{}x38=Cxf?l7mWIY^S2ygGFQWuxhJ gd$$ zvejSVC$pdW=CH3-pZBJIbxKDT)iALrm+>vZb(-bB)wbeLD-<3&MHDn^OLML9RaLCs zbx!+4^db9I7X{gWWy_36o#CCI=*uKjtW;EX{wTlJtRhb;tj89I;zX!1qF2)Z{iv`n z!9aF6G=9szNW*33XE+%odJc_WwtzrzC!F8g=q1}b$EZnPS%c1#k#9LuQC&Xv39W0@ z#~5phL_3a>+VSK~Yf8rlYmFY%_Y;p>epGK;-ESYK*Ig7AlZf@KtY)v`oK>o43{*r} zii=El>$qD?U)MIt>M(NP&35k0lP9jx+@zbSo@5>*FYT5b6NgT?mfQ$EDpT-h5pByr zf=T+L1OBg))5%8%28gU^B%onK&FTSsK-_c=z^_NeV8Am)hND;OF#x2d&;t0jhw`_M z{duoH5KeY-r@#R5Z^$a6p (85F<>&8hKvGZD_`g_aFMF{EEZlSulM1!w% zx3hLTYA8vw$U%)04|zi)k7?~&K1?<}C*2m$P-9yMT?X4ur(bjDlm L=|1LHc0hpEDD`U0t0Ggp<{-< z+o#t&7lR4cA3nXMY^$M`N5olYUB56qUwSp+cbMn(R5R~ml%7J*H^Vk})j;18z3x@S z$$?~T%4N7--P?US{VvP#&A{wnf2(0gx1v5u^rb|g0Yn;{uJAAhq6N#TGetAwj+{`F ztlH(Z>9;Z82?!W@)@@R|o*?aPH->Bwzv?~Gig*MCymc80cfAQh<~AF& %O+XM zrW!sg0Jj`|1Uh!SX^1#LMoJ$I1f-yYRxA)j2fgN?D|1`82w7D4cXO{tZO@Z9ZGe`5 zj4Oud6@C~VDs+q2FOmB;D&`?5@*ARi5n?n&mar#F=oarp6fXxO $ }1wg^~fs&G E{O)F9;dnJu zmZex){!9C@Cr5+P_A@M*HV@&Gx}TGSn+i&pWc+^WD;_wzV|UcPU9_JMC_XYqWoq g$z_MxU*MEvR5$_;S3QmL1saau2F& zVq_xL9reI)BR(c>)Ha-3!lDKx89i(X=>Z6Oyjh5>ZE-X#0v@Cy9Z2y1Fo1=(c;k>y zqy*VbJ@1pY5kjF03|_CxH{V%iPW286-7VNKcUHY~&M%?ktZjU~?LSi0a4TlKdAT{` zrsYv>?b1-C`)uS>)mM(%17+f{(Q8?MuL;A47th}`MAwa;kh8z5Z4$R_Wt&hc<@2p- ztm?6ixo)?U1aoIyp`a9%I*Eq{KtabRDR@U_ASANersH@@l=OlKKMdTx77YUk6h^cD zX(AYbf$@;1Ntj{MtD?%eTa+7q`o|7!zwgEWV7gbQ#WKxo+&6JYk*NrBF^9=w27pO8 zIQSv?q-f9an+h!o_&YX)uaiY%T3)-PWJF3t9WPz9cYa3_-*Zl^k$-HMydu~Cz3|Xo z r3!#kK=bbI7TB-s`}G&N89N%?sB6Jf| DPmsc9gK$ z8V??`B#S0BhcxOc#H^wJukYry2K)|b2;8ue)^*9K>#mOmjhHf5Z7Nsq-=_|nx175F zdAWI?`FrrA()Duz56c(J#ETt8j9Xud-9pn2pUZ=vp^wV1W6a~JRF0PA@zd_uwj93c z{0+gz92b21;>jQ|gac3t;0KF1Svq|x7`g|QMPW1pQ^%z9G1bw7!tID21kanhU64cV z*+Mp_#)95C`ciY3zK3%!QTcI5{}!Ba*t`AuzM%W-^sKZ#Z$hBGhrx53+;=)pe-_JM zVC@eo2+8}Za*k!C)^@*d+}XFW4_qQ|F=HS`6ti%_u?zcQGjz=LfH)mYK3 {ncGPHzy2M_$iKhHI_c1~Cz%Y2(|a#u?ah 1cFNv|TZ?opQnYLPgQ-dKcNL zSi2{f {lfm}+HR5(j)`K^ z4GU3ksGH55cIAx;=QX`$*U04X!F=c?J(^G2yqR6Y)b!i)&dZI L6#WcCqRt^KbN8V{C ##s&MwasXX~XG!=+|i#8s>Sf5e1C(Ghjn z4i*nd&07V(PsUbqE2i*x1sVo%E=D-GvjHMU2cZw8x1j05Rz1s7h_VTzVnZ>?o>|*i zyr_~@O2V@Lg0Uu&uB^yn4%1hAl0|23HQ2crSDEwJG{ci@@^SoXoGtCGwEG0Kv%ro& zbznNImUN1QZoEvS$i<>kg{PU8mn6o~B|*NCtUjm}ohX%s@m~~500 E`weeQUj{rE{Cw(Zm=SUCMWL`%$7E;m=Xe&vxu&d|;oP z*V;Lq*Tv5{`rgaH*Kz!B-}L?P$T~#E7*qZ4g}2GkuMaKwovQ--hsejZ*!D}Yy1|v_ z1zJBlU&4f*FWd;5|8VAu8M-_COmZK4^t$PqB8zpk&7&&EVPn&|W%%@6#rxsQ>9YER zsz +ji-FV|1B!+@8`)y?Kt*>lS}o-0OAF`T{K) zKhYJgj3_1pC(q&lqb!; <&MCif;ra{Clx&xeBY-hhthKbvkp|7{essWQIcrn9p>kN;ql-Pw@+DBffuR;S`zP z-24xi=wiz0o8^d#d*GoSIEbwoDvU!Dd~uXDpuBQp)LE3WnAYa-_eI0y(Q(dIssJtZ zr-#p1+gtbi4`wfr57|uP{`!w-;wQ+R0bj33#B2cBroLQ1{S$EK33^5#9$*?K3$>=N zPY4Ug&ku}8 Fy`)%*5J{I%-WBzUkF9i) zvZuA&9D1W% #@Hs*;}% =HLF`&X$0 z$VEI~=*6;Ov^o=6wV{>qjr7c>>T`_M(0U5)agB1@Tv4c#FYOW$O$EBVOAK`lHV^6S zM#q&aws2>#(AV-ylUa5c@@rB@4CWM{yM4)!!ckOj;sY~ChYusy_PqYs+eNLstWPeT zRKG-is %ru0^a%6M@m ?C7v?$>{c)!BNAO4&Beb~B~(gjyT7t0j!2db_YO}sp5PYpAB z-G#BB8x!nWUXd>)vX86YjPqLOi+#9jU*|iWzIF0km`s4XKRn;^OpY}Y`RL#zfbos} zzI=3*b?cQO)w|uN#l5np$O^!ZU7i6ikOPVWG>Fn%`WCU5)ljJO3x)I`HP*XxbC3m_ zEyj-8*VK=AZ&QbI=Z++ b#I@ifVy%qqF|4cx`Nl2(?ke3MJ z$7fD_2F1;y2Y~)StS3Ej$X0@k^o}yDXr#M`yO=l8p)r{?Y|u*hxkItr>8FL~G9PNZ zK84@p&JFz vew(G%NsVuD{WAFB{kNu8 zqs3L7IR3K*0}rm?w9?7&MGvxJDQyuU7KNl#^`v#O3)ZaI(<0}X_nq8-^IN|Q9@QzL z# IJ*Zvr&DT>k{xhD5hXgK;DksK5o4#%Txb0ZnvPkhNAeqyy* zQB#rV#_9Q$tbq%?IQq&0LCg8M@~Ag*c&B9{NS%)HxVS^3#q+2dFZ&ymJw%seP(+Y# zV)@a2biA+jR^RySAwb8G?5^-Bi8#4*p;~zIlU$jo9R&y2qnoc^LFFn}msz%;9cPSm zEBaTnTbn{5Wlx)>CE3#Gv5KS8tL}T&>q seRot@S+6qZaex&y*G>xC56r);|l z*@D#F#}Ds}$f46=<8o-|`y&Z8O@1|q%0t8jv38*Lx>U4V^OOKuH8 UODoizQpFL5qL)tYr#Ge+(-~hlmfr6%;}ECM7^V z9!)*~Kqto@7LO^;h{q2mkjS?Ky*kZ-nQl0L8Y*w56o0iD^x61U+5xTfDB++U1#nyF z`wCe8IKNMQ{26Uk6le0r_SNn~_ZgH`T|OWIP?4|{NirTPW* M#GC1H2XiJ9qP$bO6}7C@Jf9M5dQJ5opwAv_-t&HQb<(v3(A5^}n2x3DqnQH5 zbB?0P-Wu2QjLat2nAVWgf(G=7Uwi1P>>ep{9OOqky)CZoZIQbUF TzyI zDwS9iqrZf+e)n0-JXFQ$jj!A!dT+pY?ry8S%RhT!DS)ZtJJrL2$EzP3j0D|Ar#(6vd4INo&&~?| zaQ;?NE%e>5wWA%mtcWa#nVklATs7FOm$Bx>f7rhm;;D@zTlUs8qI5{&qI%u(3<^NP z|7~;v7u*2@JZR_`5kar(fo_ANZ|jCza$eu*&VI&HTOT>;GrN7`ASp}F;?xm)z_>rZ z`IynQgybam9eu#y_xZgW`*S3xpt|Y<;n6FJeW$X>_IKMgEQ$w4R4=AB9Wdz#BG3R7 zQdIOIJU|>Jz*Jrh%)*vmmcPQC)_Od+*mvqW++HJgx+}F@&ZBfBZlXT^lBMz3Ervhy z2W?lV<=7h*+1$k+i0f(&pg^b{1SRKNY$m#>e%>x&+G@{}sFE3aJ6|9#3z{zNZO3{( zY7^WasmiHbyDZ<4%y;bdQWV>X6#J^0mHYZ+Rle&PGDtk6br1JkX7*I2Z`o_{vv?;O zYr}x~nNcDD2tpl C3a|P=Li8Qnzk>w?>~{<|Z3m`V`A0vcfIcHm~>qQ5u2A zI@>E8EPYGNGSqoy@VYjK*EDSUZK{f2ce=`KpKEVr-O{=COU)}0xM0*( zg#t@yrHDB*&AZ0Aq!Q?Dgw%iGp|_!93?zdFMf_98KztTeOB`+smK|AO&J^@oU;)xN zyc~=RIiKYynOg1O88Vo#0TAa8MB|Ra)POg(Po;~b>mg%>mam1YU2QLKU#{f@MSTb< z`|}w4a)R)q%J0#mZ>kdS5ICyyRYe({(^;M5^1dEP uj6ZSJZ8*hqoCT6kAl9ZhRN(xdt$K>m{`nJ)r|L6MJRxvy}Z5gxBkA-sx6^ zqU bkZ=9WY7%LzcEH4l##|F=HI_Fn>q z0&@U%nuvF_lL}93LadUxkxDynr!{XG`#u|jFt&L9-jDR9x(Mc$rO6EE&;4mzx7O=T z&pP*Wa$}F4r*pNW@RpuZl6$@V>6y4#KkV#Z@dA6$LNInRI@lBhKX3vhAmE!2NQ8N+ z*5p3(Y7=-@d~=XfY~6BBM%DRXBA^VfxAl+Xp58S+FYd^3VkE2IKTZcQMq%JyQTo+a z9y775d73?Yn};HucjfoNUF9hY7YXH#brtvj0fvob&$;hZWo&A_G~zdIkjIi<=pjT! zuD*0TOqD ##XBpFWB=j&6A%r=rTJ z--?9f731yPPz}o1gZsY7{U5HW>{K| FbKne`W`YxQwh!723^ z7u;}HCr{nPV$jn`Lqs`#*m+{VOl}hg(Fpe$lQ46-zBo3#P!20wWow XWX 73;^?@I9r WYhruPL{O--LtF~k6;ho#l3$qg^;;#=+GnMYt9EJ`y zvl2O$XJ3D%XPuR^r8vduUd7!!i1}M1+R _zbT4Jd(N3heY_E%Lob6@@e?`C5SVGS *aA={k^RzHg`zKf57SQ+~9gaACt4} z=k*5952KD=U4E?Cn49fOK54e)GO-(Z^Q59oN4d`1jAiPCkww3lGt0XA+y6K^%djTj zzm1O&K|m0d20^4#x}`g$B}O-l-jGHlrMtTsAuXd+q&r4zgn}>_B`pa2p8Nm2+Y63y z9NWF?`o?*FPL>X-`BaGS^Iy(an02bEA4}f*G}Ngbmk>Jt$;Ln?l_)17G0R6kSGd*X zj|EaFYzoO>Z>zp&B0rrpV|k#xwl!WPf}XgRMbEOi;GK`z?M82~)9{AW9L^Gu`~&h48bTT#Vs5Wu@CCc1Ulm;& zNAJ<>!HMhC_fr1gs|_ WBgI;P-xOofB;@(qc_Q=UmyR<@m;}9p0~8e$%P) z*r>J%EFk^+G xd2({39VDBuMbJ}W9UiBk z0Ql}WqC5kiZZi&KTPUeFIVw98tZ_rj%?IS;=bmOipCO=EQn+-JtevIy50TaL0NF^n z{^rw(!E~Q74vP6kQ~vTxkgxMWHt6h)&2n*b0*r8+aMo9Z8KAU^5)d`e&w$j(nLiTb zj*1q>5B+-g(w!@6%^-$CZ-mKOMG5~IDJRj0%h0<^BVPvvG?@?5U4u_-dPBu~n=_TR zs@Q$+RH7w(|2_zj$3WrjKSMY=sGGwfMtWbgVkev4EYY!0u8d@<7)NqOtEq{^r#mh@ zZtYjr5$^R5-CI;FEc4*HylFqx6OViEMJaq}Cq`suKFHct3!V?8{H2{QJKA*QT~IVi z)%mR_phc%8zDi1?cito`)2gh;bm5!1Sf1@(LT>V)a>rWfG-WTX=ja-XPt_g;&u@x@ zqR7zpZWS@*d9aa*OL;zY-%YIm>f$^Xd4#qrtiSC%FWOfz%{}^DEI+=)89<#&o)U -AsoOHwNDa+kk!E<-91Ru_`|y+-}z+Rl1EQar_~ %ZlL=hNI0WH9{sG{E{Q*RCK2;xh({;gBxyNql?df+KNZEGiTQlTu zU>4X{@ZxRe$7A*FV=y8W)#k7tu~xvW6behYr#AwZHK~>PQAR4z2ZU9W+`Q|E}sf zoBHRrPamjkg50`sn^_OIEPm1QFS~PEI;P8?DnpDlldbcRzQbT7wfD8b-ni~NbLB1Z z)2!CjtE3Q1@_iY_@xsSJcRLEd&}o9$y2ix!^?lJ8=e`%d{yVZM-$wQqLz<`OOy>Rr zCGgT_jlG^;^x5r`Vo8-!NtBA7HZoVLkBz;DRbj_kGM3r3p(W}@D4`W| azlrq JZjA#k}t|n59)z6kwbKTXxLkC%)gs$vEIF#78f)r(ezrQDp>IJ z^yhhzZ~yu{dYT({m!~s!ww~96!sPo(>a6_?q4S$G8(D}_m<229n;Py2>w9I(uSiSH z*&$$$Fb)Q5Ekn8lxpW9OIaKK`6Mqple?7@%URih1!(-w~PV=y3%m`|;#2a;XIQ&NQ z-unE{b#vGLENZtCW*PEaw>yw(JhXb;v-aUM)ewW(N0k
S2}v|I?L{iCLMJx8q!F1AsKItSJl;txMBIn*W~PO~d}E2K??+ z-9tRuPXuJG4= |-H1R{ql=YRhd)_@Y_EKpmWqch7CZXu61krv^#p}^ zDdhkclMR7f_&1!?2v?`sCLx$)ar^52bm6nTg|@XR_>osbVNu=s!K8(^Sd9@zs2O8= z5hM0<-))?C(M^pfE{_QmJAxBI*dCNVeKh{9x}~#De{{6mtW_BDYY2@Ajg71N55y?A z(SvE_EoCRoYAu5#OLwg3&J>%3!U7RnD`tx+ou?XE;Ru&^rYhI%yBm4>$;HbVNgKkz z)*N5|f3<= vB3vW;pyo4-1{W`pm$hTgcy zi%>zufryX8(OFeW_rlxql5r{d&;C{I@xgm5b~0_$VWm1t^?WRHLE^L9E;C)7Ssr z$Yd55ROmV$Sy6q7Jqmn$)LKI)3qK|u>TEt+>GjMriX%Ggj(mJbV*}~Y5Gv@>oI{;~ zWvQGk%e T~{Jw;3Y+~n+vunQ#hu88h9rMAat3l0RE0^7#0Hd*9+f2ku(M>esKTzKBdZ$qE zz(XJLefs0Qox~j(*$)f6yd>uD=UNZeDBk|k(K~A7M^7*6x<(e7zp+1IH^-o &n#uEk=+%RVZI~V|o;Pd9jDooX&ZFpUe{3{qV!8_&@e{ z1EGj6mx&vc;!#Rhhw9KlAcX{X1pgQ}>U~i_?ixqvF-yPa3$DPq+?xRR(?rZqnfv_; zxuy61!1XB6$9Z(~J5TkkoX5pTB{#R^dvQr5f-45x`o&pPzts-~C9?UQ{Edx<%^-u> z6|L~)QP$TI|6kxVvx2WzCO5a?&pF?JU(t;VW +VT1NU&gExBv7STxl({N+7T`oI>OYog6N(Q&%Chrq$2hw-haIeWSiNvVo9} z (ZBt%y@4hn;Zbe-qUT~ z_z)cTKPBQ6%aIhAI1!$#&Uvpp-%A1gBh~l0lCQ4n(8FxM-(@T{&E`cDf5T<3gwJ0_ zG@ltZ6w -E4 zmC 1s)uV7kVC)1PG6A8I;?J&m!Pb)GRFeq*9?l#!Tew3u*| z-=^YAW <2c0pIx`kswrCE5-tQaEq!+FH*?TeST4JmgUMaJoK $8v&k5I%&nX2z7gW zxgSbp+PceHk2T+Ih{S&JJ48*S>jNM-JSBNG`H$`itgPfD236g(>4b2$&Ukr>YW&nZ z;7kRjQ?uf~0?n{6hXV;FUvX2EG@jsnt?0&$Mzfl{*F$8*ROc?Qv3^IB(KS~|e#%zy ze-z&r3#ocjvfml&$j+G*Eu~udKI 44+MjqGXZyJTd@uwK}CC#UNLvXA<6QV`uAo>p7vEhXrR|8 zyOdqk1|gcmGOsnyB~a5!dzU8+^TkbH2&ZyWno;Lnh`#?o?uQHJQ~U_j=6GkqWnV(n z%-^+S-Rt3V&qBX9xO-l*@WIu-)%Og0R|V&c>HE#C#jH06!i(cINZ4epqETa)2i;ni z)6BKja0mF+b+Ynq4FWned3?2~6T^EB^%Y5WfZ~A7E@xdVr3*vOZcJpI2}f2UGCJx~ zb<9>h!#<(l{-}ejYVSYL^IynEP5GS1z6(bOQhI?y)^4T;lAteE!E+Zut^SP{(@P Q51FN|b94#Bkcj>oIReH~{}=&Lv9lwjBcF+Xv#JX-Um|3F-b zWf491uVCX(rcZ=R(kSL!tO>}|LH0OIPon3nf!p|hDJM7&2rJc<)4)&nJ<~$cr{~dq zVVByFqC?uTcK26G$7C;mxg{4{1z v zno8@n)iUfsU!g^j$JISILe{cw<+{*(*tX8han|~*Nip8$ETrbLni3|_WvM2fhE!MY z;1;GeS2gyoT2Wq)zO0UAKqiIe>|nSJMDw{!RH4ML1b3N4$LdxRsd6PTiZcu(K2YdI z{RUB(YVcRAHg(Vqzg)ZcTHt 8N5d;kz11QDRG z;ZLj+(m g1j5m~e4d2fpwb;G4YR_=%4d&Picx^?%Nq|Fl`dQxY1k^JDMcwL@rk z5B#b9^9f{m`=y16z3~UGX=80@ - zcDnuJjsRgSl5J0>&7Ed@7UwgKU>A`2QL5X=NiDV9mhrrIb8Q=j9akr3Tw2hEb&*ER zQ}}9;%;C?Iz=vhdjmbjh#7;^7_|O Zl)fIMf)jA*3_!f+-bHQ?@60z8svd|ZkW1yF_{C=$e+7fT>R>;m`R z9b2MvDtAEbYr@2jWV)3$+J9>9@eL0*mPMz{+Ia{|!HPxadtIi@KM!gRIiS a8X3C$uJ zewlNZ2C9Y1+=vj(&SsYDyz>h&lQ3uvD6ZLlG{?BLsdSO3+bpnF?A|TTNBQ(z#$xTu z6102^*^gnYV 5{cuSI@F3LMg-0c?e*CMO z*FpK+PZu}AiwdfojN^I6* hh?LKr8 zfL>dw9Av?!87N 0VE7&IO8A!3Rf=g%+?U%E8S67NqYTXD4fL3g3q zg1X5jiWR#URU>14HaY>bGLXpik?A9otvV1yPLe?Iisqr(Rc8wDdEECmUwpz7DdhA# zt+pl$%1Bs&7Z+K2gfRFt#Kd8nvG+wRFQu4()F3sc<=&TPR9&B)k4Tg1S3WzpmcTli zTSX!p3PiRi6w |fW| zcO2J}uRth(+{h3`ne&IpuOLD^mGN1VCV3x3r~+0demLlJT5Ns&cSD*XT&2WH?WmV5 zPvdBCJ`&-v0PsrU&}o?Rc(-i)xAp)pe0#qY=KvjZ!{0zLwGO|qPiA+{pnFhZ$5Eui zJUDX-ceW4>frtwZrqjuRUJ9u#;6|mgRq!dN|J9Urk9ch2H7A -j93Ih= zx1^}Jvx^&Nz`v}>Lns;JY&cg$RZ?x8`ke}5!iWw%L@co8Y}yWl1s{f=O}tLrs-!wY zDTZ&f9~M71afTMQ$^j?efGJA!_6e64ySdjdmQfL$LT=*)Oui%>@zkN-AHlx@9+LbN zmM10Tz`!4u=h*5v*pl9Gqp0V^B)8F4c`lUl$>LXcBD*m7Waif9y^*Jv#cFz({rv2r z2&es$RI>E~jGlqWg3UL&ReK%9xEkvFhrO{!0)+{ kg4soBT{ z)i_^GL@I&8 ?6a)be44{Hxq8J3Jr- ^ r9BzSyR~} zJ#wW7N#we)wo*UV2t!+MIa&D{T8s|Qp!W|)heBramUW1*e6$_#qCO0Ua@O_c`53r0 z*{5r(q>g&3XrX~CZ!F-xeYeP aQ4gC z@K|%EC5Fa(sr-v%@VZW4)62ouzz*@P+TFfwjQKi_F6L3o4OcD9@$`~v0~}3p?T3_2 zyX9XhiUhfpfbf9`A0Q_}K#mYZ0KCKrPhd?sdF80`VE4HBg E(^^M!~VxrSj=T z0M~}f(w(=1N*IsXe;}KaE2liAiWPDa!Y3&pJVHFcu|*gC6(@z#<(=y5&`ek-&n5c{ zzoE5vE-2@2R*4u`OQZ2=Hp)tfxF&t$oENa~7wB7mt-twN%Ga{TFVw-4^-to(&XV@l zEL!S~@H-LHxsQ6Ng 0)(f#h%i905(#vG1RoGb`&Q6@SBYP%H~xMr(cF;J3~(j-st!lQgk3 z;CBRy>bb%|P%VvEvDf^o5?Gss{Uzyyz-T*#xnnYAXiy xLY259NwSCSliQtc-#I+#mI3+s~&aro^JJS!N<@q+h?GR-wXnhiM zxf2aAZF2}uiLa)VU(jG77p@VU+MnZm2P5@$kmAkP>FyBR5Zu(2fhpK#T0c1`+@Iun z0bcywX(5TeR?(Dt9@(t8 A{ zVmhMqAYVI=%pPN^(4Mvnu!$=TUYc??Jp=ECJt#6CEIzaFM)7T)OGWO8>d{z5?j&HL zVIcv{MF>zU0XZ}|AdnnBNWSF}D4hitL>R75Zk=OqBMAJ(h+OOtaFT+69nt@bmowxD zCFsCOt3~6UDIG|9kZ8&^#EAi06yAMVb7Q?!>Y zPOb8ibav2O4&yTjKq=b)h&2 of8_=L+qiXliv zLv7+i>6P4Dv34r3-f^zo@;8U1zY?Sa@fn?BW~X_dhNc@izi%yb5`PSp{nZw1T^|%0 zHuFgpyc?#9K}c2Ke%pJ&g8dg0k60R>7QynP#z&21NJ6?QPY1Y5eT}>y^@8tLZ%?hh z@Lu`Ee}j4>f_-sz2gDvL?z_f^)ZG=^LON=fR{3{_1;-fQ&wID=YrfFj6J3k9_!~6e zFLAustF>hbuMpT6WO(9b_3E9?Qd!()m-v?Lxutg$6^c%ky}` oTnGnv_W)`hFXnv|1*8^Wud{L9JV#x;6b4y?Zz^1_FQxVd0Ewz zul%5Q7Dkt>Z%#ij`)CrKAVnZk%t3fLpC$P|_>8^&0t0YrahUK(fPk)WYrwJrME{W! zXfcuCx2eUsAKcz$)t*yz$*Kf?oLredMNVC)B(vPYZ@!#-^sth6x+_NOK3SH^FhjN+ zjt@|HX8_R*6YzE;pf*HUq&tFjfwWB~z7umCPY}1^_iK;a^~3Il2(~?0C?vn8s}PuX zyn`;e<&_C}t5e%>zM`zI4As555;A#f)&uu-?5=#VKPR&GU`j@{?90MpyJx#8c)N8^ zYW3B3yZ{@AK#?$~w}G|4o1_s-iT;~0ERW{|g+~&A!}wb`6X40W5hReaCZ9-%w8tg< zs;Uni&ak6w%-wk_tWWr(#93ef$VjCj`Ot6okV^Xn%{!`T_MS#?2D-?e3$f9})v#`~ z=sivCI-PC3XrX-3AO?J(l~sP`>Qnnzo&B5=-zA4yV-X-qC|5j(wIrilMcp|Uf4ik6 zv+> J;_~(tTfse-*Ux%T5W1J)>jt}!v5Z!qJpfPLk zbf5|9R;E1_v|EZp!u7Ok{XL-p+Uq^*$p*(gzy)Ww0_~o$ z)Pqe|D=8g*&pY;6@+>dzdeiGdY7{V7ehC!{5$4({IfT1*0wXj3x)6u{vvzd4b~ FCS9D4MzjJ2b5fc;W6$ij@#s>k{G(}{%wId-g zDGA5LW3pp%`F}eZ#j_NAYwK{(gLEqM>UkgqT4r7RW@R={R0eOHVZ6D{f~v|RuTwLf zCUxITSmxt-eE!4l@AxMS;w;RxKdVrwHdnZtJu~{?V!LK!0$!S=!Zfr(&?Ng+8=UtE zr$LWvrIJ0Z&WG#)KlBwQ+w#wUAcMzD&+9T$Q|wp$TH-GZJWrV~c^RuTu7ipw4rG0* zsGV!kA}mI1AZq~}CIEF#NJ9{E)I0ic*9mehv}!TQuu*S6neFiBG-hSkGoX1FEWvu_ z8b`n|rH4yF0uasss~igx3qHaByb(mw@gz$|ultd*1vc4_88EQ}AA|Xxx(??&d>)<4 z6Ti*;T?aCj=>5VcYVyI}ZIP9UbpJ)S4$a!J!S1xsUVE58@5jmE!`r^uH}4qbFMI-= z1vmHXS=sq)%^h{NA2lQ;?exV#&q*p3@uqjrdk3eej-^66+ui6QJtB7cGI!vue-Foc z6Nd|@jH2dN)mieb%$h4DhabnRX%ENOUtCyFZo>bZlO=X97TgWPeJg#EU8;g})?GWB z>o^$`8m_zAFW=DW^i_P=S)=r{MPp^wZ-QVdpW&@w_Z5rLH1?8wBO=K6e*}_5Ggv;N zbN(n{$I2TRV%^WFn@7V{MX1?jQnt{0-7z34B00$N-VnM70ryL2prFp{HZPW1n#_#j zS|P)qb+P&f=!?;Yx^C`KhT9WtHENCLVZDmSf|{1Qkw`3epm8rcF5n7NJ=4Mq|NTwo z;wvDl7Sc`?VwwfHq((U7y#m>P1&DLx0PGS7PcmV-kZQgz`nl=Hs~I#=l&9*pyV~Tc zF!gc9UTn@vz=(aOljHn#0H1kLZnwAqEek%2db%~>u0*NfycQ$a9;jojDeNvC+>;r4 z`C}>ZO7FB&`MOCLs&u@3Et6ba ^o0Zg(C~A93wqFPYFWfx-sVx%V{Gxeplga)& zkR%k&!bG4VXAjtzK!P?vvH?gAHvw2@0`A-&3W5RvkbxkJ(%m^d^V3@epOVyENVt>E zOPBW(6*LbBOmdFLDy@bu4xi@Tkl_sl`ckui(n%B&6 Pp3``)`3$Zw_X6Swn=7KLSn{K1V^#I4KulngE1(R*~wEJ0u3=DAWYM;8xJ^+95+ zpA`aiG6P!+g2#Vu1bj(fxSr;^C`zpil #b=hv1@!jUwpUipZ63 zqurWI3uf9(OZ=$bhKTf>VgDV2kiMTss{8x(q@%|nv&y6rPbI2lHWmtoz0Nu}{v|Ry zIQ4tXi}k+#=B8M?xI$MnK+G9pHojO*tJ1h@wxMiBrDQ;vfbI0Zx%ocrF>SLr_iXL+ zF2#xa0ymniCxbIIXtyzF-b(g!_NTQJc3Dn<98Xb35u4xwD91qmlVVZZ0BUI#Tp|#N zG(sSp5XD3)`~Xk_D_OGvyaAF|DHWfAx-V7AYI!~QkWp3P+xo6Wn-$b+QhO9;wCk|6 zB_^*?r)pA+Mp(c#dqgZNb}sh+14-O@{t8&y5xj}&=n>X+^qxoxkx>+yg1*|YgkA}( z&@^EJvm3a$T~>J{1^H#;<12gK?J{)LYb&fQq_&=g#;936jS`$Sr561F0)>M>)+|7j z3_zNEk^;<@L2?grW6it%_NqU9J?Y69dF`1MFEiQNlXJ-E*w_0RDuoNjy#Ei>C@tDT zFOZPb9lXezPaF#(`Ty|3k(m^t%2yM_%ubAMBn=izhAEdG1$^NtGwxcbfJ4@9T|HQcYYSz07!R?asgS-)atA8F& zW^)E&emi+)@O;{8QQOz+i=2Cpv4mk>K@Hh^u@qW$vk!t7J62gCo@T}y;J?m6M->^; z-oN_Qf`9Ix=@Xf}8dnN0OmciFWxzE1q~N14E&dM<-4({6>p#5`-7@)&e{WXD{bCqA zR~@SIHy{o5+`j(74k0t*u(M2=PT$FM|Mruw9cyA%=Ec;0B<^cn*u@=H#^Mbww=to~ zS}?6Z0P>^VIOKU|fLJ+pIHv46>pxKB9bTU+UGfW6b}>H_akR;6um!~7B0wgndG2x@ z926370-0^KcdKt5t{cvrzZ9QnkEi4jY161@-spc%#3L~fFEQN-H62jIym<>V4u)g< zHKBYx8*d(N6p%G0*xN3X3%q2(!?!5|3@ecUBjP(v_xT2u#w_2@*4yPiA@jXMjM}tg z-{ATejCtLLe7)qO8U4*LlKX-_Nar>Z|A*|skeo0G1i}TLK8|qQ*RpMU`+1#n=!M>I zNedR{_=_^WmtyRmCxsj3?mEwUn18=<@3FwzTC11~ebo3N2BF=n3W3 }H+bb7ZD}T&@g9xOP_>_l)KXtXQW2 z+3k$~tUjf0hr)Nd_iO9VMkPDc*KqYT#y>mv-iAE%(l?RToLZ{l({TR`;~*_HI}o3s zy-ajf7^9cMT(!|R?@9j$ibpw_=-n}fm`7NWr7sqt;S#I H9l z +>VDW9cmBGg0*%KN06Uudq-Uw?mkn!4l8T*qAkUGS^dA{g0Y;Avw<4|hZQ zt4tf_7X|UK2mWY#bt5tL%nfz9pODF^bw23eC(dHB>q_P!6|r2-H*q5tuaLGb _7q=W17eSDd#;KJfNfj%Qjq=7wP={UN$W2?A8tnljXhA;Zn!I}x1-dRHaTpO{b ziZYEHj3CB6`0pa54qhIQBQ;>}Z9kk^!7PVE?ZWiko+J+hczHp 3 z0o R6o*tTLf+eAY_5s~k+Iu&t;1h+rM+(>i6c6L=R l!^w zRI0a&R=4hiU0lZF9nF*5ZwEJ8%nu7c{OI+cT3L~G34FOp`M!HPO!;|Y`|WVs-o4Gf zwVa*~KFIwEfY5v?p!kSIX$oUCrQn-QCUhh+wo*sqhJ!fwe6d^yrk*T_*5>)+ +?Xk+%s{cQQ-Xopv}FipR)X46 TY0YjW{MujdMZE KhRfzGGkdHv8_3r-^gWU-$GZeTk>=BJio4MBiBXOrTc+zN>gWpwr=FD z+hy2LQM9<=>wW={FyRPJ#n*5FL442%DHlFZk}16^on`h+rq1obqz8L0-24E+H{ZDK zzsR==GZ`fnbG5v^Vz?N(dQNrW^xBUXkLXASzTH&$$Yf2#{>;#60Q#{GZOmJm)bIv^ z=aKNSK!$RUj8ig<@qVi80^-{|@*!oCeQDD|?7<61uU^Jcx+Y^`D`&@T?qtTkh!qi{ zyvDXI^8qsYqL1Qq8AF|tG*EE2 lD+286Y{vnvF;aP}&-AE88vHnY8^i8^mnP(QPnVJYSP& zo(&59B$;o&Gm;Q^`ZsDVG|bO8?}hM6CTKvpc|YLgjg%MWt}f>tNm=R5ZQ* z1#sGwYy|bFp8!yy6cDa8t&+WcxCTIze+Qgh4$MrWt@`VDMhECg{RT18o>F_tO7EY# z#k4EP!SgoL=P70Yn4F1RNULR}JKmS;@N)%>fe)6?u1CuvmT=O+9Gji_RmS67f3Z?C z?Wug%G>2UZyIS!IwD!VNH0OyNz?{YvL^lLUFRA&F@%VuyCF%T{u0HWEQ!a7Y6u~|a zgIAvKzFoZz@a;X{45@=Wjb^n~WW6Ni({ZarXht6++z Aii@I zHDA-a9@r=%miO$|9X`w5ovl|8(D!){m8@+T$X+Up`Ein00O2+$aCbIcxUA+~qiM6s zr%dj0=t2n+_UPtqk@{7 tc|`5^8H(e7?{{{KPN{zp0vI2L4e>M{ zIa{wwe`wg{eWU;P;396vT%aQnW4h{V&T&wrFjQZKD%W4|57ADQq};Poxu-Aj7}IPX z{jLsfFBw7M%UM%{b$xQ4WVcQ=9LLxmg&zYIiSZJiK) z=4VnL;PI!Ne~x>M?>etnhV1N-;i0bg*2?6!#C2M}{*B|{-sJK+IZtH>?el;7Khw^m zBWm~`3F~*SU#ps{%Aj2uCB^^Q3N==I>GgQCqicH5EBu~+mo;X{{EuJJVVj4AB@#IS zmiV4{O-TZ~js&=01e0v)Ab|9rLb&jQnvki?2IwyZm_WD$_#`BS!Xs4R)bU5tkWAAp zPl!h@KYdxjmjS8hzW}Dh3yoD(3fP*Xzw7lCvO3c1{B-;5hVOcF*EWGgSCK2N1VBdv z-39@!08@{O2%P*uLI583u>W&|M!q9Yvk?0v*rf6r&I>J3hd-Nn#f KT HE(JFKZ9O=kDxsMyzi@sdiU#X z-7>ei9wJHlOT64#e2r+I_o@wdu2DV-; owIUB3*cOu(8D z#DXJ0m?vNl3Mb85EXmaBM%PLQUHk{4j6G`ENleSVk)Rs=7ey ZrB%g?;;AZKP~}Uln} JCW8e@fR^~z0J|$cuEH_$$12hcywE`+2;DQCL@j&%x9X^tglszBv_;;U^ zYVyc*<&@fM@^C_6hBKd;MimnDUN1m&JUYL$9P_J^u5WeQXcm^L^X?+__8sBa%?D}) zbp;%9eV^7p=@+KW18;07Bo#zXXbMOzl{XC*Qk{Q`X9&uSw8;p^=AL! HhYVfXQ-iR$&I$T(=?`jv1TxEq&C0syTO&q868l!WF zmP?HbkjS= %VOXc`eT(h0DPN!Z-@o{xI|9tc8;^<$s>SLTk1&r9 z)rW*@1UOzlTJJ^(=MERRCB?wc=S|ow`LJXT$kydX;^Lh8PacQd1{wT3W{`wD^bLkb z-y?k sQ&l>!8^Clna@`fAj=D0aP a<7G(Qr{*wx>JZ_xl8~$Qg1GXvu4gy}2z`O{2#Ivb`-QE`l zKcBobZY EpT8Ptcdq=O;2-N0Y5eLjwr>qpd;sK)?#{tNHLDONrX^j$xRO z1EE0vXH6qJ94}K?pr}{kbfjv@h;N|5l*InASJBl!Omb(7^MwbZ A= zbN^_DhzLBNJQ`p#Ocz>;-p*R8Tb>fl_VMob^A+){dY@A-Rev~NC>qb~+fh^Xz)Lv6 zZ%i>thONfo1^Icg-E|PmgKBv3;{G7`irr@FWxk7-b;91S=C2y>v^p-^RYO*SHfMjw zUf{Wsy?SV|-9aC*)y5@8yLh?|9_owPO%lw(9AZ5J(u&>6np^{amTQv9O8Slj*|dpl z_m~Sp-J7VyQs29_qxhQ25LO>TJceNdgR*&Ed5I472SBRZpsSGq!xV3)778Ls{~zd0 z!y|-2;oNz|V7+_8?JxtC8q|t-=0IfXKajR}konQc)M8p@{XgTc)g9K0?27a{>wkpR z4vVcwq +7`rg*{Y;%-_BG%+M``AKyeaNZKLxRcwGA 7HfmS$ga1wOy6TIg8w+`-bL# zs{6V-;+@XD @~Lj zVjP_IS2)me^2G*TvRSZf!gAys-c)PG^Go|RXuKiYlRf=;-!H?&_$i#|0Z5Jz5Ua@H zy;3TBLd{GK1ZV=&T@@94oRV-7d rQHU-BEV7og6jer9kN+CRP5; zi?{u#SV(ipr(>y*Sv^CIMgU|K-J@fR>G;Asm0yO^QdO37Z_Y1|cbFU;9OkFXewZ6= zm`ocR$ElI_IPHk1fO#xqXtcq}c$Pr(lf(#5Y_l-^q#oDB$LnEe&n|aD$O~&E%mZv* z(DN$8{r&2nmv4+w7uNMI