From ce630db2886b651c648b597eeee12d3ee1cb0a01 Mon Sep 17 00:00:00 2001 From: CircleCI updater Date: Tue, 8 Mar 2022 13:03:43 +0000 Subject: [PATCH] automatic site/doc update [skip ci] --- docs/articles/tutorial.html | 4 ++-- docs/articles/tutorial.pdf | Bin 326341 -> 326341 bytes docs/examples/report.html | 2 +- docs/handbook_bd/FCCalc.html | 8 +++---- docs/handbook_bd/TPs.html | 4 ++-- docs/handbook_bd/advanced.html | 4 ++-- docs/handbook_bd/annotation.html | 4 ++-- docs/handbook_bd/componentization.html | 4 ++-- docs/handbook_bd/features.html | 4 ++-- docs/handbook_bd/handbook.pdf | Bin 2256327 -> 2253468 bytes .../initiating-a-sets-workflow.html | 4 ++-- docs/handbook_bd/inspecting-results.html | 20 +++++++++--------- docs/handbook_bd/introduction-1.html | 4 ++-- docs/handbook_bd/search_index.json | 2 +- docs/handbook_bd/setsAdducts.html | 4 ++-- docs/handbook_bd/subset.html | 4 ++-- docs/handbook_bd/visualization.html | 8 +++---- docs/handbook_bd/workflow-concepts.html | 4 ++-- docs/pkgdown.yml | 2 +- docs/reference/patRoon.pdf | Bin 739821 -> 739821 bytes 20 files changed, 43 insertions(+), 43 deletions(-) diff --git a/docs/articles/tutorial.html b/docs/articles/tutorial.html index cc5314936..02efd931d 100644 --- a/docs/articles/tutorial.html +++ b/docs/articles/tutorial.html @@ -154,8 +154,8 @@

Introduction - +
+

Data diff --git a/docs/articles/tutorial.pdf b/docs/articles/tutorial.pdf index c08dbae9820e8e059545f323946dfa6224bcdf77..dd46a01b13f0074887491c83af4bdda650704cb4 100644 GIT binary patch delta 5405 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 report - patRoon — Tue Mar 8 11:20:38 2022 + patRoon — Tue Mar 8 12:54:12 2022 diff --git a/docs/handbook_bd/FCCalc.html b/docs/handbook_bd/FCCalc.html index 8656ce724..99d560148 100644 --- a/docs/handbook_bd/FCCalc.html +++ b/docs/handbook_bd/FCCalc.html @@ -358,14 +358,14 @@

8.8 Fold changes
myFCParams <- getFCParams(c("solvent-pos", "standard-pos")) # compare solvent/standard
diff --git a/docs/handbook_bd/TPs.html b/docs/handbook_bd/TPs.html
index eed149f32..0578b1ac4 100644
--- a/docs/handbook_bd/TPs.html
+++ b/docs/handbook_bd/TPs.html
@@ -339,8 +339,8 @@ 

7 Transformation product screening

This chapter describes the various functionality for screening of transformation products (TPs), which are introduced since patRoon 2.0. Screening for TPs, i.e. chemicals that are formed from a parent chemical by e.g. chemical or biological processes, has broad applications. For this reason, the TP screening related functionality is designed to be flexible, thus allowing one to use a workflow that is best suited for a particular study.

Regardless, the TP screening workflow in patRoon can be roughly summarized as follows:

-
- +
+
  • Parent screening During this step a common patRoon workflow is used to screen for the parent chemicals of interest. This could be a full non-target analysis with compound annotation or a relative simple suspect or target screening.
  • Obtaining TPs Data is obtained of potential TPs for the parents of interest. The TPs may originate from a library or predicted in-silico. Note that in some workflows this step is omitted (discussed later).
  • diff --git a/docs/handbook_bd/advanced.html b/docs/handbook_bd/advanced.html index 15d5b592c..21874d128 100644 --- a/docs/handbook_bd/advanced.html +++ b/docs/handbook_bd/advanced.html @@ -365,8 +365,8 @@

    6.5.1 Initiating a sets workflow fGroups <- makeSet(fGroupsPos, fGroupsNeg, groupAlgo = "openms", adducts = c("[M+H]+", "[M-H]-"))

Visually, this workflow looks like this:

-
- +
+

Of course, any other processing steps on the feature groups data such as subsetting and visually checking features are also possible before the sets workflow is initiated. Furthermore, it is also possible to perform adduct annotations prior to grouping, which is an alternative way to improve neutralization to what was discussed before.

diff --git a/docs/handbook_bd/annotation.html b/docs/handbook_bd/annotation.html index 76360bdc4..4ac36524f 100644 --- a/docs/handbook_bd/annotation.html +++ b/docs/handbook_bd/annotation.html @@ -338,8 +338,8 @@

4.6 Annotation

The annotation consists of collecting MS peak lists and then formula and/or compound annotation:

-
- +
+

Note that compound annotation is normally not dependent upon formula annotation. However, formula data can be used to improve ranking of candidates afterwards by the addFormulaScoring() function, which will be discussed later in this section. Furthermore, suspect annotation is not mandatory, and may use data from peak lists, formulae and/or comounds.

4.6.1 MS peak lists

diff --git a/docs/handbook_bd/componentization.html b/docs/handbook_bd/componentization.html index 5fbbccecd..8122a6984 100644 --- a/docs/handbook_bd/componentization.html +++ b/docs/handbook_bd/componentization.html @@ -469,8 +469,8 @@

4.4.1 Features with similar chrom

4.4.2 Homologues series

Homologues series can be automatically detected by interfacing with the nontarget R package. Components are made from feature groups that show increasing m/z and retention time values. Series are first detected within each replicate group. Afterwards, series from all replicates are linked in case (partial) overlap occurs and this overlap consists of the same feature groups (see figure below). Linked series are then finally merged if this will not cause any conflicts with other series: such a conflict typically occurs when two series are not only linked to each other.

-
- +
+

Figure 4.2: Linking of homologues series top: partial overlap and will be linked; bottom: no linkage due to different feature in overlapping series.

diff --git a/docs/handbook_bd/features.html b/docs/handbook_bd/features.html index 408e62b16..79b4777f9 100644 --- a/docs/handbook_bd/features.html +++ b/docs/handbook_bd/features.html @@ -338,8 +338,8 @@

4.3 Features

Collecting features from the analyses consists of finding all features, grouping them across analyses (optionally after retention time alignment), and if desired suspect screening:

-
- +
+

4.3.1 Finding and grouping features

Several algorithms are available for finding features. These are listed in the table below alongside their usage and general remarks.

diff --git a/docs/handbook_bd/handbook.pdf b/docs/handbook_bd/handbook.pdf index b882c7507a1d986d58a3a336ace87bb61f4847fd..684672d3f8481e02b56f7402b4a99730583f8f73 100644 GIT binary patch delta 275533 zcmX_nbyU;;|NST_NkKvplMJW-GE@1*90*>z33z3kPZYC``x<$W;qu4uIk1hha~IBm+qZ{;sjZD&1m-uM zP7i%|9g*C=BBM=C86!x?sjL?pCxGJt3afJ85^cG_&2!2zd2=s3@|4|BB!A?2px07L z{RUsHuX!LstN$P`uscRCx8r>!7vYf7i`e$-xbI6Px2;A(OhI4q4;i~wj=b<*Dj4?c zT17nJqjBS{aC(*v?)PZT2R5r-Z&Dg41en4}H9wC(eH^dM z9NZDp1;W=+U#Hm)R2yb`fNT-5yYDtwu>FFZ(tYbKwRMI?2Lf!)gu>zHaravDjblwuwbRjnFGmj{W3$Z%6jbnsP17p83f*(n{NDyuc{ni)oM|NeW0 zPw7GNgT+Z0ul?mSVk?5sfUn;sz6iB^7>Mkm z6UH-at$(@yC8A)&*Hur?IC^KD@}Pso$R`pfuV6pUJ7$EL2D*<}GVc*I#<+ zPBsH*4oI*iMZ=_%h)?EL_lc%0RhBlR%~~SkW(3p8+QfX31Ys@FH(zsSGz3 z0jIr4On%4egL{^yEt#%p4YR0^s0pC5Zx}42Jf7f6=53^<-pi2Y$#l#Yl}IOfX(MN7 z|1vC3V3_{ggWJWpMh9nG>goG^qU36BWG;gidy4(+fl&y#Bqs^G0I6ZGEm2)==Vr7M z+1o#^Lz7lBMk?gXahs03o~KIt$UF&q)IKS?3LIYQ8(+ zR`p;bJ1Jz{x|hGAHnWYU>QEo5^BC`dq6W^&r}A6 zh=&*&dYXH>g}n``kJx;s{T+Fazr}veP4ZGN8LAJUIpB)Vz+QOwFws(7oUd@2;o<4i z?O|X4LZ23Z0pGLTCvRIT2tRy#{cT*~l&FpU8c@0HAv&@$aa33ho(7{u)EBl_37Ng1 zTt4xX9eECwQQ^B8=+(({`U|NAa5{ynB4Qzbxs z_bJvhz5Rxn>lzC@1QmC@5O;EV=5D#GNKW&L^@cg7Vdp&AVvyiLD9=2>9q!$M@D47Bpo~z4Uf|PzHC@~X-kQ(0`d!1y${@U;DN%@JAjn|dE3<-2Dv@Rk_ zcF@sV5W$%O;?X*1D26GIt>EZ=vnr$NI<%~euiN)WQI4W$0r}o!`K!=PU z#WkIuR7LGXjlIf@UxK7zTyLD_`2Eb06~ANa^sRqDBhOb|Qm}0&hV6u2&YVY+Mz^Z! zqL5!8*PpL#vQ`_yD=jOSF)Df%XctU>qGxw?K)X0^=EGi6?WwMd%3U4BQ0ktCqN7&l z{a?CiJW{be!A2FC%enl-4^U@=FyMoJmt+x*kiUpnv%yeCoPR}ItTtyV`?D%dVu$d& zAJPFXqJJboPDj+Q8}KWa_Bt~@t}y>g3%^e6m}74=GqV~=5b95%k! zs#h+&K8`@|_OZemoOn0u9*STjv2^F6$)NC);;6kRsgl_1fG(cjREaDx?_NG;9EJbe z#*$dwg76!WF$YD+;+?WDx#KOmg}e(!W(c5DGB3#byE&f2?}b#{x2_>XI~Wv31MOLa zVMl*0LE9Te3{2LT7S^Vd48%d?RMP`1qh`oUUo4asw)zp$I5iKlmHc(k<3MN}(Uoi_ zHqG1ea7W?C8C(Wi2sdMC=V*iJfUR*{0}eEBS?;;waI)`yY}AUXfM; zw9C+;_UfhTYi+;JV=W9hgwgA|@fY>D_fjFxn7s$!x?_6O*_mUWWOL<_9Mp9@Ekcv5 z!_qZzhs$R(ugjOhQr37UvftBdVQ{R6W1bq&F;rLAx1{}wyGu#v7o}+**L#YT)7c>Y=jw^`_wPz(+V96 zSiN6@AD2PveU<oU&?5u^m}Qj1Z$&2`dd1ES!`GVjrYm)C-5!}AKXevy}Hj|`;jtoD?Q zQLZTIJMty|hp!EI9r%>onq0txZp|0i8RSL`{t;;`srzV!ftwu zSbWB!>X}aM!6q-iulZgLP`TbbAXPT_Ug03FnK<7df&|0{2RB1sHh~f!Cu`#Z%@I64qHg7 zY0|xi*SSZ~#zhP;cF-brH9lwW$@p?&Yl;95)q$pc*mM*6V0xtn{kLcZrKIGsmI?~KLw6QSC(oE{REy+e(N@{ z%|rZy=O9FFgEx;cl{AjrC(7qW9fY5L4|zJto7~KBX)-8NS=6~5Eib#kB+hq}{o`6= z22LL4r&u!iUmo0o9DemKUMcicn_}r4zPSRc&Gy^{lUpe3_+7@&wJ$o29tv|DtKq!D zmDmW>biOd9X#sez6+dIeYpNkKeWneKlV2e2vg+Wfuk1Z#oy|%@ka=37sFT)&A`m4h zmo!3hf0H?=#iGEjN%_}PQ_}SLq`=+D5kdrQ<^9((-cHI#ti?>TC-k`YgqDe+qcdO% zDCthyqrc)1L5=ByQhu@dR)|}YhyGeEbZIkAH!I$zH0W}|G=k-v7Y z{0iD~DCPV47F6arG2w`Y{DVsTyD)Kx2WU*R>}P|Tpqn~rXch~(Hv2KIgwNv|9r*ii4CkY;ZptEE_8wpBJUzx8xST=S zW$nME^ND&+=V+T(bI%vzPd9;$HjhK7-5m?jcweu)k~`W-W0GG$NVx&S9YM?^E#$Hm z%JAU%TA9Pz@^I^4KFBl!>EmbW+oJbv2rqtg&atxEFlho3C8t(cvIcae^$HwO-_1xi zni206(n+TVdZJUR!RBkUEgP9Ev|>fS7$<~tbx7chMdbS*$ogDMBbIz;FAsUz&#l!x zqi&?vfutD)YYZ=n73h8r# zd$eH^{adP<@=`|2N@`due@72AZ^zQDrq%Dv)V9$4dVUBkt`kxpQ@C(3V-9of#Ymy& z)*PA5p4XUsf(iBmZD%YE>h=u$j!Co17|FEpzO8}cNTTEL4BW?`_7rOQv5BkK_SuET zEfG(O#8$#+fQstoXaaJW&tFw|YaVPfAPV09=d_G-)jT5G>v;{YD*Wd}+GhEAl;X-j zRn3yO1-C295KIEkDo!|1>61Bj)cnCD-)100##8;*p+%E|Lx%XiC;1b%)Nfn*9(YfW zL6^!jvG4w^T~bG$VO!d%r`{`wI>-R#Hk(?Q$2-Vk;1LAqkmnC~UoSaN;!F@Rkk~ec>L@+&a+9jx@qx0`wk9sRt;2r zxI&0cgooMCpW-o`EH&_u0v)smM%zLQkku{+V3eHsc3L$vAvZZG{q%y4tuO!lQ+-Y@ z4UYlVOTRIjGMx>H6OTL@fr;hPvE}93%bVNFx_ln@6)P(`&EQU5En0mZY!@5Zxcw0k zH8nAQ-qbEJj8#1$;mT9YKIS=+wFB_* zVGgaiw&yif)w$nCoo%f|k_)oX!wJ?7*8WX9J+p^)An&h0Z6rz>pCzQ5oNY$F{{r_l z>qpE?V)m%Iy`yYhm7&9KY8+S>+r=xkX6CQV%)rW0d&Dh>Sd4Dc&2*6BL6;*<+(?_& zT*d*YxL_s`>Y)5l_}6*{wMrLM5wpPr~0r~R&H}XEV zY)vJc5d8xi%*B{Vljm3WR&Y<$Pm|AxvgxL{ep1`N2-ORFHjBvbmUz%jk~#W62-m+e z#kR1@Pi3qAGRp?&bCKSU@E_Xy}U;nI2J%;a3Lt>-fpEmGe7sTV;yldL-Eojx=j{_|vKf0=b ze+%jaN)i6clwL)%#_F6`jS{wh6l?AWv_S2Nsq!zYtQbyW!f!#qBaAVs&&2c=M7vjy z7(&?$7#s0PTT;=ch-Mia|?<~uK^Br%j|bFMcPl! zq_EXd-8-S7RWTGm+S zk^uxqO}GXG^1#d?UZLO(@9`~YWgGLjXT^~c(M1^HCk|vUMOg4nBwE>T`Tgt;c`6p^ zVifZEFJ)e4UU2DA)H2dlE7;A~bkLE&OY_>GRq2V+P+ops_qvofu4=H0w@?L}8_QPP z7DEV_2Y}A+={5SEz;8GfZb6rVmoVY8$2JPp=MT1SL8O?Y!CO!~bM|u0(E;x&e9m-L zplGd~dU+mUYGm5-D^7SQkK$z#E1MgB+zU`Om%`A|f%mn_E>P=ufValXXeTnX_iLe{ zDq6etXWf0jTHeOM%6?B0k0Vc3&{~tiy!tuD8g+5dx7OW?GDF2^)FkFrPgr;eE5*$l z_g^0qKpJuMtm|?dKlmxPORO#N7Dg6S(BHd>^GwLfIPjBk$YnCoGFTR^iv`hrH_45zBXx!_;rOOu^hNgDv(ax?`BdiOAydj%=Hx-`gVOla3e ztW>CKP#L9_ggo<-y(8&$am`iIxQ&dwUnHL8lT^Z$5Zbnda|LODk7$`Pt?fXfl2^aj zjN7Tr>H0N3b_q*$Q`<&un^vA!^xEA(i)Rb*UPUPJPD(Xieqc(R)8B2syAh1JAT z0e)^M;5V4^7G&r33Op$$+xZfB`b|j~C-5>>h?`?^-_Rv9Z{x!W*xir&7WC~0md}e< zNdj^BEgv0d9WUJCsexPSMX$TXHZq)nS^7ZF0-O2|EentxwQ(w9og*CGIl9yl%7?w0=^K za=8W7>p=WA_M1fj#JBVC>2^C&zpM6%h0DhCLrF93 zFj{oYGYtCprVvYYM7ftnF%L-GcdebNf6U;M~W@_deM)O%UFPB|P4FLWD_rQI$BUcq<5tIRmEeaV_}`RthT*DVOitpYP^lSNG1{aL|wbo7}J zPu$79f;6C2M+JF&fSlVuNNQxP(M%QxE~bL5@>33Uj)ZufeLKh zksAD1cHPqSkxcE5J zl9P3@?D;RI0n37MY(*Qc4z}u=BB#cUXEh+(gZ3`fg|WOs-VcI5eO5elL&)n$B+KbL zGD61*t4MRIv7D*HLORmNu7sa%7HkOFo+a^jZu}bYg#2@a(lMEf(OqHd zeGGO<QIe~CS%%B5MCT!0j6O|aAJ%mm3 zhiPe*dLyIJ;$S>qK+-3AhkyW;sVSpY|MZEGnK?{-{o<}4<_WVVFuka-5`1yM#FQK& zexP;D{xP(RP6V;sv`dv@9m^789X)q7$`Byj&Etmhpf%B-hiyqOZ(hDX_?v;NcV?0&MFF#_>T`FKzrz)|i z!V_#cFjf@;dQ1xOy#)yjAa@PU9iP=uEt^HRjLyu9YcPCj8nf&&XD>IIEgDRe!A2%~(+6UT)_pSzj-@WN!XuVpQ&!fjvu^ zJ#{WxU6?ISi!JS{8cS-5k{?_H4vyBiznHw97i*xNTKr8aaLL}N{Qg1g=7O?x#~%mb zK->MFwvt32;G6ZRu%^Rd<=j|=&e;EI}^&6;9m?l;;RZE!>T zR?~@OIE3;}(V@1-l2LY~&ysja(~>DlNuL7#;5)*{-n79LEWrq#!GjqQ$soU%JoDgJ z?7yQ)jp>6QWG)c&4Q#XG*=H{46kRHYpSiqWsxyuZ5eX@mEv(5oO#mk(MI*`>tJN~R zFl2I{o*4NwE40c-c^4Mnf;dL^z`xBE#@pD@4rGQZP3k4ap;8KB8Ub&F_Pd_T2LT@` z?LW1rD$I^zNvu&S=WH$Y-@0Tfn~)e6x_GswEf$6;*x(my;;s)8|GHF%tUgJ@+x+h4 zOF}sWJQQ*_MX?~2j_rJn-X>M_In&EV6a5%{xL;0ugII}^?$z2uKj9t_j@{DN=bRQ7 zDBEGDV*obbO$t&y8^$3|-nR`;0%niD9PK?SfcejSf;P_d14zBQNrf{Qumrx%B*ES4 zu{_gM2W4V=-hm?JDj8YOe z_=24ivl|%nARSXH>-pu2P5DH0NOg%xCRgKBT)3I3n*TvQI#wn&$h%Xs$#D>W;QL8Xa#dd2$YT<~7C@1_pxAElOG110uVP!S3z^Ii_`sapq;1#N}5b z!`1X3gyMTN%v1_J7UO2Fs%#p74(b1XU&bGsS%B_Zt1i!(=%7LUYcpr5PEj=~5dtg) zh~9q5q zevJ0h_#!uDLhT&4o7oQU##$@bFVB(o0G03_dl;El5<)pRa|HH_PwD9-@JvVgab|g= z*-o5Z1xrpEIm_Irg1#7=r(S!Gh8;^UkKrMoRY{Kwm`3{r!T*pMDp&a%X@s-<}- z1XQlJ+1hPApG@Hd1LZ@ z_~`b6ZqmoUxZ?rpuaxXhJj`vpRD@~pBET_u6S>6av}hNeUc$9pn$6bcXzJe=p&sRu+OLucmwcGKcgdWhXQ+kp zTp10Q$MYHoQ+PG2G>(Y_URK6$AJBgIH`m3Q&9(PKS?>pfu@=vZE#6ZZ+MVe_#+r}$ z47>$tw&goz3}<4yig|iFH4}4Xx+J`1XeA`)olEn?y>9};`V+k8No6(SmB99J&d~bA z+T~71s?4{BtO<#D!C#Fl*eHZPAs;^|_wz=1s)fE2=0Ew@Mqdp9?9{Rm#PxKsu<9O{ zA^4L=F5I)5;kDlAp(DZ&SXD+wA*MppWyZdjy9Va%0#7PQYO_#GXnfSt%(j8u$ZYeF zlW(_eUkUcHhIKNdIWNNGtSsz3f7yw2`Iikl98#q7X~-#ZRs1ZjGVbbF@O&uUL82g* zi@rbtt7$S`uT}w8uTbr3=6^Dyk+sTA4<0H=H%zSIE+WgGaZJ;9yD+Cv0(WEh%GX;^ zZ6kWjcHNPD$yP?<8+#CP*xn*{mOUvQaz8dMR`F|ugNTYJ@8PHj()k#^iRE0YOesy( z^RiWpf zyiRmc4&PRp71U4tSZ>>- zo2Ana(l=%2i z`+!4YkpbuxKCWcA~0PxNn3v;IDST z-?WFEoU4k|(`Kf}OpkZ0bLZx3mo6qw!o7+~*Mc$o$qwmm7)=u92k1sQ(O*kui|SU6 zPrCBOlALPKi+Fz%MOaq8_3p#lG~l6F#PfzE_hbU@7;TdG5$vks>HO4d<2bFHqOT>!7#ZX(D9mk8onJ+9td^8t?wh@%tM%hbQ_B38O4d)IIx6%l zYX!APgD5M1d-r?s1zoOI)E$mICOIus#ff@~_w*I3L4+V-CgNY%znxNTb|%fIY620X zX3KyLa^4bJtyJh`4|m*~8MTU>V41EpWA2rZsjEmE&dg7#Hg4-px&`gXtIPE$#wXyc z;j#S~Sg!>n!8J+AkZkOjynIzvU43UvxvmPKK7-}SgOTk66c z4>e$A%t%!@nnOPLTFOtN24&uADd=ZWhUlGfG2;=gv!u$1I)i>TkH@qIt#E68G9t__>v!@4+i zwl|j1_CMrO`VBbwx&@r;ok3a3A8XNFdEkF)0LiixOvj&t)T91$Vb&&7!cUd?`a|JC z2#A}LzML?iI}gTMUB6zho4HzC=54&LfYjESrR###fjbsW5bEl(3e@b?{y>bLDScsM z-P83SDT8DKM%`cQXl*HJ_(VvsJYKNQWir5O*kfIN+HL-h@&J|FIR13<5A{MXKn?cU zqLH2$F7YQIGC0J`hVUEsZxBF#ntH$|upaZyU*TOGkpa>)_P)-rbbU0(s4Ql+GJw#6 zrS5KH)Dwf2B3()IlemEceD3o`eEj<@8XpWP3;M0I9^OA(;ld}{4iuN>q_PSqflc`d z^{$zVe@tl{5wmkuQ&LYl4xg4ZKh`iuMP_@HFWuRKHXT#N{#MuWEqU3pHSx6@^@fYQ z4)M_?W@neaYZnLp>qk-M%n`4q+!Je%Q z=lSECqQhH|6&%5*Q`_fk&R5W3*H7$56~2iFhm3f)jmg7YLez~nX5UE? zn2{6pN6mP2lQnSBUa=x`vE=&WtYax&gTK?pmsk^(Cai&w71b2_PqAr~^qF0sV?ZF! z$18v!iZGa=m!u^N_sLS?screkCT^u#cv_S1jxTe}Rt9ZM*Cb#NQxmFgatjhKT&g)$ z(A$-5ZYbsdnB~nHLZ8swT%rF$CQj=mIE$IGePtaSoWV783(a?ek(=K_!_NlBs{n#_0N^Ckl<{9_f z@5PX}N<;gd%3pGV6G5K$nhW@7YBprFv%Rp)K;d%^2NH=QHdDRtwh$* zeG}8gIX6f9#e>><`__>?ENSCi+T@8$Sp3SJ_Z%GgD_H_HT4J8J$td;lGDuc0gp3EI z>O>gNvKq9^xoPdT%+SX89`guYxh6e)F7w#%}z#56UqQo)77hd(X@^n8!G|9UoQ3|^+2 zUf$<58O*u7n+3r-zEA(tDGkX;Nm5DxYzTBbY}cUjSWFSlrEQTu|~q1FrGV#tN8D*wxlavJzeyEx)8!@Djx7cR)K zV}edLJQioN8+}*#K*i4QD^q_$?|9GFC&PgES{0$%*IVqak)N@HVCGW=gw{%L)Eb0T zw{D8Re8p_y_1uE8vZ@r13lYHcf~O-PK=13nM2yAbK8BFu{Y#rioH<&HbxAw2;ag*n?r~hvF(T^RXkl|cVR=ccclgk>D+pX84^VyYL(>kvhGg{C2$bOy_7>9|iniuW_5EE)oKyP|=gfl8h=24I9y z%of%hHdx#2I03C^-E;Rn$4FqC&g7P6R%p^ZzUA0TG-c*V$cRtUjrE^XJFI7ziFY5+ zwAuWrb`bvY%7PTv)EPcVftD8SHZY0lqrkOAy`OJAgxPwX{I0^|vt_BB-EaJ3z_s$A zL%4z2ZT+0N$DE@U2>_vowU7Ep3925l$~EriE@a@G!M9bgB<|O5l&-a*Gg&OtWzc>O zSpI`NllP_#v5pV9KYAv}{Q39KI!=rKN3bwav}glt9K)L%-iN{$7M&Kel9se?nc-jc0z37-uua#o3Dk;~h1dp!`_6+H$|^yY_s>aLuBv1kixAmHr2uJEqkYV%}>! zSZ(hSs77DEyp}IwgRxzhWPT$xO&zkou8H~`@!>5lO_beI$z2Ss#*ecwWR8H`XIFBxPH4;vH961Rb zEKSR`&=oG`^6=WZBpBv+f?eXkf-iEydH+$o`_IH50GPnpBLX&8f+e9qHlODsx93|V*Zk$xp7kME zVuxHzsg0G-oXY4eW9ohkCk!19j|^{~_N*)fukJY(AQMKYm0ceYgi~F|d&r(qa~45G8AYkrZK1p5tMAN!zi~ z??)ps0NhV`a=jHrUSF~|Q_;;5y{_F7x2qQ^D)eGRjf5d(y}&5z>^KF$L&=Z%ThTo+ zZ>dPcz8@BBLD_nF8m3>=PPOD5p_`eV@0OkV3M&;euv$4CFTvHD#h&EAjkjQP9zagS z?rEsduMg#{9bHKz-~rXA7kplXoVnxUtkSm*<*~(jl-fo7-98Y%Mvea#q&Vm@ zB##@O9TJtiw(N0*O=r0~(D~<}oN%r?ROZ_nnj98EtgIl;-oD;E9gdFppVVw(zw5u& zjvG<~fkf2ux!KB3RW=e-Q;1|QjCLhLd-CwZkMamH=l8Sor4co_k)>6tCC%H?FNTkK zY1B$is}<4U)jRnc2&pM~#m$~(t2>eywh?!bv~fMNw(x3QfR5DM2=J>)uB)Gi^h&nB zj)!>vgK0=&uEo|7ZuT-pZ~S)r3lN6wuM-g`P3=lnml(7<(zMr{_$IvVc~>b~z5D8Q z{f~dHoylqM&kw|$%;n-`LbMyLv{L`9s&L|^U52z5-@NK%)GQ;8-g{fo@Cu>s=D5YX z37;3m5?vyz&x>jsfk|CeY&VJ*q?}#Y5V)ozabJ}3Rc2)|h4_1(4S}J|A51@`LjqQCY!$5$!+pS)sIr|4VIdF&)> zL??n^agzFDL=me6F`g5<6R9d5w{E4WEvpBi_?ctKoy=W63iIiW$Di@($$~kv*^R%R zMpczi{UIE^|Kj(Uj9M{gN4oLz{J9mNQrhH5e52n~M~2 z>FAiPAFva$Zv*tT5WQ67bJ}y8UM=)9x}NqB6SbC!oCx!1uEh<#@2r`*EP_eL5XgVXbcUfCzxoy3V+3v?nPpZVF>{QR}fB)W8+|MiO=nyY|AlkVG=4V(u zpHgU?!`i^Q{Rm+j+WM|?qEQn21sOIPZ40NHQiU4}=D@k;(7@f}Xu14446HZ{&P{CD7!cg=M9P19Jro!0jsOQ!El-eOtXGIc%=h^nw1u{q#iA1WIF zx_?V>MTp>XaIc$YI_$%HwJXcvPL}FGm=BF4T@1rKzE5UOS?vau@^XvOIyWW3#XY_r zvrtW7RbgKc<+|?vqY=3ra5gw-6VAPsLNU8jo-M9y{j-%?%|3_ zmo(bST2{?5ZNG6f?pF(OQ)T&tXjwL3Y-^=*vS_7fvRh5DpVK3$^1@{5B5dQ-aEz`U zsdj{*(1;jnL_7OBGGA;=md2{Aed_V@jKnhUEt89@?)$yUvAZJMuOuE{)~=45HjGSq zxB4DeFVP~yipQUKti#6JLqwDQ4f5BF>Hz;u|1wgh;xgo6^Jcb=2vkF1@=p#B&O0HC z8_x9;xBaEU%2(#fU5pia&v*UCfCZrvtbg#O7sDXH07}7>6V20vr?~TUZY0X)uAdyX zLljoR(`tbGz)D&&lw;!b`oXVPOq0h{L@&i6yj^mPQ=LX=4TOd?Jrs+HNQ5s(!;ORe zCw+mzLt@lj0?^2y*aNRhGlE_R`mV~|MeZDj|ZZ7 zsR@@tr~g9NcRrz?+!(7ZA=5Pot2wc@cXjxF#8xk_7xwhMB?Ar)xg;wu^@votdiQdT zL0S3dC64J+254XI4wkHOMr=&H;^b3f5cSdr2gMRRs<(J43)`_VTaN*GHS-p|9W}8< zxJT^;q^YfCU@2}N`bu4}NSpg*3FOk-y?y2S$&QjYw051D-pjM=cu}j0)Ey-eZ(+;6 zS><1FJg~MqPF&CDSW7QA9{dF_n3-iY;%xN$66?4;x2bK&;`qGIbbHkS4T3IUo=N;r zssD$S2|4-BGoRxT;$>sxRg}RT|C;y5hAdiV#_waHDf@6XR+jbAKlsJr7!Z61p`m;W>TV-M zmDL_B$P}bQJ}D)xhFSTBQdY(W!tV+5tUhWqWPoJHoS30t1|4`2AhGaN)Qs%_bBUfWv!2$n;?c*R_ z-`u1DAKUL64V*uW)3SYBZ>XfRC_qeaxc9ZiZ{s6oT)3Yt{-otqRHlq`*SH7Z+Ir9w zzO+<^z}C$;B3kHIGb98VOlA5yG_xKhCyA(a>f1ogKc3oUSnj$s7YZn`t-A~Ap!Jd8 zy4nf+*zI%Bj&ExxzLZ%S1%!(mIOXCwgWQ-1Ur2%O-Vc}}Xe+Y!botxkieJq`%s~BO zi01SQxsxwr31>u2%11qaT}?y4gR9u#-NO$~FSdWlS+*$)RaL2+`hPL3i7ztnbS$x- zK#m!IPK;ACW)wexAKclr_$Nru1N)WczIe5o&~E20&bdQNrDzqaKvh4#@;C6|u?oBp zbHcxIb`Mc<0~4KP4uQrmo$h~j4RL(oQO|i@I9>#gtO>2L|606Lu=rjXu%_d#5dPOV zB6{%Zn@>qWoxK|dc6MSyPX9}HD_GN5QLRYXz&XLESKCJ%U0CcKrvn}~>;-~++J7&H z$rOgvme@!5mdV(>wzWJS?zZ@D4C?vX@ca?$!j6UgUG7rsHtd}XM z_N0x<;OBYGo@PiCZuUoiP>8`2G@^!E{l6&c(M{4p8^GabI@97>Jj>ow@V&&!iY<_V zQeohN-r(NrAH1eNo%HCpQ=wlfz*%dhR}2z{hC*@8;WdWd&!4s3fa3r`PPw7B?7*V1 zHwT}S)5n1H!*~<(y?re-Co_h+L>VoKe4t!~>Xwjy*2D)qNr6Re|?@7 zi}H}_1|p5qx#*wWROkLPFn>}*X@oGH>r@D&@5DQFo}8)>5|Y9V#|jULK30~clGEhT z)QyK+weHuM^3&Ft9zu!3x~IDJ6Ya_mHR^XS>K&D4iT=QOZgTEi6)g~S0!rREE~mbF zBeBDA|IaY!W+9kCt|OAxi76oVO+$Yd$(ac+kd|mXo>ufmQ^ceoT|<7SM9i9afLixk zwW)ZnLIxPkWr%q&-@RNB+I{(@eB589Gx<0+f4A9%{H4YHJP>{WULc5?fDNQSu8?Ja zrFj>m41o^IINrtVMZ98OwB1bf+bz9cHIBp=Y3i>vBlULSQLm{W+dPmHhHveej5*2y zlBJ6~h^YMGkZcRlc{7uR?lBDrkFa6XSOCw!??9qECl-SBF_MXKku~4KCeIWrsXKyTo?)KGWF_9WzX+H?3%R1 zN)A5$J2zj=U}Xzc^bE{qvlME%sgsoby=uL`r+-(u23mL8RaMf=+6ETw%SN-|DHgv5 zj^f^aXL@J| z4_SYIPw=}-<7!2Uw}9a&z@Tv~vF^`G_VF^l%4NembOc5Iu+8RMBBNN^=0$vR)4Umt zyTcCRD3SRuA2WH2g1y~`m{()t5BOZYEk}f!*QKK>ql++{XkW|Bvb*;*QS99(b}}5X z0RL2Fb?V`l^~8dJjFglLX+>{@*QniHF3!dg!P~`Lv)uJuvKvbWOdhzC@+%S~UueW- zerH*U6k-X)(IKh0PZE9Do@A%rt@~?TT1`zNb0J=<*k@6;%x@-6fiYpXS3|94rVN9* zg5L9huiUV9GrpCeyE4!8xB7zWC#&tLQm4^i<{Bs^B5)FVvHnWk+c%p|h|s{P-cVe22{g@$0!-X`)@2vD*C9 z*)rU`^(wAdjo0jE|1MJ)eF3GsNyUQDaN}=p$NVG#6>*OPM zS18^VM!%W9Dj6h@w%e!GtXuZJV1oGbtWf<1^+#$RQCil)<4$Vh{MVQX_|7P?6hIZ! zp*K`nf1Y^Y0J&tXhAdtWFPiPg*ZsNy0!0utLK8iP?c(Yt*T-d9O?$pqMqD}JH%`|d z{-+?5dpJnH1N9gNWJz~B6@x;>DU+dI)Ye0+duw$K*Y;z%l-ZO8;=3-tv0|8Wx0yTY zWv@LM{d$ITPjt&aXW2o%?GtZwomFtYfJv<-%!VCnGhy9A+btbT`~CL^Uj1(f?R-f( z|I$kxfa6B%aZViuf?Nip9sT&v4w&DK=h=9zOHx)nXWJyYZv`~7Fffb63B4R4Dt)t4 zs6+d#@Lrm~K?zch?-MCiP#K?uKt|DIbhJoBWO8wwhW}Es$({XY;QC*Fg$7{a>?oNP z8;!uyG&ZL3`r7+jj;mQGcB)YG{WDIzvuBCfki1uqkp}T@SKzKz55$O>mPQqFtWIJ~ z%wjdk=-|y8ysDy3m1hq!yM|Ui)G4H2-CW(Bg%NZjiMhsezd4Vlr4D8^W@+k+&SCS` zR9U6`$I8e1=Gj(sl_ShlpNv~Ml1=^fG9*}*&1F&q>c~ZS7r5ZGmWB3! z88CDsZ+wqwFtvWGrhcw1$)KI5wG4=p5+p_AT|Zh&{*E)2^4ai;JiU-K)r3=h=4*L( z__}j!OtRQ3SGW|b-2E=+l~l-GR`wP|Z5q@zBVd!btfl@+BCSA_=H=_cPj7jC&Hh_#mUQP@Wger5F3Rze)Jl^sb9+89dR+Ia{Pcd| z;c9Au?j&}H0(5e@2iEU$Lv+0S!p<2LyE`i31Q>jt$BgbB3Fj*HguIm|PB zeF=O}9Uj1?S@+y(+zWr zeZHjx+I;nNe=z^l0fO6Yw`K>T)t?<5q@N+!Rz5SmWDef&dTq|rdbgbI`s|+R+XJ(x zo<87Deig7s0)M_|+UV&Uq8+qYd+uPZ{pi6D57Gk^ov}PmmC>1ddy6EaoWZ+}AmE!p zO_to^`(jVRi_%AE`H_a-{LKii-y=>UvVTu}G!OOS9d63X2UpwX_sVyFqyBn2FkSmK z`QKdpMZp50vaP6FP>?v$8B9X`dig#Ayd2yr+5r(8luCNQpnuG+lPC7!2kzGZy=o}C zpWjUtuxje(g(|n?)r z|6}Ss!AjaIReCQ{RirV1-i&&VTi;@OrA{LO0hm6dITtgZB9 z67EMih7?h7m509|(w+V(7;)vK@@ko*>_hs!@rDP%pR`|<&JPwm;Ul-;|2MlOC*u>h zT%b2pPQHY;^kHa{9XtbyMgbonn+e`C(~p4*GEPWn`yxi_)kfY*`jjVbPZZL4-YvGB zI`zob-5i=9vGAW~P)7_#%(GPaj{F&9->UfiVJ$*Oj9K~Co{716oB;Dyy4$B8(*g_9 zzi)WE^lW5dfo3QC6He76`c&7>s%KePVyx+LgFJm0w@Sk8EKG$i@&SlDL#=)V?eCOa zcm``;#`vOt95{dHsZ58dg(z)OCdGGu|LS!Osu7)&;557X715IkKh{`;5;zNU@?u&$ z)QHDXyL`ftdA(F!agvh#yt22Yl*5L&iHP>@{Uo5Wnlw}wRO00ecguZ3P8+gj951bh z&a39XEIO+wpqKM^MMi+r`h4e01hya6cZnJW7FL1qifKC61rN4n1?OZDSLh)_*-=@n zx*J%qh?BO%rj*(?&lMw^*&WNlXm`HQ>=vyMAx_Bp=0KezouB;e3q9pRu)SvBnMat4 za%fTU!&qe-@9uty_=<~><9pvz?<6j+@A4Xb`AZa7D^ag`dMgj?07A}=oBwr{Q2^{E z*j0*S7ZTAxHPdW`o0BUF$wS)?3}^8P=Wjf zt0E0+5dGdO%l>}qGDlbnCJL!**SX78(^=1Z^FdVVjZ4;Gr30~yRv5|VIe)|(lBfq1 z%QvB010j4o=?NJJ)!AGwxp%`eH^zL=~Ix zlqT_I_IIYqASuHU*{qh=q9v>-8h3CC?;k%PPe;=)mN$L*sfBeDmoAWz+iG)O3r zyYKF5MO%%e^w0PhOZxhE04DJbPJM9~-L8IpONr~SFyfr2Xw}OeS+qRE2|;RW*w~jd zy{uNPfgp=>8ZtIc?EtiPO4NW7g_?cD4Xt`qU*Z z=0A$oCJNEzLm7&B=}VmV*>r4&pxlR!fqj0$Jf2)1$jj`ARB)gj>Qh|8|>~Q275f5>!J-*8g|7q@)h`Al-@L=ytNYbH2D+;5ChFn zq#T}C`+`0o&*t}7MVL#HgwV^I?Us(wl2YkVl|LOsXFUY<$h`S-H+b&6$l1oktcS+Q zxBL!6j*f>CQqlj38CCbvAi$P#*3Gymej_gz;UVyCet#~rV0x3;>&fgORY`+}cdy91 zN8CB-L}eea3z?7uXxXh`${}%};ohSDNC`e{)sD@2;6D4rN>{g_R9FvT#f2)tVikQj zzl0$$-dLLG5E5j^M9J}CK9~MRtO!5tP}H@oYUOhz5LRMRp|Nvw{e^Z0-rlkp78dGZ zebE@(m1ka7;9SE{SFV&JT(}?Plj&-yX6?-EMb|p)D&?{b0x*Ly&(njI^gV|rf)s}!Owp*qyKq*JHK1@ zJ<5T#pxui1teEaYvE8@giTH$-X++I5NOGC|cXZzcD+%ix|IPeu#YZ*roVZ1&sjdh`aeC$1ng zSEgO}$Sj|&y~S;FW5Q=}Q~yNh5)&+PVNVbok(=c?Gid)Qsn7UTn`hvSep_#we4@pHUn<9lSq^6I#Bg?G;>`F0ur&+T zSki}(yPDW-u}E1@Ka#c`ggsS?-?>-T6{2xPZHF^ot>=SL$zDKtuj~A20L#J<8@h97 z7bw;uFm5k_5+B=Z)i}}*F==_abYXBR!H_BiqHrj+e${)nC&k*>US+eLuKvJUk9UDr zJVjvwQrX-U3Go*RHVDG-(LLZGmF~+}hM3vc`kIWH#C<$O188=}E)+7)SM_hrYBsEd5@Xoptr-nG2MP6-uP`muL{IT{pS876}6Sp)sVls;p~H z<6m`8m-bfZO2Eb{zLmzn!YtjC#inO5W7B)bI$&FOO7riX=q}oimjVr3FkIboaA7*# z-OT4})+kT*5kB=(pUKRI? zh2lBF4mC)g(6q+l1t1;In@F#Ir?Zc)|Nd?#RpIaY5J7_akMeS9O^TJ%`*x=aWJ9=T zk4tZyqu4*@xl5ET;|DJ;fYp&UdNsH=?_zTL=OP}xB;pZ1W!pGV=y?Jim#xKOC_p<0DD=D5c#B=S8#;}{ zb*B7h&O#Hs2>&XiBmmtJ)OIp8X)CBVE>Ysaw*P3ohi-{aXVMCIoSioPkyD6R67-;8 zY8QRzIwh}`7iM6>5Siw}S2Ft|xq82Pt`PONyET+*{&G3rBq1wJJ|O`uGo)#~-&as(3?U(~EiKT5 zUGZ){p3w&`_RI01QwGXA<&Xtdmd- zJiNcvN$R%ZLX2XvLVp}T7TKqA^O|&%_qPt&VLcMtd-gmx_O@itcVb7{z#UEG9?&cV zIP^+PmYoC*?~6YTH2};%^owp?yO^oGQLQ_pb&Xfex`RgJN$r61!ErV_gz@B6PF-*1 zEMQX~5)T$tl#1j@-mxW6d6Q^L1ql_osC@aUXfecHSdw8jM%JD=F`sX_`>F>x&;-KO zNqu_ZgY=VBuPiC!k%Vt06vfQ2j2m$A`+W~UsqKp!FyqbnO3a(8dd*M?@{OnnNtJ1* zMC^Wk_a(eCtBL2ODOwd4c$!p(yA%Z)Vz>I#r1O~3V+Ul9b86o6?<_SvuJjl%Nv-cX zmQ{kH`i=`{fL(*-bzxx9-XB zxekXU`O90X9~5t&+-BcsS%TZcf{C|yWvpfRTpj-bY(35u!a)YqV#A|Ni?_w^i#=S4hyA0^Tny?9 z1{C1ty^0vJVy_>6i5?de7j^;#hABM;l*6+>kLo*IM?F!P_EHDR%)MQZYNEw&#TB>75Pr#v5Q4I z34^{mskOEOgk@)}>_k6gC_qhh@rkXFMfT^1WFm)SQJaH9;(Boj4VenaG@7xGe3o%v zJ_{FggA=}OSjPN;g$G_}ApT(FClpC>5SE3pUMptcHE=iE;e2zOk8ZV?awT?-iCntA z3txQl9*o@nU`zbElU#JeI52fHO{w%*B!iOV3*2Fm^uo1pEnXD0XDn)ee|=0MudXiH zCMD$yyOmR7Z$oLPXkRA^EUkkkkTl`j=BR+`Uh0W@q~R3*yx(}TTQHg-pfhpxnBOQo zXM2g=)yy-&b+`^A%UB{DuiIp?eCwe_V*cIsy9HSh7aC_TgvURY0`mcI(}+{UhPsh` z`$4oPLPS$Eki?Kphxhg;&)><#nnIeo)_NPmiPi~uMZ@t?@pZ0MBQ~-l2697r$s2x(ZWYW7c%DqwQRxxr{QwpwHI8C zX#}k;4~f1>_x=iZBEB_w&!2+n_u2vNbcPV#Wt!Jj2G357zK@cuCU+4ZIPYz>yWJ;~4lw(a2NWf`8JD^23L9Fy zE7YFsP)NvS+8Z>7SHl|-UFz+#{u(&L;=EZ^usoVx(y6+)@Zn5r$EH=ZppDyMS~4+k zcC}SP@Ot4!2EB@XDc~rczFS~77vQfy79}vp|0d^0T-%&OaPDIslsxJI7spbB(!&Juz>Od1e zFcH1uLVrCjRYw@kQ|Ax;C31G)Ox$j=Ihz&1WN%L@RE(Hr4E>3Qx3RBB`ONQ%z@Z}& zU-gyWRgrdmT#T?V`PL?5|JhxT?OuoCH;O^_fVcVw08@IcXFm{o$$+RgN(`8cd{9@ zfe?=oQ3+&UF3-{Ku#uSIOhMNIS8?30UDyMYqGr{qGe0Har=Ik0tBqdSz(wE!W0y?m z^oi0L+-)W$r4UQNsD%b^nInWvYQ)__!eMsM9E$Z35WrY30( zhtM`CEZ`|kW?VNgrc3s9*NgBy4vL;?*Sgl2Igeudi_S|qO)QlgQ*%A^%f{D_)}#Lj z>3>Xcolcg0E;M~s%lBt*)XDJ5!d5imZdT*+^+Q_pPXUT)fT(N&hUZx)FiMZKU)_Yz zG*|(|?CD?Lz-33uT}{b}qhOWXtSgIWibwY$appiPx8Nvv$`l4rz51li$K{`NDTh*} zAuC{>;|wJuriJ(PSIn0TSJ~!sJ^M=}OGqEAiAI!dsBwAr{qT@XDApXLvbsAK>gQ*O zOZCWCl?SGycXCoQ1$#w0&);loBIT|?(u?gpOEAw67!V$L8T6YciewdGib-y&!s~Bq+EqVL;aPp zzeJ2*E>+PuEsfahKT+IDXbIN=*}R5a@))JR08yA}tl7@c$)7+hI4L#2d!Jb0VZf3Y z@_cHhneO?WxUL!-$Z)YhkofYXBihJSHGKNE=vfHB?v~r{T`H22iCl(2wi2Xj~9K6yTnAm zR~NU^wf+UK9W8OYEzkEmE63AXs343l!bEpJBm=^PD>Z8MnQk+SexWVuL@w#Bd!(sH zU#NIdp0~^|;b)S%oD=B2${9Q5u{@W5p&RTpMldhb8|J7@LuhmqY~DO^qP(VlZ^o*Y z*PGM+CFwO#wRe2?VYK3KUI}Zl#P&HbR*64V==ZcrmoIgQ&XBXN@QUA?UqMyqJF&Kl z(StyJwaUW(OsD>b4kQ%@o)pnLZeVMmI3apSy5rN^t#XC<0_DD zVa6Jx;PEBg$oldRnD|40=294?8Y^BwbG%8iT`)S>PP1{fy&)dxszc;#?5y&Pn z716Sx$49r)N$VGb6~)PPh;uBs(WQGE*Tv&q9|)PD_Tjm#^Mo_9fB$GFcAli=~fFHtj^C%kv8BT z@TqX)#N#r{2dMw(lR>7jfN=d9b4#3{)SLH#iT_B=(g9Y<{Gy_=n>fn6Jg%DjiX|yT zEvge2GJ;m9gyUfu=vf4%ba-t(Z58n`v=}ZjB48!vIHMhs zCFMafpjkrQnFLdh5YZa9LEy&3G$EGm~2x}@1KCK!6}KOQEQ2RzT;mQVh$ z{_ppbBU~b$f=)k4x`ahYVALdWHk(b^)w%IFHO1IwHm|I&9MCmFHt87~IQDtt3wwX1JWh}) zor)CmXvG|DCcpoY$j^LA+cnga@~c9A!h$0qQL&598#ZCIgTZNA;^x~z9`>4#t&Sq( zxP2zvd?duG&j_eDQ6?*`>+INiJw6pAdVpfYqwR`!@%J- zDHkEeLuna4r%8UN-c6SAVab6UTsL<>@C|qoLR+cQD%K}MP1|9%p3nNQL7~bfxKi%| zrl0d|3Y&6-4^8!C^O5o!XIMG%L?I;NBWvn}tjHi>7tD0|JNPbI3PHgPzylyZt@qpZ z8K*Xo>_fgDwA=pESN-{$NhsUdCoi=8CK;br+B1D#c*&R^nw6_#`nJ$Gm#G+$gR-fa z)|HSSJ`$!)$jN5%I~TKx*8~AG;EHPCvH&Tf?ax2)z6u~~b*F6=C@iE%Y?!TAgZ;Kx z=XfcD^_XLw9Z>vBG$rA9b<6ca@2dZ3zT1C+B7@P@PvjcQ6<7RjhMTl7eYy2_{SK-6 z1n(6hO81|ie|jI_0mcBeCW$RsZ$0WV4>&{|W9(sDTXw4a%5?GDl;nC6x8FqWT*{nK ztyo<^w)^r zHkZJrAkCmJOK7kMPCl8pI_&O#dH@f`wp^3(N0RIfB1+zZpRB}B9lf781)+EKz?Gle zkPJ9U?%*c=gWcTrKU*}jwsv2o{=2EB={U_^ar;_87xB@W`Kgrb@hSnAfOH#%UHB8^ z1{->@Q$I8~!h;%A-Q>^-ZiS0mHvV-va}mNb{k4kOz0b2EjtAeOe@TFp0rdg^uRwZI zR{f7KwUDaDFf5QhRGo37BUss=n6{Vwp%@eIM`ZB6gB!xp&%~^1=jIF}>=()72ry10 zi8e&e7{H8c24-BHKN)y|@LkSeDBMM@d~w%#_Jv%Dn(`N3Kvbs`BU#|d@I*7*{76G6 z#&zVb;}OHT{biW?0#E=WSNBj4V-7lfucDiuyNHRf)%fp68gIjJT5mzjl4@H^d-f-) zPWX<1e4OMuA?sWRFOht3O8d;afr-uN#)p*T1oKgT`I$@++hVZg7&ee|d6oT#62rpT z@y^d7l3LMDtQ*y%^4S$*7GxV z;73N(d=>VMy3778yX__koMCvTYY=kC6BHIO(mk{dz3uOJD+qT=sR;=nz4$U9 z%D`NMhRhH#c{gv`BTH8S5aE*DFe?CuLB-E(?+v0KT zYJJ>KdeRw2)!P#{xpnekdUw@|C!lQ+IVg2FrEt0M;41l&g`m=QU_o6f_@PiQMv$W` zyWicMakj7~WwmJKtkyZ(*XibJKgj|PA{MOj{OLM-dVj4E+9IvQcldFXk5{CtZha0a z9!IJKIuL%3efNKYQPmsNL&gScT=-rMH$m{8i=A-YYG+puxf^i)K5M5U%5Iq=>YUx^ z8%)q7%TIM4GwOxd-xOD5?+;o}NbvS9*?61Q8j(U-+LEhm6k4j8VgPuk-YPW(P;WwAyLb8)>Bi4XMksI^ko$&vvqixqPpT0V9 z{O1lfFXn9B0NMaYT$cm= zWTl(OpH)39JHGGDaC!Nj{q9T{R3$W@@)o44>IYyclfY}i$nWBuKBYXlHI@_$b;{c= zGbv+jsW4dBji78Y&l&0#zCYBb z_sAt!pSsKDl_uSLY>F!SKTirl09!4O&&YRcx~oL&rxblWsUy+%k~GrD_0EySy|XTU z^7txAn6zrUe<|?U1Fsl=;`RM9O?@GsThKsus?&9ug9D(WfWOkj*g*Y~rvBSij9Y!> zoVL<}I;HxgBR)U(m*|lZgUk!fpaw{qp{ZU*_1BeY&!`uZpMb=f}1&sgc!b- zkv97|Re)YhNPW$uG3TON&iOpAtf(IE296r`jus!HJ)J1h0Fm8!Jg>(NpZfE%2#5CM zKNZ+;S$Q$~ZU(1SlOJ)qEeBo^fvq0)VIN!~B|A09G{@2#>G$S(&nE>2ixvhL+HlOS zl=akS=BfGerG+E0?ed9b@LVRJRUs`AzcI*f%+;;IWsfP7sR>IQaoJ)SP0tN^D59HK zf%N5_C&Bs80jNr%hv>uxCKQa;PwM185K`AV`C_;L2A*@4;S}@SAz_WY;A|!CnGs7ET`4+0FPT;8lqRV%yv#Y0Jy(LViMg-

1ubhmmyS>4c6R^BC5ac_m$Ukb1po!Z-PE+0Vm@JiZTX_w3q;#da4kMb&niKb_H__SjZ5N-999mOT?`0ti z`A6Af*PIdCWY@fgWO!GB;bT++SMp>D`&qHf=Kgi?G3pE&--X+80V6(*>PzX_o`_tR z?hsS`?_=VQePt5+E_I>0&S$A_)++5Eer*vhIGB%sa1(rS4VJO&0VD0{66~bENFERrk~>xK=o6{A%mDp!Xy}mr8FaijNH~9$KZ;D$mrLpVns+|j zPdduTDe&5vGbS;>Q7xj!e9Y2Q7Frz9GSoJd1fgTPt80~C0)du1x|Fdp*Yj|(m`QN&?d~tQ3z;(3$IM&b+cGBHz2O}q)zrIze z12Gk|cANpGrZ~SQGHaT-xboiDfA117OKRxRVZ{wiRN03_ypxGe7vuR@~b=Zys=<)jlAo7Yz z_cEQpaG5oAoGyra+UO&X+d8j`dcmZB5bG>1*z06;Dc@7JBC2HMz zG;ZuZvxly0m|F9y2vUWF81Di_fMSe((db#dxBg!uy_Ho0(&Z>oGsF~}3xe*Kq3Q%X z@ZB39;fLdn7soDgstg6h>enRh-i{ok?GVTFOleCnUvrL5wk;HW5A)~&!M`}qn>J}r zGe57&En7#OBv`|T{uuZg2-N!m%Kv)%F&|GlPxPOnpghn`)h;9gxLX>&h-oomA~;R( z4-+7Z8MOE^6U^&beb?;G5ttF@oy7m5Ky$(S1Fy?jdkgkNMoO&HSe2^5cBLM{*J$G^ zk)p-8IpFm;6w!z>z=9SIq^g=B*6It1$@wi3$7M0|^lFe`#;V9u)aFD`DBO-GdA3QX z6mh&Q@2z5><^b^Nn-QEV=%=lAW4tQ* z(?oWunsHXW?!`YQnnK20<`%LIOg>dpN#Pf|;0GZ&#t?=~1E!E{-b?%N+2{RXO_c4UuP@mSuHb=sD{?R~-wvj9vC z%F*(5kkSB213D4_3w1~l5Ji5`FVO;{-}C7TW>^{&(Ky&k%YH67H60M-pU7KX@$Mm0 z(kPI93*C2QWvv`sCz!l`&ORci9O7aWwl!{+Jm*WpQMmY~>~MdR47HxB+`$^9C5+0a zG@IjLFN!nN6*}ziP&;%RuF!X^s>+x-`t{ErqqVz7SSoL})^?$!sJ?nEm&+IWYF2{c z$7MM0uupNn!ULSh^wF18&t#>N1ZNYY(DC-X^6bP?N|?ykXk3@9o{HwFUBDeu*C6_ zewY4=vB~0|nTC0Wd6%Nf(PsP2lDNets>=vO1Km=i;A6~$-OBHoO*BTqUmocU6#C1> zq}C9H4o!&(o_51dkigL40zXNFQw-Qu&e^@`Tjim>6ryOV*MHLIJiH2wXncLwi( z>eWj&HR6AA-c&&3ROX6I;_D`eN~zn!Zp~^koLKq_O`p5j12?*WfdFUQo`n_aW`wqc1bM%0W@71cEJ1HMZ|E zrbVWwA&dPxLYSNzLgCmw`%QtZ~m|%^C z4-Fcn8_?arK({H9)+f!3+?FvG&(nDzUJTJF$uqq_C*PRxOs?*gA!zG~7pc>;)1XB( zpNLqhKa|WQs2Zd()z0LFHzU9XWz5oNE6-dgW^*2>V1!(i!1Hd zApGBKa%`)<4Ei^nwx5@b#cNHGPObdj3rLz=i4^XQ?p}WsL&FhTs?85SNWunzZNNkl zKnB*r=}pqZ?$!5P3?BCAa|DVveEz`Cn)6ia!)qsVMiS177~QhwpmS~x%zmw3-Cv?% zU@^8M_@!x$#Ww%o&elA9(%ho4PGHrYB7>>!HyDtcvCS?23VsfN=2sd14y4tC6FH^M zEYU=_9Tb9zZn|Y-sgm50vP2QMFX|(ddo(_0pmhIMd6R$g>Ra9pJN|ml+NFos;q?~m z`#MN-#&y>w&V!RQmpoT%^9H|P4-nT|8J|ZmnSTY#kRR{!aw#(RzwRk z3X%sm9h#IV3hB8^)vdWs4kp@a+F}aNk<`_C_ngQX5J!M^#z23QW>{ZXH-owimjM zE9F2Hbjd%i$M8C=b`0EH`Y^25le73=1zl)=#-@5Uw|yI%0)6N0mL+?3%Z))B;qs^g zAYa^x`?v`pLvk+=E9k&+S#-$0EA6oOjnPbVxLgLhP*lS* z4f8w_tACgdpE&)jWnp@1XPdq_W*s7tlXcOeKNorI7ht`k0X<$xx`b3`OX7Z;%u{`Jd9~9iDqi%|R8&(J6 zR#aX*22_h|I5v-af4d{{lIGTC$1QU|_NW-<-${shKz#kyrXAAdb&UAioY~|twSHtu z{>mjy#e$(kackf=Ph70(JwftMjkTLS6S`Hqe4{R8HoEOTULdIaIoB#1ss+`)mYA?2 zsoJiDy@RzM#EYxWx6E>Pwqj{_ots8>#~fIOLZ|OjB~4{}y`)8$`-&P8Kg2$`Vh1Zw ztt+}<<0_Padb?lx3)Z7d$R-uDcXS8Wf(t1ducBJwfntQOW^aggC7tlmhmS zzx$Z|NuWHyw{o(}&y(iXcEdSS$*y*U@>Cy$L8s|VAzP@B^KH-%W<#X)iVtYkLedf> zDs|-~m?u9v4<=F|7uPyus`|?frDfiBXqO<7$QjtdlkKvP$?}BTN!Qc6LtI*q zAAi4teERK%I!V~L+2hs>xqxgcy*&QI#q9p|k##WutFU6|8{O>q$=AE5ml{2pn5Lb( z%dT5nGgi{is%I+_-(ABGHKY*e7!YF)>t0`=)r5!Ub`+`GJcv)Sj;1qEr@ie3?Pplu8&=mYs&e1G~iVIfIRndw7wUtx+vrZ1U$ zyM==?Itl*me-vZo0@i6<45c3DQ_LsPHO2?onYf##=nCFbex3y)7(t{R|Av>G0HgvO zHath~@^XV3hb4(tRSh%pWinQu+^_ZFYU`_mJeRF{O57B z2+$~;d^6DqqD~`Y@$8yj(Y-nU#rCx`X_!iC@|7&sd2ouO4Oaldj#9nqgfnJ)>R0l3{htE*xFQ(`;S13CeBuiTjkR`FceRD5uH zf5KgM(xXb1`_PuPd}QvG;tHIrdli$Qqh@Eis_dD#oNHW<7g+#HQ4*T~H-Id_*@N1u zuG=G5H}~iGV`-E*ioTvPRF{}q8lIPhjk5pzY#}StLO*fV+QcGgtAyXBc+6_+&)9r* zi$vxCn14tK{5ga9-L7DfLNnEr5Guk;okj^bK3>zbJiy+i?rUXjmEuLg&-TGo^&JFZ zE)|y0yJ&E06xWX7)dteseotR-s->Qx{(vEg$(1O|j-I5Cclj&2eZrp;$z0Wgf2KLG z@a>8Oj5Y6In%dEQ@pucIRsmo2kWY&4s8NC8S9kLlTpv<^gl-`c2TDa(cEyY{JNzat z!}c-@DT$Bm=UaBwjjfdh zPTUB&pm`nfM&a4U|GIh_15oIJ%W{4c-~w2g4yywBRH7+EPFfPH>{$~~_?)cTIq{*YP@O#%H{L2yqMjypG; zZn9o)Zm2xbCIYX3q&mEH258~lUlk@8fzVCpwo71)u$3*vNU@=m9Y`_AX6w#H z!jR_T6C%2u2Ea~JtJGj6xuuFov`fFDo}sn3`kZX_YU5I7<9_L-9VSNQRVl#`XE0v7 zWDBP3PP?PWDg-h5jCHt)x-$V!UZ~QD`LOCca)hjDiIo*Hs^a&vY^dB6c2KMTJz3WZJWig8+ zfopP*Hk^4p(m487dvJEv;ePGjIy_0yQY?{Goj^9~u^$AU0qj}8ga3C6$p1N_k%kn- z|11r~0H!~JAi#v@nctPcZJjxcAQ=N9wcbl~WcZ3>S%)3V?-?96Hmtf^^UIe*9 z8c?w#066dR>PCycQ1LFor?dqfiaRPLWxD`AN%9lKwGM3hP^lM@jxUIuErM&$)Ua0S zFEa2v61z9&zhi&GNS-&bRN>@n4+aoORr?ovP5sop7wxqXmO1s7Oo`_5KNO$#{jhlQ zozRZ&K2Yv}R8Bvt^7Q}62^IY;T>&dR0EoIW(TGd~iIuG)PjvKXu_ zwbX!?ZLtW0Mdn-N6h9Lfbzu=?u@0{A#LA`K6Wu*1*g;`_d1^r;GA$Si4GM&PvO|`V z^GZuoplfS&O{e#)!8x0;+W%PKEdfpcRA6_I{pi0$RagRJ%HnKEVO`in^XU-2=x}Xn zPb3hb)-CD`Zr=5TW1>pSvN;5$OqFT<2=^maIWykLGIg5%vWGTd-Y85g_sB2yvT?#? z;!TS_)5rX?_q_CK{`-oreZ@RjkqVaPgq3B0F{Xc)fr?;&~Ws^NVoD z*E`$FY6~-d#hE;BIO<$pEz_Q-FWfQIDL{RKK(+0b!=810yLiy=WQQETq8dR$0H|so)dai*j+X44h3@c8p&T;2668y?$l2Q>NlkC)=xV*qEzJ@Y);xPL)F-> zrm@ug2kS8evApdhXV7^q#v+MoM9ZsW?ct{AiwBMp9K}2SPXKT#Feb6fmD#%N>LXHb zYuB>GWk|)go=hUY9jHR#$;cn~IdrIQ@xwI8FaGh`Djzvi=bpciV&JFB(AF|-{N+x? z`)|LD0_z0OUg8AAttj1RQnA)&!5Fgi)gKW7JLGA?AM@EX59=FE4Rn1bw6n%0m8OOrKXyNtROlq!6D%3KV%og?& z8+E?EvyTgJMJgW5TxnG=M&kE(F)ERq(?bV z15dwGJu2GY=SRAu_pjpX6ivEv-xPQwA-<$dUm&9FZd&cPchwF7s_oufJVg$wG2_zT z2Xgf(t)WTw=GEAoqLi+iXfV`~#bLCCZwlNqd88;}hk-3MzSvgoE+4yVaG^9h71j8= z&@M$+$QJJYsCrg22>VNlRk6j8e#~cQWK3>lqz(!Arv%uX1V!rOvzIcMw&FL=OS4O6 zn?v$zha+^ed%02pzudTVD5YNJy=%9qdr?%5&mom!Yw!L2{V?e?t`a6KY%f?^@5pA= z#Law-LlBlL{1t9U-(0*Mp+Z|9``yeRYCLJ9D?7|*{3v&JX3>l~Cqr*Bmcbc{yxhy? zurajE$wDxN{4)%JoGC zJqkL|k{tXu=%_x*$mXvjcH-6q!pwp0slP-PO;Jx|zBq9*u-8_27Dp5+?aDbP8rsNL zRid7ZS5)x94U7+G%q=p;?Zd+fbrF%^7IZVo;7(KSS%i@tu)YQ~AkzOEuJS+#7kHbU zfM=db_y^y5;kV|Fn$N$X?N~D&>(AP>VkoiBqc6kc@2*;vtlrh$=Ut5Q42%@Mt#M&| zArCZ9s9$fo9pDKX>eb*#U;nXz2e5m3+Ka8o^z{U{y(zIU+2)}1h`S@oreoAlOjsF$ zMdQO46i9K29wlp^{mK6VL`R45D=B}8m}8`O14X8bD=>|(msBj+lfMoZl2oAF=NDZI z`NzAbE}1b`U(0}nb(%>r9#9#Jn>|MP(c=NLXh6!X^SG=Zix&zfaQ<1^pR#E=!kaGa zWfTTL?vII1aa@{QGK<+MxNzD8O4mJlc=M)(%Zu&=+6K4XGmZP2!Pr|N%mECyJGCXF zg_ZTUsfAo5I@JJ%!#a6cYXt#Ocl@&tCrz zZyG%)K=Ig7+|wDLlXhLTRafF@-qIZwgu+j?}2x2_pS zy#AVHNt^p9SBOXW>rE;0bOB?BJ5pp3tNC}@AGK>Saxh2T&79xsOWHoFU#2eI8R(Pg zl{wm(Mb7>Gu)cQ`+{rSZ@+ChwBY`nK6Uqg=E~=ZUaqZ;(+vIVz-}I*1tn>QMH-@MC z)N8D{-!X+}zN|MfoFx|B|He#X-GDbbE&(>HAwkMagc zeIYf~>uPzJ=CeGHZjIyiqPI7m=Hg=CJ8!~Sr)b9(uSr6;(^QU*<)U^5if#};-NJn} z2hQ0w{~`*M9uf)Me4Yd@ycb(YO?UrA)8LEY3CZJ_qPN7fBZ~FYW%i6$n!cZio=rKW zG_@-%loo-0{u=1t6biz{W`Ki?><6tEk;W8ldd>9sR5A=zZY$^YrTQr~oX z*~N_qSar_x*5CgnW(JF+nzZnIiBi|eR)EmKP$sm<%@(6-GiLp~_MYMhDMJ(HJD+rd zu4LSPDj316VCJ&paD|v2tGv5vx8v~4TbkwRMyDrc41?{+OoALTTR`RZ|HIQ&$3^je zT{ob6&1>8W_j*-lbOl^lC^*Y28oz2WxH~d~N<5F|n|l!3jB2?_rh1Qk+kj!W zWYh1d=0U`PVaAG|9eA0SpUl(4caCIBucKFX*Jo7-IFdKF#m-+2$|P(o;7omfw_SV- z{GfYFC-PM?>f4%i7Vo1_z0;_**Vx4N`QM*v-kaI1(0OtoHZr$a5z+-5ypzwSyRy#i zt^FRTe*S(K5~%EHBPXW*l|T_A7d=SOC$=Vt3M#GgDWvIMJ#! zU^!Gf7Au467QF%kQd5+L#Cm6ga|NrOHp*(a%G4fcH}1s0KHp6Oj_3W$Pn1J=#iSd0km%o^RRdz9-GJSZSzg(}%B3HBL`=aMGqZs<3!} zHKV>gF+NoBt=7!-kKCHPe;+1+u-G zf9;(M-8nDwTsY_s(`T*5)ALLi&$(3uHGIAM$Z__qRPTu}BbFk9VEy*?&U9zxxZf<(7vGzSPa1yRXKBe94kbSZIz-^ z&xM9b3SpF1C#-C`ll)hI9W1x0BdeuNyAH&@S3U_bBQqrA)#SK+2GDJLwe0V9ftmU< zjTbA~xcb9&)ah~Z4A6kRy+^IoH5ZuBD5%W`L^e{$Bpz)fG~3S{!lY|AN~^oXE({)w zUh&mX<;4S4O9bxILsVr16fdT55+OR(5eL528{*hqd#T^?Dnu2$-(%U(-LDFHbXU(E zH>B6m6#S{3$79=3SX5mQ6y;y5SoEJEyPi!)gMQDvW3irQ+WO+kj;MM^VGRt_YFWj7 z(hlibL79KQAH-b}e={Uv5)cynTqvl^%#5Y+Dgk(}pSQe2!qNJ{|BKMTT|&qSerf2C zX})XwS-S|?Hk^nJ`zT1x>@^cFguTUOguKv9(0Wp!yVHEF%rQKW?Go zor+~6J|!DO#-3Ry`4sDCU=C3M%=+()KH&|3?T1k%du+^Ak>oQh{ju}s_kzfjq%6HZ zW0k(=^Fi?=LpPpb>+Pq%JZG?8O$_Nurl%R2o7XQ5!++LCmvq?Mf1%`Efpy={LOLie z^Xb@6oX>wv3C|eCb-in_?(cz5p3OyTs?Ra?d8U2Q)i|CGFvYe&&H>~?F4d>YaB?Nl=2Q7A2|7BP3_z5MwNYY#*XpZ1O zW6%Zt2cBKY?{g0b8E~r#k1df0LoySDS54dd>x!nN{#vN9i|56s@fUu1VZ`$}W-X*_ zX9boAnX7V0Dn?SEu_9$p>XtLfpJC45$pxr0@`=-{_k~C3IhkN&?USCz_e9ZP! zIbdgy(c$E){<=z2#G%;8@OD3Ta$kgH?_^*OYv8xnU$pCU(!HMyf6gg?_xkU1=ZTVX zONvBcM~4q-Ls3kBnUB{GX$9%&%FB}z%?Tsz=#Xstu?9|ZH&4L9mnzLBgzwfThq=lNoSaumgWWf*);*iQ-Dl&;{5C8w7cbx= z?K^gB^UivqBBxhy>GstV?7qAqpDAnZAV?n}YEG`~Y`%!;fG2AF#F%%s*AyY_e|{5sa8}zN(yH^nSiB zPlv_hN+DpfV%2Ax6%qR0G^qyu)ni{Lq~Nd>%%iJT@{cYT?hhP!(vj9cPU?z_c@q`e zx-ccoc*VWna!RU|2s$@Kf-?cW~=Ai zguV9Mrnne>;tJ>fk;oh7#q~R1gR|aU`>z}Eyv9{kJL^%nI#*Hs`{439aU9mYh2`)0 z(~R~<;zIsX4?`foc{~!~K+hw3bL85xt9*Qs)(*Uf{ZZqW>xx(dtO8-5RJg|@x7R8> zgIH>?^iOLJ5-J4o^!$bNSX%KHv1Z(b{qZq{!npG!glD{)-}57REC^NiYr-zb>QhJ8 z1`d~Na5WK$-iM9FTzL4XV=E&LC?1duu9QD6p zU9NE2{>@~5(h$C|$Lj9OaNf!-r?sh-T6~U%LL4O{lve8a0$<>7s*`^Eb2d?>HE_|9Rx*1;5Bvgz(gnEnszvty}^#-F44 z0G-o&VcGH{CU(hW@nTvIt>^$r~9kIsI^4&GLQ(o;yDmB`lKjEsTH4LS_7)A;I z5#Zh)bS*z3;3(lLGk+<(gr738ayO`u9beZ?(?#KI-AUm088 zZFcsm>rQ)Ge*hhvWZ@(W#sde@+m0kB!f7*{i3Nei$&Aj8y^KAW+^n`0>xJc%`2=J%>= z;YMUKP!d7R2IZ%T<3@r%JDF=%sRHnm4d$FUM3KN-t8<2iG7jVoj;|>+eNMcib>%A$ zn^ul*a8%aD6^Mu^@4Za7k(4^eCN8>}_~&;_$GX!pU*aF$#IB)6EdveNq=vaqb^RN+ zRbO}q^OqI=S%ksgQYMe_CjKtC4P~^e_RLFG6;f-#A?`zXjMPXRy1frp;Pr))BrtH7 z~n#dj;HI_iLdFlNmnlEMFq#48dLUU+stQ z2!7dvwtQ#3aB)KTH?_3?l&j6G@#qi8ak*YQJQP&-ogErTOt~n0&+J%4ZSePJ#@@k^ z{;~PS?i(JJtDoD*;ZBq1#%@<5>Aaa*q}sOt3A&4WecY)y#5U7;<4fO?w))LC_J78v zrdH1)Jb6!wBUn7r+dH#jEhFxI3S+qEU3g~x)O1Pfxaawj)-03LngT}!Tc?6h))QaB z)bE89oQ~Q4FcVG%cPCsFSLR`htq+~Gdwtlu!P+eiw^Yj>gJgT=e7FSC=2(^J=pXwUm9`#7}s07X%=A;;N|VA!fyV$p+eJWhiFRSAvdbjzc- zkx|zKiOpatjk!0PRD#&5cw~>Ea(EwAH%CvBo+V7`*YS%qdL8q(=n_QpxBr?_Z^B`F zIL&#!_kn$PAYTKoo|L&pLZkvQU2Dq#y;#`2i*Lt%Q@sg`P2qy=ee2sw!#{63Oo05L zw>vd2S7JY$%()*0)r|$CdT#ir289t)g@lboPQFS$za=PMJoauzadM(sY}U&nVo<$h zJ16&~KJ}Jt;se)e3qSqm6WKPV}d!7K0nXPhN6I<8)SdJ5-{_91zUK>BW|pxm<7>8~iR+7C|%V>z!&)Hz#|T`n=wrpUIY9 zevNhD?XR$1u{0`)M5A-biHjY$yn4>H$B4a^je50(t!tpwOmj|-qtu1@t}8$AXX)|Z zJ#Vf~EBRxeq)!(ukJWPmn7xdTR?ksuX8v#g{z{^*J}O;$t+4G%D=LQ*Jx|4b#z-ev zsLg%+CvI&+(y96KLc3$dl)dIV9JVm-2_m|@OUBqEc z%ao{=SD`ymBAdU&4@(}0__KjXAler4Tp21q_*=YJK|t;P?7dc-g7GDtMm$F@m2Sor zz7W~@-2VKg0x#m3n`9)4udK28Feu0BTzNTd z8i(WX*w4!Mo|Ks#T}0m2ciMU>@oJ4yfFzF44XS@xI)3{NzSjlW$}#cx)JpI}5Aa3H zKTIwsw>Uq2g;N-Z-4@rkNdQWuB7Pa>@K$QeXa6oi*=}VbTIn}}?img>w_OpNF!I!D zSH2kx*ihZRl~~ZPl>%>@l*{mARGVocEGn3OX?n2@O>Q#htZ?R_C>yw)JN@kNHtE^* z=8ipw45D7(the(I@fUlwz%!Y<$0Aeaq#viLN3kRV5Bc0=u_g2c!efD^hOL{`U#X08 zc%_1LbvA-*tI3Qk@3d&kziD#GW)_jK7r^7=1In0FUDCCmT*XZPZ90ag`&w<^IfDy@ zEQ!q`$F!wJQ{=UR^PM7q%{~7u(+Z>kw{Ih?X<`uw7wyi{3SIInY8xrzRtX|)s{X;e zlezsf@0HYf6HSQQhY8^N-S<%0^5Yv!k;*vSF7)`92T@wG}KVWcSESC?(gqUp8djxxZ+$c^Pd1ze_8ov()OXG|LDW{ zY0onQV^aZ0S;q6Hnd>h$wa)y90+4b|$jh3;?MUu`W`BJ5{7-wYm9S|MJT$-4Cnp-q+FS}LwyI<`}qwO^vDU&Hc85`)~ z6nQ`ATUk!(CRXxKQNlB)FP`I&$$>C^L!l=}4km`DU257tB-)5n)#X6V0c951W;_o1 zGS=mHe%Wi_c(lZKXI`AiBN-mA#i$Mpc?q`7vJ|q?3w{NHg%VT4H(8*kZ3>;-uJz&s zoDYhY**$q8$eExmS_dcm`##!J4h?*|mdVKtMUeqee2xfM*77db!V6Q@npf(kmE}n> z=#2=b0=EUKp9Y)3*1GCH9(cU{=4ULgW3({8Jk`9$bxiwlXaDkvmA;{mLp_WP{6Ybe zY(|~CzX0Fwu`Als62})v(KriE4;F;jDQbs2c{5pMoj6aOCsFxqG?xr^xMI(9L;V&8vdi3*T+^SLINgOjk#ij!MBOV4@H+n)3w1npUYd*X*Rja zzBf%}Xy7@PQ!0X>)Q9A^KVqtXu&LdVF#NW%|FR6%QFKlSXQ}&K`seBuCm7;_vCON_`%l?om+C=rmfH1>FwzOZ?I2FE0hS`}s^H ze#`}!HL5)Ar)1&e^)aDBxP)FtwCW}cy@e5k7XWjqKd_*SJpfat{5|S zh6=INKJQN_bl!ID2>m|y!cN@P4jOiGoU_)UkEK>N5z9Zfwi3yXpOhsSD|IKE=4zP@ z@cj5ao>kSSHI_P~u=jF1nq2)?@ZE=wSiP{k)9ANJQ+k9XxmCX5hlY0Acvynb0IS-0 z7FuFIN0j@Zo=@7BD&apHBTYJ}>~1XxBu{kzb;aw0VlDvH`Omj8(;VPE1>N zg}l@Jtf$2m?^ED$6i+7j&8?}&)Q(F4+J~}ixs4{1vzsj3My`cKvRmHL^2gp0)h2tr zyIvVK{*%H9xHzRSS%lw|L-S!{Y9O=bVGkQa)>m+jB=G%qu)?aJI$j z@@kxEY7M67pUW?rjlk1$GoHOY_noGH&Yf@=JhmaiTxRnJ$Q0mtTG>x-an>qiq<>(- zjc~M`zBk->{(SGO;e!LEe)7YO33ESXaRgCtWgYA8{AU{ff#WY_H@gqSEcrG?%mBv;BZ%dEhy#?hPIM|sD#c75z(R_fw>Lt$K z-zeL(o_M?-z>kG^enkJWWuv5Ug;GG}tR>)%pzgJ1NmUjF7%lJEOs?LnkyyxTMR@po% zuYy|M73obHj5h5ixzqSDlFuhb@`}@p$6MWQ-7tPo2>cljFCaS+XKPC$o@JhKv6S!K zJdl{-+nh)rFPjgimp9s#m^~Kx!DW8;#GkgG(#@p#BK=aip?fJ2i<{x=enmBBIx*8( zSLYlj=Q&C0tv#_LQLeTm5f%aAgBH7o#Ac_1#4QNXeS!C>sb7)nPT>vM>`CTxQ=LPP z@(u2%&jCSjiIUS-^P#e{_`2Gk?;?6<@$tl0?aAU(Q-7zuSc_~mFo|(Ou4H#VGO$uC zJ3V=qPxd?{s+?u`wFOPo!xfXyFzH4Ix4&5yPYwu^Kodf!`5mFVz~H8k27_DytzOHS zYk7s!^)g?=i=<$xAC^mMZu!`YRW(@%nYx+x+rxm|N0uj7BmMdo?QX2APj1!PY)QUb z!4-Uiy(sKmaS~L7G(Yqk`5sNzFn8q&IT8r%FF#>>yZYv=X)4Sp1d=6Iy)N;I+fu^E ziqXw*6ZOcnro`=6AuY99R+lITV=#gpdok_d!A*&VV0by<#lrWp6sp3F$DhW^wK=>= z!5b)mbv-WjqSq>~HP9^*Zn8W>NnGVHbR1n!WV2pYkblz()~Vrtgk$BB0VR>-`zDi= z`jI;we(fPf$|g|D8vC)Ar|`O=a$`JRT%v!*WTdI<-~>@lfZbKNE;@PwpJvs5&TL-7 z7`*UelhN6iH7z%unQEjY;0p`uC2^Ho(6R?WTYpVTDfv^_<4pi1*8aMSXJ+)Oxw({v z3xeFeWaVvVI!O!Gb!XvK=(k!)s}qF5X0c??BcW-d{v=uV_R0RqYXvL($e{xVj*qd! zwh3nXUVk~po~N&0zBi68KiXMK_*P-5(MxR+*ED<9D?lP*IeOP^fvh`yRR{-NSlzGpMifdsnNh^s#0i~l%jP(5c*W_wPf zYrx#2p4BL~(Pwz=snVo8scBU0{!F=$6)?9?X$u{-vm|!U>>(Mbr|q@c410QOxAq9Xey>S;rS%u^bH2Ug zhEp$neB38bLvaWCOu} zEQIFblr)P zvZof@IG<)f+s;DnMlmcYMV#G8rN%s<&!Ru%cqI+~!0Kn|^E$+Xg=ev8^PyQX(~URS zf{TeXS<(tSImUh(B%QYmCiA%1okapog99J$cuAVJ*qgYfk<9t}m0q4;4TJ3rPF(N1 z<1v+YC{wE;H(_^lNiuZXwf-zQE6-L%39n<8_VYW{U92 z<*>COz$&)0anoh3`E=r{;tGC}(-_O1kXUi`mo13;D{@gf)PWEP8yd}d4~%Jge-7cT zlkA)8DxF!ahF>x$+w}_)KG+TWxFG{dJsoBj&Y1{uzVrHx2iPagD;&Vh()hY$&ITkU zqcSvCZG#ifyVZb$&1@4P_*Gv5Ed%Y$faMQjtzUD?HP{^%-6v$QHc>$wVqX_XK5a8kxWUAfe3ES}qGJE36KTzeAFX#xHG z4arfY&=&mb58QNETcp(I_?vs`og(djPt<~RrN&+xs|9u1+^!LQ<_!sn)bh838!V8X zE5eb1+G7tVJ|D(TFn{~IhlPUSibTWK%q>?4E+>NF+4TXJz}c(PrOLG?P9L1Lz$pvw zmmxSME&*gr9tOqXrf&8xM#}$^3Xr^B|JAFIG85{ZCUdoO|0h1tZ9H0(qnUX4t$C7W}k$LWo zhqZY85=ZbiKwwpZw8iZ7;so=q5Hd6`cz`sm%uuH*c^rrkWdxaJ&u z)}3B%apO^q3fgF17`(11-?)d}br2DB&d~k}^B{&(Mthl#TM0{B! z+>I)LQPO>t)WUims910L>182U%a30@=SYS3(167m^-BrZx^fEq0c#fCjb%h2X;fWB>dRwjQ=@U|?TN}jL9rGJgC$Kh5e=pE$nmuaWxhA=07mYkdc zLP)MlB_CtGaII9ES8~x;A!>`=ebuk2Iw^sEM5TO4rGaK$O4A#H^+otpWkfj0p@f_~ zq_)PpaxOH6{KSx%0n0SyX74?YvX)T`Z!;{s%nC)=0nL{nDLwCJSa`KY7xsV0RcqvG z?9ECyqOinARvR5;XM-TuzNV}U+2xYhH0Y;rh^%(5u|7kcXHy5h0-{|QEBn&R!bLsDYIcw9xyPsLGQmS>Q=;cEify%?+0PmTQvA%C3 zYS4)9m!h|W#(on%$r(=xb4z=s{xXF1y|4}8-H(0XS2dOezfEUH=JN~88rb(*kY9F> z?8Z`Ok=i?!j4eMhl!8_u7y~~Gf0BVeA{>x& zUds3A%G_KurBs%&lX>s}$#<-rJ}2$;B4sd8`*h(-mh3}ry5j!N^><&&C_T$#_Aj8N zvt><=6M@e(i;1)Eux7J4?j4r0NQNX_iwFmOEPSQ?6ROQHUb}fe_z%r4wcw9D?dC6& z9^yGezX)dytJN0Qo=k`WBETruQF~%O--4HH30r=dWOnCTitq}*-656ghrxGGR;Kb~ zc_$YF4M=6&hCWKREZHkuG{)pVz2*&k>?e0>bYR}CqIZ*+^^iV(-@ZFjPVZQ1pzalS z3A0j)_{!X&QY&z`7YDzZ>iIKC=%@iUF)t#jSAE0muBZ5lCnfVaupO6o@_wIoaP#dx zF0z1e)~jSL&)vVI6I&|p>rXm&;BwoyfWONtM|bi|4)GqRXAz{F1~XIUrS2*#i-4n zLMJEOb)Z4CPWe>{;963Hiu$!9M@{}}s)ePlBhdEn{hzwt1oasW6VrvJcQ*@JsbudJ zb`7iZ@J270s2i(^Zt_ITHhgOR!INy^G?@SRIgsSGH@UQwMWyx3i8ylB0`Ao@k-YNh z@{%t{GtltYz!gi1m}ojab%W^s`QqrpLvc6S#@JR?FaEP~@TSarLYmC=j5!CqwT!yc zoEt+&oF4S?{OU+8?D2QCSk4_vWNm+DhN&tUPwJ7cfhPM?_mdj9H~2p-xkcOlJ<1(o zR%>?IMJ0_&uHd*^n{>>a7KKI$;okz6@|3_|6xxS0rMtJZ>UWUMUe8gvjvuv1;vLhS z)(s@=e{y>-1_XbPUHmyZwX%LzpDQ9a8JYf0K>O?NnJ$xg+MZ#b3UL8e zo8z!aN3t}WPU*JsrGw*wGmmzj3@MC=g|j6>~`%ODKYGJONv^S zefGco+8Bg>u4yII4|_0fuj4?L@`UH6W|%qmT9Ubj63&KIB98(N>UISi-6T@83*p?F zvo#LQZXW^T-pCk%<3I<$`M`Q5w@*P@h|_|a1`#h^!Gxa=O9EY$BM`&Qk>@L@G3wnW zo_TwLzvMY14P@!%w^qG=I+YI_CTa^6mRTF#xEKAQlZy3uuJeY#*vyEz)JZX~UCsch z)8#F5Y^LW2eZdB60<-x!QA@XIF0ZhUhYw0_*n=KZHzg@WB<~>!_#y>gWZ;V&eBA_J z=wx{5iNNxC~?$z+YFaV&ouf+ar0@wY! z*Jt&>=b%di{_Bf`Yu%ld>$6q(<;}C}>x78|AP{AFg#fpI_10wwx}-rI4DTZ3`sa== z>-UEba<13wug~CT$ein0xZB0%&bj3!Yz{zOUkbu6H|KsG!CNW#N*mb44i?O&KU_PY zR&QQ&s~xBSW!eC05#jAEE2gzp1%+Q60UL8yhO~h9z9H>3{O{tL|6Ko*U~}0riM|6M z^U7)8WKN^{DiY~tS>B}8K7mW)nH_Q+pK~<#cFHxYJm-9%{IcpYvZKx-91aAbBCoHU zu94gDOSu@IfsO8OOb$+UtbQNAd-fy+Xz*46v`BVx05v_F60}o1+ypEN?!HdFMgbQm zfP@Au62WM@;C~T=g8TiRd;Q}&X>wOg`|F9|X+mpx0MBVjcTSzf*|o>l$1;De=`LV% z3mQCEnnBS{S5%)asAepVEPt6?6<@YaI(k(B*V{SQ*~6FkPf!`9!lS^~u%+GeDFErF z$~O2yd z0KFF1F~waykQ)J}I@vY}DYu%I`ug5dGA;r+5fHRI4F?m>wHr>V!KCRkG5k7j&DiB%gc>y6B<|f=A-;&oJ`v~r@wA>4rh~l zVt;_Up}4g^uagC`nnJ2_B{ceRnGD$|ZUdLuBSjj&(Eeq7KrEHuXX%=xdWmeS&b9;K z>C504!&*DphTEYI6}bCeLVKh>cc*aRT|S|cZk-Crz0${`3kxZHEUU}R90}xmxl(EV z)u}(mAHvj_)^#>sFZjFfPUqASqpG?$Inr-4x`qnX-RufmUT?EDjX!Ysqj2EWTs_l! zoH?!?`RbL#&8jR^1~uXvq^^ads~;FQP5NdL|G-8`IwC8*CM77DVmQ{taf`e5(&L<$ zC5gIe>9#YxAYeeqhFv;>`7B+B0%is4XNj()%)D%168(%bnK~tRuzOt6n$z z7V>1fS?REOoI=}rZ4M^`Hyq;aoRdVyxIn*^wfCcMkw;rG;j%z<$>mLV**K8IIJHQ> zl?ad!PAF7%3)yBcF_tl>k0xpEP-vG7MqS#Zlg98;lIx9az7O95E|E&e#kCL z8n)WoeBfVV#xh(~8bdD*m=&afa9350~9`;?kTFva@w`Mn0S7?@;agL^CT%>ny zb;0RyBHv@{QHI=@8pS`eZKf2}aQ!__Gi)_#{-(LzC$&8v$_Ayr1&m8{2su_;!~Irj zT>4u*@MCP6{r!T%@RqFp*8SEddIl5QD3P`w zl|PsyX9p>4(w{_`k&N0^0+r6J?+J*z%Cr~$JdTaqyH&@|#6bjm+x|sLP_#>TJXp=E zSBeNGGc*|mCQrMp5R*Qea97H3glZ*!b_aRtdIewh2hNhp971B-n>2zk#lKg(f)~{O zgb4~GpcC(@@8}^oe+DHJ!6e!+({k>G8sIPLZ}IEcno5Uh*5kj0^rR%(+SVdg*kT)N zAe!5c<6QP{)h!M1of8LuH*QOf437U= zn9b9#C9Zs!-KF)~xSzXExIw9z!D~4R1ef-rfb5(5soZzE-a>9jy@^1CljE#5IcF^d2b#{p6c(fUkEDZ>rR;}l63E?)pCVDO8z+dWS6kmti~R`yESRnX zU+y@jo#DF3EWB4L95{Z7!A;hEe9T_;*h3tJpvXQcxt+QB9LGz{{>S=UysWE)zM zBq1MV7#1I&237#iRz#NN9y{hpwb}x3)YuxQcUzlJm__KTU zZLXYP`4eOaunTwT+Genz)V38hSFrA6KhGdXb?@}xw{qVGF|H|iQ9U|tkHd$kzb8Eh zZ!t~Vqip4o8oJBGGg|hLMj;N|gls`fY&m2$SCsxB0;NJD+$DG)ErddQF!^X)+i`Ry z?G5CZYIz)j&L3CKX5-4@8%s9MDPWS;^D=XddExG-PKKi==d$mdheH8-5jKH~fw*XX zQi8<~m74K!V_N-v$Q^>ku}>OM^f(=}M2DE`Lsv@Q&i5k5sN&yTUBQ)}C!193T)sfK zVS+$?8d$h$TkaIDKPW8P%O5_h0b^*>D=)4}VbN`YD^l03JDwzHbZfC>QxCI%)Ydb2 z;fShL0vl%#F#6TsZ9)haK8O%Yh#E)<5Sof;gC}``F2^6tY*XCPdmGj!@KNh75J#n` zxLB3`rQ6M9)sr27U_pfNJ0^}Z-uJtlh9k%^(7cqEpW)(B57y{2Te+Lb{1x^C@(^_w ztu5MYyTYl|JI(J}RKOh_D%Q(0*|O=UmdA};h7AjG7J0yeoXb@AYrKD(Zum3U64tv! z9=GyxM;TV`PNdwL0<$_rP!7Z$DB=#KEju6`&1~3uR867n5=x9-uhpk-t@cfZYT_8c zPUGBa2Pc9JC97~?l3=G@yi3>VACx_cL1&;Ah#91!wlpx>@j!2Ci_>lCfGU~N2#5m6dy4Mb=EeU1VoUzsN%!sEeIIGyGy2^k$tToile#HyWD^Kmb&`p+`v#&f zJ6`RjB|nBJyU1?QQrp}e2u|3Wzzu?G0BhJ00@%Ypg zBwzNyRP4B5JPOAe|7keFrwP;com+*h!x64fgMWEIHEz+O(Cp*M0Q>`>{_gO-*g3A= zV4aNJuQ$N9duR>c;|LW*$#j)D&f&kkhlZ&ad?}9mzsHNfy_%#8tUN<#FxP5>|CcAh zm(Rj8gb~bXp>f8Aezq7yU7Hl9hys26{@1A1Hy$hf588I_E@h6pmWBcrFSK7chZk4K zESTO7cjyrnK_0T@m5JThH!-M}N9O@@^|UC1cHApM$`bEp!0?Gb&f=KZ+Z_ylKz)~^ zpHO%RrXAb*ayQr$P#jMYA$uD-8?B>xU|~>6eMvP=<+q6GI0gZ9*lJe_6Rg{8GRTz4 zz}pWfv!QCa)VBedwHU1!MAbb)FgnE*+CTVy&}h4cq661X9xfQhXECLr{I4!H;#xb4 zG!juSoLK`!=zyLtTpyvN7JYPQ)%m?crd;N^}%?6^{4q8j_8iZA;k=Q;-7Clf$;4;&Yij6~iSpgYLK6$16p0$Fd7P`oux%fU)7B5g*3Q`NWdQIM1>9W6!OQQpl z&e@qSF~u?IIoX~*VAoqK1C9tXVopZ?en-mFx$TI>ofK}zcFS8>HO09-1H8s#pXalS z73;QtedR15vroL=hWh2xW4gKX(8n)fa+}bejM{ClwFbzlqKg`ZSWapglP(MS3``0#&ebwCNTK3`G37=Fe<;vCS>9E5M$67VmbkNK`>z=O|jkYZIo$fj?Q3Ndk z@ebW;4s@!<(tqIxdm|<46L+)*8)N^ZOKU^VEfjHu;VuZu8D|o8daaIIJ{G+_o?v&vS41+|* zcm{&G_g^ON*`Gc6m#_hSX%+97JDd!){^evVg0^*79AZ>Og{FcRKj*wvVlv2JeY z79vjs^+$^i7cg6gX-)|_%l<9Ys~e7Rlzg|)AZePa-31;C)2|5mp zaAmV-NA@pZU|K71H=J!2q5t|MnENrvA#NetXNnw(&tBWGdM5EbtV5GIVq0u+Q1yT`tFme0)FVf+ z8ENu?9%PlytyP*t+RG!h=;B0i1V-BLn|#bdU&t+Ft9S=(7Hg$gN3tEPN7S-GCcLtx{BjNw=Q}XaHEuhibpnXkp}p$8=T!QxdZlNMjv;SPGGI) zoEhnosC5-e^3HQ+ajWK7^LLIliRS3eP@!82?R=`i6KhzJfRZ8S7VV%ON2Sxg?QW-# zDQSaDq-5^gVD|~7Vq7A2h60Zo`JLwfv0LCB!T5xJ6i-aOkf)RO8+a@g@nJ!_fuNF*@kc z;6`%UYSYamN$iY6 zpl;TSY*rD}WxNVU!S1#qCF6p+pC5 z_0#k*v7r?fBdD-M%<>xaGsZhX_?T)Gyl+kpF*wb90`Q5e_hFPB2 z+xIVG?{9>52JsI>p)=UN&n3*^4_ZoW$5lKN0CN-olXRbh(Q<_}%8;-xYcUh_0MYf; zMFiSj;I;ZJHhH{(@axTEI9|qv=`AyVVGK9!sp_K9?t2<_`GTD~J?kq6C^%YOV=y)s zG*HC3m3*OgZ|c8NS#za;`6ojt(2$`CNygoeoh#}ATSZ_5&_n@-loFN3ou}b^W509~ z^-uDehk8bV3=}Q5YL+Dn#+m<_U-*BC`$gG6Ffzx?M~WgnMFp~*BK?m!^ESlo#d6;P zQ6@l!sF*PfLjo7nq%A35{?mk%0~O4H_*QHd-9AYm3sBpd0S<4Qg+oL-G8z8S!)UsW zGQw_av?QiNx%dAN1q~0$nM_c&fRf*yGw`eP{sx~P1fv{eOm7Kv2{}=L%T)J?ufYY> zuCe1eGJU~R7H`;^-vuEqIYEG;LK&Scp53wN-m%S~25F?TFT!c9%cm;yq6f?~fK+s5 zlQ;^54s^Drt}K)Nhx5i~>S_ughBu(e8z?f|DHlsBH516j1e|WyK~K?g2K%sJoJQM* zmDk?fCk9+BAtWm)RjbDVk#?zO^rfF~%69xVr)-xKZQwuI(dZ$CcC`Lwuoep@g8|EF zuC1h9dy1|y1(gL1Zx3K64O4*d509&(?INVsH%)nnx5rIPakB>E3$s}SWZuT89W5`x zeM-=y>H`rKbsQYikA1h<#|tBiB7*pa_L;?vK$VAvay38x$F=Se{|HF+vNGiT+dY%d z@*F(?nlcwlr`P|dn5i12Z7D#LB^n2vOq#-|LrqG+MIJ;74(&)ETD zj2{VPKhSFf2l%H7q<+ejK7qJo%%jy{`zkL*+}^*=CB=lHQ~z35D9r9*7rKGKqulp2 z@=2srz%@$1tPx=c=>icfD47sLC3yBV#n7Yxog|i89czl9Go*-dhM0*qAG1Ss%Bk6i zw~2YBz>HxQg$9&U-ves51J@nySjf1K`&yvUSi8g4FC0|&e19ls1>BTLRg_qDC$Tp(!>+eBKT?hLIc0@mU&iXx|;cq++v$9dBw9KpmU zgtnan*QSVIPi~s`XC9mHY zu#1_igB)nm^PnA^*fT83?1AS`(ew!^GL`t>%ApZdg3w&Vlk)v#$^daIZRzmI2|3 zf`IvswD)`)*m-XGa14Bm*_)gSM{^O-H6fFYagfG%MtftPkq~~lK1@yda6m&VsA=xg z6P0zKyFN2AVs-V4i#q`8lb15kqmlihlY%O|FglC)C@Y-2^RF7>(LHx#CCcc zQk-OQO#4w5l&6xKi)NV_Lkt*ggQ>z12iRN~WMhZgS5oT$Js9B_r1NLK`hVrwTIx=u zU7{Ivxmd)<*}A4k0b{-ufKlqcttMI&FfB2GJ@ma3&00AMGkzCM8@$_Q45?Lb3%Z3` zKQNm1H&fG$D?!v>fWq0;#?+?{Y6wzBt{t?}wBC)GIvsN5v*;)KfU$Fc)r#4xj^A3ZYt&)jxXr5y~A z3ehCgKziI#Y?W$b3m2Rb!k9OABtW=8b392(ivVIObnoeyg{JNESF{UdhhyxR^o^STBkRrM zpjhh8l*WG!2gaVl|SAI83vWM7IbW6d50 z*~T)_@4jE-ocHJZ`2F$jeK4=>zMsqWysqm7I-l+*RZiIhZA{*_)uP;F(`fv8uS3=)xCMr9!1)}PtNe$!loLd58Qx(1zYI(Ler$_>mV=qZ%~RXPO~Ibz?qBL{RCE?X`I{WeXKWY zPx+ygw5vhh+*6rz0MFg)Dc^{?mK0Ts z)1cxoiz@$!fnrd{Nj&W860{zz;o_1!Plo|-2(O+rf*XYGFBC|MH)k~g!vu)10WE%u z!wB;xvWr=(%@g9d2tTgV82M-6=t?g{X!a?6!Z`Cw4lq|DI=vdiE0XW=WU7AH1MWo6 zLf$v%Me6&OZeI0mG26wCwFUla(5VSY$Kzt+r*3c!O2mQ%DF}?p0!eE3q!R7Qjm9c1 zC}Y2;t!Wo$S%<_1Eb)rjPYoV>!IP=dxnb_($<%ue;AH&c1|;=(0bufp(OTS zA{(i|CIlY3;YHx_epM*NG85M?_6xvApT|+~V4YTR2WY_&!iEkd+H zGMG6D9dh_*m(ke!sUe zwQ~S+h})IFm6mFNnjQgJdyf%6gvlCO*WMEo8gh9EN<6qzXFw*qJ~k^k*{g_NXp4oa z5orEDAkG4;3;2TB+`47N&9jbx>g)=K`ryJ0CRgz#<$GO7X`Rp6Z_LiaQyu+|W3cW0 zcM@7$lIlI!XC>VOKz-7)KnP{W1UbNXg_cPp)%^q4DfuWKv9Fsb+`cg+``(W0;oKOe z3#Iu6K4XJA<_f0Ju$ga@P~SjzjYjiaOc`Rv@wZpJqlhK7SKQ(N zf=WXta$NI3>Ty$*l#_@EJ*egca*X7#YxgXmh1k)SS|40V*>=%Wisl37ft`%u)Z;su z+CCUvh&uKY)|GC`byven4uYhs9^@6#2J@UHf+N zajH3iKlty*+E1h(A=1Hsmu{9uC6##of!V}Q@_mo_L1@<%MQ=x`eGO?Vv%ClgX?4&& z&(WIo^qRjPc1#l3UwO21{lWSt5GGsm%;x!$14dHV*!fg{AfK-01BND#$TCFd~eVBjKY9|A&@7n%XB zgIl`$_76~cjSqq4*iLvy_#6my6DA`mn(i!sBx2^ zs~`3=gUh{Kn(%|KnDP>5yE4zx^9nVZ$>XljZ0O+heDh_Tr zIcw>QSlM_LYzA;BbFaw%2umUGvUuch3hosFpdZO$@;(3d450Exei4yEsevyk*GyG< zi~0OO457p;v#$Yi08BML+vu>`urXXe!U^;66i2k}aRMdem;)baO6DpQSgm+HdN z$RA^o2b!i*;nF-eD)Md_P?xQ+iz90WBPe)Rxp&rc%J>1S6Wf)!$^hz>%iIel3;E7q z{2i%{LfUBL&jYFp==$C-&YB!(W1@kE7o_7poCB2nk3F!S?Euc2%2Z3nEqJOp8Icne z0H^>aeTp?`{SfHynP}A`rY3TC0Es3x8$nlw%i?T2%1V~M6jR0HBmgBj`gz?)l0x#k zfPl&77^=YMnX!J}&xvD*GG*&f`G`Lmvt_xe-%52GwNng+eD5-Jmv8k9N|dAN5n!Jn z%8cgUqDB?>jW?>6Q>Nbq0|2M46~k_gJZW4~+=WtYAfse+P&yP`yQHtlT?6!oUy^x4 zXy0g2-G9#0L1F|A`O#f~C}@fJ1)GS`EC-VW^L+6nOP3eaIlwFhY`L-aqSN-YdWrXa zFAhKmJ}sTy!v%$ES0^YHWwBStpY;Hhk ze`rzoE>jFvUMjG^-~5yVSNwy?G9&~yKi!Sn^&}A8VetxE63d1pK+c5x0ql}sh6(;c zgTp2}V@T?k*Rg5j+2g>-PHx;6$LH*6Fm}fVbYK2_XU!ksd9!7j#p4u9X8K>M=x9L7 za+j>I%Lc#c50FW;vj@sUetm!C2V_ECnx!~yle>ySAxd$a%u`^kup1Kv@z{JzzFn7s zwtGw9W8*0Mv1|K`cGngQFUtPT*Ri2$y2y0saRA;I5uvZ>Mp~ekOC|?CjnXEFilzCq9 z>1#fc!Y^FGt*-GJlpaf`4hKn_fDS)#ME|}E*xL~Eoox~3r!gwdx)q?ne4lN)Wb*Li zAP9-zwH;3q+wY2YN1CX-IeCi&$^)3TXKU05&nn3V9`yWP z(LJUg54H)b16HyJvXWJ5o8N6Y;pxKUoic4sT}v2#@SZ!$^JZO>(FeZ4adiOI|2`>^ zVHkt3&d-x%^X}~bV7|M8d)z<~PI9_Z$ud;ws=>e?hYUf+WZUgi_+ZKJC$7o@$%nl2 z>sB$}^AiL;T}-vom-%A5c=XtT03}YbJW4%ZL_grE@1Rf9YrSkQ7FTnK_ZV0&c7kiY zH@)~}c7`DR$*iNmAZ3XL-GHn#q?MBmCTA(^U|eywuVS-beO6|bwK?{b%H{VWJy{B; z{HquCovOnnjTby!coHEyb9}l%iWEF1@+HsnVBDN%@8CGv!rZ0aYbbb$sHC41qqow2 z#$<6{ECyIo5d_bd)=s{gxFdez)hA$oJZkwhydOBC5Hcg=>rJG>Jza43K6-VdA$4xf zoOr0jJ8BqiiFj6Xlx!$F5b@mL0KnBv@kzRt0|pMSH*DyRi3}N>3=$Xj@CFop5x-Bf zFUZOQSD1&liw%Q9X(#I7t-%&#J7LkK?lPoBk$|(CSGvob>XN!Aa)@vU)l*jTe;g2E zGgVQ|i_QLXE1VYm={%3#KM)anxbjOWW7_n04g>}O!0jiV-5l)|VOs?FQX@P>)(4f3 zm$5SZe2>|PE_5eU(ZAUq{B}Eeytm<3cVwr~XEV8z1CO>;v;t3u)4KEp{kK1=AAQae zBHaV9(-x^Tf&GF@nJXy=_@p9wRGHMwkQvU;Xn)2x7_A|tH)EftymjZmDc?h(^X-}7 z3n3i1pyw`dP_yhHwqD!s!=h)k4N7VU<9;da8>nS^EEGCl@Gz=cZ4GWCbE0NP+0Ih{ z4%2tIL~G6&b{EKhUW(w(c}f}D!a90TS-zKpLI7shSQ2Pex0`|8NX}+W*o6VxRtw-zhC;}lY$p(Y82VUm$W5;P zh@E~$0=J%_%VgjW{)WS8rc{3ngP+ZX#0GMxwTIj?BK8QV#(mkD!GQC(P&S&#b_j!#v2JgJSs-PreYAcDaRsJ*=P}e&uz+5&T!_~OqdS_b!;E4 zz#dw7fPgnR9_k^C^YuKSho*!_)iB`8Zx=&{3Xt-Ge?ATc$~!J*2$~DH7`LF~RQ13a zXq2l|_t|`SZk9!Lfp#oyOPwX>+Ar0xl6oeO#8>W>D4NFc$--FQPJ@332sdA09vE zVyMDX&osUu;BI`|HZKB(erT{u&c@!l|8TphUKlD)RGC;d4{E{b`gK|c zbrV_Ol{z5tQ3v&H;+K6VGiU{%(Y%UBGh3r-;Rj2m?z9d1z{;}iX%_)NU6%^KZ3ara zZ2QFvo^H`SG0RoJ!}3Cro&Oj}oL}%rON}bx0AM&sc(^sidrgPBBGmzuM#-);O*;@1 zU=LNbtd3Pb`GvA&?xzy(W*)=wiNY~Yi>7(t@vd3ZiV0}G1>xF~!J|juasj3HbWq4a zH10r?%BbFVUoT1u9Ks-Z_Y{LN1=uR4;qaTxI2lzU<&dwsd9Z-i{A!g9wZL`TSfat z(#r#3He(G3K2INL)&gZP#tJ+n0=B73uA((T6v%1>b6pL{CO;Dp0O1hP87eEcXJDf| z9+}jHL$Mfr%*4gquneFNJ>|3K;66zlO*cmK>rGd8tucjrfE6>r|ct&yu=yx%ZHQab)GLKXG1_sw#m@jhq5}^FDB@)JfNOMmW z?Usj+oqYByk?9mTo+5*m5+G1Uj>y1X&(3gVTM5a|+F!}|ps;)rEhJkk>xBJ`&eQ_7 z0Bp*Ahwhrkzd3Qen+;&Ky!A$7DjiR*F2OeGe_ z085UcB%HrP8uKF`Z#3-7CidS4?*hZ+nasb|uAjg6Uh>`c*;iY3qYp+DixS@_PK}BH zzWoQVXC7p9vgEV!WQs9VAwI4Q4IUBXAkonY)+*KLPFm+F5&{cXi1@6Ls{RM{$IPN; zt>y7lEd6MkHV0t0I^eyE=9S}gGeT(}KMhheD3Iv8OPi8>caeS)eB*K~?0;Z0g+(eN z9-xlhf)+T4r2^USTSWMvty}EzGtK_fJL!iQ3ml|tv7C%~2PdzY-0aIo5spm3SMiYL zOP^9+9SOOnn5C%-B+-p_lbK&_HMQPGs5LBE;GR6bPiSVv}yzeIq>0d``#i|s3b zNp9hlXx!7T7zB~Q*RWGyDfJ7@`xS}6Ir6$w$mrpU-h=nbZ_j(~BP^l`m+X>tFC5v! z6_i{JgpjY#XO_Hi^uIvk2 zotE`+oy@lHp2{bx3f7x6Y3U|$8wD7-PgiqIa_5}RxGe!jSsi%h^1F*@4@0$4`bIn?ybs374DKGJ6xajbsd%== z4|%b?fO_2+?ndt0n^a=l8@Uw`zD_7*RioA#s%q~yF{Xi|Kth?t?x(tns^)SQ1_06q z!_Z#~oreKSF%uk>34$J&3hrz3ZDQoTHu}-C_z>S|dB~@nZT8ugo|wG%Z@^0nTm;J= zV6*oA!Qp}Kul&JYV508m+nfMR43^wDoCt`21Y(K9X+98tKwo8To_(MLctR#{vbv>m zEjV_ma5Uz^DMK&FQI-KM}F|~3xu5I#^c*6 zo*8mvvb~sxX0C(E7mBulVX}D=_5g5ylvxhaf+!q=4GisaKySK4L-a_MGK@O+tiOOc z!wiKnj8JaO7gB|B5;|R-w4j{yOKt;`x^wFYOHLnl=(!Kj-n|*Jfod>(Zy5*5O~xapfOFgWD9r)*e0%9YXCRNMuKjQYys=d2mCe$gEd~~n(TH|>+EruZhlKR4V_+JT-T|t* z{-5O_i+S^8pigNoPXzl`xz{^iSPa)awWS%@M|6HCWZQi>obk5^d_cL`@(Q+&o#BQK zDutQ#i|0Zm*(ZZ`l|{*#%#2Nbk2*e?{_%;C?)r^9&5%9VZE|_#zfZQR&yIO=-6R!c zrR)JJBXA_%em{6UBXkl0#B9{p9!i%g`rgV8i%X}Nc^%Q^=zRYH-=MEKWswcq=|tTx zz60-*;Vu*1NGSf97gKxcDHRxkmJEhUC-CpCMdxJ9kt> zjlbSHSo?mj7`=MS4i7m<7hj)>9!TKk1HW;)TzUr@^~HREvJ=l1urb^eB%c2fT2U;y z{Xdm_8Vz!ePuk}^B1&sG-71)E)D+W^pi*13wQL@EMWi#KbG)@vf&&SiYVLgBCoVuI zDrn_p-v9KLBQvEGYC|CcE1Tai>=g%mC6sMG9XbWCc@1__&XWENM2WFeum9VrB=hf&gWr*TCIaty&2Zz)%*<3x1uG}23u@j^pMo$9#*Gn0~fH~SDpjlhuEt@LdB z4uP7g1+8->b6SqtDsWQ#=zi3qa7TbRSq74Ffm1B~zy-HDeV7w4xFNn$*Iy>_1t;5R zK_i)I{a4p*fK>OsPjyLhh7{iA*ms=}enD&c0O;1R@gO9zc{${F*CrvIT>wC2KYQXC-E#B!PG7on z>3$FU>bdQif=TJ%{ZDY*kQzPdpePG?$qgk2MH&VkG9j>PZ5}Oh8_O|Zd6F7Bf-t?h zEpx^O4v#nir-%w$H{#?p7Qr0mJ`#!QFB!ZsDS50MnW0m@Owm#J22iO6(6KbM@>|gC%q1o+c=x zh@J)a_H$VDT-jZ--g?)5906(x{h`JL3exRYB2x%p@5&+^P4muTt7H)HIM6+21$zsgPuI7Yi`(&}D0 zWL7W{>rfp{b}Kg9ksp@VyUK7HxU@$4;~J4JLOZ=Vw58h0qn=c}Yb?KSo|Jxc*mz9s z@WeOobykh$D`DU_8-U-RFnLs}`9RojnFCVAs!}U@Y6UuG8Go}SAfEfR&wC&$bWz0L zF~Tk`bSb(>v#0FdTvXXCe~>SDP(L}BDp>1 z&^w!dZhl*z_`>l(tN7-PfLexK6SyjOPw!2U_@17i%uD1VV(WCw$A66 zNt2aP((h@>j}y)9PrB}IJoyhYeP-mlx4zW`?|4kq8avsZa{r%J-m&)HAGyT>tB9W|@e4Z)3 z`8-qAdZ#I*eY~pJwGZsh4}WQQ8Q@s)MjRPeCzg7yrj?rEiImV5)luYIeS7yUUe)II z{%4(rJaklo}|mG8Q_3Vkk%r#>02mGy}u^s#;B zw6>eagm~MkuK5{&NGShA^iz^cjE+#%n;IMN{ZQUN>OlK5onk*J+->2=dFD&dw&<&C0*<8`al zE+0(>3?h95L{Wdj2==!L&r-E z&B|8bax*bEsW7ZoFk^boR(*knAto?h{-ZIuBF?XhRqb2hKt|u+)w(sL`c6J>}97+AkMJ-42I%EYVY}LaHx;|=8JEnIn zq5A>1^%>nr#vknK(BOpaCn5YySGjbe{mZD{iSnOTlP8RmNZg{8@0J)&1*K%CeJATr zN6@ZNeGT1L!P7+?N*|lzYoF1Z$9P%z+{i~G!Z(u9E;m`XM7jb(@|awC z?_3g6@lF2w(0g`j z&){t#-UzUvGktj_rkxp6@nMUTO6_8fUP5Kh5-f~Uqcce70@~j+TyV3`B}L@!lzP6# zP$t|MgqLo;_x$_m6Zq~TZDa~8Z9m8%Th*g--u|oRYKaSPS!O=}bZlmPQyDK>JNQ2P z^&h*w>vEI7=UxW4E2-{}Tyk?z;1$@_(mH!K5G&q767!qotnLAqq z9$a$e*?pZP#OP<) z>z$W`T+ZQ}O{n9^uT2x?(^?1@SJy;^T=uEEbrFXtt~e?1XVx_B(tR{@4hprHX>_`t z;7?urWrvfhyv*SED4SMA>`5PaHZ%=N3|7smMSnT`_ZG&zJ3{1UCF8;7O5H((Ui=wMX{?ZX7#Jdh_5TaW{VC_p3AI!+KNL zhvd(;KAKKah8(41TR|PAOzydJCR#p|$34@RMW6mUYM)wSK95@B5_83!vg#&F5`Ai} zvOSy+9g0+|>`h-R$TS?mCZU0)k*hX*?B=SZujV=Cf+JGCHN7CBcK8H*b?FRqxe!@? zU&dDxHxi?eYuf6TI)^csoQ-N$4H9Td6eA;uP4m$o@?13wcX3JA|{`7)14Q{vX zXaT{)D+tSP$M*2%FQ)<0CNG?;fSReB+7 z41*0T?(M*LHy6eKP!Y}S|Cmt;kAM?5pZ$6ch@8Xx{d--P?a5c6;f$gl0tG6QsgUd z5Egrd2ItD09A@w3l=3%^>3!7};+kn6Os4(2#G8mKQw1)(?|f<=Df(Yu3IAs59aQ{Z zNVC^p&5(GpfHAuF%~?{YCA|(o0~+~XK$BzITnbgMs#)Evdp|b9`DK3>bAdfN{ufA8O4an>#R4VmjTsZY&k z@IBAR&ScueTPqM^`%Ke>y_;`4$=wa4S<5_`>K<$=G5zH&Gt{i|N8(R!y0wgJel#H# zJiJh6J&0(pn!+*m@vj8lziC;oN_Cv1ny}u@2rJj%H#@pq=L6}xjj7v`m*mb;EzpzG z@ZQau;r~mj?G@8R6Cn8<}#>Ul^>3m*9)JnCW+P47@FP{1}FrhYD(2yXp@X_>33-?`KDIU?3+ihtGd7 z@_Z@ZR^s28_j|v#(BMqFZOyeNOuRgk_+Se0}AqV_j=kG4JT zs;3258aKvH^!^**@hQ5d&*aktA?&D4Ws#J`Z@)t>g4SPBV|-)UswI< zmI?ahDSY0DF*5(##(KqC!RCX9UEyE>!GHCUeA}C}-zNv38||`{aTUfBK@z1R~zH}21|CLeA^XVq6Q(U$p82IR5#5MvsCAP^b?_3 zV=Rin>{Q=r-E=Hlr7Za7q9ZJQ2&jF;rfcF-Ut(<=%6tB4$J}LIX(o2(XZjN*{U_BYqHZXYM5_MP5I;q_S%(h3)in zP_&z_5$p=P3z$ppn)GbS>nZ6E9UQ$G6r09aTPG)mf= zG3V633oi5U2@S$KZ^txM5gSxR)*ifIKdrqtE!042{TO@m%Ut%m>25k$%0>^|%5N>e z)&8SPpnLe=>@$2`kPd6zO1PGGHk(PuX9mc-oJ!*zQyVQX4WxX9xQ>!=@hs*m?zW&g zBA9$N6FX;1O&2~nMtkLk!TlsFBIw{|l!tR_@G$NpJZ5G2fc)-vVN%GE* z2EhkwhLS;iZlvA)eqE``*bg#xcU<$nqrnqh9Nv=S?JAyo-aW_W6FvC4JHMn_qRN@Z z`Gi7lJ44t1PJsqN)MU8AjABWk>=sah(HK%nTzV~x5iEtFuf3o}b^hmoJP{Oc*Q72p zq&@&t$i)8Uq8JI@na92LTl@8wYY4Gjrv3HTQcGhBA=&^dEfW!bRb8-c{hMtn<`(1kdQZmXNIwxgJtKn|B|&{ zA#Rnm?zL^gsszZ!dGn}Y{yvanaY{`T94`{4!Dnem9_~7jtaqZgZCPv1@8u@4=h&u-o^%3%22K_SoFLYNGK| z_}9NM*`q%U)I|Gu8IkPc=}+0U6!yQJV~t>gz%n=H*eM0eH**-X#!ohb4AUyL5$trk zJJCERF?{7ksSH zW~I*^jQVt6>D(Fc?Z>e$Em*dzC2pZxTxQNRC@|GaX8dhVHF;Vuidw_8Sq zm4sY4;@J!R1!*J0t)s$4hmwOq5pBNa0M7_ByIb`eE~)28cWH1rTs-b6d{XRH{D}XN0DR4?=ICjAmCj>Q4q*x~uR6?2yB&C2+KPKgQ%bcS#U7J)yrc6Ko&daJxb5O{xF1O9 zvTlce(Mo4=@0<6*@wU{Ck>Xy%j`QWAKdIF=04Ya*v+!u16PW(Gi8@tmey4w0@^}TY zvN$6UTq*VMf53_DRveeWute;eLfrB2=xrBEySIUQ>6PDY7UWU9G3v~?KQE<8nc|j2 z`=&O7P$=o1N*~F1KjKD&;~7`jZ;koU4BFora?W+c-1a)+36LHt#``n4#1^YQ7vp02?Ntw*} zvUd>^??veu{68ggi<;GuqrL$iM$Z-h%Ocpy(Etr$|3rWBWL(lH*#{P@5RjfD86(rY zpv(KPG)+FJD4Av(b@O2N>J?}}ze1|9RkS^$ZhFTv3Enl6q+7Tp@YR|1(30sL;PWH* zv%Gp$8z!fP=86cB9lp~hq^IB<)!22qIAi;Kk;Y436}4fvu;ZBw5IH;GHOfAfO!GBN zmZ=WA^)t_g9DHAGx$bU%<|=M!@_Nu!cwg#Xy?QS@)|Qc4uipGQC6nqDT&7mWhXTn= zf?aw}mEnJ26}#qsNj5uGGUFG96O_$4%sWcj9%s-xmfw_2M?}l5&y`F}?Gze}zK?Um zMV)a(=ODR?1@PU8oUgC}CXbb`gWS17UIzn8J~~gJN5aDCo|pVWk4nRHf%Jj<+N#sZ#CAj2tkTNFm!%E+ zB5p^i+Ta1d05?6C5NkqBxH>j{1lg|eVUTo2y)Z_i@QR(?A^;={7}rU36hM|a@<*mi z7BHJ!{0iB@r%_Z2LFq)#We}(pQi#5-OiuKj3G7(S47#{;Cl+8BunDB~4xjTOSL0<) zWhF0Q%B<>KaE){5(n?MC^aAecY<%&Xv;~X=n2@xDxB#^K7wMx7>Xnj5Ck`33)bF_- z@?nc4p`q^Ck(Yg@)27qR78)sRTpS~zd?Y7Ef)U<2jVXf20$toISCI3X}h7Tk{$_Ytt9b$5F1%ophaFukrKq^~xu^HVzgcg-dx>U@6}ndG>F zykl3j?dgxzYQ58)zLMNCmpmQ^hzLSw&VGJXgAs>JOZi?Cy=0QW@ICkt6w-qVP_?Vg zgkGGPc2PKx8y!(vS(_f~p7yzg5)#%*vKY41n4|D)hNR>E8A&nt$t1pcx&(aYzOY%h~$k6O$j zQ!fDO+L1qEyW4LLJs?+$33yd! z-z2qE3*P-^x?jeJ;+C_xRL>s&25>k^e^iRbE}O1>ueNWt3s9X=w4Dws9Y(k}?#qQ}aw1DgFhgOU8&Oz)Wvh@1%}(ajYycgrPX zZ9ML$^Mrmc%V;|?X)`$!Lu4=W1p!DQpQq06{GZ5@=?hNRr|tIQ4p3q!89EFgQiRS2 z6nKX+Byu0;$1$#@vY7EY!6#x3oLK=JVSS@dFB9;3t|#t_Q~xH%UCa9uX)vkv9Ki4y z@hN;y^dI|a{9K9ATdlUz2IqW3LM%#B0aV?_Cf?{9P^u&OEpY-@g=IUlgn|4PIzk~E z1Xq=6+SJps&iVp{%r|Xy6thNLQhxMvf%i6UG9qB^&qlv{1HGm+dJ8pi=Yv2Dy2xl?H`SHD< z$vog<_bjTIeeS8YYVJpDv!~O?y!DBS?I~fg|49Ss?6uf?d_#_RPE!rsZ4?gq9=)*c zT?PKa(SgZvo1g6;-gm?Ll3c<%36vhMJY+)`s6F=eb}ye+k-NVaC)F~|w_oF=U9UtB ztPF-$3%eInCpmVolqagntXPI^wu5x&Kt3io|#wnz0^C)`RP>&}{)1fG|9tp5}>At)=#~d>FnOVIi z;D=1(8|v0q)Dq8|z9Gamkg0^&DM04cSzl*rmJ_(c4ZbWwgAt`MCYWlaCE2TC?JdlS z5F~H7iOHMaLrDs5~ zw)rz|zCPrgkRm9;MGIKbc6xp*n-Sh#^gFWDAwN&P4f*Q3v8vzun`94t(w~+F-~H;# zGWh>k49W*|6c#w;K_4*K-mDy2B%^{|!bqP|eEXZXh!UStHI4P2yb|#vojg`6nR^}u zAoEQ(y_F3@dWn%l(Fgl_K6f=;1IKtUA1N~-25M;D?n&t5$Wf8GxPy1fm`9dqJ~ps@WMYA=StB$vvjp5h8qWt!eWEv=h>+X5!)kRCFLaMPgbsxx3 zGmH2<9wGg=Y{#mz3@J_%DT}|kLrHH0XM6*MWVb;Pc=U97M+|FsfZI|jvh&g(M)6|k z)Pd}2kI5{*(y*7QHsa}k!v3?~M2fL_(-AYv2ykOB-Fc~_%q*3?5Vqko*o8e99NNob zQyJguN+;_Rm0fN>t;@(EcaxJiCm-bNKEY3*Bd(cW$lXkuv&0OI?w!=7b?DzJ|9$nf z#(6N6-GYSnWN6d1dWUdTgWl)Mnz@l+_~*4 zfzW<%D%KW;Idhp$bji1YFz+WW7aEopCDbJRkoMIqGD}Tx`QWd%F(7=j@ToDyb=1kX zO`YeD`=?IrpXC21BYU1G`*YY z)~I%l%AdZPHzu>Ie!Hb#pr3C<)}7qWK>{rgO4yFSVvilf63jSD^V=-_&GXQ%>HXR^KT|}PvUtOn z<;Q_`FcubpPhC@oR+a%=)e@)3;I(2^q`~<^$EJ&m7=sh|Ka7arB$abZ7=zanyy%CE z+iDfB+x=Ou!?in!=q?^gQL}oMMC+Q7(_LIg-5J0bQ~p3kgq46^4BpG;SL`5H?HKE3 zqX~s>2aiqiCqHAE{pqkILoTHdIWH?|g5M`Dshl>2JM1nb_XSDO6}kP)fU>#<&_#M? zMf=s%2jrO7>!pUH;}_pYE81Rj^zF%fchFml(Z3{D>UIJ+brxNPB77SKlRN54yfX;A zz&tRe)3#XJ(7WN;0tMAg;9CqpID#>YG>Y8kF5jBd*OP@zNv>|*Gev+~$l-SPm2q9< ze}5fe`jT>D%n9iYL5b7&o@?tPP9#^rdlM}a02OMRbx1qY1 zpqvXw-F$c-0@wijF_UJwQ{5e;>?fW z8N*&+wr|2t-w2Q_yASUFq~N};pksi_{dszM*sG?dQ@k1LU8UwM*y4&gwD!>p5-*vm zmTy$p)$20!spBe%D5^H;Tduf@Kr2c0>?^8@P_Jyx4#-u@}%dV1rpw89F_nTTcp6fz6GZnTo*bNu9oO`W+Xdx8earOf7H=7VdGPi z2Kkp6MW4OESK}BZfO=mlhzn>NL&<_#lNTQR03G}*bb@LD_4+x?;8eM1TUX!uE+M(n z!UUh1g+oB29iJ+n_G(o-U-E&3%r7C`$N*D%lPg`@!6aY;^8XC(xq~pytb~t0T^+_& zcK@j*>Nx!w`w0Qd-fz@aI9AU2!ju0Q#wO+eF$4>M z9=5Q5wSox30T4g`{tV1vI6!#yhUNdMAR_<$%x8;y-}*bwSp!g04~+xcid=p4nNR=x zU(-yh>sK|a3G8xsxQmC@f3BGg} z()*tvGZKGuT^pz@8)|-ZaWoX)5=OC2ew**j8xKMMPR<8UW4wO z_BlDn4z;aEposS$gp>Etq&nFnMtg%zh?QKI4<@qDdZ5HE^h*I^*MBHWt#U*nbxpdM zoyt)SDeZsx$8O(%@A`eG3V>-Zk)8GZM{0H)cP=_6NI6}*5v1~bNdl{FmA@qOwM>Q( zc-XCl7bLQuIar^_Kz`1P*(-;@}O?)n?~+;?Om)~L2ia_i{40%}2LUaHE-}yW4Q1N+vfnq$}^b8P*{=iI-P7z({`vp93Eeb$K)>CGL$1 zw3Uh2Sa#->QG=U)+BfaOsOVkU3=SlU?{ovJDS8-BF)-!@PaXiSgpe(d=u?uCIVpfb zsEhVoeCiGrkHy1|&NF~50ImqY@~lZVaeW8NQpbj%CCZu6#T*Yuu!1zBG^F16$lK{h z8)Q4vmhgWU{Y`iMutFRbbfuk^OLD+$3Wmi0EqZFDincw_{lLvbGlchgEi`fqnF7`7 znVaTeSwgISe-&sl=(vJpvlV(95_sQ;k-L>|+>yDy01{mKE-Gz+DTQ(a4w!2nm4IN? zf$_=$5(PBnK`!d&^D@T{||0 zOknAKmhnbHhtN|n!Zqe!)GJQMczk?$p``TB`+g*Am7^l<%_rhNxs&=vjZvmGMozyl z{798pjCY!v-*G!|oa9tabV}^((y5r0xcc9X`1Mh_KVvSjI1|xAoh2KwQMv9&Tyk$$ zqv{Xr*`h0rPdhn%YN9Qr4PFZPBhqS>iKXmRmj?XD&_6URf6Rksx#}C%h`{Mlxo6U9 zTNBqZ>_ZEKhh7Z4aj%in&qcT>FcIc(0_4Yh1QIQ^&hu?;dB(!>ZOvv2z-O;pYhrT?{?% z21(0y=GnHtLhQ1Rr|DM`UL-Jn99BzLRt1J)du?+Ouh8Y9D;mN}~5_y2!ny=Pn#S^qb@ z_JRT`pePU{qJk6+B0a1|1gT0uM4Hlzg7gx?*n^6Iv=FM&o3Idiwa_FK=^dnZkQyKc zpEC*Wwg3BhvHRI&GLxAz=lsgIoRE7>M9HNYBL9x(43`skwZPY5K0EV5NX^3#S7)wO zK6H8n9`B0ycZZrvMo@k<3Cmj+hcfB4p#c;QFiGFAZL^kqrYxargETIElexBke*D)} z(WS_xH+4oe=`rAUR}FSw65sSbPn!YLV0Z_P+c}t@h{+-UQX}k-CU4<3&ehI^?mki$|UM z#G|I|;IUjpI%nYgONI=n-sQ(hXz!)MxpT8#dr8xCg=X%(UlZIDo%)VMO-Gl7O-D}{ z058W_5pE9Cko~T3?nQ%3V{q56N&~7Ixbo!=Iz`9x=lZPi(AkLTen|bxOyzh{+;U*< z^TIj5F7V5(RimGftX-qE(*neIY0rsUulj|J=x4vE5tQSuwLl8HEUJ6ZiR9t1RCNi9 zE+bNo5z)kV=hKM>*E1d&Ig+3!e_q&X;VZCs!YDUON?sdq&*7Cr(%zTCp({Xeb~qq~ zv{>!PZSMNbeB=xGx>t3_w`NERV<_Ji9;l?%1>R4mB7M79z&bZg+IrEMYXPe!(X#`V zz8Ed>rOr~e!o=l`;2nludzIlJ3dx2VC*cKF6Gc4`fyuo4TpqWbd8=s!59CjzpK7^f zVZLr^x`T3`J|CZn%oPkzY_qqntBq^!%^%32X?Zu}p>>@W?^^X75Jx-SbyMxX@pBq_ z`P`sMnb{=%+J$&pw;^@fUgU1FEzg&*`e;2LjCOY=GL>=DhF+DrkUK@hQN%HyPYrpm zF1jW?;?etNv@I!|8!8W>oX!(#5ia>srq-yT)ysD4(ilo`j^Z;WAR~Q~&}iOJAQqIu z%MGuoN<4Rq+WMN2Xi#UF+8de1f5ckILE>|K=fEI|!>5=V!;uLdT#v5vbCjH!k=Mn0 zURN26L9b~j5S*$VNfoQ+cZEGF@FX=7xX(KH@;k!M=LTf5s4s_~>ZC>)ZECKe8r z9k8F z#LMeE>o!qCp6u#kWD!BcK@0MWg;UELj5hhr`Nyg+2~y98>0G5!&ywZuycPEW;j<=q z71U*kzurkzgel79XWB(x2^J)GiL;=uC7i#T9B%thfcEB-D`ya1s(x;mW#ga=xKm_N zkW$A*v_YUJdMQs%Ir(Dp;uKjrrZCq$`|!u%lx6sI%xMMr9{Rc-K+dxoG{WyC^M7C+ z$0X(e{9`MPI)je0cD!sOfXms)!C&?J5AgEVL59rRVE^%C@H63&T>eTY_*L)~WJ1T{ zY8#xI|J>~%gb8@_X7eG9IUDR%4_51*vfZ*iN=P145gAF7Tx0h`WDY;D_tb;%dreob zSww-O;~2hrmlb5yjQv`GDKzKhzY^em^|uk;M_CMg4gPM%xZYBhAF;CE0JmVFbX7Kz zjnu3ve+^z*KuM!&%qD%e>fLRG7LBy@NapJIJK%5`A4-D8=K>OFR#MbZp?MQcud$7g zqf<2Rv4VUGRe6Hzudsta%8#xHGn_)^n)84IzFjkA`KD*-8myIH;pxg0>P-(j0P zyX@aaxL~1a*4_bzDifp`-*V$cl&L@IW|fOpXff`m_3FpF(V1PT2fbZ8w{0KbcQ9L5#WP z<@J>yC5oTdw#(FBL63Mw74CZ;C3od0VtaF$>;oHDT=u6OU%&E+R<}$G&o+ulw9UG# zkd0JDRGKOYVV6)Q;eya-!bx&Jq178@my&X(_Q7J^R0K@Z=ei1~Q#koGP+H>b%^Vzn#HTMpJL8+i;hU|~S zKUX;mGJ>B6V*4}5ZYK>a7aQMC{BVTID+rIBagmfVF|7D|Kh>8|2_e6OX2(qkPRks` zY&4flml-zLVQ2$6N!P6J?F1>F57C_K&hnybhe!!+u)5fy{kU$kuUxC{# z(*aCF2cP$#7M{E+anz)GXs}23l!Qyqal!>z*Ve(I0Ku)W{2I*j0ojo5^C9h0r>SJ4 z`(R05Ac4{G`>TEp6SJq*NTg>g)Gi}62* zR7<(P8f6})<7#=%KApw5Dmkaec=N0-ATKK?DAkboGIo zph{CXXLQ?(ENx-(ZB6h#isT4=&Jl4}3EqAEa)fEs+6hoyhC-fRE!L*;Dk6)n51({B zpYUne$TAR2K2Mgso9t9)2N!GzsNmOA%c#pQLxVrf_$6OkUlP1>{Mfd7U#L802`TUO zjJILzL*Dvq$)%@4`fs?Z=9WSvh=(RE9So)fcg@!EHR^N*Qj(n$!qdocIaaDP@!5{9 zxe^8Lax1>V17uT-ELb{KXD@*=$qldUnc)>00zaYtWzPg*Zlz{}u?aW+*-dT^UV}M3 zC+-l@M)Uf`HjhgPJ{QOU^=nw(3yPwjNm=&4i*h8{rqR5miw}nU60{Z-Pk46-B(@W1 zGbgU&yLoj}&_wCP<--s6K}92|lZMG-S7-JXs?80vE)SrbB>N<7Zg%9%P-ftTlE%GLS+_0^ z4qnh=TQRVc4a%>jjxIEKXP>{n`nLtWwNr4`?H;2}T@UD%8|7@EEcd-%O-yPd_<;80 z>25?UsHppO5!+?;cT23uiG;MBv6)MHa|n zGjpU};EVr6F*u7+yY`3--&r+>JDN(u^;J=GQWT+)>+Oxy86C)k;BzX5WkS?gTSwvCB;v<6p2|XiDPH}>3+w~tFvS+p<)Rt zlZ6a6YthYio^FQ}cU2Q=sDrP&cd^Tm$E0Ox_PAEl=h4gl`Qgs~uO#t=M2l;@!~?(G zS>{>tVth|NwL!Ik-5qfR)tCAWCislK6Fn?@ zfLD4w=Xm_!zAGRc;2}iz?5c}|=(fh=gyqaRyL`RIdBh{V1>3IM)`t;VeI2MSs(BUi z@f=#zcdc6AU0ijTJxN;;fg*AafZ9mk(lGO$L*yCEs#&D>$`}34xaVS(oh* zgrjL|Y+jhfwemX&(O1rt|M(WWiyVLJN|=Om`qX;x$+r;PK@Vt-p{O5jU8&^0_L`cS zS$DE1X8X(jWBK)63PNcU_wtC`X2#dymP0=L=AIw=syEDbzq8^q-(^Dhkgbq2T~-&& zT>DffQnZF`Nmkc^Q7yKwCu?;wX7S`8&u8^A6y3>tbNT>a>d)m4xIY?s3`yD z0>sx}W_0=4M3z}_b*g&ptvSvRLw|Lud20Pht?M9Q+P7=Ry@=r(&~H8+^mHzX{p9C8 zrmh$Z|D;|d4JBk)&-L9P1-vR&F`m(*a^(%uf_sGpef2N`s%k}Iadq4I!3?4Xq2v8^ zgOkej$8sCR-Ck2=S^W!#+xEO~=*c8N%SSjlKpo`gGEg1-nr$ojthsR5myb5JzMY?s z^AJ7;p7YtPwS@BUk#JDJ(7@$}gE@B?Z0|qX6O!t+EV_cMS2T7UQ~F&N`;3Bi)dm2~ zxMe`%8hhJ;WKee@<_GI3(X);I;h#*u{X|l`cDgo}#%ALlrLd8VnenOKQ#t2n%P?&^ zIZh{id}jo_+FpXNTL4Tp|9MK|L!(Da@Jg8$57w*ow2qNqs<7szfSW#{``iXD$klV{ zoXw`~XSu5R$fhb{5;|9iUypK}h7?-7tN6%V-O*V`RGMyLb*v$q-@ft|Al<{Ma=^HU z)3eSqzn)X(!-0bmZGyA5sh|Y*Z`FRQS3%v}B=C`=P{lZl4~ePGoFdvx3@ACpv7}Ms zjl4z3MO&-nl+>L0GsUL<+$h=-I^NCJ21xb3^M`1CbqJD)z8gsow=^>OVnt?RDl)^s^f_sdhsA z_nE1>64hn6wPu&D!!5XT9=TtW%*mXiUEBs#HnUYg}AnDyFv^sbV1kyZEc0$ z!t}X*9MFHEO=_KV5m#p}XgiYP(Pk>lnE}<9r)%v7^J0kNeIhED<~oh7AC(bngc4!{ zDW|8gQOzPf%3OsS^^avlxi_yY6b*@d5T)rUsh>PMjTLz~%LS%IAZ4aKNr*WstVNFq z|6X>dV6<>8)wdhp!Iih9S>8NaFJ>w@!|DSQ@EjTME|m6=vr_Q0@@ld%V&(Jaukv`qovb#wqYT01nHtP`1C z8eKZzFb(5pl*?jx;Pp$XYYFrlMDPb5;sG`QT$~V*SS1+XLtbvOD`I$133wjx8aI`B z;I=2e^!En^v$#6Dt$z2wR>KPe9yH>k;~YnYN?TIt;;rDOYA=SlNLIaqvl@){seUg} z+u3;wnJswW#EE%!er~r)G<(rWBQ&A;i<(j z-;Jk`bIUaO|73o8NRVVHaEH|H@oi;5oDGKcS| z@d9W6c+w@)G%AvG(H5Sm-MZ+au>`)Sb(_8Y8BrHg!YEL$YxrqBQ75z6i)o>lUe~+t z?>=|SN!G>HrH-Q1oRF?H8KkJuB1=*Ja3voVFfCSH$*W;H6muUCFrdz!T&KI7PNbd& zBc4Eq#UaQ1kll^x8{AwA@9pDt=R-)>6n_h>*d9zaoAK9kR_wHUs*KXAH z^&prQ{nixoL;-q-Z{2a3QgA^*@~2?99*Sp^en24OUq6hVx?il*A-bfE6M7G7aD{qI z9_@5;It}ER5Ya13lW_LhbcXmR<=SY?QUGdB{s(Uh-uG7iLTEiyU@zEN;?@Q}Fx)H^ zFYv`_YWzNJ~)?IoxK&fZX=K@!HA|>-FGcuaF{l^LMhDqK+5wBnWF1y4^ zYW@U2SiRKgyK9p_lQeIRr}RfuA)o7EMpfNxz*V3>acBM~=PmEgSTP-6k5r2rza{uV znI~n27EsxNjV;{#x=u?l*j?m9=d%R3#;)QHB=HIBJtC-FVKCRUk2qOA%11R9wIF-| zM;hE?L4EPjV0Xdt_}{AqV%V(eo|rno>t@zq8XW)F4A}k1q|bC(v2d{Aegz zBejSc7<&D_t^#Me8>TZQv}m%AJwFOm+v9?1=!Ex6Jt^S(0XDT$)_Kai&Dgtq*3Jjg zcj5+FsKwM4)Wpo8S6E}0`K#8|=(@y? zsRA>&ZgBe=(SPvWOoW55yC|M!O{MZt)Ke9I(kQ5HlE)6ugdHKjQGCA+JZ=@iNu#I= zR!p@_zX-t7e?ET?<}SjsPS|mm=r+wviyMLadY1xc%OpGICAw~l?&39=YHL3kHGBL) zlY#u!BpBeC$p7RkmwiW+ETJ|hBN|HCDPIwd+cT+o1REXB|)2#xACJKU+2<6 zN!0{*-fVi=3E~c5PJ}=6fO?A{a<_ByifZ)m@Ds31OMJmCQE#8x2OJa z0Nz*8*e2CO<-eW1k`E^O{+z1%ika)Nu(%Pe9)n$6~I>xJ{R9O)T|s(Yy=lK zVNQd8lO%@c%L3ll65P!zP_Mu!EE8-2SX-HFR+gu7`S68yOmnbNv=&@-FiDlQfYK_@ zn$I&AoFPCq%>v;809ohJ6;6}5B%5@?GB+`cFP4!o+z4$q*%n~*D)81XuPCK-LaQ$A zujigVv2WNeTARV$!fnJ**a|v6^bVUe=uP2V2S7hYEtN?Ha8RRk`5m^dtt0r+;R7q| z)i4t1y->kB*JCoP6Bg>EL~&2^6XEcx;ULM98na8CfnLtny4LqhVIJ>!xd-uOVJQTsR8(%CpCqAv&zPujih~PM zw_bt6F8G42+KGX#RpRim+&JNtfG99{FyD6`fd$xVl9zJ-#`E?2_n#bj$J)`7>oHwy zKm1VG6}S%6xf*BtEmd`1vR#>cX61S=T0*f`qeG(}?6?%s^=`0N^zOp~+|{&goubUwQ5A}!3%zrFgk)C4(`LLsF8yH33e3iGMSWy^ggXPKYY_l3tJkW6*^%K--oX1_G)+bV01l~ zZ2p^b(LD)i)M2(Dwt}dPsL+~BZj#6@(u*YFD&Y&UP`EUtz(wfQU-B8cLb08`)qq{N zUUJz&Dd*A3LFY6L)=B56Gig?)t2T&eick!e!DcqO{MBzllCf*QUN4(#s>FLQ_Xe{b zjBu#wQ@UTHTkWvVz5Ikl1yUE0bpPxP&ja{$gZ(lEz3H;r2~JCXi}-EKig2MEwBv)b z=&Jf|s~hDf5DT&`T$kD*Q;)Z1&t;OU44W9NTydl{NRML~BRZ(6XKaYY}Fw>LNhN0amDc=SPso+7cO z<)gLgS{eH1>x)117HPUlasaLu+_!^k0WM@lJ#)!V=qK`3_q*>fdQ-|q`a|Ln>1PY$ z_77yxto2L2@FeuvX>A8cZidObFo`?L~ocO ze$FF^qr{MeijXI7j6Ka+0u`+c%OnF8|ACn*iL2GM*h@Z(nodJwyVuzP@=6mxIP%OQ zGusH4SZFDsfCYGGc4my zn13^$6D)N-#0L7SEqDwapW_8Z$3&t}V`WiOf2FB+0|6DtK?e~-1$VgDjV4^8 zyS{3oUC5k*@XGg@9R8|aO)I0d-);PPq3o!(s-Yv3e=1|KP#IX$@wh~os0gDUL}+c8 zJqe&JbGy!}8#|J4Dw$_b?b(t@q`Mj*Rc1&AxE7+p8F1I#gCIg0okw8)$Rwir3QH%^ z#L4sZhKarin@H zyy(1ws_z6pV*oRHQV3K6v3AcS+csIy7e7`V$JjL^7JG#e8yJp*fc64b`5TZAKo$T6 zRpO!7j0iN6oCN$Jph`=%HQ__v9(#Pd1g@W@BVTMqY%)8zL>ptm?wUXH@G7MITVfyi zC~6wMZ$Iv4z*KIQutAd{B-zyzbZJ?Zrb|RKrKmASlQW*B&A^BEV#{fK>Wi-X@O$%2 z@d`le{4=aT0|JBjs8je<9PO29Oe)BB+pGt8uWx7rAP$st9QH<`%PC{JXYi>EZ2@sg za1!g%n|VlP7W?p`%p~?Bz-nMx1kG*Z?{6`qL)s(Ho31ld;n6Dtm57{L_l8iyTtx2$`g&C)r!*Nteygq&}DDGkQ z&k~7cGEPohuN5TSIJ*|MBff-{zS9FhLwC%{aDXS24`J@kv`FHws^?~EL|p;sKnxhi zqgxB<@Jw{uA$EsNKc?Cdfaf;>wpiLolS;iVayRbV4xH25DSQpqL4X(<9j`Fbwa3cd^S?ys&U#g-=7o$wa6!^)BC(CYE_>i0 z97EI1K@4St&<29R4Vll8Y|_{XlMAr?$rU})#3S?(zy)A&t~Irr;##O}1OsW;i|78s z+CmJ#TZ_7y7z0Ww=Boa;p#On6*Y7sfV@xCo{J?+)369Ehby0Ai5y)6q&!Vb##44ymVgmcFmW;LwmF^OCAGH`s}!Mo;jm;^)G72+#j$F}as&^tw* z*Bbi8DAc6#)0(}tYM2A5g$q711~!XXO*;cP4!nw(rXYg`XHp+^ePT6g;E5q-6=_to zuJ|WLif?YTy`z+=O&J$W?>}O>6AnOhj;|?QZf}pV9bzjrGagiW6RMx{&vIBuN0Z3} zhpWb}|FQNkgOEWx2x7Bm9V=)iKzv=!jyuJKD6)Tl`ROfo`wdsZ zva4XUY*XDPKm|bDWCt9Ysd~r|{nu>}auqaYOm6-!hMP+0n7gK=7-cDp+ygJ$HWhN4 zVcW(8IMY+KN(Ph;jT0V#7`0UogPJ#g)m3~NJBwAl8Ut_T`9Y!edqKWz0tk_}Wldsi zXfHB5lkNgxTUBWv4^3Mgj3N$KT$M1;Q)&`3wK)~-Jd4%2G&gGmqS_@|X?NX*Hm5(X zm?JZD*bkq&4!QJaMQAk@o%SYbAQceuk-GM)GG*aMh zm+D#Pt2$unTD642At3aT2FkhPxVi>+qurNi(HDoG3}#jP4y}Y_xEq}*U*yzufsca! z0dk(rJN_h8@p2gNLJ6$A`*RlK?%B`022f zB7~!E;F>p;tPcA36TBgkil&*g z4{qirjDKI>RL(5ESiD?xwDkNDTpz$@s*I?Dv$(!D;46e7AkK(xOmL6cA>wAfVdVA& z$g(!zmKtI;8Uo{NTOf66ibG&aQ=OhW=bj3Ol8NIAVv%dyDd9ZAuA1B5cxgOxcNKk3PjC9tc0mM)y6xaUem7i& zys8PmqQ3FKA49Qhx}8}XAk~47Ws?mOEpJ{VN+&H30sI(*05IX7@*;`WYXTElD>LfN*7()W@1$58aLfnyHm8MTqk#36?4&~!F`iEHXk^CR(_iA z=Uky*T1}aLE>vx(frc@Bf{Mc623kw z(bf}JBT%W(|Fvg2N)lLmjvSrs-a+2i^m!)t8_B>iw=9qJLZ!YVa*f+6Ir{>v)w?n1$8wO zm#d!yesm@1a24`osoENQy|+T8`#tww=tDu@>Cxc;56M7(%*+``04PVT%__j+hN1jZ zc9J&+k9sE6%|+|cH=a4WbhR^!@|QrSSu6E*- z+{Yc;``tvUg8et?`9Wt-$@`TiCviB-jiLeLgSg_fV0D%EF;&kBrBHE+DBJmtJ;Yr( zeYdq21UH*Nv@%lGdFiU8=(c%@&0E-6|YC1rW2F@oHl;+fTHq1ju|2lD=?p!Rp6^kdjHM<&Ws=$N*K&tw z=Z|&~rI*Y4#@_YpDf0NsGXKLfT&Yeckm`cb0^$gMAOVqEk&Car5$|#2VTVRo-@7iX zeWBvy*9Y6`_rMZ9e+2{Y&y?w8)aVZ36p+u9o+tfB8WGgfSifq%k)hoSZOJ13RYly1 zt>CgAD-a{!lD*uz?RLZ#Kg18DS{r2q9;$i6=C=JnN(ckocuOS!aD#Y8kni2YMnm=G zzQmKpI5(~Yno~dBjG;VcNHS}UYs>@mVkjdVRCCu_peX=K+5|(fKuCFi_XI-?r`RhL(+@Z|H)5(J#|g+qT2Bg~_`a>$f{+46Ru4W(0qQJSSe!Mf>tp3B6n+SDF}VIKAaWEM zq|+75cfY&Sj8~?lYLM_ddd~}a#Dkf>gCBsxl1`+xYk)D|fDFt#O6VWPXQ#SBmQ$%R ztcrNkOy~jzO*q`}TfSOkiN0%aGU#bt;3iX?<%!-}Ez}@~8i(lNlVhyU{+Ku|<>PJ@Zxxa-qKAHraj;MvZPQ z4CnzWnu)`3Lxgm$hE4W=e&!ibi*3|HE*2xn_;We!+HTV>dsytJT`a-HWQX4Bpnt6E zSSZQdfitF`)c>f^5Q8(N4YjMTxHieT*>=IwYx++`3lA`4z_M3G$@cf{^Ls&0h6mCf zG?9TG)tK`T%YHk)!4+3e_acT^<72mUKj1HL-uBi8gtQYIuDJfZ0ggB!%^?bv#4Le> zpzEFp1QULsQr*G+D2aX%5onJO>XmDI(DYP8zBJ}7$2aqPe%6;YC&yBv0nHMYRC@`C z-qu{QE4eOcuGEDC;q>bWSL@r)F3BO`v7E;^w!4gvrC89WKFPHON)Vr<#B`a+NUn$< ztvA0HZIhMBT8Gtfrb0{Fx?b(tzmN7Gd+L!|XeGJ>s}NG((uj?M^9W3`sUr@@OtcK2 zXu!&+j-de7tHhIimT`?dshwjfC?HJdEjv{!=ANCBWbv(&Xh@Q9UJC%~nS;KkBa>=x zSFlwfxn4Xh4KlK1e=?fiu5C{-zvjt9&F<@dqVfxR$Rw}WWh=hw?+h3Fn8Ftdp5;JD za-$<@OTsr#3otvs15A1R3DJ)!7E4H~IacAV>XkjjZy@E5dza{!%Mcr|^?81e2|kV8 zlfS-FgDVZgDWgw+CEDm%Qr|qZIwB zdu@GJBfX?I*(;pMgbLwBLMh3YE^LR(dQm zfZ+!Nl2Xa)5?2Vl;gm>S+NL?sCk(;YOoYcy5O{~4 z!rGkf^9gjMON$gR10_Ri0a$RA44}$mAiI^iJJ)w z1m7t>3o+;k6}=)}XJ%*gVYTdeB?Kzv{|d-~^v)*iTW_us@QpBFKPF!U`>*E3Rm~i; zm;P`yV(uOgiyqc`29xi0^DM@+&~iX4^!s1l%M1k|C_{p8iOX3(vGP2dcRcJa^U~)ttf% zB=G=ybu1PZ>;6R*)N?uSst=c_n zOm9$;)oB)#?z2EtQRe$6WhT*3pTB4lsC+GbQ^*@$HI-o!U_pt11fHh%M@<0%kxdzO zRqP|7SLWa=Fwkhyz|s9h708o-^h~tKkJ&DFL2jn}W=W}G zsr1U7DP(oaW>_eAB6uwvgK-aIA3#4N2+L<0OIk6a09{e#fwngT?*jwDm_KX}2x!gX z$--95VSug(ux{IuF$1ix*&|5LhpwF#`P~hDE&fj*`*f_5{2)25z!?3l3mV6O(6Jjp z(M(pHq1&el2f=5YPLRsdWFS`awTV(JO~6|MgJZN-ed4Jr96Z~5Mu~r40jxQ#&|I1} zpM(O^Z+HUZM@?a{ER0RszoXC1uUj*Wsw>#?l|S0JM?UrixwJT2HJlQxVR>0ku?HJH z8DeICG(j@egWuJe_i6s`3o9qgm2&_#}RL_s6Wue~ZU5nzt|5a&C`nEcb5M zkOt+!=SpLr(HJ_>_kb%K{zJCCnmHsADUUs7uiH^}A%dMZZ8?BfC%B&=Qfb={ix0hj z4FaW&iO)m$O1~wJTDV=?LtYZRbsT~f*08`@BqW=hk#7jru%lT#aF$@sz9bBlldPV@0iiZ|WC4m^#}ECmMo!eVJq(=*VXT;@p?AouY+WF&nA~J1vxR3hXH{2kF*UzT)B= z_wrGr#AtANGr*I9Q;SS0uQStE8TdWY%{uwlZrZb;!y|g`RfcGWy_d#Pv^KpR&yeTb z`!un$x6SQXXKt_DUXYRb$Jt&|eX{y$5B_kD!l*U8I4;yb4(A=d#xc`@J~%hb)7;uy zvOVkT_l1O}QbVBchouEnOVqIUdk1TG{}NA+lW(!95gP&h8(vY-s)~DvMfohvoNkMW z7JtjbLTrdlA!aw#!+tgc{OrTc#-3+vKxw;4+XKXj?*u{X8X-=C#k~qK*B9i<#*6ZC zpylJOo9Y);j zh_e6JL;?X9iM~;{xL-~cObo#?#f5J$B&+WLJV-+U&GtFMwmgCJQY%>C<%C^meD!73 zb%4U?^jBHn8qN2O+mJ1e&`qZMRTWhspT7KKV`G@nRvc>j?Q@phT&XI$X0V}`VPj*` zLqqJZ6_&7&&AU1I$eH6L35Jx#^&ZoZRukIUKesBAQIH>z_y&d= zvH^YCznPY4nDVM|1&A{GNFXRR8Hy9&Ln9CLtS}8zzufzDdwV`+&c4PK1F{&Ez!+YB z2spYFOYnRA0GV&J50U(K+5#S6;G$Yh$0C&Xa80 z+}fYxb{`y469$eE@-bX&UZRCsmS0WeQ)bwu2b zTfQP8j@|@?@9HeHUG(6*;Zv7Ln@Kl+65C{3R+^_MC$E9s7$(tK|3vY}FtGbH5Ou&X zn!hf3S(|bhuRKX{Z(V$hQ>-@n?ge}rRQf; z%6wJkL9NM%!?k$VE8d@JdiPVjUNihg0>E%2)AM{s$nNXcoalrl>Up3Kl5w4Jk)*T; z@=neHj1ZKZ#Bn8#bC9x9(HqRvecrAyraqR&+VZtw69c7y+y>8vVVy=PmaJu+RK_O^ zhuDLd5F3lbUexq(fWcSciVS%aQ(6QYJpc8~+0Nz1Nh8RPI^KX#`cxwOg#>|y~#l7h( z?20f0+7COx6^1ardKLcTy9}n0dq4>QbInB$&R2W>fsdm`KtcExP{a^Z)dPe}C&>z} zrWV-V)nA^XpFCr)RrIjvSC5Q{PilXrhc%ZzQ#9w~#lLgnI;Bk22v6p2@|F2(9w+NT z)TonYaTrMEJu&fj+LfXUuoVbb_uxy^_~D;Z-Dlt@`C)d9Oe9XY?DDwyVM^!@i$HJqo%WPW;3#2|`zxD90_fLdNsq zHO;j}GB(?I4S&d*yDC|na9A9Rb-t+ox6=ovwT>d@9@8MO!v0S@2%4Pb5)8q2lfiEW zO!?$SuE_0wxZm4V*@dJel?HuJJYnpFO2HQ&q*Es^k{tG`%xf?4&4h7^RpR(!4S8gO zAZb`1vF-M=MqHW!ExNxs4;JnB)dFRoi5+wQB7RJ!pp{g2vb3w!Y)khu zKS&?jH#wwyIjC@#yVF&nN0}27+dIH#n2MvHNTq*%2Go`h;pGyS3EC0g48THoZ5bl9 zGa(3IQP{2R4@2I#P*((&7-(i0ukH#vUCQ)gRQOW%XuDPi_X^81Rll zIAUQqMOGhZmc^nLpM>^4>Edn5N?qA<-<2Duq^yz(#aj%H<30|_wLMhH%>Qj5u38Z; zv;|A4yEGD`)i`+e(OoQxKYyBPc}o1M#vuVoRC=TW=f#8;c9*p-R)<;eYsu30&pY*+ zO{K)lsKBZO1qoLbnnu9!u@o5#Xr`=>Mdq;xnC%0aXI27crGKF8%R_6gLP{TT_zvL( z56>0gHF-AH5_fj$uM(lHlL?qgo-iT$eYydkU5=L92CB*zilJ zQ{mGJk>$p(F^dk>n*m8=kyXNje=QCS4fU4>TqaNDX26%33$O)r%N)lER90mKoIf2& zm%;#qfGIU?rFH@_lbJh^6C3HP07$~oIN^iBHBcM;SBDH@c|O#MfE|XgE5eW`7I@IN zHu1poOD_}T$StQ}O7^T~QYV6eF%4lnliIi}Q3{5Fj&TXavp3?2NgTjt7Yr2ktC|x6 zSU{eQsL$7GGq^)|4}z`U{3RRc5c%d9hZcMHtJ`TEhJ_@vP;qPig`h6DQfbjx;0v5E zB>lkT$v2qYhRN-Jw?z>iT5;+1)J-figaJv|gA+@{GUv+B`LZuD5p@&~uz$=&96#B6 zaruuF4BSiT_NkV$#k%``qK#B+Q|VfQ3&?MFI4wQJ>WxWVg;#74srhY?BH8S0liwk0 zq5k=qw(zMqk2T;)-_2_!p}b|>6Kv#EBD2DLnzwFYT&iB1Sjb^SHlz#sS7=Ak4nePuHV(W~o1|Q}dUxZiOkvp-!o+`BTfulx3@uq>&gR6(xGTqDdts*lX+IQx5 zy>-BNM%HKZ&OBkAH?RY*9@OYQuX&TaWI5+|tm)@mD5;EF_q=_E%>RVf>W}V}wuH&k z@8Es3Z>_7$df53PWNPP8ykT%mT5LbV^gRHpaxD|b3@&2DnfM4{9O`JZ5A5E&r3&^( zrUOB&im`ZOeLZJL z#WKxp#xHYm8$hSJfk$eg`tUjsnVm(k{7W`z@icF$l#I`H9Spp2MU?f>qyWR3Eo69_ zAw+Rdp4?Xlc0y;qfGt-Mx(r^fz#Jw>T))M^2hpEzYGKuZ^$0ij|LVWpC+DGhRrOrP zPAdQd&bj#?Pq*GFaUTP)4M%B!9@vQ?Co@_D-n?J|iFbS2ri~MjY}d|YI0Uu~0upVn zWdP%6lb&+MM(HZ7>SbEhAcj}1Z2rT`a2tgL!>)%9o_YdpN*Ot>Dm)e5W`XVbP$@>H zU7OnBQBfPiRDi?N_bFiJOW6bk+O@@DZRY>{X}|-_u&0qvw`*(Gf;|k1Zm0^)rX^XX zr<@`yTvixiXTio?eGdrkReAs(BK6-mXKz}I-5`0$nRAAu0?}u1|I@MhxD!(syzDdX z%|-i+O-nzy4s`3zyEM~oZM=v3>PEJdY?K_p%ydKWB#Snry{=7~_UeuRxNp+|odMO` zQ11lRY4x1rjRpVwpQV~n-z7_5vvtv=oEG+f`VTS!RSiTU4vYM9Uh6+)*d;IR`Qv0# z6O2A-IS|*8=Sm}9y!S|gshF|n0C=~L)^XKL+_L|lO&-I>Ub?Vri@BGMxqrXxpZw;Z z+18TQF*wKCqxgKkMzd^L=lPWz=Lr?aGkv$uG#yCpy4YSil;jfhddxwRCF}av@1Iw5 zjwhUF?r*UC?1f`sEoew_LtX0KXZd-Lk2Y>9kD#tdnj0r1!Ph8LoHgegINEX`c^oz5 zbZ{S#EJ2xBdJU}!AuBZCV zo|HAartMb!PeC>EIS(K?AvP9XzX-)hjkn)wP@H<()SlACtqc3}MV_|lO*aONcF z#ry2-3oc!6liIl@dUt!vl_=0h=v}3Y&jEuU!}0_Z+evPiouCeh7QS24$o^@ZsV&G- zX)KH@GJT%Ju>Rgn=u&b7704S!fKMI#pQ-@J6QE!8S_5kHuaE89jx;FGj|%}wpj|oF zq`67n`?#TxEge@j?u8!`0ip@-^5?5XX=6a?@r*U6JAPpw+((~q>fp4@v-jwA=CDXQPcqgN@w6rprpFtaD2+^!)e3=QA~- zEr0$Cu%nRPC)~nyT%St@j-d~4aM@!WR%6G&WrWJ=Tz>DLf44B9tfb1=FXIcG{o%l* zpoc9L5$f~|7Pn1(O|^1b4$B=+A+~EPZg{v(KRu)!CZ7vztFQ%$ReE?EA6nI)WW^@| z_(8^shPEud5^a>BgJ6%0Xo+t*S(_rw;Zvb5-JzR!#nEe32@*OX-a~qQ-zYNGGkFs` z-S4gKshoaIy>+VD^bFuCr}|ANhGuVT4<%v$B`fu?Z(&ZpJR?5Ima1=?>f7a8hvsfg zPf2xF1lwc4o0iCyJPI~e{E7am<5~A9FbIY7wD@0H*iD>_KzTM`d_A6s z=f3h4bi0hAru{@4uC2tkXX01c0kCZiQAU^J;+c})*ttR{8tP$)U(kI!acdZvhRso%-9uL~o!( z1{sREpbH6r6D^Ts_FF}$ zdLN6{ZSI~49!hN~WOiEZ>Hnj?_&xJG5_&XVxU)o|0gx-y&}oIQp(sPofH}=IeGo=?1D*;x(jnOh45E1XEp0sn- ze)oOQt7%64?E{GRKbjJFTMBQx@|uHBZN6P0$p`4Ut3X?R4&qRN<0@1wWu^&A4NJae z{?ZB2G+Q0FNgcbQ>gl-yE#IGZp}TS$u#Eb9W&`$SxMv^3 zRlNSw>N@YPa=vjv%Q;qGpvO2dRd5j)Jej;{8QYUg)<=cVux?UhGa~ywPaw^sX(;B( zExk!D;Eed3snHQ>=PwF`4)CTRqpFR)z!N%<+1&WX4s1eG-Jx|>GlIG9op#@X9rKg9 z2uBnEa-Lr-<|pr|0?o(8KlDd6LbUwHsLOIo?mEKq1`sH2%p<75V9!9GF=&x(eEuw6 zIZrz5!YtR%)S#dk{G%15Q;|cXFmUrSNIG(-Pqs}m|- zS)<70vFfKZ4UM_8r9m43(k#bf2A_ZXjE|8>1JabT5AncU!L(rF)-r;Ek_5gI>hwO{ zgMfku5Dh08h5CRm<~GZCneWhzvuCM6D~e!$BQS~dFOL!c)LIAEr*ff%n3b_JlX z`WA?_Wcv6r^gGOL^T0k^22}tw^sn)up#btgt+Uy^jbXHuxO41wifO>NYI?Xla6$%m z?EtaE;UU;&2`0e6FG+PYon`55BE-w~cJwIuCh-%b6)46$}`HsH}iV9Q@)`)EXOS84fFU;pxmm+~87KXm>V&EuEg zO-dN1DA+v$RD)hsvc+z&oanz>lrT41B4!wXOix|VYF78mXUp3Nc(_W4K9e@#b2wiW zzonn6%8YYoaj}d^wcW5Zwr1R-=pDbl5vP?RDdO+phw=z^3a z^j^L@3Ht8){=PqU*EKVfnasWCp7T7cV7_HqF>#H3*jJIC#`eogtee7f$b| z`C8~nFTDL`$MxA}n?J{9`2%iA_|zNFZUMjf(1Si&JURM$X`-~kk`?>;ZE>QeQi-ZD z=gzi6NTx^ooxn^6B&rF(={Zq6*k1yd*@1=91qgU3F^5O1z-azsh0>+$5K&}kOB+Q-r-%c8`RGc0_t=`+jYZ@F-NZ=f7rkGS6Cp2gsfV&%L zt!KM=a`Yl__9m=c5PoUBu*30L=?%CO6ZkqsMfx~|&j7m`^{X?!oEoFyj}YTsY)_*S z0ix}%N|X1&Z4Z+^DuSYR2mg=z!*+J<`;SO(_eP_{oyUT!{GSKMIHSUpSdmznuuBCXC zMsQjwKc9npUl0mUhl%_R@L6whhKPTogzqhf>IEd2m9DuKnwMPHal*+y# zLH!c&6yT)M9Vd)a04EA6z*sJP>4W{t@wv=VIwg}H;|CQ+W*&cDtX1P$%o=~nS>5%S(HD63SNc52#vpN+HYiBUp&qr+=Uq5&I8w72T z>x;p%&@Fra(;;s1xMzwa=2J}Lw&vIQo3os4`zxxPfmlwoC8F^RDa|p;7n{7zKOq!N z$ArM8co*~&^?gdd+7ou)X2XlFHj%Nv3r{EzKtEYFCkEFE`A z7EI!3&7ws;uTsqM)34bI8cHaDIb`aWj60loB-0sYL|BHV`fc#dEGC&!N;SH;BP775m#k%5cSg=cH?XI*i`9*=uSbX)HowWg z7iR;3HtCXR+;)euF9G1Q#5Qccjf189iGuGb$@}dyxd)8RKnS@H!k;j1M1nxNYG;PLM*uFq}g4JHIm-}YUgoWtF z8ciZ-RbY2DnsM`2H0!Df%RzdZ`?u_kB<7Xt)S3yIsgiEz1>~Iz# z3MhlP^c0g$UZ?peDd81YA>vH4s{JEtVPXc*JwS0@BJYOH-x02O!!|lf61Y3H>F%cA z=duB@1g`|Z?qc4sf8w_#P{xO>-?OkF!E!;B&4Ba$L>()U4^U6 zq0LzhiyJ!IUV45@o1YTaM8`4|Ml>EU9&pV1m_D!WQwQwZfHjFjC#0>%C=B{fI=|ey z&@Er=MI4=n6+JbwaX>uiA_35TTBUHZ7-$;hmxI?Vs{x<_k3aMnTu0NEfE?jADszb{ zq(Z&_asz3pCLC&h2^0%KLTRJ7fMf~SKg@HuN_|qGHK}Vz>X*|N_oJn zViHKU61`4XjfsHyzpY;L8p4AM32->6bo1IW07W?0OXK07b1*gWt$!W~!NJX8W1`4o zu>wtNd{2z>)B<{?4gdncR@Yg*tbdQN%jHXHOdx;Tjp)dOx&K=dev9+gn#ChPK+6(` zxOBj;5BviF6HN0DsPbCg4E<5XrPIU@H>d$s{Vjo_4^Hz;hG$7qRJ}ENR zJZn;8R4$QS^Bnww=!Oy1$dG5VPmBtga_Zt;}Pba#7v8CSbWMAm=U4% z$Ua6>^&0~QAk?kU732Vl3DDrMhX$?nu@+iF#sX7jeOF)q)gXnq%nTB9+kQBQ1n%|{ zjUsbE4gqYq*S(Fg&4`;kx4fjvt`kMUWzW2(t@slt&RqYc)`y@C!n>{>Xi4DicH;zX z7vFukL0KkLm=p2XkxAq;PazHn5NEz}xG8RPhMXSI?mRk3 z!(eIGqp5*hV{6_Y6~+M3;(N(QBecK1e7bV$JS+Yy$knr%b3b*XVwM-`!MFpomAVRVXv6f4;v0@6e<5s zoDwLzAWFiug-}H+>rsBpHu;fh%`o zZ{3)gzCy1tcgw!`+TV%!)X)vlX;tXP3Y#w2cu({9Vk^Y|nHi{o07q=1Y^@XW-RWdQ63%Zp0pIBTNp6Tn`BI8?3yI)*`{_>aRg1bkiltAJC+tu2C|562any>qVlOIiyP+>*&7 zXaM?|e!5beOs~?NonaLo-Pw5rc7p;F4nFC(Au47DX*#$OZQ6^YiG2Vn04%?N4;heU zF9*%PI;-!kQfL_x;?xXGTtOG52wX8Tc1$ff#yJU2X0_#X7^0b_;gpBQ;nGd$XF;kk zhaB$|!wjGnar^86Yy;e1{~dV!mo~T}SVz3KEehb(xm(ZRk2MKs9$mNSs{0d`!LQ}4 zVDUF`0S^Lfjq5tWv|v?DZ9WjXQnl-n8Qwc&&|)k3SYkvk-0_iDZ1DG)vt zdE7b$tZExe2*}_y!4HmSlc))?fZVKuEs2BV=VO%mH?@DYZ@Tf45Eq4xP`G zu&yk7rl2yXe>{ofMhh@A?yEu&aV+Y`{8EZy!s-nlk#@me#!0ZzXS=poHURXJDY0^M z?6t&DCa_}UD0{wIL7pJRJ?Qy^rb6qF`-{A0Z=ZxIneWin0GtWan1C@9fxlb4d(uK0loLT6R{w_-^ED3(67oH)LLyhAIbLz|C-TW+Kjodg2XeoYFQTfhGobY$3}CTgt5 zCDta=3G^Vx?XTC;1>L0b!=NP+NS~Slc21hi_?qZ|-7&o7E6(Shdh#D;7z+1upZNBd z(2fd|YB-`tqA#-&L>l)o0iZAXZ(C+eZTy_}T)goT*qkA} z=J&7SJKsym46Uh3qU`cj%o-^DGWamcRjrAhC@tR za}tp65@^NA2@wLlQ8cs4b*wYKV{sP{q)=znUYC(_0cjb>E8*Z0ZN$fyHqQ)ZXmKDZ zrkg54efC#70LMZ2T$N&qC|J0CtCoE==QtN;pK=Pyun(#)dAi%GD_5|GU`nma5h z{3NHsE9=XYI?yWGai3wkGQedy0WP`+FHu-jNR%Z4H7EYsc;dt$MlYxTc2wu?_vs{37{8Cv8&~{JrpW@elOB>K`%n%03EMWJQ6b!(Q!$8c+bsQphLa z?#XXVXIUI;*WPLgZU-QG`~hv;gT3}^eu3_K=(}L82S^p&&6nQ5;>aTt!r`r=;PPz` zJ%a=#qVKPD=Bb;K;7%d0o^vLqE3Yt?qk7V=+lTyHd`LwZ43zhUcK?5SSmyT9dRSh8 zoq1eAECdSFM6rldfYL*B3s&MC_x`eP)sF$rlo|;~zGO<*&Wq|_;Z=KUv^UZAyOEs1 zO@@ID2pjB?`o4HA=rUR553szlj3}e9#qYvBjLY(B1NzDj>%NSi8fTtb-O!#@s<*sR zQtI~dX7aXMG{QloIvT(aE<8CE6ysdCe8ZdLu5rHw3)Wd)pFmXlsWaBzhUf9)anMU@ zM7K;yi0uo4vjd2h9)!j&o~RhGazMq+X?MU>-p<@*I?*r>cm`$aGnHelc;Gy2TCj`A z72Byjm>%`5Bt)g@5s!hEpBM)A4}ImD<(^$;+$v|2+89tu5wX2?w7HiBh$y!lC9C86 zg)pPnXBb<0jj^5DcMIJ%eNeT0@|qbbP-O&uGS8XWZS?w0*et%UiZQm>OMpW{M~Wk< zG!ZB341lVHH*X$WQBFdhl9%CU=^%dwMG-Gp@H-~>9PGb{VQkcE#4wFuznq^;{@_89 z$>hhpz*7KhS^#p2^AAdl&2vryvujqOHTl}7p5#>bisu?7s?@I74hZY-0;z@SxTLS~ z|3*-hgH4rZxc@4+cQ<`ld5*U~;GXi;|MARI{(-EvJ?{ zzXozF00?wO=oX+@MWP68Pk75U=S<>s7^Fb!BDZ zB}=Nl<_gdK2s^g$t>xeW3PWo^+is}y{gTDjsfzP(WmSjrz;=RHwXWbE?^Rj*z{h(b zQs({N+{e_UO-wMaUndpUv}dKe7L29@_rhdB+^8HWkq6QAxNbR4yD zzAw08(<Atg}u-((YwwyTn0zY< zy|lUuaS%Zn`cjo1*oQbq4N=>OT=p^T&3^w9f8LrZ1Xc*s>0@>27;fpBwS)t(*jG-w zM;g&VH_;mVGNUji&PVNV<+2PtLuu zd2;!Pf=r$or*lCTL_bA4)B+W%{ zrof8AlmBHpxZt|@91S*tgDepk!a^?VR$u{t{cGN?M{5dK;@$;4d0XYN*;&4|m@Jxd z=f=Sg4bRHF_D#2HzkR`blaqUVFwgRrBMv!!QiA=ia!Etu5zl}@p*n8T2%>DsGU^P+}E zJ6!XeW8iL?UQ44$4yUHz3K!g6^ssSK^e^dWTAO?kz_qvNQjkkg!$s#%wh5AKuYP%@ zVc>i55DMky+Xzxb_YdoGbu9j%IREBm9X7oQl^AX_ndI!VCmFQM%@3dsUQ^gjxMCwz zAJ87*=3{3?i7N#+3>5&BPN<2WcE>BsL!!$;`7vyrtylr_lCWR@A^4;(*o)4Mdt8N% z#yTtWmX~*)Thg@01x_wyy;7+DK7uN7nMWGuj%Y43TU}TU8n4?3(W?h7CcHd5#|KdF ziq9~%2^~7fx59e1yT|%2kB`5Zn-$s|_e+TDB+vJBXnE}j55ZF_HQeUq$Y}UPUm{lL zn9MSBu#oE9fc}BWeF_%c&Kj;^ZjI?r(%r^?p-Ry8wFqyO0nzFME%G(mM8oyiQ_w{Q z9woxe4!0JOj?amebIuvnxGtxW@QHbuK+ct2;Bq+hRioSy;T2|d*vus6PJ>9t6;b?U z^h^`PJO0gtDKahZ2DR@C@W(AYp%Rc{AKd*q;*jy16I>sXtpZX+b1U?csfE?n@;+z8 zr*+HL!46)BCg1pFsP~6f?@1G%f36!N&#gqzu|~UCay+#nWGk%E;VLI;Qhkx!qwI{^F%?wRE zaU!kl?0AzMvMCBYkx5#u=IkzCjG0&YIQqFyWQ4vl5A~H!iMZHMBrjAUQ~L#iUZc*2 z)oWV)nsDx`Hy%ZOPabpZ7IeF*&*;4`A+6oWkEqU858IyU{aI$H2-uqVfupBGWUdC1jvc#2{ z2I;&SM$|KnqZmhpXM7qXD` z5W;;@__6-^PZlAK_KgA=!3mlQ5lXp3)W9KR{)TK>LtgsZ_9ta!yb1)AT=jQW#3PqC zkuN`)7g-mq{^)(;15b=o)u};ciVL z7405%?i2Z&N6SmU#d>|xw8JfC?zn)vnGNjhQ;HeZPDU7?%!R+fA53^S#zYMvk2#cG zPuKGF$NqzsL|>>zo!~OP6VUr4CSrq;hp?AAiiub}_O{=0QAmE785KgiJN2AXS4y)q zi$*XJ`aL4KTwky*+w(Tid!G}>oUpntPP#|f*i-(mNHECEpIO&aA<;+beq-L+&kGN) zt_!ujn4X*5@!z2(YzFUO?TOProvUsU22Qi}U(H-G9!)bo_P6%zN*TI=DjH?sW{x&b zUWx3tQ~|%Bq>su1)4oK@FN<;=6C_51=Qcj?%jcfC`>Ph}D6xI~nW76G$M|Z~g%BYk zG~+GP;iZzd&X9(a<{LtO3wZ7t)Uh2G9Y#_-85qIL^~6ORlxbx6WAlR5qoQ@oa-YP9 zC6^$%caAT}crVwxe$gnIkeBgi@B@2RwP5aMbTqs@G!vv-Vja>}LJBa5wYegfpiUd_ zSh)_1L91#U{$j_37YRG5Cnd`uX9^$_`;n%G9C;)#T$7 zGj!+82CYQOE91z&kxefu6s56wlhk(6ae}mkV2Z=*4O;kgXBv;>@kI z8asPYye~FQPP4;2)oW6O#quj+&AI_IhCB2(I zO$TAu0=2i!{gtWVt}as8AQ$hNjA93**cv+s<~ni-W&e!1*L5Z`@R;43MFt7oa%ORZ z4#qVv>~E3g7F7iyhQ(V2H+mF~^t2JcBc8J?_aL!i$ zmfXnffyrQda=;lLLgEJmct)raE0x=dHM;Wx+Zfy}Evmk~jL}B5xBpke495Vhc1`++ zdN4VzDs)1eh`VTrYS%T{u9Pu8a#ZajvCLP^bHQN2v%AWYUr)@0J>0}unIK`^ce13q z$8;d1iyS#R+!s+9z}t?%cbulLpbqnb(VwXP>XnQWZid3e`&W=3*?EN|GllH5NN>P; zIQc-WdpQ{Ii6f6sF+jmiNE(&ssR$(vFM#tTwZ)6o#7^Az!I3GZ^zTWIlx>`bglNq7P=6kjD=YEs^`LRL^Qy+tj zFTR)fgQ~a$kD@_=>@nfEi(Xq66%7K(IaRIhAVqV>UD~p!sYOsk8@|7cw6D;z(RW)4 z&Mhw+G*L139T!3oMAXY{p#bTL<|mcT*YVY7sc{;Zh${U0;U(p%*_ZfN^cjnzh&Bog z=VGLjv^Gyi#GIrhV?T*(;(FE~lvl<4?ts+S! z`KBeTE4$z@`2_K3G#pSg|HzF!Qt|f80C`D)beeS10r8a}Aub;kFlde_R7bp4u;>H% zQZN`W`e3dwDQr*55tMkJji0kd{y%6gIHyC-?f?@ zmUg!%Pa1R#BkdZGCvgu_cS%6K!$@F(Nzj-I&y4sEk~77=N+OqIt#rbodtF~F`&#=c zM@0K9r0peFo%o!E0ET|-#GSiwXY)Pe611aHOfOl*$slhb3z^^C7nW(yXq`z=D)SQL zaShU3CQST{ZF_7;P-tpQ|FGEbD<Oxx2)z1f?u@_fm>bQQ06po&I4;}@$ zkQ8FN4>{l)9zo7^`LDeS1wZX?H$i~wmWYcefhbDCS}-b}QpnG;goqhuz5VZW-t?O3 z834;BiH$&eB!%*m4T$9jc9xA!zryk~#lYy#OSufblT%)HT<|77?9yRnpao!_o;LCr)(UCw9CAX{##Ikt8oRc~1re z_h?Xps4*^3xSEff4rW-X2Bc(yc!_o1r&{}KJk~t5amsW#=mI1z*7EE&CF@R%GB7|k zubpDpu9hkTMo^I@Ij|kFm^Z5J*>NPVp!ieeF$oTw*+nymlx0&R^my;9X9A z3bsP+26d9Rf3=}W)56%K^lH$VI~|E5aP^g-uFOLKk?<+P3BBK;Vwc^zI+qXlNn1xy zCm`c0yEI$c&<;VgE-TK6T}kQg4f!1$Q5s+ydH+I&PadVJ(=Wkf=Ok0wWn)r z!6J&9@M(>B8$TcOg<$!p$GQPccr#y9|FQV0%U!OgnpuQYgV^H^`4KL2DN~N~(AK98 zfigZ&o??9J#0&=dFptzLiHdPhSBPD4NF~Lg%hlgF_BOZk{`tWN1raW%N$(vm*rwYm zoP<;OS}*rWl1mI*tWiccn$Sd!W8>weJldr4nDD9}fz$Y=rm_uPo{O;4|a#SA%PUM*bVYJfPIo1oyely_aaTK+qBtz0b_odl{# z>I^dX6DU>;C(YfJ6^P!$HvO5`L?(X?qk8tGvb{GOkNN$SXz-MA8SE2BR>ak(+8V)g zTKu)76TDr1MNF1+E??~mQ|(_Hg7F_g7#ESBMX{$V%)$2AawTI5k^5g8p}ljX7q_Ynw{U>M*kn|nAipVubdztMTDlk) z(+Ag=Z^2wzFj^{o-{Nm-`dPQbOh00S-BSsaJgWP5-=pv~WErG>Jqlin+*k zFVH<|dwqeF19e^3R|O0odv$O6jSg@2`f&v;7Vels3SHwr4TkH|Fp~Hz<`M{Oy(#@+ zJUL6_3qP;>6bS5H_j$MRy1{#&s^aqYvj@!7?gWAklkbIwR zLiyHJ%P48Mnmq8W%bap_@lPpnd6nV@<3iQiyKo{{ulg0F9pmUa^E;GAXaZy&wi-N# z+KD@$x$^O_L$QZ#Gol;RNZ$}UWU94|Bh6F6V8)rHHr{`g(kVTL<%DBcIG-x`hn|3- zrsnxe7v#UKAYYnwwjz_%2qH%kM%J0pi%Z`AdMBF%L%5wOGJR-958t|-AjB>4VL-t~ zE_8kdYBtqKXvzP2deuzgp~cztAPzX#ee{^x1435Y0acKa9A812s9rTX?90`4wgnL} zh#K9me{gy2A~~-VEGnL5FU##}|D=L!efF)nV{jtbFxB?M4gQ*gQdL+NYqO`~>YG74 z!2;_C-DTBdV|hSg2bRJ7w%OefNQ%C(DbcDIPl0b5K<&;A=y_RlfM=(* z**EbnNCJXfnDh(V*24W7WhXDNH6zc+M}z1JmQwbV;?uHUn-7xp%&t3AgtAW1*LLwZ z6qvNb%3}cB>U`ALX(s@dr2GI^;(KTR_;Jpif`j?Pz8iJM_W2F@nn%0_DkTie`nLFIcIfpt4Zd00kxZiZ_?HsBH0nXkL z2?{1!Y;u@KKGOdh*yT2|9%Kw+(f}BYIk+dIe4u2ITm?H0;;A>A5&EpTpj4v4bKvfP zUDZ6aKK+_1%HB!BE!otht}9Tm~$ zT!yJ=a1noy0@I!sFf5n|@CihroVB0c+um30R!XM$;&y0(@eYGR(_%w*x*thW&0e3Q z%E$-6Xz8kooxJ|1My3w)=YXX|eHyP(m_SFk(Emz5OxwwQ3->~nloC=q?XZYTBnlxB zWr_SAZ;zw@{MjdG%dsc8p~oepYu$stZWK-uN*};*kT1!8M6~_Gb%oaN5KG0xlNL*#3!e2>;s2S#t^(eRSt`TtAqMg`xHJvK-)YKGE!>ac_>%sC zO^f7&d*tG3s6wB?*=?tJX7HHEpD8807;0X1`iGWGN}7eW)l&(8PXEJw%OlwO<6m`R zc$|=Y?+-prB$VjBkN!fcuFaKXa9g7>4Kj6ZQjtS&HA;b#!WUR(9FqIinszTU;v9p_ z;!U{(&UVH(L!ii+VZIlT|DYN5wble>I<%G+ZH-kAH&E?Blk8E~44%w^4ZFh7(PEKJ6Q zs)YNn78U;ltjXbAx^2<;I$E|}ZCKRufK-ot z+f|-ueV-PkBF=#+qOR~1l$!~x4Jv1Oa?XL_3%-tlXD1E1q7I+{JMq2y0STpd6$}vg zn#()e;J06g6=#rmjfueHpOwY#220Tsgoro<(r0@7z8*?GB2*k_qXS<4f5Sj?+%Mo0 za^ChX9HFJf5nOwyqS0N0MtroI7{3_-#A96s@<+b;_{Z1(Mjhj(kVcE z9e(*`zoO}r54s(#bK0sU?|`*I=~b7P6=57(?g(LDrf%;G`>Ka3py~~!3f%h;))1(0 zhXdXVEPoy{@UHD&|{)uCwXd7<$BKDR=!j?TJxP8WcG znex)%bZjI(437~`tLX~yH_dx)Z0P?6Zzy+rt#;GOvjY$~`ppja<1{^HE z7@u(jz%Gtc%TBDS?h9uQRK0VeB~0`6xtKp-Jf z7KZu5)Wb#?)(0YGZ$D5&x7>Ed>ckp3GhAiLEY^}8(riY?L;EUp1&hy$tuh}RW1dK5 zZibNUikGcnrY@w|b1TS^3B+`OGJwCl7v{bGi}Ua*_NmN+c|^SPKG))R&MLonl)#BR zl`P^^p31DFy^5!Yr4g5hLf5e0rJt4J9Ys+VF6LU{v1A~@@D_JB@4J1Zj*kx zigj$qsL4l|V~^!~wL#LChq0Iye^UIO+%f)n#9(tR5~u#<9vk`qmM5G+7_ag{OiVd5lxk zOXKMOEc=DNyYhPrFXxN|HFDFrlRlR3AR2yfuG6MPY%O16Ov$_>lL!ELP8cVQ22ZJE zq1k7we2MS?Zj(+>uXTozv*lK4fVqtYjW;^r?a=PN#62?65Lf^JcpyFcOd2Fy#TJLN zvcTS=1^5Ev$Ue76NdR&Q7=y8Zv(3n6f#H0gtu~@PC}nBjdye0CqYyu9xX$(Vor`HB zQb-Ob#Jogvv%NOn_PeP9c0v;v=t*C2!E^BqYw_eZP%@U3n9_QS7#x?70^m+hPCT(9?ZV8mMPEq7 z^lWO`S+SL%pZN>TUqA`_1zSWfJ?pXO0XUxSMKRZ=(-tI_xmdU+;W^VawAdJnnf#_S7A zjKj(^(I$nStI@LW9;ricDq^}dFOBiaBF2~|YnneHUF4x;tI@gKthJ!~APs4-<^Q-5 z=SiXff;^&|TyldbiA(qmCim6qS*+~nH_dG+e!`2la0_fS3q9>K8xZc(9Mi)BJz&yj zJE}!8t&KHH6=W+Nxqaq4oYB9D1PoSF7YdnFr)rPAy}T2AG;|lZF}W4gmaAOIJr& zuFI%*g7`_Bb{2gPG(ze1+c@X@8Qn3Qc`DXo@eaBQoC7(7&-gce+pur1!{FW^ZT0*{jPjcePlj&b#-%MYqTY!QE#~ziGP^dauzMpGz}Fr zt*{Qe<{1-kAsS_KNrz!m;l|4p8nT$*P#f@QyLd*Jn&w+3K!$lvwbB-8A15A?E|L!x z4RR6^>D+{d>nCQB4q*9V$1%>PCGW^|voW)A$~7qihA2w}6aG;CJNh%7e=J-p47aI~ zzASHaC`ccyt^6-#^pdBuuqmC4O!Sr21vxB z*sNG&aU!<56yyeuAFPZ;AUc4cq6HH^U4#r)NN{=v4 zeVJ!|7p6R|P2z1qu&x7Hs|fY(HIWXyutvc84j5Jx$u*}#nIVYc8CESjXLbOAa(9KF zgf504#tE%36s;bgQ;Jx#{X0QeY!*m2zpOsSRsridH+ISw20Z)3kJ_|tl4mu&5eALe;rsZ?K_+$p@UN@xzAb{_Z$3`4 zb833!o3AcO@%T8x;Jp;!2Wt`@cRz_p)Zy;6Jp8H%UEd$qPQLD>d#2;=;`6ZVondJ0 zTV?mdL!XzBLai*J15K~4I~}-NJNCrNauT{!-~kysL}OB3fFfrW?EKp7{>9RY@FgmmwfL=6U zD3NxFr+#N!zD*s?pw;-d3ma%98-Tl@zA}^#MQ^z=SM+8f9uO&@U}KLB-JgVx4NY;Y z2D=iCe_m1?(Y>yq7&@zsi8Fe+{=Lc)wP-@L8wGW^T9eKXKr?@4Z_$!ys%?6nWB$S; z^;1tG9jGivM0iKaI;px}xiC)dZp2Q-@~GPWFu(BAV$Mx}m1DV&S`5i+hJKeoYoXUs zL$1|U;4^9K$8 z!R-RG>SlMDNNXMqgGtbq%&&aLbkUJ18ECcfg;Xit!+qtSOq?ZK+w1plw5L(mVw$1m zTI=7i#UfFEX1r0%hGO4TJ6Fsoi~g4`BoOv($a}bk{dj zHS&!l+r(Om@nXcOJmxcBBj%YGL;xfg?7|^|aHjMIfGNh_-f$vGMxFj3{{z)sDm(c8 zwOu%r9QhUfi&=|zJUp>HK^g<98%6s{ z)Z;Z?M67eRIIq%G+CbKiW;x zSA?yClmn#UFlb~-i5DFvQd|NBIZRJH`U5y^)8%=C0^mcM3}m}XqLG{R*n6dY=4M}o z3Q5;Q@glj|wo}pcBu0-aYUJRtdVk*lIm;w@Pi|tZwk@t))6isx?MENn>3CLADC_e= zs6j^C6U|(O184popizS6si({OzT|DL-8z5VY)*xL<{gX$O>#ew4zR&QaBG!azkKw_ z!Oy=zcUZcGz(l~P1JR{>GRhttV;6lo_lOvtglrSNGColdL_@f`R-Xd$*r7PPOLC*Q zA>HJXKse;u?#odo!|`VqHY{jgw;-Ad=%Bl z)HzkUy03j1@+<6P2&=h7o1s8vax&?_xY(lYMPL6OmWp4f(yey=B;A;Gj+qOFbz{AD z)5tSESr48eMCQAf4E<P-C&L@kql zxh_ZJ4}i^qKi&Yl@Px%9a1DC_IJl7S$s>I4jJP8WsB375{kUOzVL52hOkP;)6Y-{( z{Kwcm=JYb|ZnJR?0P56jZ}!-3O)~Mk503%4n8eX#W)P(5OK0cZAs^#QbT zc?k4Q1zCP`raVk?2dVT7EtMXEQ)%_J%_aQ78Wbz6^a1cr=6xi6j-TUxKhr7OWY6iO z=6453eTH|xN(peL+@@#Kt3B)sLR!>PyHtgr*%enu8VGOLmg5lh>(2*i-_so}Xmc1pNdHO6zlZ}_BJqPa1 zBTqNMYnACNNG0Zx8Ru4)g~Zg+V|4=M#iwCtfi`KLWGx>M#&|8x7$*U-8hlYe^@>$A zoX@QoLtQIP-s+WM)F5G(qy2p5dbV}}T#2fa3FHBhi0(m9s|1f8ZVh#1_9f}2b!}3o z|3{Ft9KaWQC#(Hl2)% zPXsO|dS(q^ska7$pb`{5+gbw}DjsZSt&5&~^hrO!RSNqzs5FBDIvyB1r-wRoi^ihO zeEnK*{3^MkhHT6B9NmNeKS*4AF1?Yq%)o%UBhw=~;2Z-)2cF4^`VlY&2&I33KU{u6 zgi)Ys>_G?oV2x}os*)(AEVXRMu5h}P%m<5>y!Vxn-FOc7yIJ#uFcr#_lMleG$#T%3 z9ZoZomv+L+@N@wq&*46|l@Wsnau)8yCifR!_vA{+mDs0+#*T{He>e}05QFOBukt2B z2F`L8G+l(Za}`mjzo3&7SbO1^9E$W6YE=t35$9fX&)DJcU%}t+cYx_uGsHEnk+IKh62Mmi?vJVquO_p$?u7O;%5vr#)pH}9tWAnRwg@&=D%f9c z2Gmibn8~VPq*ov|PtvQmM>3F&%!%mslzWw@5^%&M(u_> znfe|o^wRjnpMbmH;0zW70z{JH$6D0&-zo}R^Lu82-yje!ES1$2s;D`;TGG|`XSfl~*Yq(5mV4MjecrhD)z24`u{#mjeR1S;WmxW-# zMLmyM>Jz`REZOPFM46OU7N-oB@h9jwG$vP!2GUo0WCIHU?sz z%t-E>enp3>%gV}FcYpOG5P-a9aYJA#zryD6%t(}zFTi>ebGfI9K#NC5>XBe0gYw?m z=T5q#FihnSByIlQKoC-B4AX0Mk2^H^$FMG?O;Wu9W^-tP2j9Cp3&+!2%1C{X9qsXkLKtRQLMR36O)wlrl98Ndbz_qjXC6TfSA&FSA@c8 zpbj2b;@Bv0`cX>SwV}NyH()cX_Kc^Z4oI4U=rL-PKX@H_DBLBT9(G71oC0%gk%*ad zGC^mO;36%s8L2M&Qv+x#Tz_T1f?+fhy_;6Q0YT&p zQc&IOFc7r-oSr38dj6~es&mr?ve{rWgHibkG6g_C3_L^IO8`V$0~#xO=ZN-`PAO+( zXzFt?ZoGVnhv+xDK3lf-rr)g)NXiS1-#r1dbrA{EvED#!;-f+$5bfJyBV1jkk^de2 zK^eJXhk+p>AZHKADgvmJB^t^KjHpFcm69e{{?Vu@yFU&A8O&I(Zs0$D9(b!jkdngi z!v{UF9sTZoly37>fY*N{4|8j|TAK`hopTf8>HlS3Fc8HuO4bc*X)PsX)M~TG9$*y0 zNgXX%446#z!iP?GXIFIZp$6-8YA0tGbDT9 zBPvYEm$cV)Cf>QL)Dju*Uy>V<+pt@@$hkA;B3XWRx{xG9gR!DgnPi8J(teX&5h3OzOLLUJUjh$>6WH0gv;lNRP)u>MTe`Jmo zH%fUP+F&oQSbXeWXZO5}%+}lU<@gORJ;imq!V}y(VRZ&V-k;^8%f_Mb530Mo1Z-P=)7{X+Hx+2&M1><$405wNbEv=4l(PVLD4enc?6Lt11 z6_Wg9_Skr*spRNgPp-=~5Ro$BbK^Oz8TOMD z#>d-ZW;k>jp0TTZ+MhQzIv~_WSH(Sn<&%3$YfwO0n%461aHC95Znz`h+`z1$J(Gm# zn-PZ61=G9yE{6-_e6%Dgtfviux}$CG)j443N=14BSglLbY*x6q|(IO zEuyPaNSp{;Eh$WYav%HQ95*3Rnj7>8&{?-^CW~D7By015K-RbmG~SHg_`*ndD;Y=2 zkZ!s+q;+eVE;aDyIn9RczcRy&(gI57T6dZ%aR&5-d_|2$u9ir`kyQ&QoPlJTMiV)_ zz(V&*7w(i?XB-22cLPcbOM;6^Rcu%w+TT)E}|Ok|#XIAL}bOdBAt_8wxeSo1R|rFXU#avAr)ZYz)?3lB}FC7oi#2 zXA4T?nutM4F0|U-IxQ396(?lu>G#W?^kD4SP{`ez|U48?%MZ~s6 zo3m%|SOysXMML32Y_Dg(tb-COVa45MB#sk*FaA3x9yBF@dIW5e9JaonXQ)xs7kDN} zyJZ7@9zILLC_RZ4e+LASYYLZ#Fwh%Ld^lj&U^T_xiMO?;PM%-$D&`a`#}GYDI}}d& zmWH)?1uVQ+$_1L*CKJ{BA3JLGV-(bB80S=IuPqg7sR9ScZ0Pi4=P>2`MuT3jN@bDH z2<=xiAr8vdddB#wpZMZhw&kOop^(`%9x~sfmc2$jPfyO^#+r)%$JTepHI;5%TgEaf z1p6Q*Mg&Kt2#82mqXGgl0*Z8%CS6)+fn$SM5D<`FR1gHDNQY2VdRK}O5RhI&q?b^> zeG+u;z3=yrKQ*VMJZC?9uf5jVvR=Di`8JMD>*$>gzr>!m#eBxL@N(B0VC$}%4t%xb z)%ZEi(Y<3AAkeo|%#1kuqjXw?(OFJrh2qS4>YumoJ$V@jwAqWpOe(EGZLEb&pmfE} z8O@}a2HUMo9s8oA&t&}A7u9#+8=L-W17* zWvBH8)*d&OLY7&k?&$18S(8YrUE*lQ{VJl?9)!+gSTd`;=u4{xpuFYKmI_L08(^R9%Zyvuh_aWP1XDMHK-nN&KXJ{^>hl~5 z%0w=YR@%yx zTA_Azh`-#t-^X*!!*nVlae^af>?aNlo}@i+5fr=l#S@VGL0uXul-@592?X}qSv0pQ?ki|G@Z2+F+p37v011kldF542}) zA&l~v%^`|smB9bpJOj+xhPY9~F2}Ta`+F=}= zgKf=Bs-dCO2<>x@F5?s$qW5)PFazaaz-=W9en~_NYKZr`WWuNTLlj}f{e%{Nx87#x zpMxmj>(xHe_XI}?ImBq3!N6b=Fc{b(`N2U$4|Ey*4*`RyupI;LCpGRe+*A0wYXmZh zfdDCJI4%q(RbyJm4_1a?)y6GmL$DkE4ZloXLhPp9KjzRWsluTL`>Z~x-Kz2JC&h6&@UFL}hJgXe}ht2|S z8v(+Lu}5;1jy5u{#`!}+Mmx=SwC}M@dLId}fuvFI1}?h}MTYW5*l4H0$T7QGzft`_ z1Y%9z`0rSgzeUiH)hYb`GBE`%2SQ@TQ3Xh*($eA-2YLaIKS3EP z28*K7(TORvQA?2$t(l(<+s3#)>`my&Dq17V)EC}E@h2g}IY3b}Y(cVHhKyC!HXc)y zG+M!*)PsM?CKyb`2P9-yO}Vqe6$Tk$jp_pU5;V9-**xsHt3W#u2JspSpN$gt;9Y7 z?c4$y#4Vw(2qLXnRHFqQxJQ6|Se|tOjZT&AgmLkD>_r~@k!DR9tIiyKSEfQM-n(qVC*6Tp6YVz;JC1o-R4h)jNEaLG4 zFo}u6n^hBjr@8>u+v zVEQjg6}s|b?r~xy4rgo;<&Y{!k>I`+wx!`y?Mf6z;{9TRopj$r(+*Q#(w=A$L`R0z z_7gx56Mky}^%E=I;WBa3c+$CY8}{|sb*OVB zMgaxwsF4kj9Q`Ku+WH;_5UA_!1%XO`yolS0e|y3JH*6owCn?y69dV?XDi5`H5Bho9 zcMNl;JHr@kpvpcV2{~navW;p!M!l{jf11P}H7a;gN!9}h!KW#aswuz=9rP;`O@}k? zASqIj_z*wFB+IyhT~5iUp5PK^x*dAlHGmQrJdoXtJ1%64 z^}DD+ngrBexJP|X^3l40MZ4e)s)KCLXioHx?vF^E{?NC47TF?AiR8grgdN!%vJAf5 zhn^neZhUL+BRpBQyGdGbeI5E`=>)D!W#$*=}aj8-hOHxIJ;snA|rizBfe)QlxE ztEZu8n#q(wWscK0ey&6874R}DITF`>oSJG_J>i#k)hkX%>c5E`-d$ojN4e84L8BD~ zp!Hg7T6ik(ND-4j)q5DUl4Jg@k)hA5+Tu7dsBRQ|Ml0^ysL=h=lk4ZuMfa+*D6iu8q zv#Jod6Jg5&5`v<3Wyv6NO!`LrTEHOqs^HD#TqjVd`G)MEaJ%7J!` zQz>6M^EnOn56T8uKSz6fgw=}wXzt8S?A7x4kkfvBGRt3HYiL+Cwp*{>@$r%C@%S6{Z8uV#RdU41FMK5Lbu9?*2-x656&tgqS- zl(qbDhvAP?DRNy{bgKUZa z2#psTQdhm~w^CN<;(_oY@^)DjM2mv7bvHb2pBx9PHy1ic*-yMd~dJYHG=p?+bbtg@F?>40?G$7nm@9hcRde z9nfoEJR%A#j&697ZQ(Aevs>^>aC!TFe~+HZt&Z~hki~t3{sGWZm5{~)Z`p?qfOn4% z8D5k<-}*ic;J5!I$nF4Y?3aoiT`4hp-JhCmWH90%z+8CB7ZMvJ6fOsM8R(ma%S!ml z8cEs-od*i-8p#0FPq7=c&%B%yF3GWgmGWGRXs`G$&3%FGS&l1$191S6;WdFmu-;Ko zLxypLQlU=c0u#Em|5uCEr<#{kThbL%bv~k!@UHk|_N0@|<05+}7);cyQe%NbGPAQa zw(kf!p!oj#KRet-w!ssuNGWeOWg-2bYL*6gX56sTo;YTQrwV3(TZXF@9oc$>azE6e z%V6D8dS8(etSdsC0XtrXR@n<%2QzSqU z6V>>+oAVrCRowc-?W2EpQ(|tN60FBD+Qz@Rcv}X6PgWb5Xck!8(e$e0JRq(NT|@}i zSFwukCkD@UO9U(T)FfGlJOkH+W`fxP-i;u8$aP?7CW{?d!KMTR=poOP2H{=r3I!Ej zYzgvTYVeVz#v7sJdR3NToC)4h1X#WV$cP& zrj0o1Xw2^ZD4p5m{x25+Zpd$dN__AAIi@H)l#7?LvW20&D-WhOAQby)oXShnb9w(K z2_WVb-$j*ow+N4G{b6mezv1Ipd2KoCmc0@toD1Ll(4}Lu z;MW@eG)F6}u1!|6sF$K;?NX1Ua%8`rgw~z6M0A7oko_g;{ZkO_Uzl7(>R2O;cSLI& z@JW$E2A)O@|3f&vSd4r#_h$+<$+AWhRihxjqi9+|r`UN%9HpzZxxv!8XV=@pGbt!v zWPZ$%QhWP{S~u3FTYZ#hG02wDxA-}(@P&_TM)za4mzX(sW|3aiMa72&ef-qwF??5i z&?eq?q6`h>5)>b&0ipAq}M`_GzzP9;lo>VBng z2rs&S)5IHaruUpuj+f!<&qaYXLA~ZoeJo$cS5~c;4Mhg;qK`3=izs&t(NzyiQx`G} z^QGJGhtHPQ@vG@ofUrui2H!5*vxl{7%i>sL$znqK^rEEdQt*?qJ*N=OoH_MKw0YmY zO<@em#$Rp+H2Y5Aq;%Siy;~E0Qy)^8yd1!%;xMhJo6ILY5#RFjlFtKpr(;F_3@wXWqCeaHnIrc8?zX&B&(vUDCqT^L8gAwtv`lEVqF|YdJr|I!FMC}Q1L$l(tiNVI2=y|Mml!-3M|Uc@8mtn6U^?E{Hx<@7@GnO5 zYyo$CbgOWS3y97FG7WE`MBIuHbCmgdR$1&0`{l2Z z?T>zcGh)&B*Q0W=WzW9`mi@Txo!}2*S=2uU<+qfFm`B3B_(LOkG9DTE1E+?m;gTx7 zT>MF=!9Rk*J!f1p^dRpb@J^9#{MS>DGfc3J<)ts+8Rh#g*wx}-}|;gqy8JZ zVXXO@^norr1d-6W2nu=uMCq$YdKGh{G4vYt)^+ljaDXR&>I$!HR|(Zi)}%>Pwr=f^ z|HSexVjI0mpSjnXRE=@|AAh2yf%do_>wkq6$E{IeMGL2>?`EoWOrrB)Q))nLy_7_u z>R(zvTmLCDOq6PP+a?373{=feGN$bz=IpQ9gI%vQC)ZC>_HR8Z^3(wFPa&$^XKbTR zr)|JqD2f*(T>xF7f;AvJGR>ME=5+Xp1-Rk7a`d!$3!OJ%&)JYKfh)$2=-_+Rd%X7- zmk%o2kU!|iSwkCxs8-`GeigW%s=xS5ZQMUO#4C{nJT=W+2N==jU(phN;dgWg)-p5h1AQH!Vmt{@Yv*{D!k(L zNPDE8As?VT9_*TZA!i}uvb9KAHD6g7;uL8(78l%Av*)iZnzxid3uzy`QnTms`nh10 z+CA^qw+AoQ?$Lxbt5&y%4_O{sINavp#V2^L?J`Zm9ZMJ=WnD_YGvQnbc#xZ% zBYc(a1}NtOWnHK7_k@lg;YQ&hXyrenviz%oobY?Xg(~X{SZSk0SLgjY$iBU_jai}{ z47QBm;wh}1vw_pgdo|uX;}ckDHUk&U`X`R$gxwN;2B||d=l#~YNp#csMsa+jayx;d8AbO*P<*ea6A0&-B7%%GopMIgwYwk&|)N*Y2(Zo zWP>O2pTVm{M~-7!J(*iQ@>;=}9@<9tTz+8iPphZ3^4vb&Nl1cYpgE;b!0PN4EHD(W zEgdJhUpXE=QgY`P!$hX@0h4mL-e%(SrezH$--Kj8KY2fDQ0an{AL^tszqA!cmYlGE>2OIfd%|{{&Xskx7kiymqmNm|_)_Z+;H7tU8n4i2#u_ z(Vv#a&-yucoQ89$ZPRA{{wSRFZ;M&Una-8#;Z2zrY|1ocLIM=F87h;Rz_2VUk`Gcj zz|fqo(Twg(U(MnH1T9bn{G%u@mjp8i$nVU&QTiDq=7B$}R2TG2G?^fu36|09o5Ynu zA{aJFRt|3o?J{OSd?8$?`kg|5`7Y4nB#LV+DHnK)YoLkppQ5!GOlZTBpgn*VXqyDJ zjQj1i6KUWPjQrA^&Tq)*b7D6^dpH_Ld+JiJ2K=i6`z-=Xp$nLM#I>>oYqBxlAfq3{ zWK(}6DaRK^`C-iJJevR5h)12@7zTBtchD{1%%0931@$l%TNh84b9{RiP*W#06Cg)w~7f**1ou48Jy(j7_ilBCv>b)^3t02qvd4#*o>izKl8N@RE-B>V*6?q>rJGi4xcY}MUf|DCK)(mjb z$q&t``&Nk;=>i_ z&ht1lGPNsaG+au4_%VR;ir^)M&?@A#JwCJ(BL~aB2)tJn6;>K5;RlW^Gj)i<9G%;0 zKwk-Fml4|9MH9B2(P|hL;^cFm^O=}q!@EUgEU*O^5#m1AzHR+N-?H9-)=fB-L>Q%s z0N))a1!=9|CD5AcVby5Q8&J1}T}54nU2S>JI?=dxRWWT2#EqZ~=zv>M5qcqd)3?q$ zsM8&TqR?4FJtZYK;}p8U9c{vO_J;W9av3l}Vz@!L5i7&^i6OiN-|;;`6*|o;f*F@g zG;d}1UsfK#>*goh5sGcX*pmyITE>^><*SYm$rUYDs`?*KcAt+8>G)UFhRnIi_T?E( z=j@24Da=3C3T?MvNMjv7={Ok_$?hIvrTLI9C^~h%=B&L0&w&A}T}2D;lqq1+Rq<(P zN~tN?WcVr?GDq=IN?wu3#$Ya+7ZRtA+h^2NEJR$ey2xXn_w#(kU}bUeLA~hFdy!X! zk2ie*^(5HeibuaN3u>k#?ViKIrS7jD`($1U;zNlFU?cG~4LT_teA?CxxRn)x)#Fyr zD{ee8W8vfpBb9Wv3=t>PV!?NRJ$U#no>xNk%^NdB*QB(!P*WujQB_B+C8yMmg3rYb zqO{A=t?u)E+5ts{X{L?ri({>AsNRslJ4e1>yGK*qSURYq<`y*q-O=XDVKS;MZ(RDJ z{-5wLm}|A?c&t>>&eg(akyBaYe6rmpx|MpnPoy`zKL&=$ zb+NGJ9Fcb(cS)SFes4N6`-5d@>Nq1iX1GU4x1f*?)`{nAc&i@k(z&hMp10aiKZznmbZfPcWi`jq0a z2z=X@Sp{g9FpOcm%qW~wN|8+eINIDMlaLp!ua(FuYTE|c@c(MOb`P?d22Cs%ZQYR} z5)R|qnRLWoxMX-eZdWm#yVW}p)ON5Vpd851gYsc7*crf{NHX7ZNRR~vm;CZjE;geP z!2tCZaLJvA21y#m|ECKvV1OpoBVKkMTbUvMguqd`!=QTyg%C0^I~E4&{Sqrs?=$=< z(ItWUQ-XzN{s5y-f{ORyrQ0c0=bo3H2M5gv@$~*BKeUyDzG8CU5-xXwt|S|~ckYY$ zpJLn(bBY(gpVq!Q+T9fOq$MH3&#}34mlG7Eg-7eW$5C0C$H^}Y7JxAis?rf?KF)ug6_g7>uhXeS`dQf7X%(rJH{O_CY-Y!tEXE?ZL3WJ@olRkvJcJ2 zRp)RTJKgm-zXPsUjDo_xq%B1*)M7KHe;GM|jQIuXX@wRUo};dI!)dGNX|Fu;F@I*Q zlIU!S%ZOYD3JeZQ@injbI;T#osutKW4n5WkhrXI!b-5KlmRBG)o0-mf_QPwR>l3*ev(Z4P~pLP)fAwN2-Ii2w04>y*AgS==XT}&VV+9z2);MnR!!b{mV8pk^b8Mb zfPyJ57<-c6QAQI{3V(L;!uUN|Dfbxw{1`3~82c^b{^+*h5$xQy=io*U`PAU>wmrJ* zi*n}M_MBahL@yC;)psN>OrS|Hb>RB%LagXHHvLuw8@ObWs+*2Yx4-3>_v=6JDVh6+ z`2ubeZ2Y7BN;0cy7QblYqf4i5)`NC-H|FT>W6i+TdU^rCv^5~l4=Zy0k*vuk0QiXY zdY&l%$NUNzuA;&K1;n&M2xd3_0lajgP1`YfMp%apjPU-mrypalkZhW??b4v1alQR` zoFJ+oYXUYPL#X_*#K77$J&b%O_(%MneF!kk2li!2%{mC3M8%+7qRP-sGZ;a;X)%`y zSkAu>lLD$VsKq3l7-})5Fcb|Mr=svFv{iNX{q<;P7`^^4wU~`0C?jTMF4>Qd7s;F7 zKPb#WrZ@q^nGE8Pd#%Mkant6f`V_xyhrTu9tj+=qXI>O=La|()1-1g}X6&J{tv2K@ zq#ssJYAD-k64$*+WIE$))G>JZ=w|FWAwS4%AP5vt%YP$r)7c!vt@;NaU?%og4&jG3 z`4hKx6817A9Ntanz3#WpqlXlR1*|3CeAw5Bt!w);J@!o*OW9Hm#OdH0lQ>k*Sr4v;qmcO*T%S(PO7BY{akT}7WfxDF2ZdLf^^Uhcxt6&9{QrmflN3ZwKAR&69F;E)K zv9p10-N@PvEMCJfTKbMT;um_jhgMg*fB7O64hW`#u`M+Zz8O${qDskVh`JQ2|MURp zJX9c=p#^O5@83d1sHDOV{wQDNpoz<`kO78cDME3YS248RN8?;wJUfyWs?^8zk)6~* zwjjZn0Wj5j?*kTZvmnp}(LM?hNk%bUh3j$mYJPU6(Iny|3$tY^H146En5;s_=wK6u zwqd}YG#H#!LPi=1W=|3}aMk0OVah-faE%F0wQQ!Y6V))Hr9DFiP~y^iydZ160?<6c z4FnFDJcmjAPqfrM9M$oth zGVCxFhGN*v&)CbgR9VzNz`WWvgX(?_jL8G@e52Av(laW{+l2J#SmM@W%?~ht?j7mF z|MQBQxYZn4Wv-Afq?hO97%>dBq(FBU)J_j&K#gauegv0Sj0sAgsHm)XzL>Dt1QDPt z|2;pZlX1;W>EP0#x3Z~6sIkbQrcbf770yk?Lte5;5g3PU_fd(VIboX9=10>g|E!>4 zShW75R@QUTM2n0thQJMhBm?t$IW2N0h`uMU^}EQJX@!!UjtkCmpV8frGhB?E4qD7 z=zQ5&X>In?b*{K`u1-3-qA>>4#t$!{jLynBO4LVGYj@F4?#_593mV|H-Nj~+O&MRj z5?3t0tMhfsPux?@FW9|Z9XbRP(9oFDJQW(l8_|4Mj_XH_#kdVQ*5wj`-+P4?edE{C zcgLy~mS91&N7w#DvXm_}lY8Ivk@qvHrp*oK?@%V~)W`&IY28S&$u8Mg!2x_dMbYMo z)Y6>9m&-X<)0s$G2g!RM0lQ&o@yFPvSxF`C!dc{Ut)RE8tPwS9^>86sASLumDl-;3 zhnrxq8e4vdAhN81 zLviWjsv1WM>Vnf&aB&O6@rh$EhX+3Xk_6F(Tb?;>23g6~V7V(#zXnt23AZ|>le_zd zr`xl(e^%Yw_$F&rzM$izsCKWzqBqF1Q&Y`yR&XX&O{#mR2CA%~G9k~YQ<(tiOvuRX zo4#$-rH(W~tSQ2g(@0M^W}<0Au-S-Q!O# z?u>#pl{e}iMw&a=QJ--22y(HY?nt|jdGYjan6jIbh2@qw1wYi(pU_@r7;0wFFurlB zNi8ek46AB}8T+s71|f}c*Bn8G7;FMO9g?lk-EM!f%@N$g2&l`{!NN|tGcrs~BHHAh zckKxLhmI)!#8Fz^^y6-eeOL_3lH8>R^H?=Z_6?eRyUx@-L=maSBw`8|w| zdbAJV6Dc7YAi*ria>=wdw35GZOLu0$&Tmtj92X?K%qIL${P`c$9rt8SOjCnH-*Ack zE0XV=!#S1}@xT)CNs=A39({4RuB4~*SurM)ZU{Mahv0@NsXmaaF^kqtKHDBab+^LW z={Dj4jw=f2(IGV&xk-TgS_gDu(eZuVuYio3pJA zjjH%UJ3{`oUr7>klD#mR8}05|7ulebl;J32)h!+Ev8>Sb{v|s&?wfYeP)Y}{ncz+V zNa}-*Kl4a*^Tb?XTI4f@N1!CS7HtZitR5X#bgtI)`XWl67>TwB3UA7Kuma78tRjEY zgXP(FRD{c5b#P>Rc_fZ*#@b~|KI3U)0pjH^QFlJ33TeYWEE7XbXKw z|Buzq&=YsM2I+Q9FLd4b{ehwjc&wQ+G$g-9Il1IYwXj8~l|;qZ(0?_yc{+@%BkXG# zO8-xKalc$;zUX=7dOIGphm(W^?CT$H2pbpigVuz7z3_Hj6KGAidqM!Jk}$Dve{*#A zw%hqNVAK|jxi>+oh+7zK?ZB7P~jTcZ7(8L5P$KOKUHxCFhHB3^?ur8r6RG`s06S{L#N5yNz*2h%gbsITXvL3?RaSqt+(t4pN}+Dy)#)` z($R+d>^MF`(>?XWq>*hVs5R+{EoyDLyP;)jEDS`Q&Noj7v0(!|OmAC~YHB`sO&^&A zul3RMNG5t9_fUz0<);WPG6L7|?AKN3Mrh@iM-7A|jCQ_p#T_*W^sxqd1S*8d%yYt5R z+*NI74`A>DJ?;l7TwoiHL@{;6;oAnNDWpg|AF9LrEykq}`ZXmT+yKQlm&5?|a-qJ7 zO+bG%r-k;$f9P4#&qrB@C&Ml;jeHNI{Bqmo+6iX-^>C*e6ZY1$@Xvtz73!BW8H}T{ zhjmanfZYDtc0D)VD(KFIBCSFE&vcy>G_%>5$T4%6!i?;P0=?^Mn; z#2MOR*N%$E`li4kvJ*~p}Q6N^?0>Z;#K5i7G} z&UK9OH80I=hQ-R@V}jc6#!Y~m4cgS@qhGjiq5&urw%gU)5CqZY@$Wj(Iqz9kJ%3v4 zHj_WII2PBVmXQz92HRooMiC@=D6mpXlw=%BN(kTs)43gB{dO3*q_|7z={{_jP$zQD zKcEj?Gs^!9HIc{4JwlE0SNeT)oz8D-tHp?Y`SKYDgF1vurdKodR0zCMPa`PD%s0*T z`36?&s;W?zRizYhThHef(}`m?)0a=Gyh;;%%yvHryel>fvPX?xIa*ZImSDq!I&TeNU&3HszU%0D=6Yn~Sd%_3CYP@FF8JP84 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 Q_&9m^5U8o8Rb&wU4?|$s3IG5A delta 278688 zcmZsCcQjmY6zzy!5?u%((K`{H5JZpO>m)(+n&`|Gg6N$@jowYv(M9h>k5NV!-Kc{x zp5J=!t@qwqZ>@X&yMN4l_k8Ehga8t!FU)NVig6mgi;II|3!*883^R!AjY$zSt6LAuCzEIiU8PN&pX3II> zJJT?;xHQ1?P8w7Du|^7gx<(3)oZqA4yI4e;Nt}h>SA+jm$kTU*_5CrUlKX2d)I`e0 zy%Iac;r`d_k7U#q_X?Hj>IXcz@~4Zmtkkn=Jkjd5WFr)NK9MG|nPa;Q6J(A=N6iv4 zoqO^*psqu##D{n^j~Cs_pUd%1O{afWYJE2p-A%>~G;R=v|H+gOACn^)r{mIES>bRK z9AG<+e?KHQ#=Slw7xK=*K6)2~Q%3TMnHEPq?uF6O6V*J%s0HAZT_{f z=Fj8J4_&ML+Z7|?KX+dnwtVfT*+`8<$n$S{Z~Lb&hA*7!1MO*vgn{5t!f%$y=S^^ zM}}Wi4(1|nhSW>QUw!c#Ey>XMLNxMgLDBU0H<86nLxL;&dCDM3+gP=2vz_SC zBKbdbTGUj1IDfU%U+f>~Zq(QnJ{WVCZ~RNnZ>zVW{4$&N;oPr`Zc z6n;IW*5vp8>iBwWgx5@7P=h2>h8W)@GGipJE==B2tr@PiO_jUwS9C4gO*s0e&Y;9X}AO* z5pK6Fd~x7()(YNk^QjUn(QX~+kU@@oN-T$LG zO(hUz2kPs?z*Gk9|?$E-i5;ZJEP5<1w5Z09cDbJiP|#eR76+kU`1 z_`^*@{&{(2-|_D5*j_AuLd3CGwK*#h`SQ;)NIpyzDQ6>7N@Qu_D;

kGeI3r&39|<7I6G)p1K;i)aJ2rpCI)|u zxRFM$V2_h3x>7LHK9O-+)fsrlChtQvFqeN5B>hGSbV3j{TERVwaUASIL>4KYW7Id~ zD8tlI@n&y!6b;(A=EiqjuIi7k8~m?Md4N5mxJRKYEvP8GpFv|TKL}cBjYB{>w^~n- zGN16qiZ!HGCe6TCH!^Q*ea;3c=#-$8rU%5)zQv6X!6Ze%{`FQ8d@ zX6fbkuWGz~MHAGE`ExWI3i>FS6Tu_cL$0OaY47X zVp48^e7gq7)2R=&zv^K%bwSRtv@GO#r0>Mb4NfV>-6y@b)CZOBKvCYZ{>7`Z1e3u< zB?cw4Cn@&qz#ZrS?xr1=*M8Gtj`4vA-+?+MWcblU!@JAWt<5kZ(hTc3cH@SnvgmS_ zgibcec$&HxA7jRV~HC_WsVeOBH(!Dj%aIRbCNDKSAH#fr8V3&gW=ZB&FPp zwEarC=j3_g2a30mCh=eKk4UlxqaXa`4|+h%ykAuTaF9=jH1KgSZK;j=)>qCImDkDu z-=ryiudQr%e@c;D;?hq{w!QtU?;sStJQ4F|o&Df|8Q!rzO3ios_1fTU7N$My{K=U` zkykfYIbwP>CHaKlSup8aeS-_aqN=#9h%TL^=#=z{;(QIeDJ}h}C0r_po>#Vd{POkyy{$zsQo3ME$a8v__`${6z`c@$i;;U9ag_ zG_67`n%zH3OUb_>WT;`@o#izv#cNR;dCK2cUjV&RYxK+&=3Su?ouP-njKRM|*cPH( zwi+e+*^NOYZIx58-2nnO;~6U`99defUM2E;Pui6^g;fpP-s|xmXC)rT;hU_N8c2o)7@tQ2 z5In=%Th^!u$LW*fsUm%A%Q{QZHORgIp1aDfy9E^n@OzL;qfe&`@y90fxuPs4kUk}!0Ib2AH(5}KvXqM?{al4hQKp+XYCcgQp zN&4+}#F=ZbM%hDe17{b6W^)I*>eD=6_({_#v+vw6)>ncDLU}P8Fr0PDeUZ%$Gfy$! zGW}ah~l(OQZx8Z^T3f)Yb~vpOt5jTvQpGTRe7ZY2g^@xkbbZU>7j5^%UIL_89gV9Ayykd5;^ z50Ek$C)(-wwFog4ZdYA6l+A8+8h#$WM!Rlb&TGJF;J1A0qFpM$Z?C7j=e5am)2T>h z)C!SLdtF6L2N<-G%C#d!OQ~ZsY`jY>$8-3X;WVixg2W8m!I~hBFMpm~cdyu@$-UR^ zKz$Eoc=lRo>xjA5`NJ$~RI~nCRwUFUjBO;ekl2c^^=^qfi6M(^7rZZdI=Z(4l^?lT zdS}CK)54S2vNE&sac(4&+=C(Jqvx9q#RJJk|3naIfPN17Xc^(>liKCge_dA}Erxj| z&Quw2c_V+HphE4un6dqnT}Gy+>HW7A3Bxw@1N&m24tAN3&o;hAXLvPe;%V{mUSjK- zM|wf*djk*HQ2GDdG34$aDMEVG3CF2BYO^G3R6X5_B{Y{ED9)C0WF{1;_i{4sZ`14l zB27Yy_!q!bf;e^=?`h#72zbBxG0X7eWcwi71c&mbj(p`zf_%(Pf?i^m=WK{H9R9F; zvCfY_G3-PvGO!^bPJ&@GrE$~vL~bQp1CT^i&m9o^-n@YPF(r*WuoYBr6%0H6lC$`d zi*<$OxiL?Qr7`>BY78I`;K;oEhhT&-{zZi=HUVKi{Og9FV|6%^d$6NpiQ?r9|NRaD zV`u!yBC)PI%W3T(h9()EdCUH46(8mNh<+*8$CE>lLRU$zzWjOH*4w^MlkZ?0pME!K zvHkdCT{XTBIij;qlYO_0yAynok$ONB*o zg>X1HRZP3v{)w`O+0kQd!TG_lPnnZ@7~%=E0kceT;m&nPU(Az?jL*qmooK+{nUYtm zKZ`S_6q`f)T%(@|{2mX##4yjfpSNfK*p>Q;2~W%p46NKKF^yji7yBcZ>*?rg#2KvE@s0+Edyx5*}v5L91Jp zIyz0+XvN|Q(VLqB8c2IYZ(G~h92j|yF?Fu>#N@oT3eD{FQNQSN#%iLIwz#6-6*~<- zGxHpfFo34JR@hD+eQan7GxN{zwkwR(=R`_o3e{xG;gHGgfUUYGq6NoDRhODL@{Qno z6MUW)0{QA!#eHQd)pU#Q!Z|V&f-#aJAFfKr6U4;m*e4;AdaYpINi|KHWLwUXyvWP( z{@}FSbYd!?S?lW^h_D_JlPytmd>QUk&^GOA40@0lU-g=Q13MJw%b!FQ5Y012mk!;I z6~rBA-eJuDmEM|VE|uOQ%?U4|_Odp~PA5;iH*08^iul)K!`2Z5!*L_TCqQG~uf2mc z<0eh-C_sFb(;d&_*WaizsAvl()Ws{-MOVnO{0O@%xL03+XDPSU}!^=)^TsU*ht! zcPnyF!wn8D)V=~0`z~#~3Vhj=ay1?JL z9>cw&MUkzbDZIv7;77tE?{6paD@l#zZYtuOBbKdrkz2j1Tp#S44N~SdZi*+W?m*f7 zP2G#C-#2`E@UfZDD8p6gwbQm~uY&niaOXs>>~GxfZ=fO&V0L4-$IR28rupZ+7uUxc z0E$(U5wxlgDtg{zUOcM)+_vTn3ZI?HP3sCESJ&iYnXRTh}MPv_ub)hy;7>W-HK z1xw%<<^Kf&K1{W98uu0kC`6hK&d|X7dlE>`mbe68Y~_8qDCq`ip0?sA2b+XR4@I6K zY1KR{HY(X_O-26Qfkevug~x*j#gm?0%gd+mr?nG6vZDvexclnW(Y|zx)MX9c z&K%&sy3Kl(bE_~NPzKR=5TAv0OU|lUnkj;j%Ax0^xIV#qYBSDk)ziE=!|8PRBjF_% z&w>e9?t_)g@lXK8(T^rCH@f}#z7EL|8*t0geOLwQLAH9x+AJ#Yxa_L&i=tb;lTFO5 zzm%4Fl3pqXaZa3RZ}#62*;>4KHihw+VNY=_VoC*Ik zr;~6F@s2aYv-NS9vU#F$0wa!NqUx2thhtOP?Z1+!oFw5!lj-+FvoR#6dT>{PTpUH2#{F z@p-YKLpHN?%>I!N41O(q1J;r{LZXdU`UJ4UQl;1`klK+h+8dkY1O*Fe+{yXk1#R2- zBlRvh{MA=Nk(|&xSt=rKGh#yE-0YvT^ZV4Ttu4h!+7I$4YWr?wWfH83AnYo~w&SDy zw)LkUMxn0z%*TBxBw-Rq=ksAXB>33$A!yWxp`W48YOSOhKF#(1`3W_3kb$0 zC%G*rOt3f`cHpEakE ztF*Y$axT(UquD!5ft5%mhBMi39ayes519@GJAaNb2h$flbkh}936TJCSv^^3aUKfc z#}XGgY1(>W@Yz;VXfqnft`vFfSqS}j0a#-~jx)j>Y|c)l`T5(}zLl%d6cha_HRPst z6=Ty%e^Ha{(pK(Ylv35Uuto)8Y&i#ir$Z+QCZLfdXYqMp6OHoibU}8cS z^>8s%w>w_b6B=D#X}cyHoR8G#9SgRKydK&eKhUs$iazeXS@;QHKRiwa^=Qd8UgEX2 zX+P@I#Nrm1u#C%RCJY)As%2qLd zl)baV>~&=i^VS7mw-!xj`q(hACU8Hg&iCsj6r30F!R4xQ_P)D>)*a$QCN9HUJi zj#$=IjqQ-UPwTZ|&I5=zisB9E)z}Yr*00{r^S~Q<9q%p6k?I)Ye&mO_{yR`TTUeTt zb<)iP_#4ERU*%NML7x)e#H;yP;ksvLdfL=WAnTY@%QH?~?m%&CKGM!1J}%Uw4nxH) zY^tnBE#+!2A`uX!S-9fz;Q?CWo}Vn|3_MT!QbODh;KRYkYImTJC;bO8NP3M4X=Ne@ z2+gr|{NlXDNHk2+F+ZG#stj*~h)PJ}9U+X~YwjRBG}qL}R;giX|5@zp*w_oI7tekx zK9#)<+&ewR5I7d?FcAS(0u(;GTX_09?%rNIX$d_7{I@@|3z@&-(&GF)RE0K3tFGrz z`&e}YlCk+>VP}Jo{=!j6DPx5jTb%ukR1%Gx4X;883#T0Rvz#$^!He%@Nx`b0#0wk7 z&HP#h;d3rGISWnvY%4VkG><8D4LJ7gXEN)P0*+gKv#Mse1L{goCB*xLA_E%K8}eFr z5f?#G#vR8Z?ODZi3%#dxM$9Iy4UvgF#&b)#X~*kHnb80aplwX2e*LAlC8KH8?Mw+L7jhH z;gxFOg};=a&8H4(49$Hfq(ftu`h2pei#*kw&b7;8eZA^Iu!yyCF3m{5$`Gvh@gEaF zb`GUROH7?-JmgS&>`gh8Cb;CFMM6{EH<>S+&inx(?AX_NS=+}W)W5D&F6_q&^Hcg! zY_@CIaA`zo4%TFWnQU4slJE^3!l~92m_}9ucP$w;cQ7B1$LuDPxqItBrw3HQF;AVQ zCg(JFcQ7oFDa5hXf!WGj|3iPZ8!zC?>d~VGt(w_W;~AV6_|jLPgw{+vYw>4&SiEK; zoqW(PAiOvr&F`{Ds+WE}k~21`xY0FjIKIL5QEQ|1mDT_$(rB^c*j=EzTwTMzONQg6Z@Qub7S@ZSeI7K+WD+|qP+D|9v}lM0{5VV(YHFy_H@xJsv{{kiFbBZ6P~ZsK z=;E-`!O0;HxSD|#QJDclIp@urjTuRS#Ap_}J_l~KTD7^!fwKdJi=x@OJ-Uhjj$*rZ z!l@z!>=^zT#hISh&T(T|HAl=`PAV0X zocP@DNzsY!hYq3C2dl^8e!!!%pGik8kjkZwR&=@e+TylIaA91}n46hAx^BI4j*rtr zFD84oc-w!ertK0#ICEn?d_#-&4Ke?&!5&qD8=@T}2_o$N1*!#AK6~~V(TK-c7C;nP zVfchLQa4}E_LjYMYI9-F|-h>QAkPgS2 z>Xy+`#*`fTuu@=&0LQcycpMM;O{<*&A&ufo3#d{Xz3i_Oe!hWIxLSjSrSR5ezM)&F zO50~mO|p`@N$r#aq`XiYW+t!Qz4czv`xQV`-ykFq`}xNL)9!jph&y@%`y84H*dtH^ z<6+VgMT^F0sj1?b`lknv;nr8Wd=*$yk;#W@HNIsF{tuo2zlt>rRXub=l1{Wv?b%Lk zq0zl7zw|9xm?8?*()YOIfzR(HlafxN>2GBUZrcE7Fe&7|9uge6y1FKaWHgQ#dLhZC z!rr+JwJn6yF$xjNa#u42fyvvSIe@9qt|h1tL!XUl5s84ofV#g?LDUAyc_kq0q%VUU z?67uO%!Cz$`?g5h<@z%6Xmn%3o6J<`XB5HV6s%b=S+;^ITla?gBh}c3WX@Qt6VVU83nMR0f{K{)|K) z(Gz_SFi>-CNj%l{?ikj;B|WgD>wR|`5P}<9lvK|-k*;x5Tga%YIFDFX6JZIQUWgrA z%s^92tRwMqN=;ua=X|m%mw|D_>p33`FATaIJhO4)QZ10O`YR?SrmJC(qW_(MBJGAf z@dVm)ODy<$mu8N#+&Ag064z{hAgig}w^Vv;G+)NPu7vaan8`47y5L%IJKH|s>g1?e zb{Ma$SBI^a4%_7r@d>+z>-ktCc8$Cq7LXY3SF?N+Sl@QubQN(2!ly>fjwv61 z{IX5jP##qu{lKHFmS^LP_LO<$#2cB(0I@Lo13uPuh39rSK;g=|Gkn{Tfh<~HVfqt! z?~qMW3PKHkRIqdfJ>|5>53%en?N zsjM_3lRb4muT8`4>*l13l2a3PH0%zCIP=<)PRY_%Yl#k1+67Yj$>=-T_J=?h_+@rC69+;gi(uLY|YM1rg`>B4sfu zH-n<-$z~D2t%MKD8W4_QndiM`ue5>Cc~ix{W{bPskQKr_Gdu@g-hoIVvOeRhrg?TU z%+nR`V$=$o+A+_@0%QaoL;2;lS0)TogZ>4O6ASm!Et{T3+^kVG4Xh8-engAC(-}m6RvcQ zHYIEy&_m=eiH{QRJ3_S|jrK&~k90JMMV^DnQ84AU9KC6Jb);yFRaJN4pxcpav2X&_ zUxS}n1?Y-}uBw3Ue%$~M*pP>cVKIXy+tMpv!#NGK5vpQpN@XWdi>JqxnrG9eRY^HP zZYtB2&L~OKMJU?zb3Q${`EjOcl1Eu`Cg62AaSzY_GL5EnvJ*F?y>lQI0`N;v_i9#` z^9`qu*A@d|0D0Ns&ZS`gP2UTP1R--7i5TzFXlt_mT$~TB&23s29(SO~{BBFxLJ^g|^T{ zjjD#fSG-3+)Nv!>4XuE^OsR0(l3s`Y$9% z=v1SFqZL3(o8r$H^V%s%*FypO8#Jr0Y>Qan9jLVuR@AOMri-K~7CYkP@l{124Q12d zJZIY&BBpyvO`Eg2oEo5d>?M_P14tOID>b&zTSbRze@HYOikJI%YW*B0Nw{qw)C zMhRd|1~4M`(1NI(JjbEQ3ctX~I*h)<;j!2-cZrM8MD3S>PKg2OC@^CyP7X=?3!jiT z5g%gVllyHoO8aZ#tPfPu_)aNUJn4 zPUzw{Pr%4H@ynMFjGmDu9|sKGftvgD%7IDy&TF&|x}e>5*@o#jw_AL%X-`@>KO!7u zQL;vH2ZGti=ik#OS4SvcUb8xBNVdR?)BEQ7V`v1wbCtF#RkeMRq*{Ts&@Xc`%HKPK#g(3Yl^?DfWOaa?`_@C^fX+q;)>Nw^^0d!%v^P(^ z#BR1Bp;N+pL`U@^>@(4$sb-aTPVp)yeFV5)u3}$~aohOvv(PKAM>{idu;=9rU0$*D zt&s#An*^FG0;6Po?+=vH*YL`Nc%3Y zU-cywjA&~(zi287O(cj0w_4lLeo1H)x?Ohn@6Dki>`lf&&U z)4PZPsd0&!cd6p*k#F<9+PD7JOB70cZ=N}?Ak+bW*aYG886o)>Y&$9`< z9|Wz`9J_Vz_=qt@4%Yh7mcuEM-?OHBM;}aW738F*w!AWrA~(Z|DK?Q(98^*jJ}h(r za)hT&Ci_<&Qt5#Ih99mfQfXuTKS4c>rbOxaBfHnCqE@SnArdc}*I*dQFX`2g>B@UEefWr(2%bAP;)2d+?hhXrIVv?+&zId;e}L%KJvd zNAi`_K;!JTE#=r8rECi8f`R(MIO|vQ*vHXdEmL-KYGC__T+A?nKzRJ2T?5U960QCc zZ4-iBNNIf#lr*@JXuSC&;_M!WK8-1lah^lD7Wnbc9SHzpwey|;yp^Zh_z_J}ZZZ^c zaxx8tN-r3uhj@M75i78wD&#EW8iWlqdM&Ktf8EbLSv&3z&sUg!D9H%v5D*zeYu?5} z=mX6D*iO|0ME0__jpl;ExG^3C@6@oWzr7<^ERH92INRlk`#Xg(xCFYH)ETB|p*Qo6 zZ5wd=Lm=HnwRlE&%2aqZeEss^{x9Pwwxg77IKDyXM=r1BY3wVu6XN1?AqIvL?|Q?8 z_Vv?lCRVu6=WR6^8m;N@Ejs5zzNP$BF0%Z--z(+V1J9z#9IwM$Yr}Qw?lBtYcJSvH zgY+df2`Zg9j07z8kb6MVX?F+upbnnzUOR)>@cdZ|p6kYNBnu>ByNHoIoj?7PlN|QX zM@cGOiDgH~X|}?VSH$;|lBr_b)ILK08mvE)Q7cP^l5JlzaR#1pIYET@Ue4Rq|+HRW?6d5rU|A#syR8D`=#K4 zD#Z)WwytyT3S_V{Xdt8!I%;}>Kykz!ke5J45cS2OA~#goKCb-vQv&b8Xwp@4)8Ak_ za7#xU$}wcH(B};QB^`6zKyCAsez!KxiL zu32&a$~93&kD`1z{(3rp7}m_t4%F3{Hqh_`Q)@qyFnh|>gb9D7)8RX_9zp}87=b;_u^a927zX}ftFmhaXeF)z* zj3zPSBsAaXLG*+#GVG_>#?`SUEI*~ObD0wz*&&Nnw; z5(kf0H~hrn>Pg9;YUwq%OrPCYNZQ@|F{Sw6hRRr0hL22rRj(S*Xb`B6J^&lmo&kOm z_bouNY#x=!wc1kGC|b@qj|Vb}#Yww#?0MHjoaoCTvOJ+j(oOz&6reMi=S!VfC`#RN zlzpL0X&_ZR|9JLY@=$wi>~mF37W@=M(KLY14=Zw@g^f&**DZKnZ6{5GA0q z6Wnkf_iZ$%3m|m>L}50pCiS_*5hMhKtg)g)WF(0=?)4$KK@>!9UmhK2V^gMYiw8)y zm?Q65xVf3Xi9J=CM&jbR&|4967nu|`Xlura+Gs};+a=4%(7k|uKzaG+|M+PBr=JGe zEV~j6es~~labtjRn0ug{q)@L>ny|UrItXBsM;}tiku#hvb*{vP?j4Pz#1OrraDfAk zs=vd+sxqba6#aB=Pg8U~j2{)?aTZ+gx97E5K6ie{;exzrO1O>-5sYqZd9;x-?I;3l z>2sS@8kU>+p7}FX8X~BYbQ`^@C(Z*Ew4!t*&6XD`G-y*ko>)5w*nZb zam#ryPk0ogI@@_>`T0DhTu};#Yz=L-K7STf{<#$iGL-XVhC2VY78HlO7p@+KH^+T_ zo0{$deb^qyUo2Yi!SU54;kM=+MOV$^h3W$D?T-e=K_1wT0F&EH=D7+H362?R5&s*r z8##CCQnNsq(A(Wfg)K^!?u&@7r@Mfx-#lHPj3#&J?Lplk@WwFP?q?R8uc?uS(p)W! zr)?=KyP>_bz6sDr-GOZLES3tFV=8*_a%`+hEHq`t262pBS=|$HS|SW1x^Z!kefyEK zu8|FHOFl&s`{%TeyWEH~Qtf8iC+L&|C%CJvdYpq^b3~JnIZ7#@gi@DflK_hu)=3eo z+cc}oFDmV{D2d^#V3MSxB-;a39d#c0aI%bpi}BW{Y$ zw}seb6xKR)-=FUaT1P(nJMfHwF~$%u7vc8Q&S+cHS&BwVeOKISPp-->~?BTo*!Y!IfU2lneMhmr=#(4oAkLeuL~%f(X5i&^+3`suyC zbC!>Km*&nw+z9Y2R#qO~fvk=~y(II-o$-6(zDWj%!QcMrv&ra&^A0`}BOhb3_BN6* zprP*phAjZ$m0ww@Uw-@ANapj`;d)&5^W;&ZwYm#<-*Sa^> zyrMt!Puw0o?gye^_s$l9Jq-V}-caN0Vf64LgZ6PUEPy%6qbzLxNuCRw*m-ax{rClR z@B2*J9cZ|bO)}fttC&=2oomoD`a^aMVz|e$o$Y;lkC8C?@b>Su-6q=%YlGkIJqyGs zx!3eMEg-`(;1HQ-mRjB`^>0lqn^mRL-3-=f2Jth*h)fv6iex_cT3&oERbUs6q(x9|LNA}d|)5iZ!r&fyih|TO&nC&?h zo!8utU&ONA3>Ykwzjdo8x_Y{LwqHAB>^VyUe=$X6MYYhsD6f%4@Y2G3mu#&41MK~m z(>FvIPv?%6O4+(snGZPI*>+zj;XSCzvBt+lRJ~k-9gHGf*KHCSkW8`XEiJZ@#%y6r zi9=E)8(0=>#?&}vultzXKn*V%w^#n5xH5+94JtKX>`o;C-rOC_aT&#{7>Ply>0mG* zhBATJ?kS_Gz!+kkm80Nns#$5N6%D1~9!5dBx*KVmdA`LT*ICdk>#ZBR;0`v&uXMZpw#NdZSkq>EnDFQ*!g;ShfK$EwQR?*qd_z6Q~3_f>;*vM zwB{INrUr|#is~aT;k``#CP;GzGPR@npiPnxv+xHM7#N1nP)($rzFGQ|?J>|C_$2Vd zWprwcS7NeJTUbw7X`kApSruX{M|p0r=s)$qcalm+5%j-${Y_dcCm-J=wkyjmQh-ALyjc!^EvDZ4|A(K@)GKV*rZJiAbOG|eP=zZ|4_&o9?Od%$2I$!z_mAB7{8y+~ z1eLpJnfo-q2VD1cL3Ume?c?A3aPZ( zyOXJoCd3t3je&GsxyUV$Wl49*bz=o9tOOIv|0a*#0y-pmR?Ajx_p9m80@=1&Zz|`~ zYh~+C%=ZMwe|5kmq*}#NM5jts&!gAsH#OiQRKDyLM|7X$yr*^ar4`p=#JVIuS?s1= zqzBfVC$1U9eEN5vxsM##Cyi`#H8YFZ2-p|q`M`@+VCbM0NW?k?DK_oPgcs_j)1A4K z)RPjVx*oZBdFYs&=_m$vqJRF!vTFdn9Y2fN`^^v&6EiJee_!rSS67^ms0+| zM^r&rgX~H6JZ)d$YWu-$wJQLc61M*MfY|1}|LQpI?!zJnioC+jDZXZcMHb>O^h}~E zUXAaN`C*{YMLFtgt@~njuki&7+jl%_6|-NDi)f(nON$VYZaQ$Af#rC=1$S>ya?)k(5`cvdk^I@5RZY6p)HMb0Rry6 zg(fAwB2R^dkISws9b1$PKE8>@GxTNA$Autq)d5vcBjX8Pw8Fa!*zBLBg%0D**WG*L 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 )b6-QD5*Bp#xv}a4xQh;zmmzs<=2@vke_(igL5G zn)|qi(WB6Dw$eG@caLe&2FS*6Wp@1$j53ha$vZ^jh2}9*?>1nDPPf9mEaIRL_+%B! z->-;)8vK6Z26SxrragKKNV|E;HDqL3Cf*ou@yMxUq{^9QiL^ksn7F8eBI`exNh#c2 zm22^{a@l5gQRWK<*}vBjPQPA1T2f1rR#QGIdmhcsBE}x&40X@=1DqLF1Q{zh&72YX zk1I62OSlrE5XHYDm@xuO(!aRXu;`D7H13vohH(}$u6|Ac`$FZ4jr}C1Wev+XZe1bn zvYDGjYq|d>&9wthyd{gjQ;|^SpiC*`ITE|}7|$1;kIYfn8wI(g*o>=@C!iq5R+aG- z?l;kfKSwls~$lLMpY;iCvK~WHr7c!QbO$uM7k& zg)%*A*_i2Y^CGdLi-azWA?h*9G22&wy&UPGz=p+`@t?EVxl@w{QS%^H89 z5Bo2LFSYeIR@M9NZaC!h1GO1~wNIs5)a+VQH6F9#cjy%QfFISzxh*?C52F1yD<1N< zZ$_V|W~QsViyt%pB+5RV8?B7>Q-7U;e!7G7Aq)kyByKM@Pe+P-{Mcs1@Vxmy0G(}a zB!Rd3807{JQDPOskNdWWM4npe2mv6bvz9{xxK-s{ktpi%dsD6u)IvJ;wZWM`!m9Jk zu^P>^c4ep$*j`1iur6wyX##JsYYs~!cvrnQ!+I*)z4ky1f+x`fUTCt*ihQM4T0a0i zg$l1aH?q4s?LjveDL&7x;VMBTPSq9%0qgWO%y7m_UKn<{l z?POczw4p#z7MeArmKppg7cKsi$iYBa6p;z{Uo((V&{IG6%aBh06P04-(c2WFxu>sH zkXH+fy1%-X2OOTge1urejb6)n3dv&he{W}qIg6ya@-O_UP`BnWxL7&um(tr&@^w*k z+R&GHL?>fZ0v$Hp?+V;U=tmZ&-QS$#w-cc@wl}z#tgYG4!hEDJO$we!hmM}?f9Y~o zkAeYFX?ShllTcPbHA_zf&QUd!*OqOR$~jUDtGhlmn=__u_jpKZNcq%J_Dbz3`An|V zwXXZsv~ebJF;4*=wkOeoSy?8BNnymiB4ZfDB|+JiR1m#rfe0z$%lU@|ES=*pqCBaI zA`$^}wx!_O948J34N-6GMG0q>?Y1_GeraH}e@oGQ$+HW6b_TDe@rN{;m_r%1SUx7i zBV3p4kgBvsZ=K%FEb*)MS5KKQc%N62_o#0QBC$MMs$iAiFumfoW#R1LuWm4H#bsYU zm9Q$`gnwf1nKHnjx<($b%6e_W&5A+)TO)j(lPG(u&w0{5nnp{l#i$=Os!u$&SnJ1>ejfM zw3UKU^}>?WrIff)S9MQ}4tPhr6_$~V&Ghr{gcBtftaAw-t-MS=_!qxLZk+k=Qt|jI zkEw!m=?O>D1ag)$``A$l%SD#>ky2Ux4#^BAl}&%VlM04Z<$CwJ&A_GR2>~aTDgHWF zS%qj?%;s*krc#!W*?%jMe8S6Ek&+LEzlHWC%dQsM2*=-iu#``y0bVctTp!J+$k26% zpR0ZHuq!DeCi7K;|DEXMdg&c0dra|Ad`cln<&1M=PqRj%7%XCLe35_uVeKJ9eMtKk zqp}M|ht>~B?;VTXJ09fn-40+KxEdB8E6(+0Q?G)E$E1b|?F)|%h`c}i;~v`a!V;== zLA~d5_oFgr?cW_=^^2clr(8_++wD>8;1b%{kxsY#g+#OSUTh&V*nl`oe%z+*J z68u->qV*C`{M8)uW;5w>Rc-=!{=9l3&B|&gI^Og>D)U?>*tiXzOnG>bw2D;f*s|;oNAh^gfaz)Fp2VtLhm0sO(#APrdgOV`fo<0Vb>f>2@W4oB&EHh4yG0Cmdbn`@N?QVCHe{ud&87?FYl zb1y_}GrY>$&Ea4E;bo_sMm*B{(Buv9xVGvtT-uW^>`^{hhKkr%RE)A$wqbvvPW?V0 zIQ^nip!zHrpu+_)SFK>$yN{wDuA2mP#JQ-o!Rmxw&RiZHaXze?itv@{dQ(U z>=4zUZfSen!`ftItB?Bly)jZc(Tc@laQhL9^dnYRFe6ZdEs=Ioxslq%)-{~niX$-l zqoGwp^Ll?TY0e!Xwka%aRy#;d+X&$Oa)wH=Ek?x`c+T*drT^vSxNPz^_>gIwQ%UjS z_-*Ax^rB^>h5N}K;?2aVNs9%x!nlWPHyGmuVY5tdf@`_gB1s>P@|fjS?)Pxn-Nvzx z;fX)CegVdog5Ljd9i3EPgF~N1@uS$9PF?toh*sX5FdHsDbqC|H8jyX^nlH>DPO|&O ze~9|gDrGR@)n)vHq?O#_u{blP_@NczTAo4prpx+d7x4;YnaW1AW>!uTF)3q11IvP3 z&e{d7^RMkL{mw6^tnB}VLVohvoBU51&=dQ2{1TY0H0lfvDK2m={0_Q)#9V&dZ%bg5 znAn;SGX6TjZhlu=(xOd9*dt=&aEBv!di3*St}5gOZ*&*j2^S^u6>(4Xx%3;RVfFR- z8s=%i-}nta{*BQ|dT^ zp_duQyzcJdoZlwCtQN#aqA{}tervl)I*g|KtLh9=mBhjDcJ92=D=?8R#w!!wxv%%z zp(GVf*@w-@=$rmgR-+rdBjG%_CIFmzNA=K)M=a~RzUSgW&#JoAe)|NIEbrU?TiVUp z@Qks-`qRm>6y|Wg>ii(k*9s0H!c{{Yc#YAn;d}-uf$#8h#*24Cm9q=D3*jpvLX;Zn zg_sR~Z-g~;@Y*X3-B8s6@LuwE%WsT#`*^8$@u5ddJ*DRc{T|Jp!yH3S05Yo{UFL|p zGyO$;glIJ8sOFBIIyT<+?*1)ZNj_&j7;IExoSu|9dONt1CPb$(hpbD1f=59w6s*S! z+y=t_O~@X6NmmHlJ!~yWvCdox`y?Pb6>3v53`kijy2Fr>>nKBDo zkv>ii(Iu`r2<@u2nT+5gp~=Qh$U8M}M`WcUqLM{rtUcPY?e<{S>9t-7DlDQ*D|Su3 z)TJPvq7$4Bdwtdg1;} z!4Pfy5sb!Mn%kW1wQF&lO+Rn6d#O5Apd5^b&3sepqEO^Y41i@@H3#${3;){S*spE4 zMmThK91oNDYW>>1x#=`4kd7UeLeGu&DFV16 zZ$A8SLh&L4Yj`~TvB5|hU77yW)sn!OSedezDpc0aWB#;%{iQ?o-Tds!+ea{dA)XaC zdvJ=QuEzR{!z2U4%IdkwIY&7Kspb?G34!HTiUX(swnt#QH)$!G-mCi4zibA5MB4Jc zs-k0hkV%5Ws)ky{BSH<$&s2mgC$MvEAJT-yWTCQ?ULfJkZRIiq-)i8qfWM|Xt=bHz zVUnogGTXjZIu3v22L`HD=?LG`dv&Y|v`uChHXTRCn9LNiw3LC#0#WWg`YuNp+PWpV($7coATgN zU4w;MqX}lfymn0^9N`B_W!`}*G#M>qu0ma97T&By2Ww?jBF$f$w}O~wiv1U-_Wc?U z;VD&*;!lw0v!juLncPtn#eQ%|zNgnnoi>2%J(HR99i&(xIzj@QzMSSfv9RDiL?t-M zn9LYtz%RhFP!KItV)Q9`1^+#(Co*hw7|vIpCx0rHSj}l!N{#C^O=ab>G#A>zpyS@ zHAW2ZVmCLokD#Nw5hNR*PZv+qe0!Ec?3wb!;UXrIb^Pz1u*&n(S>10NB7P@x z_z1lc0OsW1788Go7+)jR#uN{(IkOD+L;5_Smi?W8s-*puGjnm-^+`VBdf;z3gUL{? zU=}bx`0q}a_t1Xb;I-tC!OsvcN+;7aOL;2%w9@0S=@(^oMoE`r8~sK`AI&(V;1>Jj z9S8*qPro=ya$$)wV^za1bKYU~vBwu@KEAS7!9X#whF0-fP2HjTP5YO0qBN`i83YpR znjFoJk`IVWIWZ+R1rVUf7N3nkgUynKqVl*Vo8H-y@R)R{ekw;rl4fONbBL-Izi;>f z!9O#Em;}^~S=LEDi~p|n_S)~m;8ONLY)a8d_)h7s)2v9Wanjbp^Rvy8X*&(k=np_x ze6I!WN|S*&Sk1m_)pZx1a~#nM8^v@Z(cev0C=h^E-w($)p-adpWZ_}sH9Xd&0lllx zYRF%OvWcgq9NFovuMuYM52?}?pQ&C_9@orpa?VjPIkdjEpK!cHoeQo>K2kqapn92R zJvx?&<~4tn))Fm5o^GBrqOK~X91Nf_9wom#)XFUj$;Xp6edY1|csgy1*Gc0V>^`Zy z$|gq@HOP1Scw<07@kf)YA-5lBq6B{=Kbk+9^CAXo*q3SZtU95uf_GW3N1b;c<2k~x zLv->5zkSk_OppEo%x=UA-o4it!278p_YZav7pz#AXV0{BoU6l>^a+zELjf?pe-Jqt zM2ZjA9N|AAJ1koN5s{2e=Dw@6m&cL0lgpYIKt}U%i|Pa|!*S@9A_o26BrvjnVVsLG zXp`5Ra*M)#TgVks^}Lg3%qWm`!Eq!UV>~UxbZvrQKS>?s`5 zH`$Rd@KiG&NM#IOg4M9fH2}6w^AY6%)Zmn3^K$(g0w(m4;S1})VV&!4M zxGdc*Rk?xyT51(?Jp23+e>pN(gJ{PaAC7qp;7U~b44)m}luqa3$>rWwe@udqP7KVq z;|#v5ovUmm1#8feis7_}x3=*`3cV4Se-ZiEo+iW+-^5G%E4y~*0+?Rt{P!B;_0FY$ zo9Kcq1hv%QVWoe%t8+ojta1%U`unHhSHg6f9}pLh16T(!_=9~*{qc=QiV$;ofSC5m zso%p_v7P%vynR=6%iQ_I_dt{ob92*pZ3ET)#od|Mf&kh`y+5f6-koh8rl|;64fKAO z#_IWz9r1($>icGz4s@=MZcKm@T$r|AUJaj2%OGV1fUOle8LK|y_}u99*7XK(zxsn# z)#k1j^!WUOT^OnC{l(t5lMy?s!#EIuN(6VxPS{E_sH`Nt|7}%GfDkPxfQQE#iFxV# z9NWO~WISLs@KbWcC0bP-xp?5~;P{=63?T~8&#yW~s7qyX?gHg+z+9leYC9GR)%i-b z+w2v2-_bzUhvU#$z+22dC8n)`IKvYuXOMo2?+x_o+u;SZe)0@XANGI7a~QMd@N2fg zABh{k&`BC67O+*30mt?1qIFA^+9E2ZAW4HPU6Ol2w}~Fle}d#l>1{N~ysP)tuKZgQ zsV(NMt>NOq{-j@CxCHo-qVA3O4>0MUsDk~_egveeA9n=ssuNCA}raWft6MHzGmlMgpz&)4C5;^_&g}b@> z1UxhG*RfZxuCH&Y83~N@3rJ9bLM_h;)8nNK zN~?=*-^Ajk*QTW4_3uPgZM?lH&Bx9sOFkKB+xw*gVApOjKlkACr#bgD2a6T{^v~BHg7(9jI#% z^;S95n_R?NQ}ulR{O9}=6TP>Ztfma*oDw3RtEK|e^*Ggy>i6htEvuLGp^ssn{&R1r z&*JR;wB!V?Zy)oC#}innPtMFAtP$qMX18}qZPnE*NrUyj=U!#vMRmEi{x!XR&axVE z1xTs;MXJ`ntwF`!3ar)j!By-F*rP}6trcrru{zbt&GqgnmosFj6;nZF|K--0c8A(*eDx1Ot1g-qxpIDuWv%96&MCRsx zNdQDvOqK>ML{cWlxzHH;e)>j*B=EjWrB0+D|H>)n;unhO7SzDBZQ1^4>zP#()fvUa zi|`8*^)%9R{^j^MMl$ked1*fWoaR4U{H@F-T# zEB^JYl#8m}&80=~jPk6ygDT`c`nOKeg;PNrbh9}o{;!_%*=zWVTKX4Ki|brWc@9U? z!>Qwc&|<%_jsJ4`{s8rOLzn<6N_D^5){ zc{a4v0om`^`THvYmcipbm2uHw0hm!yv$afLrSJT{TKV1{aVxm86+5{*`&YGHL~6j` zYB?OMlKL0^&B$G;^s1|J=ZMZyXulG1w7oc1JG7+m@aH> zM;w6fL_I;O_25_fu-i=dec|F9^~~i2{1zB)hl;N?*uf=W5V&yzlzI)82S zB06A*o6N-79FPDxc%t4CAA!RZ0O$mKtPu{4f_ZI0PAlO5;5Scpa0tAI8h&wR@u;tl z`Eq7Cn!*OAvz!c9cx<3r(tkIU2|Sl;FDKgQsyFWRU+COkCT1?_KQ_WoH(g&rTJPbK zuf*q`^w=(sE;Yww65taD2vy?j-DDX&`?-;QPPcIV7%5Cpp%dQ8{+zhcpj~)WC{}9) zv4$5^mA~3p>p-jp0Ivt0Zr5O$lEP*;pEV+Dd6%L@E4jo z-PGO+26H<=ouesu0PjK0-fGu z*RF&D&1yMsjsQH^)7p7H2|TBxmlyc`$@{l0`y;ypE4=X8qkd-J1P&Vzhri8y!VbOV zSG6dBn^RH3|E|G+T6kbDGVBOH^8mZWNj(?wfk2pw2KiqdCd9fsGzyd3j3nHyAfIL7tNOZ&W_(n%9@g#$oVpHZg&NbN7!;Qm`dc@tb zjool7$%-U0<>-o4FwTWY?2-4Lfs4dY~8Sg z;hYMlw)B0cZs@{jo1Z2Tp5)bKeVMg*F_Gp~J$kTjVJqi2w~A@Dxza?3+vG9l*ue7v`@z~Yjlt-1&uqssvE{1VX_=R`=vIf=`lbp=6AMG0^NTW9*d zrr01mUWsMZq0P8_cRjCQ$-TOw(H2V8RLz>vRet<#hYiwLEx+9<5r)Vbw_5n#32%@S=er70-x*VD^I}hq zSYqaR+XXx$>wy2Zp?0NNqK&KJ>O;b7#NT7x@r4>w!JX(A0`%cBmPRC(kLs2}q2|)G z$lvXTX_@?YHDN}#OMpM>#tcUic&{(W4a-BDPLuyNPQO)DEfHd`5I;#!E>=L0+hsEW zQ$wHfd_k4JAq?l2mX(h1Td+H`-(?6O+T|EVMR5$_&XLRk3umF$9!n>RkPkBb`WXCGg zW;gGsCJZu#>lbkm`>{Jsj51-s&G5y`cPuIA>OY<#cG1D~6sr)!RlUlH@zrhp+zgvC zVSNyNDAkE*A`u5^Gv425?Jf2H7y#agR^(2y%jy5$+QvRcE)2{I%fJ7sFO4Kb0#9B6 ze*mfxiMB_b_vnb-Hm`d4KWx2uJe2$UKi-a%wUn|iIg*63Q_(^~rR+xb>>*>UcV!A$ zvnCm*lO6uh%_#zu&*ln`<5 zwyk<@*O6yyecckgL5?kzP*&?wWFkAUvhvbvZTJUPo{_lwTS{#=W9#ktr_SQLL3Ca= z)H^CSNr;7YJ^WP$&W1dY(7}mOhZkE~(8;4FG|4G*pIVo%()VKH48 z5t~eyz7y^2Y^rjm|CCjY(Uti8OT~H|LuW{wXtu;X;7%==Y&%@dXz_E-_vF=dx!UIL zbS}FBWnJeGv4Ripy;Js5n?k33R6kVjVHK3C)$bN%I%SOCnJ68~DUJx{r??5L$QCyO zNE_Ftg)M~l-s^U=YqVx^cE8U?9N1A255dg2Jp2orUW5xwZ00lZ0Ol^aD9s$II69FS zG*cx~FVUTsT6)7uSS56JBc^*X_FUznR))#R*aMJ?qE}_?&Q&HL$=o16XHw>Wa11x* zl*Pf|AoC1K;9`ymX$^rll1~x=ekBTA9tL%>hthuVt;QBkw#T!?I+j1cU2##Lk$-D5 z?6;SJ>L~ZDpVL|xKuHhzwg7>fGTLo4Tl&Iz-cp!QGE+PBiyq6$e?6f?F;8Dt15@5PF@5+V%g#H8r(QclpUP&|i@i#0^ zWi#>eo@3r&_9{%U>b0ELN(2cvk~!BOi5XAI*)kHX<{uoP0Jtfa5Q7Y+C}-d|l6_-4 zfChZGn{K*X`SF8?L3)O4OxAWVRD)kKEST?!JwO2wiIqCb1cKb9#sOj%itrj#|9s1) z=kkCFlH&N)$G52_pNlR;xKQ`WSrl5}4ec9+*(1yYO8ZM*)}sWzjgkjh%j&F7<`a7!%jRIL{(IEY*#?!yOZApW%sz z&T8K|X?%EJt<%dg1}T`);`6>A0ht@}-d==&0$w_88;hy75&ooj<5G|F3t>e z#N+oonIgpk5rq}y{;1vi`+|6kwDrbse%ulk4 zck}#RC+oOmS!1-_HLgLK3$O%wwpby5ZX0SZ7Y@zgS)8~J90;hHj-vs=I*9@+E!}FXjxy>h zWjjRbHh+|`PC4rDMA6x5g22eYM9$XETGtKcK+)$^E%OjbCyD;t#F!&weFC0uUCX6j z@~+2`d2I?eqL+Sxz%2sNq=<*$G7-7ZOZI|Kxz}&vM2zjir|yjUKt7T1i-jjZO|q}o z-8jCO?)(Vnk^qlg&oa|iI2_0+J7<0Cv#c=^`=Xu83viMwcVD5^k|)Alt8bkQzfo`H zA?pw~X)@me|Gu==J9!&*D(f3>I8qCAl?bhvqaNr7Qk+#Ske(Dy*CsYh*q|CDbuvq{ z?rKxxFsUM06Usz6>!&BeGVQcb(Gf!vMw5|QuTZk<$`eQC@P%H19#nSF;@~YST^*?f z48NY{r=LK5QNJETJ7-ifx4YN^OKzK$+7l|g%isI0PhwLP=OqRakauDQ@`;C{Ir$MN zJb`jNo>lc8Bd$&HU!=_a9ey_?7+&I+CkuG-n>xCa>jqG#1N}M8mkvpuRh^gtZ1&mk z_mBN@hvqZCKAk0;8t~Ufqa602@*OtR?HY2gJN)`T!t$B=?{nRqPs$H-4nJ5)pA9eR z?6;m-Te}G-H^=G(dYG~uD_2Fln+|LS$o1LY zSZm}nBo}OOCrf4h3Y$FEO1P&O&rVQ@6sp@SJ*L%suf_CW{ zBij&(#|`!g;?8=fu597pe7o3Bz#~8fc=PfZGh=~ zB{6$=ZbLT&t-~NGUxwk1tFN6zU~9ELs$IU5I(5&pCc_p`>>lL;#d9HI_F92JZWxve zAb7Eo#QYde@$J5ey)m5E5fS!;*B5b;>386#_asYEL61W(s`?M7!|cChdWxokla@8OKkUWC|%)$dl_B`@&AffJZpe%>e| zxg{FKah_z~gmAn=*^_$9Nnq>CmV_| z4>6I%3(gX^^_MLjOuG*P>DwB%AJ_or%XSyzBc9>UE(3pDq^G zZh`FX?^_@{cZ@ow_6Rpil97cylD};-8{y;223VXltyPxhVbW=30xYMQ0C&8U(pf7p zGI$lPUe2OS6`xtm6b?0(AKB22OD|XJ2k3^L7K)&qx7D#4quAPC&8sL;wp-4-_Vi}U zPh=*pewh3GE^&izI9?(%|3YixTs-Fyq%{IfrF#D}jIFDnA)GjW*7pp|e`MYn_x=YC+ThNQ<5c%dD3}3 z6(d^5DlCZ6$_6t`Qr3z8969qD&vA5^Y38tLsQEvfhT(?!QR}J*iydl`~qp-jCRo^+F@4yNa7@!d*Rrabvg%BicLgr6O3RRhB1$nD>!}%YVygqw+kZ z;i)}zH41fJPm-I{S^?J_D4t+GcpqoCTQg$gZ<;&Cttlzt#$lrCgL%{2KvIYm=w%q2 zdvy4(s3E5w?mfA`De=?J;SRC$59pd8UrCzmWSCJ4JqKBXyCj_BF;vVGGyVc5Lc3)R zRU}esLa8>p>x$(F6!yt^4<-I^VD<4tMq;|BHpo-pSR9qT7sqiBG-vp+CFbpEr~yTP*gLxxvC zB?}c=--O+wdKOF1S00f(lmyc=L%W!TI(6fC4q76qVb*@B`=}r2s70TVv4!cW8}mMDZ??J}3|Ulw)`L&m z)qxNz140b5aqzh|DefVzZaYCWew(mdZEUxoq@Ut|WjX0F?o8mc0wm~K-KTc}T~9sG z$aZK61w9Cju)22)bOmn~Ak1;Bhamn3qXaM!AAi^ffhX6qn6{jmFL_PL)p`s0|aA1Z)pCtlVp8IPAhO4p+t{8wb?9SWd#|IUriI3Q`%EEQU^kLb0n29Mk&2k*r?%hDJb< zB17UX3l#tlXpq+v%z_V8jEIBQz#?axJh^Z`BT?zx1YN)2k+D&B%({pkT@GJy6-KQM z5MNgEWc_!@widXU2qNR@TJ%vF?KBxIwjTxp-yF789DakVdrzuY9Y}bjiLI!At}}J&gpV_toNmt7OA)r#9MnsREF1;ajH9d- zLK9in!ZAHuI8HNPNd&~AHDf&%HW7?FSP|u-3!S=tb7Bf7rO{(C6qF0-*t$5`0Cac& zViRv}Jo-ngEyl+@#NC?pq|4I0??PyS9DQTndE8lwDu}78-Z`#SfJhQ*)eM@-XSjg< zVK;M@Tf`qkgm5#NV|{7v7=@Rj?H|&0a&-sVzT6wb{^^Q?@?WUXPrp>Bd*@)YK!{;b z7og;3cENun^H z)|Ugrnzsv8V(%rvBP6SFO{}u;0NqUa*4-MER>}2`NvS$08qnhy%dqoh0Mav~po+k6#TVEV)Hx-~Kt2Om-Drj1!rP;iom}*uMq2x^t?<5s`QY>8 zXp0(oFUpY}Lpi2^ircll7eK!X_yO3v41@Qqso}lh-TbPd6B5SzKyMwc+ASr-Q!Lu{ zC`GtZsf+R~fF11EzzH!eSUduQN+jiKIo9dD$)VYYe)jgqwFw2yv@PbpA zsfyhIdkz$>Sfb4f&cBd&EbPCDd969Wr4pw`>`;jJoq5n{0$vA!*bqXagt(zg?~)k z1ONf(RQZ%Q#s+#gvjF9Jz7RD|%sEaYg^K6G#2Vzz!mfV4j~&nw>-v(MAg|BF=i-4& zxR&iQQ0cUIS4S+ET#%NB!Z~~y2xGdf-QJ=52slB|?7-(;*$uD|w3-U#S3!r5^$uE? z5-8g_`xnd)AQ%q_SJFPK-avJ&(V^~P(g^S6a0ET7*_(LK4?}7kc&jr<*Ola05wag> zvcHYjZYpTkOPq?845SP<%G;uyy6pJQ3pkm}(xOldbUACt^&4$r!Fcv~=vHg2l?J`( z#j!K!Z`~v53vOkXtihwVbOQ?!wcxaDaSAb9awCd?veEArWaTIXUIU4_n$Fu6bsG3g z6(&_V0}AIJUO^SF@9)srfWW8cVGF&KUG!|T-mkWG?3ASr&tRP7*+#UWumU-_kUuS> z|E=R}^p^3&BvUq75EQ=L6nOI-lSfZPRK@mY!1GC zKggz&*U=2*YNaVK4|nLv5E404IgfD_DT29$SOKSXAP2r{ar-3{R(B@qrE=at?1TZ9 z?_E#Jd2bJ(8SQxeZw(AQpA{P;4JKl(_oY^#rDwksGZ` zWIVZy9n>}K!Y>%9a15c0fQu=@wPLYB3%%>3^lGqv9vB9>3#3l?ZrTZuzAWo4#eG0~ z-4d(?9akypIPfL}Nt&<>lUyFcerK=pqOB5eW|%8sZxU4H=C3Ud{TNi5jqO8g00CAT zlRr^k0CQAC0)^Ai*_5NTPVU>#*^V=?qyA%mGGG??T2B?vov2xoag&v zKCTu@3DWT}WgVMN_+EY)^e=N*809_5?)r9AlVgK)|2}oa#s3h8zu+BU3{Oa`K3E9f z2@lpS@zhJsV}fL@2-Srtot~7z2+&7q&8TPsvzd*US5gIs3BWW>^nS@HrTwAch4Umq zkf0K8g_`n}m`sn9D}t59I+~D{ttRwhz`vMAc8U`8Mv;#@?6L{!ExqimOXcK>D#G1x zxiO2%Htwd?NWs2{$3Y9FDm&53Jyj=Q&n64g|PVXKnEi!xAQYWG3<{3+UozQu1*k?KR*>={@BBHHwa+Qw5Wv)D1vJBe)SYv% z-z7SjAXR_~jn>~M?C;Pi#9ph02d_5-TC#PzNyJb+{FFX;m;k-j;(n0dOa+5|ak>6O zVUP`YR%&(#LpVBWu_^@YT123s9@2I3gz^AjKM%0ih_+aK4%F~LD4g8zFms_F1)eYt zeibEdHz?@Ld{40l^NYR1q({@|>BI=41Q`kCNx$IdL3Pj7^Lq!lUYU6S zj8SAaG<5P?5nFrhG2k{Aj0=SOmcC5(L)+G%cey2rxfezstG{u+Z|&R72X<_i%m-gPf`!YqzqsAD8WSsGFxOcOr&kgkCpqUa=ggCnUx z8KZpH2*p+wyn7fUaQGGBKv37&cu4?bdc_9?`$@-x8Y-k6uwSFlr^nr!P%7_HZmX)g zjP_z@vs%2z@Ccn!?X(b4{t=J+&_@d0aNk{eeSB95&ZQi>?0S}dWM6a+xivjdHAM3a zRYK*ruhXgght^?FbI5$aFW1kCKk661cAt*Q6v;@*%K)^svsBSz(gEl>e9M_14K6aU zT8R5^Be86TH|)?=Mu9o5!*l-@ue&{U0W%#Ggx-#pi;#nZxrk%#6tq^xv-KaMg&lY! znK&*ATGJ&-+r$6OLp^DI(ZS!|%*M65Bb;TK{eou*@Ofp{DgBprD1? zi>-UQi{G&kmELW9hiF^zNz=^qHolAe*$^!?z3RQM*jjNM&=??lKYP5e1q6+r8eEL~ zsmEzk=)WGXgWu944~%@MKiOW`au_w(q2--d&c9Xr+*A1ljKr1 z%=!#n+J9x|(>tOvBKZ*r)r=e`2lQ}|arL$s-Qu!cfMS^n&Yo3OwN5Tg!kV!WZ@aB5 zvFd`hG{67(1g^NRkc~*t9-w%k&3%7aTF|E@xaL69a6$i%d}|^*$1v$_ax6MRE8W$= zHG(``=$(#(-q-=`KPNgJsh^$$mrHB*9PVW3!f|Xb`dpFC<2|%$M&fL}5S=pT_KN}a zA$<*Mz5urBJtep%H)xKw7#-;X<|uc;S>Kquvy|@PZ6^TFGJq}s3@6tPQ*P}2Lz_*% z^t=G<#vu?<4ek?&<=bkryItuRe69L;(U!Rxqq+LIW%vxkVf3s|ik-X1Y#6j9{{tr| zJD_0;GLF-*M4{N)C!~v|od;EWM=kgB;k!J{c~Sp%9`B|giSd&@in5!UFok?@h;G0k za@MMbz*q!RqcN?%db$N5Ov^NGOKG0$;rT9oS>ZI?vgx#4@wcXc@q5Hk;Ac61K7EOc znBwM#7TYUpQ_wLLCtgLrYboC763(&wC7gRo8SDjv05lx&3;w{w0{?CCDaL6I-vT~C z`y$VVz*ONq%wKTy&#V^m6gp4ymhYKkbbBC4@E^E<(%@jI1lb9^t${XGp$qI4b+H6I zKRB$2xp&+Dd{0o}u1BDQ1%?3bH-aD7U1rNxL?DR(P zUB&O7qGKtKDvj`ds?C#==(vgKJ?d3mcrb#hTh9+Cm9oI=j(-Np0~YDMw|+%+)4pdz|L zs8TAx0fW^#83jxzSF;BOHg)@C!bM>F?x1&r zYsE}##K_qo)D)-=|H24h14NK^$>`^yAyQ*NIuxoD3(=I);&+U#;RqTT4yK(`TYl(? zvg_mVg(%jwX5N_Af*))A^bfS~tt#SA`LhGQY(r<)vkJ0n^Kj-O+&}%TGEV8tKw|Mc zp0yqbH?-AWe@8lvnXjhC*9~>fGCPA1*Kv1LJvTX(RkZkhKBKmhv z&pLbGGt>nmX=PU!h@JhOg7~h48<8l*SA#BIOqB`kE)TN)(He@3({WG?gF(E)J1ya<(kupQsw!9u+$G9E8T z0gP@FatI|u2dXkfZu`(JXM~PC94s7RU6Et*C`LP-WGmju5Z2Z9Mue^s95aPf&SBC_?#wcbrn0{X}>O&6h=KQNbtnx{}5Wf-N@pqp;q@4PCxkcd^wK}bzeGVkQ>2_C? zh28KZeRfP({37ZK`jJ;%@R^+=z%K-TfiiV({zz713LHNsc6W*}5>sOD(mQhHj$yDT z0sPK^grJ4psq#3BwmGKe?5cO;pYHv1M?Ado4j2hZr>4R z|4UAqmbx#-B=e~=Xr=JIIo+wMq4xV0OK>J&W2E)%Xn`4X)&&wcIhSZSc8M@&&3?Uy zi5!a#jb@Mh+cdsyKLPBwty};6%x%i0@ka6#*@@*86r7<|7J5xcSA5fUKEvqL+VvZ> z=VE6Htp;(+v3+m_r@gyj`ANu(KV_J-Gz({VS~IWWb<-CqjCy+V@LWYi$!9|AVjW|l zTX@v^pj}ud*rVE1(azw?zjOu&)^!nYn3@Hwtv|qB@Ss)c*7f%28$FMjw$Lk;QnnL_ zM8|&WPXWP(z-!3|46~c@Yd)=qO^TR1PVN~B{VDzemVHA)d!q9pYwCr&>>xJn-J~Z+ zI;2_1v3z(wpf62?kV5S#iXN+qVs5R$uZXKIVVMkIy(G5xWxTVHx!*oul#A0cCyy1y z=-52n$EBCu5}eXkNZ2@Omy;cgY}~Fi4aUu?`i%nNvt#`p*p2}#*8+`&P@OX^pNv|D zQt;1Y6Ufd?>W!W4Ttwd0IhcUfoCD)RDvHdozGk_-$GPn~r5oj^neIbPOm z;%7}%4?Wsh+97H07nUWw^JpodH8|$nAQchrbw~V+SM#OEnsq}^THon zGt_4~bLr{M{RH-cm*Og6U7!-{J^?GT7Msh(+v5;d*G^w^`1b8XQP5~T66>gMg}e}5 zG8r57n+saFK)Zkns->ET*8U22z=PP;Z^oW4l-vE2_&r5voyP93d=W0BC5!-I=LmF0K$ zL-ci+*=P#CdXNO%k_Q@e|J(kABYwdoJPx`JM=I1_WRwF86_VJ7rVG9+i%~Cc8(bX8 zd!JC$Esvf@te94=0$T?HB$*Z*2e!scD!B^#Re|f|eA5Mb@HF;se+Gwzt&`+p5c0ea zatF9iKHi+fwh0?I4!DIX0mKN%$cG0cX%WC~ghxraGyw`7*4$E7oc#%b`#?u#2fqUo zz0-1o=cU0@*_c4Asby(4z#^(ST1g2uQE}CNc$1sIB4|Ii$!ha7$ zJhLOCc5_tAKfCMV6V-*Z-ni~mdo5(YaQPRrFtNe`51=_BbXLt6hb95y0l3Zukq;Pg z04@00dDmjmMb)fxp!=+cR@-Sg+t>H&ViEduxryTjS{NHbGA)u4<`@p>5Ad!xfjP=) zIm>_a@nWer;Z93LfQxS_7z+aKgO7?Ak7Xx(toi^EOwQ8hG(NKdwXE<%GKvLEPGH$b5nbcS$f>hIs6}9RYO-?2b~Ev;S=0SlPTuXaPYZaY!7{2l z6LhFJyB(}~0HEIv7M+DT4%RAPL9bwW$P%3{y&K?;jXDn&h_Rrm#0r*9{ll#E5VzaU zJTev}i`Gn#d$d3$?e;I&*l?`deA*SUaJ<-?Uc#Nh$OW8LRSTR%TN-QQ4drdoMXU%N zqfQQb5dW4F&ofA5T3T{0mEH45s8Z>$iOmr(t&Ht%C_Gjiv^%6rtqLwKfaed`g%^9M z4ojl`SY_HJT$=^DFtK`qaR@yEznGMQBVuF}FrSOARF?k3JbnnSRsBS3*AGQWK6Kr$ zHZi)0^B_XO0ku|33zKj*>v3ntD4$l&f~Cw7KKY&+*EtJac97ehIMC6I(<>8|Tp&>F^*9t+c}{>{x*MWHJxe(22hbs? zG^3d>UQ|yK55k$Y#eM)R{*P&q& zzJmc}j<|GlNdgVHoO+I)Tu0B)*@{qW5hd}1a2!COCPyMd;^ak`o}SzVWFd6S;asqo zjqAucU|`O``lycto)KLCrH6NDH$OQx5M3~8dQt>SF?6FbR^hXHIhWoW@ZUZOB0AF2 ze6638q#yT76Ji1KNj0L0Zb`DmXP$*Ro>u-M657oNmEl}Otl&1UwapRo79w8jdi4rh*CoeEnhg1e3?Otx#XRv2AOg;P zgEQO@q-zG3CaYIlIJdjh{NgUdH!_ZFM8$K^u@Wh^u=2U#9%HU(T=}F*6lJlf3#B^w zILV%QXu^qLZ=YDXzfd%Y`s!Jjmjysh+(1A~yDe3y$2z1H4|>i)TEdEMsEf%11h@QU#>@u<>z%H|2v82$-Hot=hzO8*EN)Uc zwapqGLsQ%{s!MRaZu(%ojiYJAJ4_6qZQzJjABp$xx@zi_024j8t24N4!Ji>9Ja$Z+ zOqIIJLQjaiZA+=e@pB;@U>nB^`d~+t6M`NEIU~_VDym=+xuCbf@N_|S4L zZ0UaINO>5`;dxv9ljxTK4>rAZTUY0FkMh0L=-vClNHg#UGzw}5h%HiG4-X7aN~3q! z8N09zjJHlDKwt$qGj_JtNzfz`rTiwVdt7?H==%Zv=jF460mz8b!~n=>YZ@cqu|#PT z=Gv7HE5J4@$N=Cr6bP?0dkJZIxie5l&xoU&1C~^O%MsX?0&^3Ps`ALln~`rgizeN* zD~-ci44SY3vB_a`1(bpBPCcuY8nC}#n+3F8HJ)kOJ;Z+o#{!(Xa3L{So{N^3CnQR&*noe zF62k=szOv~LGc{k@KByB+!8sGEH%7um{jVFu2Wq8E-P9b(j1w%SQyR z?tvR34dDHqC4nCK@>kk;u?}D}yX#}wI==+re4`gEH2}{)%jH2S3UoHy5*BFg&?Xb) zcF>Am7=G_tzHi&DAp-sxD(aJ+eTl{CFTuEkLs{AttXrzyWrVG7Y&UlVSpKPXa(kc$ z-PHmnDIz<8MnNEIa~f2ugQP>dP)YGZojJBGko_4BtphuP6H}4`%#n;EJhBF=Dq%+j z$HPUX+Y8%Nt3iT${0rsuk>vbKeB}1PBxq}JOPJE{F%`$AXY>IqbcnX)s)4>XwtJ{4 z{{8Yk#$l44`&iv$1l%X)j@kQlHlj;0d~*a~8i~qApmmLQvpU8OJ9;IZI_npnkE?fd z;Ucm;Uf&ZAh7}+mui!xuIKXXD@#$b=kb%G$izkTX+}RC^SCJKcM(e*#{|3%e)dj=&R;l6&Z9B;8j)aGAu zx{i8S{#8DI>q?G~{utq24aF~N5y)(nX~Rh$}#GlQj-N=PDD+6j#WH^JmQ&xQ2M zoB|Ws`RU^}e2$|#MdfN^y9v@hhsnT71G_aqF6BSwt8MT0_m-E+_pX0v&N!cVL`1J! z*&3A0O4$AwF=wb1=MNnfIjk(55Uq}@`6l2))(yWH!8RZzr+Er%#!?OT8dtRU#~@-e zACuY!hBvH&Mw$H5D?A?JYPtp9cR!F$S0%5f?`h=3enf=$M0TQATR)_FSAbunwLzJX z_eH37y>1Uv{Q%>K+X4epXEX`<+HHQr=VcZG3(ha%b)JPB83I?`WnE$GUF*nNY2g^H z0v0^239fs`OYICy*;^~#+&li8zUFpLbASLEqs8{6yZelPGSG8|w|T8@N^S6VaSmsYgYE1$DW ztDxFuT-$#y6pi3)j(G~ zVN@2oj9l$bW#uu;8S{A!2d?8{T5w0kiXXqGC4lMgpMe5_X+~vy&GmsGhAJ|V@>e|2 zFj~%fIB&4oIyYYZrvLtp_u?mDm!CgC5Wg6@ zL4Ef=KKzw)<_$LDn|_&Jp5W#lROL3m$E7$@N9P{H-6rRTBwzAyqvR>@Vj4gj%TsRo zYgT5N4j0W7nUp=PsxHrXDemk)vDOot6E>kdcnLSV=u0PfU$~WB@ohcr!)E@mMq2zy zqXWa>4JMSpkOxw1<*ko72NDZC$9Mh;X<11dt`ksP+{}EIWo5Q9op)|HKwR10;6YUP zgOg5k6Yusl;J~WgRDTO^crEC>M6f1(m*k7tG0A;!v#&N|-{NIliyJ@s?4HL8n2vx> zpTQxonYDYJ<1Y=*lzQOd+}q$O#>GT+$7u;8X9Hp!LgT(FUmtSa493%l#T#8CU|1*MQ%Y?U+gzNB-Qh0-!C1Z}B)FGb1)Hz!dW*`lhJ9 z9Ty3wGaH1a|nPTSRYs8A&1rk#o>bXrL_ER_-(a2AF>|1NHRK(RAFO4Qt2AQYL5 z#pA|euWBp6HtHRAnnNBI4`2{$FH{UuWx@V0#$)Itt#)< zUj+={g)3*pc1U#f8J|E-j)DO?xUq#F9H6BGJMgVB6CN1l??Dbjd#PJp8n!J0ZdBFCpb4`kbu_wDSz04|RV$=&qsf5z^`SjMiUlYbMMdiB~+QB|@ zwxMo?Tf;J#?E%Lq6Py0_I?&x<+rZr=D3~2q^G0O1tqE9`#omKE0O0*qv-vt+N|lp%Xrk;`FO90o0tc&4e?Ll)vGH{5Z)O(qgL4iBoNB%{uB zfa1@hE7@NpanGBnB4otLP?tVhdG4O%2wwx~9-z+?S;>zi$eif=DYJKZ&G~MExy;rg z4A+I$C;ed204O}~Im;g6$G(&kH^H|(aypwU1ZZ!E^2wt^V0=a5VS%d~;?CrAcS6L_ zJtk$d`Ov*QqBMLLUp_Fk!w|9jkzp*{XxX|k8a7J$di;VaAm+LEpDrhN2e@xdK#aj+S^T``Rl+360SdY0(_SiRWr{hi zSDl)hj7jr_K0j!XbI%B>iID*AqR@$JLJc8AYC9o%yxVqU!f?C{xXD z>Z|YOqgVE?8?^ajeplFUURHh8QAlZy?Ln+7>a8&nb;7^>0wppV1QCax^Pg%gjj~zn zn=D*oaz_d?epGU*g1>G|v=Bk;S+(!FN(}@Gg_?4wyQ-$s`b~=XYdjoPC1iXb|9gvn zc-v57QN!X!gG<$=$pmE;_1XU8$~j(fbAs#9I>ov{wm(%&Q!iy*VTZmdW?9@aqY zV|E_*`_!ac<55I7$gQfev8lvA>}ZuCW7qn;diu_9rILVF%BfUC=IVc=uhrBCRG6+W zm&PjVbdGEIZ?>`aC_N|0Tk`UF^?Ccz6il&0LzF(xD~~_4f}bB*{^q+m2A_IxNW-6( z`$n^6Yt3qRuj9*^lBq7z`Y&S21X6R$u_w1B82@YRQct;x3ekFGPH}H`XIpPg&D#m; zGyB?`6ZgZ?aBoX_)LIcO$3gJBMHY%ALi`bMujQ=Lc#Aen^{Zd$^Buvp|9Zs_#1{q@ z%kdYENp&@LI^>5F?5ErRI=J^AT3fZnS;3jPRDIadV2je*TJzP@Z4VyT8wEF zdz$~!IZWJj=FCHz;t78L(GGRKJ(rD>#);BVsT-xHZVhU^*y+JMo&Lb}=q#`MstoV0 z|NCqvP|K%u?N>wD#C{KFPkzqjJF36QUuD0Iq_FnrCaRk9ai4cm?2#QN7&33R$&3;u zMoHfS$Hhf$L`U6zbiPSPY63ofQNc`%jlFdzbY}1@r9b@(wzTTqXOXpFUY||o zm1Iz2d5z*2`6HcD6Pp6h_Q8rL)2mz^y}d`bvJMu?E z#3NgY-O8`EIc@!Kr`GV;Qw`VeFTPcq{-!njlE|b#^x&Ar6{*Jy+P$&~t=W&t*%`;u z-gOP+7Je{^SDp3=xx>rQ{LK@O$Ndcay|cuSrs`I-6!~g1C1vz}6W`myb^sQ7Pp+y8 zZv@7$ig!#qK4hBIAQR4>&kR5`opSv(-yY#_GiB)Z+{QCyA;z5Q;hjtq4EfL+z{u}W zLO_Ooa8FS+)NI;rtVXM}xCq|iFU+ibtVUvWFc{JBbsEy}Z6%9cRWkA`RNF;)o7le; zIr2?S1i9-P)*E~}n=0t-G^sHMkm_CVKHGHG#3?$6jThHmFAxDdMjQezjqv36alU6nwRu^AS9`z5mCYoS%aB zGPtB3LJL$4-vs`z2+fpdZ1in9|?;;#!ZVfdRO4c=zB2GgqTM5GD8E7;XN-inxsz zKLzJpbL#`%9_N=Kp~?Q~xOC3IZm9sx3q0_t??`$}dbeJS;$IL{2T)f1Eq6`Z&@aiw zxH;vY-sXECWct(8_*T_0-p^?}AzDi%Ci*lKT;b>7O8huR*I z@uUU~@z|N1#;T>+V+jvM(qD64QC(fdcb2fbSNqMzuk_}st7~0FO)Th1dlGK>wrbX- zj%twOe_UCMRxcfsQg!5SGm+qL%c&3k*}0v@voF|KbUfunvxRS)+OE6%(Dd_K{0gZ! znl-8DfSO48uXO(2;9ZF;Lzwkw#Eu@~w3QQjCcz0GUHuu06A#$0X|MDK*Gfj2d-i?- zSN=ayK7&kV(ge@-Si;XHR76)yFfvhpko>srv@X4lvK%a8-45=UDp*BY5Jb~=QSfrv zg}t4@2iy{LXEjWm#x$OHfHP2fMnG6+H8Rw`>9$wM9n$^J4F@b<_xsNckDeIf&|Qyy zWwtCjOaB}^zqcw5yh;KURKadc%#HDyz%I4X6NZmL-GUtZ*l&_TDBh~Ljw4lO;l8sP z_X|J3?345s^lk+!Twk618H*BqkRr3Mm;Up^fG6<|lZp-?mo}yYG_$ll2*Cr*2gn{f zE426v`*S-=-3-PwGCJS?1b-3lL|<^PgYQHK=9pk4JiMY#F@6%@I@VRTmt&(EeK8D^ z*wnuV)zWIu2T!GoNmkrii_Tge)i7ywloBqwK%1YR;m+r|@X+d{_(!r60~G#O=((ebQFAag$U|0z0f>!&}|>;KCZ9LI~^6FK-N;c4L6 z#^4#JFd;5A5zY(=A@jB9PLs80^oY@fey6+iMAPtp!;Jhl&Nfko7s?j}ZBNgDy!dZg z_>)00ALV~IE86)Te%MCOFq~e>|0m3>`d2jP-1?k923&aw(xXDG~;n{8Dz!QB6WwfA>s<}Yt+-K!(dUM8iv#mcb;7-|qofV@ESw^x<9 z$igWkpJ7%5*(yu4@_Jsx?6dvt%RihTIpp=Rtj9~U)HK_D5D?l`*lZkTdCSuHJK=Ml z2Fw40CxWx&^Q-=-O+3oF} zK*0w4e@shX5WMWOm!HJiqiqI42h|K6)O}24(YyV->cx2CU*KRA7rXmo{-AIFJCOCL z-sw;~``Z^>`VU!%ac`k-tLonySGW!#H2wc*q12_2AM^^NiZ*A4N;jVn)&G+9e}hZw zbZ+j?1xXbN=x5Y5*VWw=a`K{JYyvqLuW}x*v(9GWF(~ps8Ec;z@DT;E9kZgYnVktXiMzg8_i4=~v0-PRe#vpdEsxe~5*P|Hnv$#~p;MOGo)Z zo96qgJ89|*kdj^`s-P%B%mHG>z%!%Q6e__4`!o#(n-cps9|Nlf3#o$Zg-S>H+fbb| zmNW%#G9?RZ+mSToFrvW%()GD)$AAeTi*QVB)FJN5?(2Rd8pSR3!8q_Es4n3p;VoA5 z-ygmy+w3@UbEDs6aCXmuOeGRahW*kLJ7h}ZB0EK)gV%jub`@p6oUYeTkf{X~{V&ri zDXK0n9F52hBR4BL24)Fzx};^EBGx2u?tUd_=|O!&~=D8ZgO06i`KT(0cqUCZkW5QWaif zI(=9+iYB9v3frBPc7=XP@a`g{m#|W@Fn&hiJzs9rKbyr$aVB_`0F_9RwyWrGE+VAR z1Y=n~x>|pV-e|J7UXgKd5AFxLEJ9j&24e@FOGDbu-1wk%!VG5o91tiG(v%hiV>gE? zE|+lbqKT?HhZUKl;I>`Ddn{LE^r6@~I32jbU0Xg+>z~7xbQa8YI9m75)0LJ_iRnL# zvlab#aJ=>9C7s7RReQWECVq@uw(1W~Sj;&E{uHRySWTHVI66(3sp!wL_u*11x`6e= z?wwta!LGZ?BPZ8g2WPR_5nhAfLZESEtt`QLQR+2Xu^F7zRlTeka+w(6 zb(vOJqA*io4q5-`bak?Kg(tYjLASZUnzHqc@wt^`<#KuNn!(NAf$P85XOYzn+Hd~m z^Y?P(Qm05kg=;ta`%NYU-au$T!>fU8OvgDF%B4C2iHj1Jy+!fbO|eM+#`C9(;_M$K zw`7(}3jQ{p0EZ0m#OFwPkN+EWZJUyLtG`txjoo7P&ctbI#xB1_VJe&F!oaxx!QN?A zZ9{`G0S|Ct^(`s*>HMg(S_fT^&+>^q^M5mD(S97E*O^C`$4dCm^%Q2R_sQD9GB#vF zJ+1lCs8O?gMW89ehQ zuU8#9HRTI$BWSfb`|G1%JvN zbNJE!wmaymiBLt)+uIcupBL4UcC|E-&M$5m6_5)5+ds`Xw=TU)s5qO(O1)+*6+de+ z_f6?Zd>c@62}#^Rt-HXlh7d>QC?Bl6B!-iB!g%tczx~FimGEJY2XHrO9g1rDObK%48s? zCR*E8*2bn3wX)k#Lnbj%$EV?X_0LcdVn~zmfM8k0vKtbDdJ0Ltm;N`w%SEMzQXg7E^`_=8grdX zQarHNy~7LWb^hoJMON`Lw-@~+?`&hx5-nb;>sexZnNCXfj1sG`7`AH#(p;{>Y2JXu z!ks&YD8a^)p;J)9xQvCGtx7+jlukf%Mu3!21)HOhUsX%$S&HU8UeVgr6tdYu2!>_? zaLR7vy{-SZ2LIl*t2A{+l)-qweI_yUL}-Ia+C?Yx%7u>3md+aUz}IOE6`*}gL89gq zwWj5kr725CtXh>LpP&7K%&k4I6lst%oxbX+-1-mZR3uU{9B*UaMbDMOD}+rf6)< zExy;=sbh09-gC>}G!Nc&ZdG(PuhJ{j)LbKO7Y4aJZ7yB`?~<=NO`JK~xym3xzz_2u z`$%<^q&MLH%`Z!rBfQYHxHH}Xnx&_rLb4|o_D`>Lt+Cb2yhOh0JCE7usXjmbn-8H? zeL6txq0D*y94O1VJlK5oYueuvJx72kx-K_-)3mi=St?v%9M_ZN>o|M86}c8wq9*cN zn>S$YdC`lRtcEPRHyd}%QT_O?enJ#Mk8QaH&Z&mf0Gh3$TUKV1GE6>{c zPAhQI=qWg33sSHvxpL0Xzv>n?H9lU7dA`$1%5ymftMIlEdCDr@7oCZ6iiriDvar`FYTH2Kv*)0m#l9^$FM9$D5BXhCS6)Jx)WE`0`Hx433kuanJxuyOICxF7+ei0wVam`57a_Tx7Iz ziG!G8iMc>KJe@l)oJ^WKFbB^B^^~WSYPXZ699p$EuL-v;)p#rPc8&dAsCzuw5c#zX zEX(=-pEF&W;}@oxstJvp>DP1rHKv=qJ}Tyt>vcVW{pS99La?jaZN_$vGcurPwlia< zD6!0xq1`j4^VEuT&(g!36q7#HlB#{*@BXhVyP-7t%pgyrxsfpO7|R!v^%*Hhq^>YE zz-J5m-O%0qvolb!0duTxLXd984)!cz^TDM=yrejL)%?fjI^S$4(qz1+jh_Otp2q|m zf#<5>xmGzbT#$Ia$@OiagO;^ayXk*S*bZh2t%+}`GoKLrNrdTma#|q;eoL%SE?PiB z`ZO8K9@QtTT3zlBBUyXqI~_?KIgV1Y(1H3}(b+$wCUO5LCpTi1*+jh`$(lv6=B@jZ z3x9#@t7Vlvx5d(Mz* z@n+L^DoC89i;CX2Dn0F9IWI>vKq0g=JxP32MFMvSKp079W%>~G#J8fK?=o_$&(pX; z$>xpc(R!r|-zfd?ze~b=Ssssk{=}9Mn}6Ny|6}XR1EK7~_Umomj8>7QsZ=UtkS$bG zktJCo*(yf1XvoMio;F4j62=g+?_|p|mKF@go_!f*%`zim1`~eg8Q$glzTY3InddoY z&Yb6*`@Zh$x{h3gCb%npSo**0uAjqQ1i6!?R1sjP(%Lg;E`Vz5*#&;y^a4MRq<&e< z<|2*Ly;pxqO!&Bw+W`rQkC>ptS5m)#E4$}#UvCjK=5R}#pHPNp0iyYZOKIQBhp7eR z0OzebxQGx@%o8#K^mP4&ZmEf;)m7_2XXgj*n1HxbjLSjqbFQ_ojT4L+jMjFJeQkm} z+CYwwsqK8_5M&QlQ0%dUB3@pEphkAmc;dxada2y5YUYA&cj=_BvhG;QA}) zHCnG;eq)dN*^4;soU3hf`kkjDEHRbxfI@q7IN^T2JShaQPCk@5+>Tcn1xBe!&*TfX zb@W7nRh?T*oJP#yewUw3E+Aj>pNpX}wolOgVP@ew`g~@AQAr})Lgs1ehd!7-xqUUI z2XZ6p0GK90Z(`gi?c4LfJnak2BI-^U?k0@W)#xEvpXP8fw;VbyV)~v<(6492bw22F zBL~E_4i*;&Fnz}9rVd{8QjLl^+-UpE=BoCd{k6*&r6E~%mP^84?f67DKh+O$dUK@ZPD`j|(u!;)1d7I@%+Llki9 zQOg#`9Lmlp7k+26$BPWKvHio1F#d>4@n!(9Y4-MeM$Tx>sXPu_HvGH6%uPXeS05pm zaIEK4ApzV5+A!8+5oKLzpan71<{#T-@tRC3o!%%iVTsYzbpC1aPaG|Xj0^|6vDUrl zLxE&l2B-4W2eF?RJG%EM^eM{gM7iLBFv+&_6_@aBN5C2|kCdyBAF^N5bO`OB$V7Q7 zw6ai+0(&mulaL*NZiKOdpAKTK)X&%e27`u#J7goZw((<)dbtKZ*=64XCjgx`0mvL< zn3P}oBoB)C4rD}D*6ksAFv$3vZ(t1^n1DE>rdOQaNuTbX+;%;){Ay>I?5T%WNK%pu z0Q%)Eg!$dV*t&caxpe6Bl1Sr558GdtUxgaZ0@X&Te_5%NTl~@AgtH%+A`ZX%{)69r-gF(g7Nu zBtR*kv8qA1{dt1eeY>`Bi;EpLMCn)vi6Q%-zJ^m}h#pm7L}836P0;$T2mD*}vRu=m zR@|Hu-OjK>4<$>s!HUe9{OX4wg@D%SbGOWwi@{W$;#3R&=q;RDA!Q#bU0!$B-=cw* z))XAAG3oBUgGy3!Vcs=SiXHlKvbDRGyCvU#Z1?(5KyN>A#p9e13d)BS>TcP^mj;ub zcU?r4;^&O_9tTv)198biK(1Z%(uD(eHbXeU;gAbZ@f4?gOj}S{F)6LdFMM&0 zgFjm<-2*cQL;P4uHCBI%(- zjL~uQI?9KS?!5i@YG_~5c9=pCV4;kJB#vCq?^)tcauc|tCxp79%Pd!}wW|Hdf85 zp}Bil{iv0?jKMpGqp~+I`=~gOp*Qr5J}AJd<)Y5AG*B+P8JJ5fr0%+2(xNj0-Lw+H*T{NX{2dszWB1sW1~fp{cslQnVb`sY z4lbnj`Y5v0`5o|t%vACC>%<(kacDp@IG+tzzmfAG+7=Wx(C7`d%X3QcFXo4YtQnZv zdK{1vN;Lo>ZPxWSA-#@k5N&LFr64zh@&BWwEAe07xbU0yQG-X7U3Wc*T_1iEf@Ow6 z?J-5_d`rxR901!OdT2uFyMrMD6eM1C8&qp<08>`5`WjyiW?)Sxyhp>@U7QbWA>YK^ zNLU(pitp^{ol@|iXycUPhLp$a;eZNJJXv;=GvfwmpG5fh=jf@7L`xb&P z9t8p?tmHl@S>jn^Q#Bk`Mh}HeGlgFJL=T|b_gsT)gn|rpmN!2Cufn3y2$ZQ51Td4- z^OfO6wd9@lT&`A|1Pk`IbI83v3r}k8s$}Y_4n5%W=j8i!bcG!IF!8 z7u@EVDn(o*7-pR1zn+B#XPit4c7f&*a>vItcRKfgO*>^qP!&DFrYVc;|J=ow{J7C3 zWFoL=ZZr|VtH6NU^OH+1`Kiv;R;wPSF=w9}xR31R^$io;h>$s* zuI1tD8G{;~s~(9W+T*+=E`_&~H@fipxJAH3{40sKynAkSyj*hAHld)ajOZFdyxf-N zA#_Xi#TTGRIeJUT(Vzb^SbrD!d+LxLs(f-j7hrmC25H@JQEDMj%8|Q1tNCi;yBb0T zr{O^L+S{5(kJrojr1#Bp+clcvh7N~=#w5q%LO~;-Kg6}8TbgIRs@^=W9^c}j8t%lc z`8!QW&gZz$vtTfI(Ak^kR<|$Czj>~@Hyl_Ipv!dNMPO)L`~o~4EZE}#1_(aheCTk_ z;?h2$pwRqxANc`8hxp~Q98oO%;6IwPo&E`3p?e`eS$`6?jG@mD{o)k1k@|3)+~VQW zq%*nPQQG&ZwvNx;6dl1HTa|E69584^{bgzcj79xjxe!qiNOC~T4oPil5T=($0Hv(? z_F^D;O>%A_Ob!n@0sTW{A|dB3a8ba57l(VE-rpIOJ)>`JmVl6ZpF>Gcmz^8S(8@-Y z!UDrFp*=^ssllCx$wWC&!2)9n(1|!p{Vo%=&_9#s&Wn)y1Lhq9k|^iXD2N4s-F~3I zSTj)uei4RPM4G&A;d@!KKOa@n*RDEYub~W?0C6j(sE^rk1ZM4ILEU4ZT3Ti~vp$7hpl~pEkV;6v@A( z=K8KuKLWq!2sbP$T~~V7M~!a=Vt$~xXPZR-CD~k}h(kjpJWf~wE0M$EU=<(ebsrSZ zP%K%f1j}#}tP8j}3SI!47BGpR4fC&>(K&+zbnw@%(z;g2N$Q0q2YX_aYa@(+FNQOh zCHQWjPylk4rR$+;$R1J#T=nrY)}PL~7LaM2CE#43unL7Iujd{U*L5d7k@e<0yETFN zJNiW^iZ3>P&bNh77&JWcp=b<#wki33-wWMCPhGl#cOmHDP>=Uvl9% zQdadoPNpfnifB$N)qo)}aI@Iv@37`PeeurR!))!DEnfPfR{nbHYol^=P}@iB|CO0d zQ#*iCtj0$wx$W~`of&q?-E|3XRwxIOBv45pSksnYu!8y8YJ$e?+T^;&c0Dn8Ro-3X z4yAZQ*tml^HrAK>Ya6WOz-E+qEnx-VHgWg8P8oRw=GSFS!e4Xz=v=dD`$v*<e9N9Ex&F4G5#dp z&y^=F1}fBlCC4*SyMgk=k&9Qy4Ew1nC%9esjr8P5RBLnl_q1IcJmCA!?OAK(O?9;#DPI|GHv;W7)NB5|` zB%Ji9o^zxCL~^Ri&PFtrkr`D#ZgG+=>7n|!f`!*s$ zHC@j!{WOnAM67y#UY-pwtSL1A9ri$dV;A%hwiVEBW457O>*Ck!KB-OT0t`>`p3)G^ z1%|6*U7$xW%J1kSwdSFt1`fZ&LSUyI$2_CYO&gJL=TEqFv6VI-xM4`b2pGb^l^oYP zMij8}3^Y>B&(SJ@&Y%NW;@JDDh&k#Fd@ANBa>B^9Xu8nY>1%AM(e*Ek}$AlW-^SMaa2& zeFstjyo2C$!&S)T%9k)Y=(eGoDthP^K^A-<=nD`HE{y~xQW-1YNIx?pq`4fZqb3JE z8`o&-|0g2=v)8&Uw}eL+L9mB z+}Ar9;%PLBTC{mb$IWqGiy3UDPw!t&nMyCt+FJcWo}!=d(x~?<^1 z1&~_N<^iN$-QDiwox6&5j!B^Fg*z{vqNP(N-z!>DcoZ$S&?U%L0bNT_vpMd!pk$Hc z>scra(`_DF{!@aQPT46oc1T!h1#MQPNwkCof(JFicRiJONskPl7)`IXzr+ zuWJx@tGnK9j%yao&C(xRx+31iGw)Pj`cuN4(Y~XOkI#{}#oRlb7b@RJh<{suIH*Pi zyIDJ`g<33R<%8BM-dKOPVDqChCQt@;b92q)S*Z%7t{c7LwWQA{e}@X>r-VifQ}%f> z0Ke}p##_~KUf7!6=av)W6&&F9RaOkZZhm8I$akMxgwKh@f1jIVSu6As?bjttyasx# z43m}`LAi%rd=Y*+KQN2NO?YU`Xn!T?gR4r9ksy* zDfSQOv@~TwtMruX)@Hhq;rQ3BkMBHAPtp0~kuU8gc-L&i3QGDQF4=TTSD-~*)7dKV zPj+}JY64&FSs(-9yNGhUxp3#fIHk+d1~y2u((J_AU!(SlMO^Z&dPi5UF{Rs5NYgBJ zrJ?gtV{@Mg`)Xuo#?juh1MuqcQR7K1+Nf}e2g_E=(`v6)|NQr|6z{Wu$IDrkPM3_T zB*;Pagm-(;gvHql&k@?z%Fs6H*Cyuur8dT>^9`B_^9%CAgQ{tWH<=&l#`tP*52;06 zWxPpa;iytYn8~8xxuPPMIphmNG~BwsOG3Ki&fQxH{uhr6jYeFn%Fg(AVTNkL3v&ip zloM`~i+Ls8hF23;vUvZQko+hnT>Zn*R=vg!ECmW5{|uh~e4t3FhD;$^vu%Dp6tP|` z5>exlo?^Ms;uW463!3EpMy7T}$4Y>wKbi<8c38AsFYVDKZ_ZT>>nU_1c>L4Is&p2z zXTNRg3G>yRv%uYE{M_qqi2P=fM|ytZEnQ8&)sdSiYQ`jvhb_H^l-kI7W~Dyy_MQTO5bH33KtRTAJ^R^W)cNa zXXl0|%X{N`+wGITAf#r)Qu5L)k}aX|4zLE^MW{^=I``2v&Bl?#&ixPQVrH&a(9z?; zrq_RR)dwrLB-uc9i-Ng>b`Fa=2)To~-rjUWqcJ`qY)-G6)pWv!M~%6K`9I&6|WvS;$}Hm&dpL;t`)|X4pig_%6GF+Y)b>-eE7sTgnpv#O;I%V70Pm~GEOWR=XK(} z0zY+Xe4ykA%AYNL|JoU%_2$+vD*xKtK?5JFj7QRLjvus`k)Raa6U&9i2I3;V-LcYm zGifPA(#7bT;0Qr=v$L^WRMA9B%pumrK@wR6jPTN=&wa+wBl^ch?t6ro={l${&@^e6 zGd#-3B1y3&&*$$l`wWC;`2BrHH_P)i_G(&}$DyRzOZx_&{=lwWd59ZfsNR1G`Y5q7 z1q&2(i!6Otw6|VeY_QO*(N83oN+P$=W*?7;p=__e$fz&hQLeRMuhlwzECR$-@!htD*@_?R#Qx%^Y{r!>K2W z=eggSHY^jvsIrWXcUMRz4a-v!#1t@}Jdn^|Ez6TDf=;9?{S@=S8VY}sxA90(z!8-D z(cI-pXj{=v8_PdS?K@-N*6Tj_ICNI)W=@7=orJX1Ja>rL#ouL%+)Y33bJMX=Hg|Cc zIf=v)es!vII+FKtRYKN&#@(pYN$k|!@uV1dBV~Cruu-XlK|etFtHj7dTJMs=&EzO4 z(O^-a5{SH)eeBo@qm+{D$?W;P|>hx%@uzO+~Kq6YHw^(*K4$^8hBuQF{ zsQI%39sdnMF6cilG8O;)rALRB$#L6lVpjUJ=lTV1`jxLRYX3}S*5xb)uKi2cb^-D< zNYvYO&Qaz?T|So!TJ_@bFl=jA8=awgJW-R!iV z3t9@{9&~8uJ`<0vsu0`eWYM87*qUEASl{QDg&c&Tftl^hy)Unf|dK2;^`f_?(xL*qhVZh-W- zLrauV@VEO8>rG8N`cVE1jp)zjOG7n*p64`jm4+|$=&C`x>HJC?XDlSu)Gq`60ZYn8JI5BK%dE_O)jMU*H#4{v<&7>n@t~17dE^jRhIHh&JEB^&l}& z2!6Y*?)y6ZI%eVLStAay@5?u0bNKdt1Dsxj_M$YUO*FlJC zDO%k^dDd5_$KY>H=suG=``0SG7)o0bV0Z^|r4OdE_y{}4gt>S*5Ce|h*^lR$A)OJ$ z4_>3g1hzRB%37!m?hUuBr4$Tse{Y$RnS|&e-5s*W)Xgp>zuyHw2neuxmz{18a({pN z1IhJcez~@#5}S!tt)a6Evar<`(EO+bJU>cWcUhJHUfrVXv4jJnL(*J#LA7BBa7}k5 zay54E!fvG`P%^LVpzsmSS|TjkU1qhc%@)GIkd;T#-QUb=&&=N65S0%dH93#*HyKQ! z9>2_9eAAvmAzV;dtdu%h%vN%)l$mgrsi!x#`3p2pC-CaWJ-Q2a4tN%{SSi}h?|Xj5 z3XHWl=1)9|>N0t)NQYRgiFUpXX5u(-F7M3JGZ5>Mv)71-{mWB4$CYTT~AdeMYb+I)%bT%O|P zG3WW`>oCuGTNU}+I)CMEYu-J~)Aw25`p!lv5Ih?Qs`Hi(dGEHj%Y7kUy@9c9zT_%f zk~4xrFB49vWGc%sMBbkJ z%oQizD!Z9F+V6U3)7V$L_4S0@z)T&=;kRbLy7^UJ9at<+3DpBg5ngEFQmA|3B2ak{ zb*Mvhum2YlQqG}$jM`wbZ1Jp{lZpz_cym0c2z&&P#2TZL(@t?XyW|b&=d7ct8X&7V z459qh`&l2n$f#&Jo9U}6SK#~c_bCUaY99g21u>uAFiy;`BBO@C@;W@ylNv(l^6`SK zT^>k1oa-|+vrHhP_F~StT1r1(H|E^TL_1y^R)Ani+wz>{Vl38Z-Y;m=~%|rR-Xn_WTo+G3Z zVx8#WK_%$nRNB7D2r!auOk)Bgg7@tL=R_1z6GuSYQ=3ZGISelI&rG0)sM3)9Dd~7VTEF$S>Ivv8VwPnop^V~e!3ys zLoN8+)eDltS)(ZT4`=Jo><%x%EV>0a&e+YA{gtZ_8`-rteCR}OlA%@j`YQmW(f23Z zRQmn^I}(b0l$$6#V=Gn%c5-SIyv2g86aOr|Ls*wjTPwU{(l?&Bt@%-B#{7lKpxTjb zX6ldC0ylHM5hl>n6adj>siPp$ayEc6iP}rJx~bm(L4;G?K4Pka`zAI*Y}3xjtxQ#A)43*R<)()8 zVBV@SKQ-ceIrm2@0#6)7g{{XIxBP1ErEag_LQ|G+wBSi1ueGe;C^m`;x^7zn#ekgR zVNEY+u3=%m;dxX1Ux)iIvwi)26vp75PVA2ATNk_V>*p6t1)NkmzzN_#)!lCy)YiDf zrP)T+8ux7%Dwsp6&nYRQPnM=`S9AtywQ-7ez7>;E) zaeffX%K3#g_a4Wli*q zeHIH!7<^weaS@;|Jtrh?)=XuZX(Xs=va+lc&VGi(9qjIk(tj?c6a%(Z$rO4f;q>Oh zjm8Ih@;j!R$*lw_9{g)b<;AJf-9>c;pcAN}<-Qc&$7XXYfB*rkUn7`CW+N;7lle6k zlGU{_Xw zdw%Y5nYF13Rc_#Xzo9!3;KRzWSCRoZ5O34#DZk`ar{;dwd}~0LL;^8<`~uN=%f4e! zT1uiMGc3P}=@)s!7gSejJeghm@H7^S>w?U@XOcE2f*PJbG_+tn*Cy25sFLSMrA0u8(H;0}?0o`wHA;cD^6p2N4P%`S&p;gylc=Ekpvhruc002Fv%_S#QS z{exdXr;{`*pE6^)1VHVx5n=f*Z56Cpz@9~P)LY}vTxb{vt)^=u?AC{4jZZ-fN7Xj5 zM-nIb2Dn3*Crs2P5m@jfDv6zaYUz~wCUhIitIWB{YrTle3UmnO?^{`Cof?DvI} zp44qi34)GgQ5WOX6)!he62f3CDFS^afQ(x(b>Ys;3jbfZ-f#)ihB4CRjEOw& zoArxv)pPJ?B!30ky~A{ON`!vqdsPe=IrmqL9e z?sZ&L%<-cjbtJiy!LlG2kZhGvT+>F~=2yWZ&uWph4lv9&zACzr6ECJZzwVmZL8Dny zF>nIAYPlrBvB-j)g+}TWPbq=S=uu5=y|XpO2tn{rD1~kRJCF^m-5*#nuxui?iKZ z&i5o>Rn=c)NklAvz|TDO4`Z~;UQYNuQ8<_O+lqF6ywGBvVpKSp6935mC4R15*1|!e zCh9!Pmum$N@>{~w-Jr_|EF2GiXhq*iarM}9?lpRAF68Ym-j{;)Q8NG)1cy%RGq}94 zsXswayP>Q=LG+E8Bwz*t&?CCBQfH;5I+WkR^y&Lool{r_)-3T3OMVE|w0_c&7Y^{- zaOrH+j8S5txRV4RdW&{Gs@e;qx?$9(1m!J317#YOg0|I|_eXn%QK#ry#qovW&|sm( z<7&*w<$c2gWpycv?MlRKf4gX^mC8pdCa)uMTE&sqynPha{f6Pl3&IPMsBKN8Ca=P! zAryaqMn|6(?lp%(4Ph#rm19ujqo0KxedK0Wk4cm|kF-kk_~V7h{fJ!38k;&CktA@mZzwR}|Y5c}2fQn|_kIg(iP1Lvk7?$kq{ zWdcAZ@?s>FZ!I^etsqm#wF@X>PhHhj7G(Qd$|!mUr=PX3n{woIyN_yQIyAhE!zAo zPv=4>vCCcVZWpme*Uc4VCJ3Y^^`??Zs$Fv2d$YhJ)y3jYs8wDl4gnKw4)ffUgr3~s znNP*yx^8aZPMG=$1n19EyI9`5h@AnY7CVUnGyxXIKgv>^jq(*!s)%nUfcS0p3t0`w zODzfTaYcX#gwtRoLVI<84xBFgqAP9-onfOC04S>j*!%Z^fDw!tAlr(5qYijI7$fnq z$FM~_Lxr_xw7VW?nJkX|EHJiwA4jSCdm-1o?5aG{-~LCzANIbyXMCb>QkK9oV;vc1I`)hZ8BC|+m?1*)uLw=1I~m} z?RNECZ!C?4KZzvr@48_9Lbm0I^8O(%8oQK!r(4wV$-C8Aifw3VJF~G~`c`44P9rF{ z9`ZVO#(L2aw`cf;5a5;u>MgL0WlWDJuh#bGH^di6b6vxqS=7<3hjiUu0=gTd7Y_7# zAv?r7Qr4=cWl4xZasf)8iv;sZzJSr}R}fCR9U5*kW?n|j@{dJw0j^pA$K3l_-63rH z)2~kTs$cgHo3TfU;Wk1%W#Xh~;Fh%xpkrJTmJ(b=Q87PVQ&LP}%)%ervR_oMJ_LfX zl@D4rYVk2MA+cC;b-}R5$6D*=*}H^}koO)+BS;zf-$HaH&CUdKFbN>$xfPxvu1U9} zxxhGKQinrUQ~KH5jR{kcso8=@B*n}*Y3NDb6jxe|;6RbZ<4NH-K*a~#0(p$Ne(M}J z2fRSla6yrwR3QO=7l3HCpd-q17mRxpgkm|X*>no5lV~T;Y{8(l6@(ui1eudE2^MD2 z|41*tf$Plt33$_?FZ?3LmHZ&m+DHf_I) zR&uzU(9}X;35Ivwa{A6j;qQ)WY*Lw+ep@sCWQR>_vuY=5b6*{tjuQ>1z40_@R999IEuQs^Jf3D{&P;7glOxL}K7wFA z8vSS;EoymOU@TcqTVc=mx-`vIKuPmMGs-qj{W zuiZ?5+UWi1p?X_Rse$k{s2KkJQD(b4pmbV7r~BN~o9(X*_rFMzT4f!hWQU4h4o3?T z$>r`UZtT+G;UdTz_hphnD)mNO9JBfOgp;vYgF<5E-y55{la30A%AL&Jg4&_Atwknt zYa7@TA;yWN%`Ml;+x4O)dzP-MLx15^vjm<9%oXi~6{~cdF^f;Q_8aSvs06X5)!z^I zr0w`>b=Y4Gh;+{rlAKF#x;8BNUxkXHNAJ}^0P$q4q2d76L*CXlhr9|vm>(ArbrCpJ zJcK&Vfx~9im_Wmd=pC8kg>SB`vcxr*3w$};s}-PFQJq0y>z&2dp;R%+yUa_LOI*z0 zGLv1lFxT#junuh!%w?V!lTg=ntLZ#Nm)J0NNt)*#q%!Yp-(s#0lpr{6mlhP72k>@J zcPLe0$Jm0Z0i@Z9Dj-O45NFqJ_qy{y?!_P8=kQs6OyYFb^Vu*FSO{R!Vygrt8<%b? z0A00yU5h#H?CLfq7kC6HTAFcqsDOO^7W0olS1}ofN%5p?N}U87I;1otclaO^SKvA6 z+|{G0`yWBtM<6C~k-y!9i94P96{yCEd08pf;gqxhcutlX1MA>2MUf@SUT%gJWtT9< zU55^*nqS}1vYxYFi>Wkwy#Mn|cQUB?#sOgsBXQ7Xx{9a+5;NMoYUG5 zXY$j;H+%7Ch;Ou?Nf5_cY{kAchfy^+&r_uiW3g@kC@3HqN)UNl)Wsx0WmZO{9waIe z-!wmwAint>3mO6WIWeyhlL%QxM;t`#R#p{5V~fmEOW}y=Uz*VuMtuatX0%%k#v9ba zR7|j;5Md~zbj+C}l$rw)(u99CLes*iH;hLF^JNrAP;U&;@Fl#M~ri@U@Gelua3a^nmUi zX8#^ufgN2j;U;EVK+V&%<;(PTeib>#;A*Esjar$B_eaq~9ni5lT6MaDVRDO-EeX!gA=G^>=FCSQD+P0< z5;}|%KL|<&a#Azck^YL7un1X)QJa*28M>)qR22~Q8J*_GdDOrLxMD8mL=nu5StA!l zQ2U7ZFW{o`^+^d`*bUH4LFxiS#4xIMGKgxNO_{s{0Zi;fQecLyaf@&pl5jS~&Kz6- zr~rrcf%mTte~vOlDeZgJyDM9BY)(XB4KZxPffLrcDh%(Fb^oV+9SDr<-G$6e7}$B_ z3YtG?ppQGbt8)J*;jd`^FW92e;|+&x{u+Ypw}Oi~6fzRylZSL&|j<5284shlILi{ROj*NQMP1CPYB{i$V}}48t`S6&8)6FU&b(Yg%3zpRE%D$< zEOR%3@g)f6=C1G#1nx9%{_*j|!_r^DON~wDxbBI1DdHU!=-02gd`;&}ieJ~8X08r% zTsZkCjJU=nHi(({d3NVJfO|iUZnsev*rjNBik=g=S81MUxgIE@ayuy0iGwTW7XwX- z!)AYxu$i$Iqt%f{qsi^EvwQ4(7w`E7Xx^K=>>Fi;jsmDV5^=FpzDAp?oTaQ z@BA2QGOr3N4KxIwd`Z@3WpLM1weNtm2rQA&a=k3n^2zo*Uj=aK7_tEV=U5_O?f=vE}!Y@iuEd~Lb^MxBdm-cN>1p5%Sx{8StUVQ0J-Xrox@g`VQv8zI9(}Za?%{~!l(fVT` zP=xN@x1+0PlS0{UFxoPGRfvhhh-vip+yvXhsJG`zeOcCX2A%8Ow*LigxlDk28g=VG#i4k!Z9wV?VtyWna&jx-4(?&*q zB2;gp8~ogSkb@KzG}36h)}P)C=5tad;jw!FSLva@JXBwWj_%t0ebxB%Z?;)9P8>%5 zw%_{eZ-2=@Wie0@sJ(FzR_4WTq+iz#k~44{EOFJPxS&7mpWdN#x#57~{d39&{YSo4 zr8Z)^qXCt;$|O=#4P}<~6++EUD1WO0zbkSajRV4g{3n~YRVSqWuGsn=WarBI`qYl1 zlqYsd^j#=LTm+_rBjH4~G@zeJ+>d$enfSWCeij--M_Idzh%Os(I3o@#&f$!d_Z}I= zlNWKAT016(OXQRbpjw!ME4P6A-JRJ(s1q3GWy`+ceId-7BSup_n9~CW9@R*}Qk~RU} zSd6$@X97^p@6fOP@<1q_^cLlQBo|Pkc~fC>gETP|8(BQhYepGyi)x;3k zWW<|Je&`E?G(vSv;X%S#1>EYQmNhZud0;2+~8Iz%Q64tQ89w`NUrsQ z2L(O0Qhqz3>|djqqv;)s`5f)58=M3n&8T?zfEvf=o!=|$R`YZ2ma7gRXiZuLd481B zPOKIzUhoMC_!FvkL7~q+Gza3#ovfc|`yxYkmeNpEi!G0a3UK$VG6|mv{6#6J0eNSm za#bKx5S37h;FOH1V1G3bhI&m?#yx!g#5o!~`kBvbl?=W;Y&&X`d9uZu;I@?l^)w!q zu}x|tSd3+xGAlTf%68+h40FJ?SAHnsQG7Iwun)kc7{UJp10NY#&ySr+S9Sora4?q# zH32XYT(f};3Qno~l^#Z|t{8ZOg|}PByt{ePPF0>%*D-6MZ`}uk9HpIw>ki+;S>%0P zfPhJ=?l2!5a%X@;PFYBMQMU33)g9 zj@YlddUnRftWGa^XaO}R)o|E%&EBC_)mqXj(Rs>wCu*V79S1UaEXO`^QO}%XpD6!W z08tmw@wuY2g!AP5Y;m-9PQf8I`T`I^DoXnlnX9u3kmTel7s8c#K_w zd}09v4FGw|wJQw+ve?^F6K~=HQOa`QQi$W^y&F;t`p9b9dgMTyBjin807(vxTfIGf z=FnCvAbUb(ZZ$Lp5B{hylVBVS!oZw6S&m8AS#ROMVlAS_CuHqOltUh>p%M8+_quhzh=C$g*w*1>pH!&nad0q@o1dQG}Wf}TD||PsEjS!IC05U)$Eeb*k-^#wbx_MhFgccICBrHiw)(+q2TD&&1zLj6M_I}lUCZ42 z2jHe2KC2?Fxn{@!>Um12c@5@z?c~e4#Y1Nk^ZF|z;Rl~zU}Pxfbl$);tEf&o0UVP6 zZWn-^a{C2NpHZu8ywYbYmaD6P%lkS-Zx5paf{4OmLb%uJhQ@G%3kn ztS0bWLkVyLZVC+QSxYU8_Wmc?*?3;KcH1xXY;SJI+i9#>)$x3GQl53kPY8Ws)e`4X z{jSVk>6o^{!%T(S57wrVLw>z#9-VdeAlvD%9px`21;ha$O7u#$>_21)q7pM`%-E&k z!J_;kcSNf{ZqV4pL+$O=s~VES;`7`V?d(7~yg+{@$K*0szsY)ZO$y-9?h$4Fp%8zt z;kyZcP+x+;1nXD}fkC&#j`Hf&VH!kA=L5l4=H$`O{(;myvw5E)jab|46S@{eva3kGpIEXzBTdDp{O>RO#HgymNR}1Q2 zIAp?N5yx%>XC}iRz#JFcwSkkC{x-oOg<5(>M>}re{Mm-OpDLXMh#G7~HRbOu4t|GP z8ohdtL~t*$TwS8fPbLv*&w!DE*Lhu(>CIEoORo~b3+_<-lYheIoA;~co8NNw5*<(^ zc3a`2ZOm&IRp?uc7q$J5;kQ-7>b8!5$h*pG>bG;zD?joBib{Ns5cjP-Mi5;KMQ{JS zZz8DP9i1SmIi}vp&+_)|V+NmuX}YTZLG)$y4;(d7okzt@KZSpvD=l+hSl@1XT`e{& z$93$*fz*-9KoMIl@^c^_Kvu@L>ra}ksaDKFiu3>61K7=eZBqD>r!S!D z3Rf;oGX({Jh0+oQ6&R>29%V^${5^@Qsx-{j?RLnHfAm&NlEm>z%uOKvm25aNlHrfD zlu5bM{IF9(IpcvEyOzQ`8ivdTzXWjz^}y#>9@o~w$=kE0E(^;&dY_S^2b6NQH7^I( zZ1zl^-7Uovz)0Tki|%Y62X*vG6=d~*eEidg;N5n3O~_v4<~?Y$yBIv1)_Hf$n`QF9 z>GBriQ__j^r-{DX5sp8aegO?F!sP}2rFO=qHJz6p^6jUyP^c=uV@+PEAypTsd1edK z!G~AbivaYVZ17+lM=hsRiCKR<$R9sV`ddL}3C?9jhwMRZ%I;#Ii3P0p#e0+A+2pb&}iDNqx8FbBYkuCCJrBZ;W zua!C)uD#{^nDdBdKcm%Su0OIf`zcr6f800|qM#oCgo%PQ`xUMA>m#fZGNUM->&`!q zjikEvi>dLHs_d6K3KPRyDzo-$Wf@nM)y1&r=K^|_ni?}c+$o5ObT7Tx8UMEx=V&NA zo*nRb3a$@wSJ_>%)G8f5kbubDBqg+J`T8-lLrgMk5l^h-k$D1MZzgEbooYf;aWZW1Q0=T!8RJ;EPVB|-Fi-JKotucPQtk>6koOK}LOIJH|& zP70pn1Ee@JQUFLRvLL`Wwwu_QT{X7tBwCwZ^!|N@yv2JFHtB%MTzC1B*z>wYMSlOW;f(C6z>`3Q^$0Lb-BX`h3&o$qCY+}>Z8?-K+f*8%Zakiayz$iu zfL0(MJU(Es<&lzwzEUXw(RVc4*xbqVJ!?#jque*8#4LafZt9Gp(`QEUK5F7gOcl+x z=q?$-gC_+W=XHBe0fM))-z$n}Vqbc$51_+?WPTvl53weGt}$ZF1mVmaqSL$MeFf8(@i2 z#)&k4Ia;uP2+B0?C|N=`_6Wl=jlUmxR)*)_HR0Z{XPC#s0sA@ZoMmWr7B30tnBxm; z8>U~Y3h9Wce;l`$S$sOmtYcDjiU_IIWA)q3Gjn|Xoul&;!_zw=t;Ih37curbxK>X( z3x#Kmx}3lrl_C8?5c+k6SZ3ma^kJ^js#Y^}$A7RLm(>z$mlOT88sjYjNQ3*7p(Zfe`R?C;DaUC zGjR#yhgi6YVAI%)r(zt82$Y3OVsAf!+M(pH?5{VXsZU^*3P1%JM_x+8iK+750a|8V zx4%N5FWi95^-YvPmj?@;tu0bk+OUs_i!dnEAxfUuCk7ceEL4{E!B!Z~DjooYArEOu zLMX@q|F#!T?uy-1x}W8FPUouF23D`-?_fq*pQJ7LHys5e?Pe&_E_+jNfxBfrI4Dus z=WPQVFdVrNIAFkP8)fv=GuxiBaq8{Ho9(^o4}2>!y6e%6Wf3q`6$yw?A6C zZN*E*`+HfRu@v#C(cO^xZ~X-d(R<=owO*xTO3lEjSmMA+4yOV^fsR$}mL`I3b1RV# z`^9p>ISVLlFKO))mOC?3xJs(}$)HcWiKJ4=b8-W1A=^C|O!1g^^{@t*FI#-)yc%!J9j76T}z2g`Rz__kv;$@ zSJ+j^@tu@~P}dQ~h&3+m38AGXBvF{x;EIoh)>LRqsG$eXmhuSIfUeY`!x)f#Oj;^wqN-nPf}ktSIo| zr|7sldO+M!!Eb$ZyQqlKDQ&)lEEqwZsM8f+3{HxefIO|moW2;lWVtrz?!x(*Q5LJt zg-w7r;Ri4uXyioNJ5sCyB2f7+WV@VmaS@~4`q39-mil1ehQt6PmF6EK#lUF5f3~B~ zjc`3|!oKt_=vDAnK*7VVqGv@6__H*GqJdq^qdK9eZktn|_-iy**o5G`uFxLfiG$|b zO-1O4l!z*rdmtd>q`BnoWU>=XGd~%-+yh5)z8Y)<9s(nN;D<>XL4kWz_;Xf=JW))( zo2g*9yPTU4-%*;o42&v(Si`7^M>)P%=l=^BFHK|LzK}QO&xwvvj(6Pz$Yyo^dw;8y zK7hdW{A(KGWrO-f-kj%oEZoM^W(K?gjuHfbBOo+d<^-sP?!Q_x2UQf@_S05yhR92H zBk4*>Wsu5G#BMqulkxn|TJ|3mUNv2bO;;JLGJGTnTMnd}+E@h2D7cP~ukF8UcC}b% zK;R}Ax%r$4xu0Zr&5Bht{!Xqy7w7umIfSTQSS?GMskoTW=wsn>ks(w z(AY53JEn_89~cE>xs@5j0Kd5?muh;1WW=RTO5-K zK1|>*2Xwv1>+> z#WBQ~ufR62Af|W*p;vy_%d@sWp=83Oymbm_Qo9d6%b~{KVkA{?1JM?eZdchkrd7`F&!}%$$i10qo z?Ldq80K<9QHK+0HR5JSUds0V}4ZA5?Pzlj=j|1&wNC?yEz6f?tmwWr!gnS zf53AA|8B_zHsQffoevLep0MY69nrJVQRu{MB;sHfOEz1Jqm50~GO!0?0rB^laKm_! zs4ccn@Gtd2B35i44>a66Bg>vjLIH~u=fKmjIV?DYA>;x&L={x%C+fy-*3SO&8STKa ztbW){F*=3oF=|uy&lz6n(T!r;3b~U{mTK1@0wV6tlBEFll6;n+=#!D9?YK!FU#?uf z1o}2@$-zNQA;+jJb=>4kEwJe%k=^nhs-@j>CwD7D;S;CLme>U2Q>PjOO*=Y!HjSbA z@)o<-)%$QNz8wxbhsi2C?$mhJW;8Xj5Jd)gPRh}H5?=2H;)A<~kJYvVo^Hn1Ex_P{ zHDbz5V)1uzD!>kAKA9Z*X#C^8EIDo9XkMBpP{kj=LVg5eTk|t3aZb0zK4NzBz zhUDaC;@*mU-?QZBrs~d=YNQ`07ctLuZ7c{Be4wcpc`LbvlDg1^kn<5(SswiL&Aw8) zJ^@%|=u`c9eDSOH0u!MY&)QTogYPX5#|-%90xfSwj^bQONB0-?{?PAaRtz^q#OM{f zswf1=P4#SQ1!83YwDLOXgm;q>wmwLQzS#t5JlkQlnPZD^77Ft5iWXF!)9=;gQ&-`4 z1gh$O{oB8gNtm}pB>*}6IAVPDkfPZCW9zNsn(F`e@!P}%3@~8K38)|;AYJN|aD);f ztso%XqdE4l009||NJ&dKs30LdN?LN%M&|&3ud|`|{r>#Ef80K9-OkxL+w1j=>v>(* zvH$u>2fj1#E0Vk|Wwz_k6~{s)bM9R3Tk%iRR?Juo;@jFiYu1!fB*&bFy>4O-C1<^Y zwtAX+>uYPz@iH}jI@N4mooaHSpS3zo^R@g!`$gv#di3v2x->b^iU`T{H<%=-MS6^ zg0m0DN=S~dzepXzzOAeqYsr>tdtc2ju}6C9(s+o;49jC5t37bFeyZ#TT8D;>c;A8S+p zgnMvmT$<>5&3Ym$Df$*nwM2*rQ~ECfv0f(r%}_&Kqg(PVhIe?G-na+jYOtaSrWAI# z`xrCNrK~jzEFGUj!D7vL@Tp7}MQ8x;lCxjNtQq+>&=dTbfV}Utp-){cs@K1IlUjfEH=&dp z8ZH7hBFXS{Uyrc4rvqHeLFa_Xbf@tzFe99!k4vM~`r2>`Qwz@Sd`u+0$$mZst=`)3 zupLW!g47@8bT6?K%2o98$+^|k^ORu;wQF+)>3P#%E&(*9wv7*b!PeUFJpJAAchpor zxfakYg;G3<&v<=&t}gV^Fbx)$tQ6Fzze~Q65jELw1EO-bRxX(oMx&krmGtq#2L8nm zMJ+I>ZT)}9n1b;)tDwvb`+b=e&5Qs*q29yl9aeaL9#``=*yJsG9+BwHO&f&P#CENO zxY0`e{*N2M_8O3x%fbOo^21b1Rzd0ss0fVgQFxqAujmjPU!JYYtq&FxJd6V4D%u>& z2Yq3yUNyE=VD4mk4Y-c(rIO=hMp~vVpmPBc zT#2?`U?$NK+kwXrJDJ1=t0uvWnyEB`)`LG~h*@>KBSt2j+omZDd@rr&Pd8q!CKqDv zFkMhg(R?B6a&SqV*TI;zUqU=Nu`zS-9N?0^&7&hapI4g{0xxf2qNe}Z> zo=wq^gx>*Dx)N>B&R+=#h<<2?!`X~CJU}4^*w|Du_F?81RHbib2Y3Dun+$yyOf9nq zWP2LzjT3qH2bix|B>~b|!lHyT^xJfakwya8jXXQq;jUmplcjER_u-^l_B#tyZd>~R zPl znhZHp#Q~hL3QV~nAd6jo@5kN&Xbs3ofov`tuJWjZpQA1unOpwWAtS!l>zsT~A|c1= z^QY90rTh+!*LIsv#JvnV((q}QT~|-7xsy?&wvRawaedg8ws+zij0%thviG|H1guAp z%gbRt)cNK;iBYvjW_yt`Fajoi@JO8QqO4i3aznU00>U4Hk=Huro^bDt+n8?I@;-;N z!=Yd4uq^8{va2xk3bQ?D1nMfksrt=0bj1HybD22Cs=o7vY(7$ zPkwNBI}S>D?z>6+u(tS64gvIU)-0N@W7gay-i0Dq0D0`{dIAk#RxV>Nl|5Z}y`-!W zWT24`hEQ>qm8PE*Yt+@2sLlQg+y^Hcx25s>Y+<5)eAHZ}=g@LH_hfLJx7?YxQoVp5 zM=1kv3`7GkGjP4s`^!osq%h+>ojp#teyl(DAn%B1zg`fZ>A{D5|KfbDg>urnd0_4d zZXgV#^FNEc5%(pooB86;L$^eY^L>*N35pL}-)4vdr-r^4Ta?9+da>Q{K)3n?kv$Y& zFoNp-9wQVg1m&{FBJK$*M8li6Pj4(svBDQ%mpsPN^Y*MFfo>j=#=hsJp2kFCB5My3 z!j+ZxHar55$krSipQ!2^KHol5!Tf)0RTTCBF_``@iNI4Z_E5h%B{Q;*nJsocqu@<7 z>n5t*RPY3dHWk^v;2K;2Y&rAw+h;iGdP84F4)rLOkXd33Oz%u~)3A(1NKdJkbZ;=W z^0aS#2kOtQE#;KkMVDX*&ZBSiCvn>S65oz;XKw{v0f**gx79eui~e=b)cME|(RE5Y zBBz(dKMm*B$gpD@qOw>3RmIX=jo6V9wcpn2e81pw4pteG(Sk72j8j>ASf0;%*Q-DM zG&}%^()1k-Zcqfc^!hTm*l?KnI?(lM{-F0n5JS!gJyqk@k+^$X0UDpcE#zpHP`Ipf z@;hK(1sT}>E;J4H5!R$df@fhCKk!}R$65C;N@VxlySFs)7{4WcTo`ipThO=&r~iZl zg!F`D8aW{zyUxVt*jv@6F5C6~5+F}_TTBNnN1hR`S9h-8`sr1C!s#Dfu-bc7MJ7=_ zj$cgry`{Mi&im@DxD$Bh+}xMI1pVn)YwY>SfArQ_tEJjw3MnwfEB2xotfN|e28yY< zE%-E$9Si84jV~B;azK4T=4|*+B^EFBQf*=*n0f?bkePG?A#mCGl|88az ztWE|_2~(A!81k@GI(t0`FcuFrEHMyaDvM`trtHXs6&RX=FY#Xz{1e1|qCU5LrYubV zg30aM>;-syGBc=>DSO>l2oQ*Lm9XxwM5>{RUTNHBQBNO$x7*QPBHnrE5JCB2!|VMICXEW*h3peLu015JdZ6m1><$KqUz1b5xVScN zA$WyKrlpAz)mYW~yo!Iiov=t&Io$t^P0b^jigJS;dA12&pLxBDC6_EOH-%=tus z6NLbB(+`AYvM(hU`)Y-B4S-ge2|BPb2~bVwQ~$Q!&aDZnx?t*Eg8OY#{s$e(Z#B*F zxq7;(NoTWVMPxZN-;UdwKP`QM)6yd|PbOOSuwbpR#*iMKY?f_BR~*|XiT8kIuOX(_ zaR}lnmYZ+as%}nm>G#+*_dDmZjp-zt{}6Omh&ZeKbV;Cf&-Q9vpU`nLCeLAO^+N0o zj)Tn9XwqE-mZMq1n4SPAvuRpzVkf7lqBYcZbPgqGglT%6-1llZBVHyRQlugBL|iI! zt=El;0mmCs>NvWA1P@=_R~4nR4uSH+XD_ynEX zxCNB%TjBP|?#x(tVzy0*nFaOOz{)M4*Hkgr!m{*GNl^n`w~dwCVJMC6n*D^ouWPDGimQ*RNe$15Bb2$jSA}s4 zQj8bSzV`?D)b}~{?dmT>8XL+O$!rP+*C+-FLM}zekQb z)X?d;^DO{$W)4K%iCw%3x7^W4wdx;OSMvQ7eE>Qj&=Af!kRCJXn2eEBeN5Te7c>ijc%<|g%>5&#*rLZMZplJONXaJ21=Gcm-rl(=1{*d`9ue%#YsvPTjNU6<^! z5LVCvhtHjGK}Vd9k>rC94+4i5H0YE=Uq*pgy-@kyH0eoBZ@-=Sn`EGAr|s$UZW8!Q`5xwg-E*jxC;R$bxnn_VVAzC>ng#mH({E+ z5QNq5(8oQW*zHm6O zQyE00I-jPuP*f3=*bE)JJlSpH%uG3DbOB+vzoWGj{)r^Cg z?qZllz{w)lVkX2~Ym#s~7cDlXCdt*wN`pacdZJ}(ny_Y-m7Hnx-9r`~z*Otwa~jG+ zG7$U0Ur=v{kT$(ns~9Q`mqJusAt3gU>S_|2nBD7rJN1`DBz^*JJ`nd^sQ`um;8u1^ zcCfU^TNtccJ9!(v=*o=6J6u05a87TFb)~n^D>UyWrS?)juv-I`Yw??9^{@z#A_%zJ zc=H*k9AA6=IO{2a#@;nu?tR(k1*dGkgb>QYt!ToJcla&vGW1{ou&DuesBOocaNu$Q zXz0T%u*jq7@pO#r^+x`g%-2@|1@uvl>_iq|PQ$epa$mJ>9v%#6c3ab4451ZBBl zfFo&wU7@l=+etEsKaun8G_IYfnh{h(bMe?EmmVX#`!WQYh56~<*4gDYC0Y}CT!z&J ziZ>@~Z&)U;l(0;KalJ=^xEboBlL@tJo!!iBl1x^Ke173#;Quf;HnV>_ev2d?wR4M* z3DjN=&g#&}a1%WWXdBW)QQ3^QizeR`Cjp~|K|vU|a5zQ`sr4M^xt_EEH5I>OT?y}x zd!}msKehvusgt6Lh;WttLAHDEi=eU-RnA-o_9_4AR8t~)_=opi%^iX5hOP8T>TM9?7|1wFydi3q55;U+CIu!c(*zpg zPcP`KPRwn-_q7)!R{=VCxPRBKVaE6AC$~9hGf zxCIcZIeJ)?La+y2+iPo^WD3^(#ry6GzQ%a@G+aw3fXZmw(b9QC;?<0VxSIt;mU-5d z8H2c&t4K3TqR4Q}6d8fBcZ!NiaA1EiIK#n{(Sy%wzh*UswF98Y>OvCGs%|&ZQBDr? zIdOo^ckm>vngas}T9ga7udx{H#ozYqtgUs(D*FU8RUYK+sQ{SjO)bzv|7l0cWqxU% zKOf8a9soUl=tZup>ol;VJgCmf8Ej>TsVlvB@x;Y|x1hslpWqNs+CFkO=a50FIskyC)p1Cx2~2<`Jve;8wtzTLjdkUN2b z+wm4`*fda?``zmltcqYl1{mU$m=TkbfbQ zH{k>9uJdpB=*Nu+^>;;H$gULvRQLEl5=tt!95j;!*_6;o=4~6alIL(Bi(?QEzImJu zs&h?hQFhN~$XoZfUdBZMF`?hleDJ%|62f{$tm{E%v*^j@Uax)Gzz^s@zxQ=MQh22L zPvs<6FYD~^MVsjSLG%NeNb;4P_>~=!{?+g}k;v?+JJTEkL}L`}Ok)#%mbB5=CT z;I}8WA!^K_{Fq^m+IUbY*xWRMoy-y#UaBrm%mw4>ZPZR3OggW4GMh!vqvS_YqK3`X zKX(BB3Gd7vuNy&zc7<;qEG9jH7r}TtLfz(xCIiC>I@!dQ(+WyO9Bt zA^1<2;|M8T_pKfaF|>ggRoo5FOTD(0%5wJN^de&+j~U)s9{koopehfkM7o1AyFo$6H7Hx)tL{gkO7YL_3Yex4RqdaJGgDc6@*i17~ z;q!jXvd5^2u2`98H%27fW?!%ErA!7Ixu||M-0XKOTu3?_#nii>ERLd$MqLPv2+g2= zrxhk)TNtpce*68Z_tz8^p6eLjFILwU2cX_RMs%`nqSvAHb&|{!Z~nNa#75|BbL^f_ zlY6aiaf=lo(z1>J{0dL}be4-_O|LZgw(uJ+QG)aA<=dM*mkI^`&JOEg#JQZs2pI@w zA}?h77^UgoGBr0vU{j z{_I*g{upxuzW^*uGgTK_JYA_JiS3{&o8U5*RHC#{qiOUII{lq`4k{JwAkidPGnx5^ z<`7A_yw~ki3tOmgTQnYjRu#ZpQMnJJCmTUP6z4al&4xihOcKeLf01ipYa)FnuQ@4E zvRAJsev~Uk`QEAVyDN@rj0#$SQ+pprCb3QqVorG_qZfpYeD2|5o|5hhE6`Xl6qz`i zU^GAsiNX6;YzSt1iLq*dhLOU)*cY*QU_2q%f5X3!9hJb+jZ(@Bj1r1zJw4Gl1huGf9|sHsp=yYr8l2US8Ck;;2NVvUrLax~fNzK{CzP+C6t~dp;lR z-dHEA_ ze=~gckk{2F`O_3Zv?F!9%a<>KcWyf(QiR)E-4B2yugext#e2#6upUsi#;t_ubsWCb zY;W`H4xqiSId_$n|Mdo$VCZo+94l$ZMNkU%>;ZR|x`+Ypnn6^vG20Fet%Di2)k{;K z##v3ZH@XAZ0GgALIr{?c9M z8US|eEi*4=JDa-^C&N+4^Q({QUpD}kS-TyuY>t1w{;p%H?#sV3z}^M z@fMu`(I(2RFnl3hR@-jBFby?K!e70w&7|^ntwp5)4JUj#Q~t~2b%mUCB@fLO$FQAB z^q?`w0jED%iFu#2DWQvb<`XxNn+N@?tSrIdGp-+S(GbqKLUZpv9mNPjR~eHanDA|} zD!g*hsMRCqVeu*#{vcd!(@ljyKTRcz)hR7Y_ug(VxuzR$ZipXH0~H%y+-A- zz%%N02^@8mXM*`^984X?d9t1D>C&cu`D)wNyo`kpfI(7m2+g))8@htEQ41)C&FOCA zJJC~Go!|ms9vBhL*3dJF23oG_DC`R&g?i{QV_=z1n=?XxJfwMksjZb<^9$8b1Th6ByoVtu6Mo=JMJf%+Gn-nQoQp34fi#4To@Hvx6x z5l-fwo=Cu{=$9^vp|3EZTV^Fny;k~wXr{S zSS-Qw5d&;A4_gYPybgNR$Z#Lj+EZTNwN`~}&ol~PplxDB*}VPa24mh?@6W335}Ts+ zgXj6O%jKj;+$yH43bb(rN_SeK%nh&xa`BeUC6aB^C%tP_#2=*K^nm*lFu5C72hL7_ zY}^aiF*EACSc#nlm-QMiy>a*Hbrx%?n{HZ4>CAI*Gwv`Tf}+93{BVSC$Py!3nl?F? zjly94%64g!O6o-x>;QeD(TjS%P(k3APEtQiW!dnh^ik5+gqx_Au07cA8k!*|mG@*c#(@dA!DU%LhJRAfIm3}l#qUPOvmi)bLf>PM_4j3>2 zdk@H{dT6jm>uj}q4eUq{90+JPQ3h+py_*E9-F*(p`T{E+m>}b=C4zJJAqG%Ag4eh? zJJ2I$KGfI#*B%%kNnp+WYfnHmZ$-0Sn=><2OvQ14ECS;hhHIa|^GAn5HZ#Q@WS6Dt z*oKD-%@O><+XTvOmqX&YHhURt5hA+~Ofy}^djTe#Ug>MEGM$rAolr_PSq{+z#zMxn z_m)FKFUu6dwv$Mlm0~Bt&fImPTHaw`$4$jyMsXSY{wU0iYPQaF7`@QSVoUj3J5o@g zu}}<@-(}pv(Do)gC`j~%2P=SB}*>-1j+CU@V&z>r0yHYwPn z!6Z+*zbXMH?RUH2j*|wXBtbEc=Bt=n$gNE)FljJR!ynN(ejHNo{~eYujE8$CpixLq zpOoD8nZU=a3Q4A!u(~yvfc*XfD4~HW9&W6dkY^<$tPB&nV2ir{PJB!Z$6&`qE8Sjv z60pI5JuzuYSgL$;#^WdOtm88*`pi$Ww0FT;*&9Mtw2{wT?2S6$kXO=pe8mKqm-{HP z!@R^3p8LSFEELLy%j&;wqY!@tuqTl7Onk%*a7sYUfk#dxmwU_G@~E!pIgZy1M|AV- z1sm7=QUA&}mpuxa3WAq9&ATS0O&P_J*QW98y2p>wQPRxFUvP1FDP7=G3ZBFAUqSm3 z{AQ#8SIru{IAPxJjf0xm894+hap^0r?J|ISYtsR@jaCN$YRC-HQvsQAfth@Q%z2W} z@lrLpHdA)jt?CDAeS-?;!awVHtq8;?2HG^Kz>^uLgyXVShNcf~;z+>L1azO!hxQBl zuqd}!CQfEp%*4c%@35_^l#8lwFWrY9J-Jif|2Py5lfQ1hL3kyEkPAA`JiQ#9d;c$+ z@UvIweZ^Qiew##-`8)Sk{)vJKVqmXL3AZc34!udm=bJXZZ(&JvAiZVEyDzSx&it1X z1Sxrcwe6L5+pd_Q-(M52o8N;W7GTCboza(2YtT8&B`e)uMz}#i+l1Fj#Uc64ghJ`M zJE!jpg=((f3p>IKRE^8p^|1hOhI{IV11tsB=N7h^1ukAbtZ25fZ$Q*|=qt-6%Aq*5 zFU-Gsg`q&h$w}ZRq-6R&xY(8?8R5)ql()YG7^TQw@J?IZD*E9A6HT;>d22c;?N;X& zuKeDtmfnVeMa@v~Sb)z=%i~1#T#1_FxrHCFtns&Kcx@^nvCAmz2>g5j)6k74NWrJ6 zE4W9T^7lkg5)!sn=duOE?QQ`3gYxL!9_cKotmS;wz$?+F+zF|6uPW3^koP$bRqY#+ z*(<<~ph&R6M?~^Ks>k=ylF1q%ke*t59*Q_MedUi=)|L_TP|`&(@YryVWXHcld{DRj zC~bPky6N6Hm}%JWyII$A>h0|&;Ig?*{b1#8bxU@xM9nugoIG8il><3KcXNbk-r}un zLZ2ChY`*J06BqI|v(SQy4}c$y9J%0wzC}$+gFJCmP0R^BR$QZc0}k6KWXgY!`Ool& z(&AXGc=0t(xsPtc+u*C)(~2FUoi^_BCRxt5#}@oL@5oD29dUgS!`B}WL^s()#Xygv z^}88P;aOAidOOrDav`(e~~B2Ep~WBttIoOAFLy&``H(| z$p#!YfItbRsb%;LpKQ%z!&v;j26RluYQMe45AU7b*3?Bu^-!~|tHGDv73>T!{D-l) zaU<^GhCK)Vij-XNzYLDELEL>|z>(yAW8OtF$p*A(>xZ0@lAeH22qZwqoD0G%B!>HK zzym6Z+BB4Dp25|k763`gH**7YP|?yxAu@>@ym+;n^g{+5qz`5)!-Xeb)&0|4kRPtA z$GU=L(zi(7o-%&|JcF_X9lwHnUAUqV)`a}A!kXL4m)urh(yD!Q85 z;tBX#Zi$bT@9I7{9S(afe-W^pyrEA5s?HCYky*ep03KS=?58(wWE9^R2d0k1ss0?c z0Mj7;{D1t!qh=4i@-49&0e!7Otx;RjDVnIHLidmW5zw0|fr=^evZWT7=#`QexM)KN zS&}mYj31RuM!37z-Co_=W=seHPkOitfT(3aODo&RiH#tUMR2ja;#}G1FTI8bNHxtR zzXvxq$NLzIe?SI(@x%8*H|Spk)33<|@Cm4o=D8lZ}pJAPpU)QEbvj z%++0So44N|Wl=`lKE!Z1o|QkNxJs_I*J$$R!{mn-9s>S#N!kt8zdbZ)~eja*6^E(3vq2ds$*fWP0qpzttdoo6g0U!2{Q=x#WH@TA zH7S$m2gI?0ABF4xRwbMdW$qw%0vDbn-maR?N$@O@Q_jGy<&S?1)r}=P)31j)fLmQYpGP3?SRX%)Gfy|;dA=)Kr& zu_@H0++N%uqXlH$B%@a8pgz;jLa^_2*0)_o2P4I?)ABVy1s}9DPV{)y3QFYoidEVqvl09fb3D@MB!>LAhgiEM z+bT|Mj+*?M_yl!e;3<~8;6avwCGz5ob+zj1jN6@3w%k0~-YqCZ^Ql{5%RL6!p$ z<;H#`4j(6{uKP0*g3Ye?!uGs7^J3F{kA>lzT{3aG-*PS>w!A)I>BR@pXG;6St3CH! zK6bi51N0ZG?xIq;t3=OlxSZgy(y)>*xRVw{e{c{+h&^3<9_Ltd4>h@{8iCdszV#aF z*e`Qkpjghd2_dta&~A-t5Qelvu;%w})iSJN^DmK{*CjoDjId^==I=R_-}sw;ABgTX znY6S;G~6t!3leXLv&=p2w`kWb=u}YW@ANM0^=I}zld=8M)pmI8IK;uJGb#EK{U$}G zwbcw{!N+wW7sca4ozmtLm+CN?oakZw7xBg-4?9^MuSU{6C-&ZcnUMi`$u$Y|nvCUP zh;9Y)I}v0-zJ@mirnQDeb(gZ|_|#PvSu41p_du?q-FrqsqSxd@;mw0fWCWSVa4=2& zc9^2e%7q{G=%LDNh`g_BeAZP^LF&3kyl4R19IfO&i+XVmxpU&IF#du3 zq*8HNp3sV_0l46vBao*8evApeVn5G)_F!Jqt#WW`938y8i5YZ32QoZ%nng9k7mV4y zVCNs3fjy(c>s#+za3{e7kMX`TahAaw`;kNSa!5f$AvDh&s?VN1f@Ei^*-PdIg#J$1--rK@>tdNIkGVin9KD7(xK_m?Qhic zyO!(0CnF(~=R*5Jx|*5x69nAd$3nP;C?3x1-k6AvRgt9L!vZQ{t-vKA%lIt9Di^bGKtFqAm<61p?mXXq+l5mOCv&F}H7BHfi>5R}&=f%0kyYaM*v6AA*x?#yG0c9$AOQ5x)7gWfC$R{$=xH_B6 z*FSWAq0i{Yk8w}CZb<|}(#`xemt|$HcL`+DXLZNBJqH_WZcBV*(N^o%{Ngd*^*zci zTX^LR`RLO+6^;7VlabE3_zU{v)Uyky@e|h{{!$x69+j2zT=u?dT04wxZm%L?7w1r3 z?>QRYK=4{$L3PbH`SAC*6HBs_$%dUgp^>3oq(;O=^`LZcH|d0Hr5@1>a>2;i$;~G< z0m&iGZ7Qw?d-j>0?>{nrB5sw^E>7>weK)Z+(aL{CQndcb*Ared1Q)tXeyl7Ol&vrN zdkHrz_`cCouYcWxWMcC6tcg=o`hlL%1BHF!-`vC?f7J;HqBCu&(6)lCrnJNyWy z{>`T!b(hXog2PiFLxqLYj#U)7Uhe6!gkaV zr?36i2LKmTTACBPOC8P5zhMoZpYdH4St*sLuhyQy?eFrlGE1V zRE+i%d=7#R@;lmsGPB6nnx&@3u)G|+s=zSEh*p={O}!1@!Gx|!V@HN%?QVf=Uq*%r z0_`4dOFb)ivxe85{Mv8fDdLnHm#PeXJLexi#y0)>0rq9R8u&mI+s+0}olh>duW%1bmLxJ& zCQxi2L%;@M1fjw6vA6>R)^wTQQ-P%V$wbkm*tV*vt+zS&^~n`kTx`5T;EdWG_my0!+Dgy@2Ldv*4=zeQ46;@`)`gf z6f0f))|5ea1w3z@(1LSn2#_5_M`%~gl*Lczo4%{(d#4SKN=Ho=kGX_qPy;z}C5*Sc z&MKhmZRp#`F-vbes^L{R@W*eLJQEbWr)NPU#fASNXY$g^^+uK<)H$f{&VKC=!HGIY z!2O&O?oleTs$S?!>PLSZmAzY9fBOi-ZLCu2(^RavL5yXvrzg8=yX0L){IkyDk+w+_ ziyKmL@AbMzawa1YhjOLb56>|wWONQzsHPt@C1}pHT$Q>2R*PrZLCZ9Q1S=n04na9Q zqJxBOo7cEFgwhW?WekzoLKg*vNDO}6o zT8J^pH*;UPhBz*i?W+^T?QAwpsN83MXJfNgJWd}<3|7Q9qAV4?4)#nfuuH2}boMCCg8A1$ie3If>!?o$BeQ z!q5hEb021d=swOZ>y5f4v#Iy#`n_D;Iq^^m=YLsfD2x-DVEtBK<*1UY>*S zu=C>yVHXblz%kyBnAFWZGH!k8<}&0+uIaniHb3hsZ*NDrfp7aMz6Bg5A8hiM0>b@~ zPuy=0ISfw{MA{K+DE~6Pd?DPwQ-_plQX)Qc~TM?`e zusjxdm6*NdJm)97d$gA}7{5;+5AE}aXHm4ZLS43nLt~okeGp69r?9mFA48lMyV|Ki z{^BH-6DrrqFQyzci!e5j8d5iXJ&Gmq9c&vy33)ucpw7vO}CqQ(q!@wQcbna`YhjL9jOP886GdX zi^~FQkcHzdU*f-kJIRpz<+Mpa+CsYXtNvbDN*9LMK7B`3P$ooWPWHq0>h*O)G(P?2$mUa-*a@l>i}36)!`{5<1>`PLI68outNpW-eR_tveVjeUc1r2)C(x=%49?ea0n1j}=m?UH~e z%q)bZ>$Rs(l4i@wCw`Y%+Sj`agi$sIdvl{_moZ!Zi4u2z5*4l47`T{-{uO8UD0`T8 z+%B%Wd;Cd!O3$^hl$={L26gg?kz-{!?uEphU%@%$rr;eELH9&Xg=6e-+H))NM1OPf z?@~!3e$B}`-^459aE?AP6RbNY0xmNo213uBpE=eP>6R*q;r2M##tRiqmQWj9Rh)k1N@gic0Wo3R5jvwrNOk0cxB)4YR4LEe!)cJB0`fky@;(qE?_dC(ItoDshKuP%hM8>bFvG5hG z?raslxaHl7OT8%d(45OkI^lq4X&J$_N17o5t+bvlx>)=Dg^uvBuj9Tr4538c$rRz6 zzwzW%exG%<`1PNIpEQ|S#lYIpL74}`k30)T7$SxOW|!6z2CZHC2GKfB)1Tg9J^)ed z4zM1k&bZvGhI+#iefIJ(ZOt+F_nU~8kof2tQJo^>zPvBzZh1)mw5OkdGfeOXaCP9_ zc(dB(9lU9sA2o}5qAgGQZut~sO=n#N>cXe2zT%PnRhRo-pgKmEuoV`nEg!Alr&UX+ z^f6EWZLzgA!b-^EV5EEFc2w6lDVR^%^(GnzIqp-$$GQ0=HKxWs%aCsnXh(Mqj@!}O z({5tp7wgf2H-+lL)f&1`5$oEnutrcNblnGk--SQWRQTY4t#|@B8@aPfwp!ycJ&_Ub zOY{fzDaeEMR#LcB&hHxG%k{Lc*N*=27&mWQv5T0k=kxq1PVs~yZpait{ZV5RJ$#b{ zv!OwBcXPcIi%}u;#F@>@N6`DSVvNZLcq}4qxSYPsm3I1K@_7 zIezCw_&bF=uEY6h>C^xS@6%tZFk?!_j#7xuLU0mWkOSW6-a$2LFy|XSU}Y| zr_9^BOxZat_v<2L4Jm7t8a;1wUH440dzpQXAU{Vg-p_mMUDSl)DCKH+!ycv>!dZGGUo zv<_-D_~=xMJGSKd$o$-8hoo7Cmq>Q+wX{}u#!$|suHr=JA1Lx;ncfx6fXhOo;3oYT zLZ6RD9~sa=R!Giwjj?D^oULDJ%OjBlxm&r6Oqdy~`0fzKTfVc*4O?NtEhKJ7;cC2ny7a=&3Ru?>ZMgM7eEjr|P8J z4joF{Pm!9@?qai%qYq`#Aq=Pq=DJu9a%^aGjY$zbuze{q#C@vMc zO!BTK?asR5QQ70UPZ4Z04oUZ%oN3`y&YX5E>Q)@PVq)qdxDL&}M2m@~y|C<4MS*wW62Q z{1cwNpZB*}ycg;HxqVfTG@GE#&js|oLAUd-bd{EJCYDwt^^7`hr%WbepPreRWDcMP zjZPJZr=H)4k|urg=ps%M+)n3|i+sc!hIhROt2UyJ2$SOaNx&)4?`s!ptfo= zjFOuNY`y#(ylX(sQ{wY+o|E6e$65QP-1fU}~oU+I@WX~mOWw(?>v`0_J`*GJYs1z977 zdcEVf%q>Y?esH+K%tzZEf&4M9kKp>DlIQuli_>eUgPt{ll*@VWr%3JspQ0aj5(PIt zI1cEb?5_UCfJ7h#rR9_ysjs*zMOn{j4TKJx0^BCA)GVOSt-@(?*(mcH?n+pQV8fDO z!vHc8-9cKEF-0vj7QKD$=%dI$WJI@$Z?~SALTJj(dh^D$bdhNG1S&mDeMjZQVMi10WI+}HEXP=P$1d!af zzTtXHDVp92;elZb=wLobI+f529-Tr16W9Dl>(@~5mi~$>pmi_9K=R>mYM!l8h=|K^ zD;JmDO@+H2V0*)iy%k145t67sM45_k@K&JMjcqW30@2Cb^ap6?<&Z~1Og3Dt1B2UJg$5Kti^XTc@;1jaw-!+Mqf+AZTKP7tO1sa-q(mz++eti$=3ct(_ zCzTacHJRc&BZwm^&v@g-T}ntc-a~sOuS7?Bvr^yX=$^g;kzGQ4<>2~*t$&Pfh|dvz zX|wWh|D*2kpT7BheKUgh;F~F8s0B?>NyC9$mTET!*X(?Kcrm#DbnH|7+b?)|-T)Ah z<$iDc1g#Ei!F8403_d5P| zPu!PJ^(mP_`QSd-xTu3|+D0n6oY4!giZa7|mcm0zp8}g+TI!xkg;poH@3cV!QU$|_?UsiSk`*r6{h%`rBe@u6G*VPcuW?#g~MlhJ2} zhEHEF0Zt!~qtyXrQKO4!2hsa^J~_hc$*y)%Bgi1QBK-jR_w}!vUfhx#I$=rnth#@Z z{I!QXDTLFh4O?Om2VHGoS;`a7b-x&9b!ix{3m7|nE5E|w^a1aQwB~fx4yj*gu93!ulW(g-{7$AjPlRpGegfnGhM|V+TE& zQL-di@ISx>Hf)65dqpK%N;7|i92rb)P`%#skluWTkuK;vnp;)yFw;M7rYnSa9E15ts10&|1>cJ_v88*RESdUT|l_7Mzj?S%#j9GFTK!18*%oZYij93ToClpGT^_NBBbYAg#tS zOn}}^b`}M4k)$Rsd!(mA_)1Db<|%-a1i;mHL*Z+1t;7JulIIkjPVllDNjI!&3`8Qm zuuun3sEwdQK)ZP}^NrIyDjeh^IHG~U0SyF_8M#=pCz7{Q+R5ZNSorWc`7h~b56$>_ zDnO36T3zvl#g;#(6lYQA{>6bXS;o^ET>v^PKgG2L3_^2NZkn zq~bu?vA^_REJ#FvF@+T4OWRIp%sY8B_fFF@hySg&eS}!NYH||1lj{ddp7vaaWLxe*U% zqwW@+Yf!(Q?;5t&g$0MY1Z6i z->Af!ggw%ye;1Dlf7IR3fnnv6Rq+Q4U5u}x-#(P*W%$lV#{;3BNBMoFL|na8B%9t& zlC9ntTEX2qwr?}#scQ{c`&cEqio!yMhDh>H^83<276tDsNt24~*HWZSJz~cA(#C~` zNK#Mp`?85R4N#PgMS6JeQ`E|Tep$;rroZ%#E*{jT4>9Am#ovnsxlL6~gYPK*ffXVB zgi;lMhW+oxz(A$w|Bk+bIRT0Qveh8pFkz0b6~=Y#@cZ?uHtN6&J@t0NEiKK1d}x9| zg;T9SJE+Fgr!|K0czs7D=TiCs@q`0lj`m+nrQf05K`ECT^ke{w(MMOBHbMgJ+qmvs zOGSb9VwbS6Yd7nw8e1)2C1rsCVhaRyRg>rj#B7Bnxv_Xh@)~2Z^Hf&m(WHLsn+>>I z4Sk>7{KnZ*LLX_R7ZwYHDF$ehNyA`}Ye9YnDlk!pdTy-Jr@~#{4h{O2k1S-KaaVj9 zWwj*h^xR%RX*fdp);|R_9O<0=gk4U-L>)ax7l3LpCLh{mYnfU&mBL|e8V3#?V-Pom zK`rnpmT#{&z}wZU5tXJ7Ur!-nMb$acl@BkzoctL3Jo`Y z-aqw-Z7o8#`rCP#G7lxquFR}|2T5fN+R{(t^p1KLW>;_zHx@T{7$s94|MM+bg5 zas~r1(*HBdk2MoAM|bFZ{cTuy*I>wSpT2`C4#OJ1!owSG051Mb&OFhH)VXu`P$A=@ zvHNl0ETK{Z%uUTDS}*D%V_#`I+tbOXtUQ+zb*MsHn3pabPBBrGt^h# zKd)RkQ`K+F9Fp}5Rtj!v%=h|YM?n!PVP$g)@1EQ?&R3%ezD*X)1`k1^&aKwf*>hZh zEOZb7cyK_x)k87>qaVX}1f`kTa2spN_G5nF%kgcRNNnc_BB)MQeS`v9-rVJcBXx@- zKX-&iy!e$`+{$r2V_W@zUl|WtPkGY16!ss(wOW(mAUr>&AC)c-B9!JyPsDJ6>3oAD~0kfiBhf99@SdSc@qL zIN-CLylFS(Vw+8p9W-{_kS9_Bj`HsdGX06Jm{I5RjOHXtwMn!zdYQmiCrmb6aF7t2#ClG6zoB8%hCEaV)Sbe1W-CQ-kI&SgoiCaN+;G#>hpRlvWMA&7eD~HeC@f;oMgtewMA;euU>--%X*}+3u=0Ht-U~yMww}QrBkA$fo9G!G% zript#q5I`9YU(()vcN^w*sqa$5d56(*Bsk*Ym_(bJdRc-Qm}~PyZ`_p5>HkBi%~AX`N_v*L#|QniP=}Q*O5L~Z7G{SQyN@Uxp;-kSgEj7ji^x03 z-(3FY1!kaX?NfROC_mG?d>P8exx8b`7RCf+Bd#af4qf+2Xz$*w)q{bi>=#Oi5Lji) zq~Jw~dL2p7ul$F?Vl!A0^~RDEsq|F!^W_pcC?HX(ADnK{UA>1nyq|Ecw1{Cf{Y{vr zT!XhP726|UqHpMRgY= z^W16}>CS69i7EJ7$a&DC`KGi$QH`d$PnN8zRFvW11-Y&tkH$@>f97*l`ooDj`3WC9 z-uQUtohPyM3MtiJsDL23o<#2>?3Mv{L;nn>SKOGDIrr)=;n96N)>wfI>m*dlP$vG5=6s$!23$QWp4d<0+84%eJH8zZx*l=(7vl^t{y`+N@1oH* zlNT4_x*eEg@7jk}~IabH=h{XZ1m);k!&`icKK3>P1s=Y-`#?A1tO9faV|WK9V+n zN3TlDTS!M@;758=D*6i|aPY9+T&^C0ImH)ux~K)yU^8?uL|*Pqr2C|2VQtgQ@ycZg zqqrb^2NLdfwz4gG#&vP1h^^dVPd&_T!QP3@x9I*OSr`0(K^zxMCcnfB3OCB?af=a-H`95^TRg>cG=x%)bO~zNi24k5*Do+nIa7XVScoB%jJMT~Qj&G# zt%q=gH#^cfq$rt-WeWqCf2RGMEx4JLc4AF)xp;M%^1;tk;8kaP_*SBw(&L1{0i1iE z93GDg4d*E;IUd0OR{0@-Z2n?Veb=hOTV7mG9JuGc3n|gIv?`^dtCx>NJ*s}WA7uSq zvd>;To^&!Jb<4PRZR2LX>xn3RNRpNO5{Gqyvz0KLGI8vF&zTgAK#TDP4x$m-of*d}!NWmq!A(fxu`Kmc z4L`V*%>9cc#Ja?G7qW+9#dH=0-+%4ZvbJmIHJEtxhu%nbw+x~3mUAf1#$x4E#so_& zsGSjGEkn0`_v|v=dlyxM1;r@$lG~stcf3d`A$i18r?V8=%+x>cR7J~!e|pfH6Bh+- zkE0i3-7AnGXv@SBg^UUAPGJTGjoRV^sJB3awp)QtHby6(ddg;+VTAIYRjzY-DYf^S zYRnQd)jQ%uQ|=tATO?ie;g&@7zR#*9H}rpu(-&B~ee=lh>SIW&S>l2G_Kz8ho`-_A zq`F1Fa=nB~{G2g4yyr408omi8!f&5!T=$*-N3kbh=WK-^MI&uQs>?Qaa8jKN?~%Fa z-}E@RZOG3m`0a0M%Et4Q|NI?tYvTZEvDHF1WiJmEk+(KIn{x5tM7hE$RETzEu47iA zHD@K3fp~PKi*P2s?Z|bCzqqd1Mv+U)8#rasqxV2A$eiCgBN)FB8O^u-Uu9VQ0>-E+ z)rS{edSa(pPg5d1u~}j5mdJ5E(a*$;F&C3_mc@56M`m=I*AVIaO*Y69UFN|=GbMHS zUR1vBMhRG-S-QW(1xws6QVPt9DWbDgF2GJI zzQGTLNY!RcA#eOb$6>;wWl6{~)$cfT*k$u=wQ1)&@`Ng5Z;TwLc6>_v){3vh3Jc)- zCT0!teRuxWU-nvP)-8(fA(T0%Mvx9QGUD_3wX5$*u&c|XbTNG>%wjVCWMnQm6G8n~ zMID?9*#sm$*Khtd)DrDKXGwv6+zyE6zT2cXu4R(Fa`+P{;PVe$6F3^PusCP@unS5I zAxU*m+UR9*{laU$xekQmWPOguoH|O8NWZ=6vv#Q*{vErv_GCPDCnewwCq|8N12x5m zw}3EFjdXc@S}Z-y=R4LwiU}|HvsFIGGO33lsD791u_w#WyD3yJ@(jNz<_-#=VgqNB z-CUu?J*-Ikq)I3V&A|*yj@OD2T$SvlXSvwwJndIq5?O@(n_#}F%Rp3Jf@O3 z$b#n`AOH9wzoGC}QoYR*ej19ql7Fgd*r&sX4{Nlo-Rllbyls)B<(Bm{osHMkPCG} zcf?lxMLB{<)TTU3`bhfZiAIr9`7jg|2ic5u&U?9rFLIb&no<&lMf8dt(fYxn90c;S zLByT~t>-!^vh-VM;oA*OnVW7O$o%%FJ8|9xz0nC4gB)5VxZ5tjw&op`f;V7Q#h@|! z#6TaI;+Ci4F3HA**J5*SL*r~ zOpK9>dy8nh+>p^|mO?ckTAo5-V3@UXJi_np@9 zpR_$N``GFTj70s%qIMeJ^kjk(7p94$0EJlv1k$L}vsf0Ke~_cpc=s;tvDNLf)o)Tf z$UU<*n{a%YLDs{_$0iQ|4tDN@8QTaRu2nt#oWg;J59Od!{63g!xsBgG1 zRzzR;wfO--{0IDMSXVNpbjuG8&JcdTC^PB z?cMLFXc5H)j4Rhn_A!hd1$1RIeruB=b*nJ_uA#TH`9AeAhR{Kh;&2xuQAa3S2kSCQ zMGzO9c?!4i59BrHwSjdVFsm6qK2T%TZbH;hHL+bQ^qjajG{1zHA@W!aG%uv$3OkAo ziC@iX^e*P;Ey^E{zHKaf3z2;ev){ zY-N{kw1PQw&a0)(r1V9H%Uu*-Zz7^9=P^*EOb9xw+fh&z(|;jy6ltm7L?^ca8^=0f zL080#Eh%^*Um3?w+&u1*bnf-h9n7?tQbgM_!qHIaEq5OyLJ3%3mdMtmat)!|jbiDW zpbKDDmam6KJxthps#_`vgec#pd!}cD$c9SF=f+*g{94AYhefiDy0jac%@R4PTiO(3 zRmWWvcIU9{6raakY3ZW-mjX;WPFDjpr%V_lHNP34=p}r zeI#Q~xXxpioFU3pHTY2JvvfSZVhzVAR{(#P;6s!ndy3Q<`SY3SI8%~uC8T&%$d>`z zg-V&b1<}4J$`$H^ffF+5L4Gpp7F9>BSi1Gp8Vjt?t~Rg7fS>06;Z4p90sgBn@6;Y) zyWmUQ7zyc5pw@lHDiF3}ZsW`p&ELb>S*p2Dz{7McLo%_hkC4xX7|z|3ws=6iL_N@;V93x#h`H+|E%C@d3dP2L&`@-wxcH(p2_xfA@VSGw&8;QBy z)Gz#R?XlwXHdhkPV)w`&U+M1?b67~}-RZa75&V~=3rtC~^B>YOyKlK)T^SN~f`k+P z98knGX{lLrY>hQ-;^kOxEJxU(nfa2m-nf@%Zuj4qZNkbc zhuoYw)Jy8Pq!{I5`%235U|UzyhuSB*TWZH^F3g%l&|~&kGdZi(iL6myyeJZOfso*# zINRse56UG*d#77JG;l+xtTG$#$|HHZ-&KJF5sObXRucC#J}S3ma7CsEksbqjl)9Ni zjvqC0>(l)nuLs!$(RAmJK&65u4)ut}Gx`#8Tk=-2-ic=~_4dQ6K&H>~!(~VQ2omS-zL_?(Q%$)m`P}Kz-Gu@ z?Q!ZPexv9&#V7BvwZ!*r3Y9T7KRuh z0E_OyN*5IN36+W&{3%^3cITi#4VytliipS4pP6>tJya^@0@EX)bh!_o*1x>I^Cool z(xvt@}d&B47o)nwGmrGGB7>B!?P znX|`}YAx9{LB78SV*zn$OqIH^lnE*mck&@Bs*%$OnB_dgbjhm&PMAKEsBSa-5zAjVmO- zxE!Ay?7nqOjopFHN%ij|Jx~!XXNcVocG4Wb9V&AopcWS)b0^s80K(Af&g~Oo%ZrFA z&uQ#81-OLDtZ2WZ+-i0(oNdC9t%~NLN-jzt1ymriK}HXL5MNAx!1t>lE{dzZeF>!6 zdn~IxAFCwSk>ft|pp0BVa103hK&%EM+#i!=>ht`1;>*q}Javux1aAJU5j0!-!w%f_VEcYpn?L_(Cz zq;@;-OSaosEp0Chn*x7O&;4ZEdyc;IcV%B=m4n##P8$0dr2m;Lvxh>1OTR-2Q8+wA zGDp=BVQI{J?t6Nh3S`$GzE_$)1R-YS*?yl z5AO*b_P~nr*Lbodb{iB1WBUsy48uQZQ!oio8;kNgz$CEz_3s(ws>U7=m zIV+xlN<{emQHjWuJbq#}eu0*G2&w{C)ump4Cku`@|C0HS%VZT+OoY{_0jQA=f4Jh0 z>ZpNc@_f{hWgQ+*BX(4f%Hv1#}ey;TkufL+5*r zb}veKo=?A#?c2X&v&t2&xMqBWqIw6+4pLh0!LYPmK=SG%dC$TH@%6awKtAQuM+e{} ztDtg6DajBK4N!Z=_pHwg7s#ibyUVJQfmnfSEIV~5)Y0YvXRX6C#<5g49%^e0u`KmX zF=aCO1amDZHckuyK08tpLj}IhN%t0v?0%#H7PRp_vgzI@E{;C-j6U?3NgTk02 zPdL!#V^nZ%;O5pAp*cTy*J_DKF00>2Pqf>Jh{C`IW%H(d`qh&fI*pyEZiOwt9$hW4 zEqk*YhCZZJy6Jl2IS-7gr98`lDj~Q~lUHIzfGC5Pz5x%*2Cv9-{|_Bp=9B@ z@U`0=+YFyy3%zH1EK3R?JK{~F*Vy+8>@o3Bq)XlSjL$BIwx?+b%r&&OUvrHS^KSrl zZ)tsqEIi`SW+)JEGaLa5fAq*wk;(UReenvIP1SOYZH0?7TjX$M&V_55jp(~`*30+g zQrHyUAzFB_1;OLOTJ+@CRX1&Q+vMnyFgPNwlm!*Rru@8o_2gjIm`hfsHjv(p^R6qWj--bbLpOR)alkz2)677)OwyjgQ4pyu$vA2Hm( z?!7)Kp~$`0YM#u!>YU|+A5s1W<>c6S18ktNuhJ@_&Nx!yjU6!(%TwhX=UCR2Gjtv` zRq+?JR&FYFyMhw;0Ai-OzNdVJRtq#Cokn=&9QXGM;aHyPvRKEmA|z)B$azItxaRwa zfvU@^s+;IH36ciaf?LwIKuq5ans(^K`SNTRFi)1qisRV0Zt?&c4C zC*7ckMWun{r%k%TM%hu(9BAa5DC_-=NVW7KYSTt-(MgLr-wlq&hT17A*@ZQ_9+~sP z%cyy_!(OPMz~@jYwoi9g$SubITHtA|v94t-m;N-m42$de@?ww~>*Y~R1>{g22zr?; zt565U2Y{1+A&Hm6OO2rdO5c_3?z#p`J>xT)p^0OvWSvty@j9oQHRRbs6-9*a`#{vK znVliN9+rm{aQ{@Opa!0M=y}d)TS30hmW2Rc$w?W464^JF7&=x7)MswmKbrhQQe8Bu2JGjvJ}V68wsDe7SCHC+zW4%z z%CTNxfZ_9GI;<$;n5qkPeKkL)lAY8Nh1IB+~WA`&ptwA-oEb#&A{|y|?G{(3K zNX_T+ln-tT{v=NNM++Z-3Mi1BX}8QivXm(@)4*r^=zpvXJ4VfS8Gp9P8a`;1KUL@& zGodXSI+42rjNCyJp3Nbt=dlbiEz~%Us+Ef`K5jR&E95P;Cf7f41x^iz+N_s3HT4&%DJcqP^U z{V03=lHHswZ&l)JzF@A%7S(}J*!Z{R>_9=@&xcLf$B7!Yq}a=nC%|;MERs{F13MOh zZMfHz?ZgRp{X!o|CwU}n*`3N)wFd~!D)B9WIRo=`e*D*Ew1u%CZ5|AIo&-9rX+N2F zhiQwnIpG^}FibSu2ZI*S(vrnmy&$M+>4DDrPq^K!zoJRl5^Ra#H+xH;5mdMTaiosT zem7lqU?5O)loM|da+Z)8cL*}sIHB<;6U|EbPe(7##MmdG(Iv}q1D#p*$5_f)I5e;Q z^Hhk!&r^HROoYbH*ZWGJK^5RY1wE&zfaILhsEm5Lehd8zeqO#pv|28Dp-5LdB4{F9 zf95=v+zMz8c{^qP03zu zdN$GaUh#I{j}x;Bp|inTG>uke?kuZEy;G6-Lm|7^^b5f{+>XI}J+Xmr3btjWrjZxRnBt@uS#!O37**cQRXUdGe-9rxKkAq6XPN09Jg$>3m7vD*tfdd{9EkhE zZk8=OR!5r9BAE$b6)9c7?}Uc`1Ix39hAQMCoN}a)H0~Xog&p^iMiROq24{ zxMh%}mbnBLr*FIVz<&gNa(3pR?2vQOt!MiNU5ZdOF8GF7E7r|0t7C2|I^UCt;TF;4 zm(C$m(v!-ueqf6%iC_iHwC~SF<%#=?9vCq}7_Cv`^B4`8S(d7Js>Zxq4@#8=aZZ8bSV(4O!tk0M)3>Jsed_WMKeosBm7zHe%seM z8MNGyV7Z-AsvdsVNGc!K)=ML#-mIB=_d`oqpnq<29~4zdIgZQJ5iDE!3*sc<3~tqx zUL^Yr?lZ{nk0*-t<(`iKrbD<5`zw_m7XUF(OIR3L%FoFDSqIk zKuwpb&6n%;(x0`}5LT^M$gO38gOgOjwNT-a{%J`yu)?u10KV&S@YGwXRbdj)4g@`= zhM)g9xC$UB!X~stKOJLb*7Zeh_Ma6)wNj|*#o>K)kLZ^5oIRas_1x1F{{$T=F z0M7)?cXY8FYS9A6eo@PyJJ=3cOOaMcnT@e|$cp zs!U>l?f&kxl|_Xd1N>L!ZSiM(f?*_iw1oSat@{TsZnuX@1q$`WECs<*4ZuV^NekKB zqU(>O#(*^vPm;*tzPNIjbSH=V-AWosG?!ZshNpKf_d&#Sg0Rh21-qSe!Zwb{E9Ean zJIAXKJ3-m}hV3ELEHxhKC=668y-893BD!v+%w6S4Nie6P30>u;DI{=)t;-8PI`_Q$ zrfoi?D}j*N)207burV;#%haWE!M+O2G=VhIVvJ+He+Cp`rGiK4xufbD!F|YVO5d=a zV_W`kag}G=T~i)0eoWJMtjlm5r~d1#VKi}q)eZ%oQLJ4k=>{YSiUkg#5!=RBCsRZv&4r6;X#nj!WICL z@V*aT?O4#p_#z3L6nH(SMh8KIbm7PWz?z^l8Qrk^wwmjJ<$bTjdb7mZCp%T)0||&d zh2s~vZ%%D!hR}hZTcx{BLbOxLYKRWtm`&jEO{iL1+YcWp2|od9H&ze=TXYCal+#I- z`Zlvf`0A4->&z1U-a~u|YZXO&Q_28Lc0c+i@@JQX4zN0b0`Py;?OLq(hEc!XOLmkB zr7kN%i>R^tBPcc?7>A{cFA2p_lHbqRG9iV6MMCMSqOOQ1Aj$@Yw$hGLUG{c#?Y0|F zpuoTd!5d{EU2Edu+}ie^z2||U9sYK%yG88(h(MD0Zsp1*_EFC3U%s$!(+<8NyE|M^ zG?~pk8IHGzNzKhEM_Z_UH9nZ)z>kwv(Bs7y;op-YpX+Eho;@YwQY zSki`s{HnnZR6bZ@`%%Q@H!DZ9cAQr@*-RG1cTPjCO%Zp@{E#!BB%f!B}7dB z3Y>>z6_le|Hcxn6tHhC#X=6dKjUj33bw9{Oor^A}u03&vWH zXANv`G(B!jx}`L@mtz8{wkri7HFwg!B4n4b>iTZcRx4S~TEe_SWZZ}QUvcZ-aUwN3 z*1G84qC?~yOI8L$(}`;1zOU+K@C$PgrRt39<)J*ZD^nfx$S82+$_ zsDDLV#+OEDWIV`TKWlH7w3&@FE7?)bTt%nsX9Y^KJ`Aq_FGAUY;P9ZPnOT10!dAKS zn(+K-qVYk9%HlV8{`v+KWqocvUO2Wr{ed#|`mX>)5Ue=(j%0Qq!QaO3jV$nQ*NdDC zTP(U(gCG6_!ANA#vL9KEgFJ$$!f--I}~8maeM6lXgG(VE}SM*U?zP-?xEKCXq3 zf`><~8n&)+S#8@|ixxy^I7BJ&U3n2vzo6BJE4+o}mCr5auj!vP!VErpqW{b9Trl%aBR#sk5E0WT zJTSy@!6_Pz&S0lX=sy5htmEi62M^9s5NfMa#hx|q>AzOk`drw?-y7~x9TFEj^X$Rz zTq|sl3wZ=`M-`-I2Y<5s&Zt~lc3hkEsnCPb=e_6|;f9~34iyX2LM9mAN&!`0Evp+) z`=O5Y`ywAYlC_C|?B1(f=-)i9EerY)mzqJhL@0#u=u$A3TOHA&Y9!x26fdJsIb$MI z01RkT zq0!t`pkIJ+9(Fp6a20B;o%7uK2hM_p?*0-Cq46-X;n)LSOr^A4I-R`xz$A*s0!W?o zkv<}Ilr_&AT-c`)U1?B-%m_OEmJG3~(J`z+{uwA?Vd_LvCzofYX~-v|7K+HJMAvWW z1tR1=bPqw-46d-<`vS0YRud#VWDr}z1XjTUu*}sgtA#2d4gjXdUw+yE?|n}n|Dinw zy-x*PKVbPK>Y64v-Ct8Ag6ff>DAR4$iW}^femZvF&`Bn0dK}h`b2tSBn|dp#^e1Aa zrE=4u@mc*nrz)v(Q&T088-8<5qm*CCWv(i*?n8^t7GihFVWsrX-*Pt(_F>;IDJEaM z55M}0!eZz(O=Z$@h8S+YtOVZ6Yp%%xMP zUM^kIv-CmpQZXF2h#q!o!AW47^%8~&XdjXb$1m05HR2ZpMoqexB3*k~@6?Hhcb;M_ z^@CS*3A5yVg@N>8(j{wQ^cJ{zdpRO;ti*~)5eit^UG3>I3&*ernm}Kx5Zah} zlHQea?_FIGMI%+0avQDmB8!x9pInI`GmMfjis5)S>O5_(Ohto0mZK0=%s=@Eift_9 zd=;njgM3*QBK;n3a<<=CH-<$O-n0sm`{Fg)FC!Uk#o@X!yg@bvGCARf);)F!O z#om|n)=E)p{9wPy4O9RPrJ_rvL}8uVCD*ER$Sc=9kFFoX133V0Pq1{ zHh#yB#O@}jx~d;oZs5<23A(nRqR*}EE>Q>uLLZ`07ZbF79OgeP?sp(YADHX~ zRum=-*Ouow*HBJXEV!iKR(6^z@5DNRE^)ta#IGC&X1MYghgr?+t~m5sYtl#2x40h@ zUS{9XjH!vNJrv1JxEWjgkLe%cAA7K`f!Yf_hWAd?Lw36RikLiZtO}WQ%M9{ZJJ=L6 zT<me7`8MKD`j)H`nGoN$B4)4 zr8(j+Gy7x+B@Y}wWct25#!&t()MV>9hV3(fAdXPbrpTgpc1?a&SQQsC1*TT12lDzi z-4E*3S#~QT4xBk&K_)s%d79BdKYMq$r1S}E=6IaRh=gReXCb9QKR?SC$(c8Ubq}m? zXzFJ_;>yX&MmP@WMzKe60X^vFL^Iei*P=M7d|vz@#D+n98k$#XV$$-$EK$8B<`DSW zj}w3S+Sv)2P2g*XyJcmK{l{R~ux{@s?csJS>w9}8_Q)%rf`qSXUO-BgiijnN);@O9 zabAfgSjB0-OIy*P12o6hr!z$>Z%Tzt%H6}9WGpQYkW&KQmsW=WTxR0PPuQRn4?dm# z>BB9@N@exY^jEu|dak3*OW(1V-tZGt<1Yyd+}kt>f169023{`sx$>GFv!tzEJ9Z%W zlm!eVWrO1v^%9>|_Nmi6c681LkgJa!1;=bM$!m(l@BJKiuemrYEGeonJ5+snHJmvpt5P^&-pgngqb?_HT zNvQuQ7Wu^}EyQ9zN>2=QOfXf83^S13%I2eoXQR5v9u-y3l;;))^SRXAwL*3sQM23LFs()wFBY9CWhZIMJClW%B5Nu|##a zv=lqD+%+lq0Vd(;jNiC(O=uVAlIO*YTH9A5Z2u2aFv=Ui!WD&!_EW1o!i9WI=2V1n zJI{hTeySPq|7DhBOH3}L6ESy%j!8i2cRJ+5ve|N2)+{k}>22{l_wTeV*2r5P(e15s z2_a5~3g(!|!(RAD<6h8xgZ1;3aN_p%KJ}|hT<{ZV>9~A#8vl#MSRk-uF2KW}uo|o+ zi4~FYX9g+;7PKYoA{y++oMsu#Yk$OT>aS^D+TVUFWLNTSc~3OIlt#-iT;fXa>5qHj zHf|37?76nN1Q)iX%w5Ad3F+n&o5UqCs1TL$r*&lWH^ zK@L2d3K$)nD~{@~wa#3Mof#EG*{^@F-EKij>DXgPu#!4mp-R3uB}^#GdV7iwfH4YD z1I@5PhB23Xi|~~X*kiB2L{_M7QD8fGoTk9z)VyV)lRpVUmRMRjM-m!x=l1H;;fdLW!* zELNayLKaY?Dp5ZWA2EjIS+>vr*MLX@pw$}l6lCZ(o+YF?QLjM8*a3hJSed<|5Dw-D z)6vtFKe)7<+4p-z<5jRlUPcG<1*0zn#2wEI4gdF@y*HrFG-WNZ)o%L@5lD;@LW#S$ zA9Y~@EIC{c*5C@`WxESgL5J`ou37RbfB#1`|9yFdEjG3E+}27*sTUp=_42Pw`EhYt zon~h5Ve+u4d$%Mj{st}6r`G^@gpx1$+gr(I6M~}N?%)AIGf|C^U+IXb?O9cw+Z3ol z7Rv~i`$q}H_1q5sW%jFP=EAYH=*?0-yMPwh&{0JPH${UWgxvvOV7(^G_%_(SV{FiP zmZWUTnRa5%6m}0_=giF>+Ulx+eeK)SG+==Pf9G$LJc1%%#;ItIX-aoubxw=BklOf% z?FOq2$r5SisF4y8N%mh(xvdXT zhcy(5#KEH^? zfc;j70{5O&oxUF`wW0Xr#NN@;m?9#tZPmaw+KP!zhc?KLYPYeXnQA6TCV{Xm-STghzeS(`;{L+78pL7CL7Ff$jY{!TG7AeWapydg;oq)HC=G{fu~ zU#D1YOt*0?E0#kHi)OaT!BM0@Im=TkQI;Ec2RVAsS}~~zhw_3Vn1FhC)4}Eca^qU* zHj7-RJXATSa+?HE3#KiAvIiymHyx8yhXZL`slg6DO?nh=*W3ySHWw+E!%@s(;|DW( zzZf5qUfvL9_L;g^fU#-{(Hbgmy&0UGD5Oy+gSu@|WJtY6(KWCLb%-2HA_)roB1o4b z+tw?incCUH6Q@d224#QOL}SJHLQ=^;vdo#_x_aJkl4w_E;*>F68 z42zz=pr7r_A;Z5jh64uz%o5WxfSN|ZYgQS*95F0%&L<%&qXkV^C2Tm#ddhysAm>?h zLKsCG&+#*h|0{Ox*b=SmK?42lgluXiR zTbPIGLEf!rf&QG_aWz83r@^+s(lpcHe5lPS;6FtkesXN1AWoz6*jmErWv6Yw4h`JC zry)bwJ^Ya_yb=1I>~j%`>~ERoNKFHX#je{j#dLOi^4WEC7C6?Hj#YE-)-bri+Cf1% z#~h+%T0GKFx9ypu>hTus?;-};gTqgqO@v5XC>ny@Wfmu!f`zO1MJOWbON~eE@Cq;B z(=oX%Q$~;0?Q37}&?X2U@6cOFZOO||_^W-$y;075*=@@H1yK4kf73qujd}Gi%-V3wX3S0&M$x{@4iO!l+uhiT{2ja-lb*OMzAYGGb{>y&_iVRIaEDeqWhn>{U*7o&|~3eC1ovZi`YrIJ{;WyjBH=G`fA7#7hqp3rlPoe!Il*DQXASj|+i zOP3tr6i8#lUy`M4Tu`yq3otIP+DFfPV(?LEW`B$%O-svTsrKTP4Xd^e4J!-G?aAMM zLF>iZs?SYTd*?Zfu(e~$!@S>h=H-rXW*(+BnV%yj$QLNM2;@5=^9=T#Ch60jWK zS(fLP^$6!FezvycNsr!!TUoz-)=Ie~8g`wgPS3p}JkmBe`SOvDRGe-!F(KfvQg|bG z_?RG?uXhMOw~rr2KQzK(uRz)*1s>Spi{eBjZbmn{?mjXWZt(v^hf-U zm$0Gf)oabDrBJBYQR(m}nx4X>h}jI+=q9?Hrqdef9_*#vAcT8a_!4sxXQmv@@7{Gs z?P7`}071#UnkxwEM0e=pytv-p43hg2h-~oc1^6pyAn5+w4$l0Amm%%ty5XQfE^WB8;JeQF&NpEa!w zRywdz(joC6IA6aSC3q8<)}s3Ukt1UUi5LA>sc*W*gPuV&&bnsj(1uzVG~vh1IZq(b znU4csTwfu1hW}8{v_hM6u)n=nPQ+60RWnk5Q&g;b$!;yb7jK`+z5C;Q*I2=J&7Kq2 z59!{pzFQ(_B`di}?b{*075!J+b;kS>PH-333W=1GXgYL3t*$F1>s~)D)jva4Jr;ca zEW1zD$Y*cg*K4mLZ?;waAusZ>Ldd~N;HDq)zVnW>bg8;QZvQIS3e2>Y-@st^9(iH0 zl^5RJS1Wx=dn3oiJW|N)f5>4M#|)#~39WAwRB65Vihwcn?~|XqXODk`jM-KhKk#V$ zU~!VD&o^{!Cu}P^xmTPu71XW-iBs49-WKYo-ortKW~d5Ip4 zjo#3{v=x8mO!25PzJvSRp*icRZ{HN$--{iif&isqU)L+$obXsF!ihslv5o z6(D3L`*PoM{%vtHxvf}C$FodraD_Hv_l|Q?P>elJn4V>qZ98CBw~o~B*PZ)q^Je`b zF1L%@&CflY3iozYf?`jzq*Mk^4gOWxcK$}P_t{LVKeLwB)>URv|MwV5id(2 zihd%f;&{FeVc+9^Pc1RW&6UK0pUwsk>1HVyH1-`o9TRu_^fzvJNZz0kZ~42k3%3m@ zYMx&lYT`Vh#VZ+Y#w*F%$sK)Ibsh4fyyZ&;lkyUReDog19xsVDJNDx%uMOd#sm@@6Y8&*r(py{|7ofscZvl(j)P)InD8Co-d$)^M=E1j$ajZi>Q03 z@Ql&UO|&<1UtK4eX#P6D@jA~}^romzoR!ZCO-BVC0_>NV{+_D(4x6Gj_glSsauK$! z=BVc#KEFxf`uWQhVKl$+U8&G9-2GDOj1?AGRns}u z{Y^1Oc@=4MH8Xh)GWHo#tTSjiJ$1x40T4)Lxd!%(^M{Er3Ui1aw!!V^xozop)(LEb zYDA(^Lg^IV>My@?VS%)Fa$D23<5q?fHb4@|^^jc%IQFL&OpqRlIWD!;z4}Kjeoujy zV7s-gi}KZ`(_xk$AL*63tOy~L`AzM33p>V=2^;KT!z-^?{i9cQ;seuTf-a)dCNQ+M zyu+H|>tSd5hK2L#e?_=|wTW1}-{e~1P`)8f;O+lTg=IB;`bT}IN)YyZHzF9DbA@AO z=mP8&H+E3G`d-tz?X-$TOp>JYwT3TH96;!x&adX-(+!>OykBFNuA_vTB%9EkT+ec>g(K-vo1dF$R( zY9#A55o-LWkj1lN&kR;TFeZpK^H^kwxiLA5E z3SxD&7Tt|!14VcPR&BOxzwh~K=y)5E_ksQi3W!xMK`{G1;oK)TWKX;s)G_qG&6{$1N^s#_ z+mX2)3~JzL*4k)H?5@k1#grV^g2Efs67__s6vMRDUl$ABKG#1g#yD~sJ{*&NTtvBZ zP4*gs2O~z$wp}*3}Z3(TH+kPQC%3 zf2!4uj{X7Hmadwr4c4*q&*eDNy?B z=9umGHN1*qcuWR9)@@s`Ifz@ypya~E#GZq5=1Yff!~L0x;;GXYqWGz%TZSs#eUd|G zxL$dAeQOsq{Z?RET~By~sO?OI^zwJ10fnK)oC9($@B6T6e0P45a8d%2(VpJ%FqJOq z$4*yV{=RKQ0XETGH|1VmPbjx7RkPZ!Ri4I`u#mGJm(TjREc;eQh<8mZLUs4aY-3G3i*p@3N)>mUoHKOP*TK_? z6HeE)oW2n6fMp?0r2L-zDP?mTT`lVwzq5lY;NP=<7d=q(bQW}4qpu-;`vhL6Ux+is z#=(2~wPl;|N)Av|yA<2y}%ULJkSsqslM# zWN@-xR|{Ipy6~rG&#lls+CAd(O7*fQ6HOehPN9Nf0x9$a`ApEz|DtUE3wxJqH6b<0WlRny!pg z)`?M9Y1`mp81q)?d~4_|m*0DBM$x+gq@dL>DInRI_Xi{VSnM* z({kO+%lVCMLuP88l69oKgc~nBuyYB!UFW$pSw+fUC5_wJx)qB^^$wG| zxZDWjXo_*p<%X63E@J!yH}TJqF0KGEZAjd#<0Zb7FjXiK{6CgA7i*1=oVUxaybIaZ z#dSuD7phVDcUQv?H$0Sse1U|8l6=%d+2$nH#a!~Hs>#{?t)sUk|lAP#_; z2d$aWhjR}ob*2L%|CAF*gJuL>)k>-7g2x44Gzm~z+LVd{AX&4OF~lD(D(^YA=xy9B zlD@g0uJq-W$<=ROHZIT7H>(P0NWI;HIIr*;{wP7aa_lMQPzmP=4@J-C>Ce==HyKOy zb}vxcD)&3V#53UI>fUh5B*r)Wnc}7fX6N5AZ^A2V!z@nZe%W9_A^qVfx^fF^lUt*Q zq#s7=nWqV5i-+smiF@oGPEp!C!z_&04a;qED7qgEU+<5Ja?683v;U8+?+j=v-MUt> zj8bhV3dX3YAVr!W2&hp(5g4TjQdBx9y|<&zNC2e>NB}9KARVN4P?6pQgh&ZU?}Q#Y z-#!V>oqON!$NU&W$~otGp1t>4Yp?Bh3klwlxxq@X41z;7JJ;YE9IDT*oR;pfIuxx= zpQYC+sBgfp#|nshr3WmzH9hb!xj*}7WYLm$j!LwSVzW)MK*o{TW_`6J0cj`GS=N|y zEt-FEXkTY=nANav=`^i{ZMYYKS_f2WoXGIf()xAY5bl#ol_`M6f zUH;HGtgWZH(DBJ@Zp>IJMZ_RP{jx-cTC)zHEXIu9Nb30u8_<4+xO^TU8yp-l@O%fa z&$qgy9TC#C`+{%?pkv=hcrvP@Lu~j@=3L1e`gtKbHsjU%5guLIm|d=0g@5_lPF_5X zP#*7kH^L(nZ8?wvaUnT_!Gg^+m)L22+o`?FS#%)ifV?4FfRD;3oJx1>j|mnJWiV8j zXJmI;kFT56utTSjv5|NU!-zu=8yuniJkXDUWYnhDN>&`3fJNS{ULIYlUQW$Ri$-`# zr-mZ*i1iQBR@5Q4vk4LyaiGg+kgPb7Aw7swNNpnZ4?4^#UeFZGTTU2QaMd15X;O3z zC+43^XpztcI77cRX)PdwV=dL%>4nvkW$hax6tPnsTjQJ_r`lqga<4)e<`Bh#N;;TkQ!4G(Ll>hG1XR0d2GJ0l@v{JCbs!F3Y&W<&=#0f*n;-poCakgldmKe zzN|g3q_7o^9woRVqAs%8VCzPaS^ciYd$-Nl63wQI<$PPvooy6F3k?Mz9Ng~~iQ{u^ zc@%UBLF&HoywkWik~Mjn@fBK1_|_A<9?w@W7Wz z15|tD?Axx-T|EFgoD!msa~lDV=l~e>XG9HmS;s`G6m#cz(qO|%oP|WIMO=kkZ`Abp z4x zu&!8?Gi1|aot_e`uNU0)(9X$vmm!;9ibJ~~sN!U~S)N`w9Z7Z}y5tnFz`0eA2!dg{ zC2`4&qSn&d{KN5qLyAny;&eN|tMwrl+1HLTio*(W7@3^7PYys?wH90CP|7oFZtZ4{gE{l`g@sLilR~MkOEdjbzTTSsH(E-DnbF z9u5dmUd}U~HqG%flfWe3Hrt;hvuwIQNfmXIc6i~G?`S}ty%g^$ zhkQ=$2q%@yt(SdrylZ7@8(ErK851??`<65jnknzHC-nEh8rpRqBlPx6R<}&GgnJ4^ z;;b8sp9)B5Z4arYup+nM%SBfvuGWh2OA}_Iutd6QeBdent}}}sn*AW=GW_9ZGEwry z|D~WaHsjMRzhVnShI&P1*qR`+zLUzWVuCvUU*Q*P7cHhIJyQhhV@qhSAC{vJMRTT; z#kS`%SXNr~JF|^ghLH6c!h2c#m@GZ0ivw5QyjBCMal;|!kP`*Mq#DrPZZ2kwCk#0I z#=Nu^>l|_mayBmA~bBj$u?7zN>P z!#~Cse`kh!?W7U&9u0^7!io_wQ9k?DXIi?}-%=yk84yuX4;N}VS-xBo>Wr;^tbNh5 zmbRS4RfC!8{#hAFu8Y{jM9Gq$RzmPy{%cTiq7p19exW?{gXshdkIXmzCuIX(Uf{F;3Hwio`^XmYK@X32|Kna8!p9~;EE3k#w(fNE?g z>cX_#eklBxMHTvxwwp`vba`f*CSXGZm>0WO&HjQ+xQ1Issj zv`wQJp>Ky!-Vw7ZCz=hv#VGya;GHWe9kBGcB~3at-I4d|XsUQu&30;CAk$4*tbUkN zKq~EHF{tnn|7=1ihY8r#6)T2p4!T=4xAD2oPev;H@=p}ip13mZctMlyUA`Q+)t)Zu zb7pHU>^ryb*E6)QGl#%ymqSn1pTrRJCxj@7*FrcGS%342`gj5$KXP!*f@5NW^ClMZ zX;+V;yIV)R_?>8ZUq=IvI+UD;`q$*7*LTYCRgb@@jabw!kLGvb*F{l{KxXw+PSS+b zP=Y_%j)0X^oXlml%Au#7M}f@o&cz+Pkmo7E30UD$`5gh+MOA8h?kkZ_c;!u7;gT8g zdmt1;_hO2N3P=F!Dgh*6^|ZmhAm?(GeS!N&h;u$mR7`gU^pL&twojJKav%qlM*|Xe ztYDykgbrWus~VE%7Vn-|D3%FnqYv>WjmZ^v?4UtI{(8AhuM#SPv=VP3rI}~mM5x9a zO<}J9_8ee%@lUj!)4(=i5NBsXyV0~P+NBiKG`bT%s4qoVaK4R>hD7f<-&Bw*)nUoADMgtVR>}PPsKo36;_2(vV<(2 zdtPRCUnAUIL`hzvg1q=7tANzI>-rSi1Qb8Jc(egs@*2u zlK+>@b$WSf4It5yiM#+DM>uv*P*`Bw{*V_c&u!w?5n*CUSc#4oZlN!4{-$MRdcA!? z??GiJFNk}V9_Zl2{0_-KWp?ZMa&}K3FhqjG_HQvgSz5|}-xBbxF@Aze&bhVaSyDus$8mI^tQy9-qv;81v>G;>S~IFVLF8mq_$hqh`d`euo3H`XMiH=M zp`ymJz>j!2%hB2?Bl7!J;r) z*gvB)eUNW$XJ)9do&KrXh|0&~i@8u#j#E*4PRw1=AZFv#`PwBvYgxraWwc@kqqYkx zEZ^^Z)hQlusk|}q6J5l(%~ddi{j5KQ&8l1SiybT(P%41d*@(X#^lNa== zcO@|lD!Jm(5XA{74$*N*LgvNF^Sc;JY1?1-B&<4e7MWf2ox`lk^#qkPN+UF*-(Rp7K&DVu>FJ->q8Z!Nvr*dEn}aHqQaf; zbIQ`41mK7`hGTk!%6fS%H<~yRCW+D6K1VmL`;Y8!b2?<@i)PAKoN)B=vp0DA3n+ce zgvcrG46Dea_cHrsYg0U`OLix2H-4~PSZLj?9^YBqaB_L*-H$%=&zvnEX6?xH4tSe4 ztT&Fe9c)C}6&vBK3UWKEjs{wf7mNgJ4^_*jgCcEdSZ=$gEyuOu4a$*<0_flfpRsK- zgvg|gx6_f1KL6E4w#BU%@~|}uqB@JkX>jYTCJG4yld1>S(z&-&8@ZW2={a(IP?E4P zHyY|v-A&81Z83NKU+DTz54>(lArZ}OBx~`twPqd*T23H_zU?%U9T?|$6T++)!`-Fb zgt4vRUi3&1yC?kE`ti}!0Qn<_x1wP0c$Le;tij&-Hg~x@MkR#3NJlL`&W5a_-x&1X zwZRMz3r@;^khSr-_!h!<4YI!S?2^L{gNi-k-~S0pk|Bx>19XI^a$N6k(9hV^yLjmR zY&b%EV3b-Z1sG&N&@NML3FRkUlgL2MK{$p$i8XLPi6Urn(-)UgI!RY+hLfOVZ^nM} zIlX#xm~@G&QHi9Z!756SnpKWFZfvQ8m27=qQ|LV^13DfMY2k^P*WSr<@oa{Sp545H zT=}?{L~o*B=y^{gIj0%HV&heo z5@&afY#mZ8c^;^Z;~a^l@Q1qr&?NO(xfDphUeY#j%nCJUW(WuI#!2KPqk~5 zh&%J0?6xC$x^~dsw25TS5%V^_I!D~ex+|gjV=r2sQWF+x#WZ$o!SP0m(#cF@MRPv| z>qRAU({+uQq_#R#IwTlx?CCbsg|Ir1btwG#J{OPoRd7G4hc9Lt1k7_#E*L6532fv2 zzlV|=o%l^|JLQwL$Kc>>y#TQ5?K+_ZzqUwcYx|$XMX_IIM2nG;RMAgFr2`jEBjp@+ zu_o#63ne~*W|CBf2&^LelH+?i)_m_{GGu0##%~)`Jcs@I4@u_{c-C7e(|Y&flf?w; z$1JSoN5_KML3;`8#=E!DG(4MDlr)9A!jhp9qXGUs_N&?In2ZYl4ty9f@rfPX#c?}j z9l|KWeT5bjdT<8x6{HmST4r^O5Lb$mn-&n&*A0AQ|4!mT{XyPQ37QrzodB1w1L56k za%A%tb^g`Cw#u_&Z;SQ_ZXQaUOl^^;=kk2jU2mNG!G*D67^za?7B2%SK-}Qfaaqes zA(ltgc%C0VJ8a>SI1pMv0IjJ2VZJ}9%bKg_Q0;8t z;=1!Hy8y;&;WeESMo31NecNW1Ahtc^x{LG9bK{WJ#nh&}R$p2E%Z4#FIg0v|!+X6` zr(lkT5g_$~1{~Cn4e@CNyi@6Bpa=&lJ12G zn8UbMxdIpX&|s~TNCqI9D0@a->!&eaEggqq*Km(EXBP+Ch-IM#s^XHLYfWm`yhU-(m&w$*;_Blshlsi4(?$GX^|nlIDDJ#-FY*mrw6D7LMLO~Ev%XBF zIkQ=E0wdTH2}>Vi1thi<+2*#Kr7=ec#l>TFL)&%Rqh70DcfZ+S#1wk0TzOr+`s?aB zW8^z(2QEu6tDzq^z*UhU>JG;)IK&Rv)KBsDikcG+JSTNO%DA@gFlA4F$PM~V3GU7g z?mO*lSAae3S#K0n{~02(x_hK0B+AS(>@xF{s=fLh8INnb)5o`? zTzdWd5}S^`m%eca;N&AP?H9OWwK48HM}m)pq6r;vfRr;1t~@SXx^{R9+th*vr|})% zq12P!Kgl{D9Im|SA~fr9OduS_1hyBpW z;v_zs__-f^j#e*-)V22K-4eRJFy0tB4^txWa>n1>Hu58yM~mz!B1vBwi{)b0mey(* zn+A-BUCE5ig*$|;LZ)Zi8aL>4UPPU^`Lf7)ok!ePggD_1%>QT)hXadAzj z>G9)4q|yII$dmmUx^Ip%zGA4W(5dhC4cCtts&6pQBo*J`^J!3df9-Qa?A5Wnj{N>q zmyIJG-F6{!rw?s#j}3D?2^aKQUysqbvV19EQ1YFL47rop!F9CStMK-YI*BY@8MyjD zJ`@SA12kK1D)5i2dQEXRse@_-omXX#K9{I2DJ`&ebVRUf6Zq0q3&PQLUtA*IB%S$GAf&FSDAkx^jRGiCj*SpW&u-I}^^9m^MHK z7a}>ZJ#B}vdQ3Z9FI;XjpDjFXmZiTV6=Qx*Z@*+#bu&bgE~EHXVAn$#8`|YUZt0pe zb1%1xsX?ggsoeMIoHLYlQYx(TF3h-PX=6QK0oExsopc882EXl%@lKnc)192hyT%uC z0#*;;w<4PR-Y@4b%=tXfmz7T4hEIxGQ}LS@pc@G{>GI@QQyCcUo%?ZUm@&z;xK#EL z{=>%lJKBzTg-*O~Do~o(Pw=Rj*6E&zC@Lk!+X^mgA3&*8^>Sx6zpjXN<&J?+B8-4% zTc4J;Y;zRFt>iufOW;z4wzZ<+2hHD+`n7wsd~b%>T@&^VhTPTIsJm))B$X13U=B`u zcZtvB!?Rk2&4-QnP{K}n-2zgg_Is{cV?md)(!g1GW9^H|d*Soj(4y8R=jdts%LC!^ z&vx4vTp)6GPJDF#;>r*R;zc7o6l{$`U8LLasEflQP;^ju)M-le1dn$<2+ zwS0WxXz!(94xa`7x=%-9j<(b;I+P%l!!QfdMsq>8Wl3-uWYXKi0*}NTp3mqb$QbUMr4ejs%O*Z1Aqm4uVdTLXTdY7 zU1qsaRPkebBkJH%!P0QeUF4QI;K^Napj=vz<*Sj=Tvcu6I$zM>evd7~XF=;p2KF*~ zuu;_rIWP3@#qqK+_znFjsfAVSO||qGDOnU$;9t(WSa12*5h>n&ZTI`$=>cT)&Mv;j z=t8&VkG~bD6(!gO-O6rMX*W4M z3XfxpbMxc3-NwiJqLzRh_sSNd6J{x!^39o2a(dP&t-`DSV{UxygL*=in8-TAgmhZk ztw6gQm#t5wY%JR&qEA|G{9({s6h0tuf1~Qy%k}YwZv*Z|_U>}ceR#Q=e1(lK34_lj zb9BipULKd zt$|%T`4=)UO$|Q^v8G0`nIZenk2vqIM`yjn(OGakZ4ABJg19V5J7kwOD$G8L_!47} z3ZhaX{kD6T?F2keu9i*xEShK{Uvt*Ilr= zkNhVmpIWgPdJ|c?Zwd8QpRlaH$9anmO*$zbGA!4|v{fCNUj*g2-RI`BTJ#f-j#LUH zJ6~Uk5CKN>jqwfTiNoQCe-XNvTru{!%z3afN6#358v!kqM1s8~>~8$B!a)+@c7M6{ zTvlh9+i(HTuO{SseGJGA`OuW{8Xd674$LJ*kDDo$yO#Z$=CoQpA&ajEn-v;-9a&c% z&cmK6){~Q_>RM*ElxhmQt@80K%AhTdiPr4`kVZTFnMBo@)pehUWv}EYW-Oc`u9!s@ zUArq(9N&#|gDbU#S3qgEq*qXQKw4hhZp3KGRTFd+d9l07Vi--_F!t4a^5i~-@R>*& zcBoU0oX8N^$ipnTc3ut9I+5YGAv^;AZ3-`kkkvheVlsTlL-1D|kiH^b{CC03ikRL4 z3|m=PrHtbi3@^=JqW{P=QUzrYP(m~|CeV9;EkUyGd0x@Bv{KL&xq~*GS_Pp9og~jG z4KYK^iN2r)8%zw9s3@>us7sT$m{Y`# zj6c!gQQ)HX4u4F#8^FJrG|A++_Z??k7 zOQKbv0CCw$9p@bQvoNR>73VY_v=v(qoEUX^($YDL{l+A-Qe}xuYxrOp&uvGwInI%j zc-Mlba-S(`EnGhvwqK|LLZ8T%E3B*(sa%=Sb%(zp#MnL%Fav7gD z@btX{e~S=Dhx8cxDb2FI%VK2&S@slOTm%~ zIGvJc;$50K;IELyK2$Ys0rZ5Xcsca}9JK_*Y2nk^yr2(KobHZ$GT$pf_MIjtQ;j<*6KHhVPwWU$;;nELFyQdE{Nomij1l#) z@nYMc`b?P?v*N9&54MG`12ppqdtMM-$XZ&M$-KgCQ)j1E*BhFHCn%H8XXx+O;o~xs z%Jmp0x|TF*q4bsy^@TI1)N*|gxg2i$~ahPG7+C}H}^pnwJppHik6js!K)E7 z$YI_cyDep3N4!ld&HM0wP)alO!{;NQPrnT4zTVC14*_R! z6lW^KS59oNiSNpOd@(kk`9D%dC{(Q#RMx+m*2iBkz<&TW;y?H#0?VcKe(J?o?%9i0 zgAL!SKoymAR>xXF1hlV#5;3_yTHwRlwQGW`6F^11DKmm;AC)}6W;pKMRZz(^gi;M~ zP@+Y<7OHpUi*9R1tajYJ*@x-U`cR;&+_3ST@cpCbau(<=fgF z!K&$;`mH3PB}R@uLDi7&;KbgXS6WT^HUVxL^S&HZB&>E(EPR7s(}f&k$cE}YrZdx< zy1L6hMo|j@gjxYK4Bm`6=(-aMpj)LWub&vJ5)^`MGs$<^4ygp4C3RjUG7PH~{ICo^ z`lkPki>n5nLtHUo@$WjArV-u-Rm6>tDDiY=7W=Y6m^3g@J50=5bbfP`z4?r9GnA?| z?S~NGsJPbaBEYg}#Sey#AGY89vgGnbz9Is0r;db&lb+-HEJ_z8v4A4B%NNIoq_N}{ zy3~)lwb2L0sI#YQsbY*F{w}Xb^8(I2W0Rx=(S(Nc-OqJsyH3{s;XjG1elIEd%o!)M zI}d;=o!WDE(EV|{ma0^K6Z>aAh-e(gh=WNwys&{hLkD)C7Xlxb5UKc*mg(| z(A5kb=zw2ix@pk&ScrAP%$J6XDmZk_q6#K}?WmeLyC9_^X?L~y_+zQ_)zsJjg%haH zVJVorfw0jk>d^K7idVUFt_>GkyamR7^YtKeaA$VRAJo*lkfLWrMs$|*}-}W*51S!saUbCP-vWtQm`@r(q|5x7OlJbZmt&^V_ra; zi8(pQf8flj6Ng$V^H#b3)QbWICzhcZ7G&_x_O@uQ1NNIvl$lPooOMj`dHF*8i>i3& zVqn{akF_aUcGs14SXohoebum)A+95;i?!j56MtW5Wa|A)U0h~{WYUe1ujt+-?@d2s z`gAK4>ZyxAc4sRRw!+*y!}JpbV3a8)QqfC=#9p27D7No_&WILqB8!o^x5=%}Y&rc4 zdtwy}M7kJ2dkmVb&!}?I+Xw4-9WLzQ&Skl7?FwiGGJxxH9}Nw%I`J z;(Lm&$Oic?Ht%TQ{-TQHf%oDGxaDwR_MLmFg`RyuV#$en#G#!l5EE+_p{7br7m=um zn?sr@4=Rr&I4^w4cy$wV(|UJYM`OmIdreU5GD}NmgCLqE@v*7?Mbl<>m2_yW9{j^% zWO3F_b5g^+ z&)qqfsfm*PJhf)W%`OmTDRO|gJ){Uy@RHS!Ce`p zfW@;l^KCG!xiuNK-9L{Eg zYD^W-TmqQ%Ko|bz!%#@Wx8Q$o9w4846-%DE@Mi#Wi89Op&GV9KU;s)NzEe7@=KZ%3 zAEg^=*D&c!BaT+nwvO^j^Ki!xA)D->neEC!S6O|qQ2R%XN#l{%Vua6VegJw=PE_H{ zFJCIt8Oearmje zxIc&8rQ6zw#&<^b?oGher4l)`*lhl5JqFGi*777s4YmTGEQBT#RrtX2N&Ws{klVBZ zrNC!4uDvt5CdsjwaPbZbxAH<06r4_gw;OBb{nKxVt4TytR4E$BlBt<=Z;p|2JArDRAgW;~CS^XD$@Zc?A)kK$AeB?~{yK8th(+Hrt zXNnl8=lknh%S$}7ojd2<5*k5>+fNfyQL{4mLsebjdquhf4UF0g01VyB#vT z=CV6d6E#(Jy-jo9omkPHp28k?74A6tjt%ALfgH0>l`W~o2ez0bHBKJnPPasnNzh&C zMBdCfLobo>^iZN~$wpTn(bm+kcJg)GG*SbA-@vCbk(0|Ue2i#KB3*cbgU2|q&As+3 zTF;>Edpe%DNoyVKlHVEnfLUyfU&N&tYFY8ZgzuYARcW``a`lqmS6Usi$t8P$bRMhb zph+c*-^_xN7%CV1olD)PkU-TtQB*8vhP(_l7cTQPKN*xw4|ZL#;zXy#tO~ zE4AfX5j*2%Of`M5yz9+SjdT|Q4RhA@e4WQ+9NpBsqt^Xpgy(E?A@n+ae+JWrsB*V1 zZ`?vGN9_2kO3q(dB`GcB_gzk1zvQPH+Zl>prnd zz4w~&H*H_8S%bD3zf_B^33-P^U6*(WLNtn+`ZE6^Fp%CMY>vXg1&8WEr0bAepz$7& z|N0nb@bC?z&fdc(@x**MLuZO=W3*F98y|0fJ_0OxWU7|-Fy+=1u4H)PNR#W==;|X# zdkBd#iMy=flyE!r{x#DTM8<`kl{B6>Jd@%skko!Pq3x3@U3x_2Yc;9!=Kq_N-*_A+uQ~ zox4cqP-4#!hL*xl3j%b;Bas8)<^Ldc-8y3*Z4+WC0{8Wg^aZCH*d0w6ilwqTP>-3{ zR)_Jj@8ACAtLaEf^o;hyIRT*6B?O%vF+v2lnJEKEFO15N@OnFP1?F_5MZ9n0MX>Hx z)~(I1&5R|%tV&sY87Qi-g&1UUH*RINW`?Yd@KEghs znQ{aHSbXhVx0iko9>pKoFxIvkXSB6#f8gUd=cg+x;ug0|GEPXiCZS0xBrnjbnK~@g zYoGb)XCdjmju90V7jhmUVxslm6s#@Vr(Sx9?ljlyL6K7n;xY$!-LtxDpa`7_ApM|r zCiK6R7#=Bk{Hy0-{qxLyNYb*nV^)FI8#iq!Og8zT3c2tnDFrgYS=L5(@hz!}bl;i` zU;KRR0mpl020-hYv;&@8l9%DQ?O6@S5QD7gXDy-2FPB)1z3usg2wrx4PcCeiRSWZ; zGD_K$d=_3}WPuXzvB#QmTFx1^NpvQ-l_x7B1-n2HB7f>!y zuvDa9H0R%;DKf}CxkBoE%yR*d1=A~hK5sz1DJwC{e#tzr_U6n^HFRjX&nZLPMtkDX z>Qp9yIX-qliE$o9{FGcl6gW?VD(6A&6o)Xk)n78Fu!=n?KJo)lno%Hm0f87?RIP{l z)a|~^^h#t&QY7~ed}l$XqAvYBWS7g3Q;bm)Lg;5S*o$ZcE~LapN&S6(jQXW0??TO9 zTA=H6ng63>f#OCP8m-*H-y3>((S-b*RDZ56W{EtG;JmKU13BH`QYC|Gg&XnjpeyZ6 zgVj42q@(J|sxgN}sXz{}E~4tdrHXqXvQG1cT%%W;!#0IIm4Bf^Rd49jWCeeLh|#~upXCm0f30oX=s0;vM9jd^zPJz%5h3A{6EANLFgGqXk%)OEaJ z{3oP|SIT0>hwh2;fAuRv zTOh$<*XY@vu{$e_k6%&6l7CqKqf6-prBAU;@|u}wIo7Hf`Dh*W9u*%h_GZJgehnZi zCGP+~#cf>llK@km^b43C`+wwzRvXgN=*w6HCV)ZH2P#RYHb^M3f3@V2y)|nWc`PLa zl#+~~PlQL%O19%dq{VdxGd+&w*KX}9)Qw_zlUblOY-W@mg$uhBlMSriKizd@&e()O zx15^spC2P$6_6&b4qbZ>#LjvlNq_cInDuUlS#6J*pG}i?$-59tQqNayj|$Va2{U4J znMLK-F=sX~{-GU2#m@ZKvZA{ue2%#oQM@=-9{g4$2lEG@Givrpu(p%YzaAm_#UvT zWxJ~+SQHt6dI^-w2a1>df1Cu`tyrYeh-2K3lM>$x_+1`Z950UUVS0VmJ+}W$1%;?G zYk`-~RyWT(v~BlwrQ-sq`2o9U&E9Y9;s=(hS|?sbl`7eWa}s&0e2IPQ#nPg5hJMV0W2fQ0|jx3Y$%2CB;Qi({~j#j(v!>-xX?nud6Wq>t)n zV>2u@%Ha2)s;YpchEi*HdG708<<;(TB89Cna>vSI6KqDb=?%|_UKhy_o{2oZnd@4N zd`ZfqZ{d;Bi?ZW+_s@1*#cLow%^!@1_DwnAgET;n5q-npQ&H#-EQckdy9uBAY~)$3 zfu*lMkD{zc%`4x4xs7izdK%V;Om4br9}T;U&)iYK(W1em#fe&!fI~?ZyD{Ju-O-o6 zCRE56Sb)Z-a-54Xz$#~B@e*3F@gP*myuN&DC6LYFWy2`Vt^qc6H+AgZVO{NdWb^ZzXNhC6yo zyGxJ_-Qo-Pto}4$e!!~syA7~k{i6fxlsIdo=HuKszNXRXF=N#PscSKj@p~eo?qmu% zBh?cm1`oQ+CGno?B47N{8wHCj4E+v>bO-&Pvc|`6zj8Juv z$F$R~Nc}AU3TXJ(CXrJPgi96JLSNki(E*$o6S=SV+U~DB#lCMpszBFZ-zYyAub1@V zqTlzdlVNCLdVgZze=t^M>!h}`JS{~fLFc-W)TAFi2Pghp8p$BCXQEo|e5}hzuzChHXFdC0={}cXv0vNSjQe^EGl1`)4i0@Hj3l&I zG!m>g2I*9p0s`~N@8f-nD!wpJRZ6H> z;r*5#LetSsXC6?3n}3j(#vYqf4x$|%0UpJdx5_b9kM9l1QhC0qgE@d7_kVJelfx<| z+~A9Bizy*uv+emeWT4|I)bJekEpl%3e`I8imr7IFs)3lz$jSl<***GEK)Z-O zdm_3jo}^AxXFOnSi?Lsnu7HFLngS}spn-YywHO$ET2?mA@C19KBhj!BmeDs;)3Gw> zUSDrCW_`6PvO8m!;88T}#v-h!!_7g=iDavLQvK^+p!NBp`&{NN>QjdwTjdkT4C+)+ zwxdeO|6M0Ts~yH4U1S6JwZyZIQt|Q^58zMHWl~dqwz#-HXa+msq{SQF&H?_TG)Epe zDG))ft~31zV^-(NKuq;o-SUoWHP(bsf2I8l7@*Chhz{YnH_^IU7f{?kuU&_<{O=1V z@4NC&WxI$ra6j3Y<2i|E4zG=FDq7injrC>85htHNcyFmCw_eQ6$CKt=#Vm~DT4Si~^_Q+Bsn88` z?cOYsoio0E=stES$Ody_Vk+BpQ2S1in)!dan+Or8Nu>F5tP-Bn198)$*SGVmt-dpW z8c>u%dp%VZku0qU89@j0sQO^qwT)0HF|+vA1Ob1m-9{66EU}QAId^e7V~Fogs%0_7 z#N1ZwqA>*c951@F?j!*;g5c%*)P3N2kQdDH^g}M_ZUtuoB@=3UrVO%~HJYVaNv8 zBK}p~;CF|MAscYB7DQpiTV1K=yG?+QGa}{?zvyRMWX%L(ro~7$mzd@zn zrg?-=RhW8th__+L3PoqWhS89%eEdkr3pkVT8Lw!$X0y6`AJU|Asv#f&@Ky8|fdsl{ zHrlVP8_ce&tP-rwy|GTH@QaA`iQtLdL+i}y$5lsIC;ax?+T@XcOSQw4p3KC^g-BER zvwLl6Lt!Q$PN~9Qa;T0^vCj;%N{}xX`dAx@qQ?pyp!B8^MAb1_1ur zFtWYn9a2VH?A1?4S|^JPDW8MgfZEp>C<2KMjooBiHnA~9KwmdM^1IjE`FM?(-wfK# z*?#p4sEj<_IJsbjC4}YmgoQA8PyD+%i&XmYAnZp}xK~_46-_qrG5u!ME!pZzZbkwFd^aoC!LN z5>1C(t#>u~n>Xhu<7W45>g{}qqi|-rTA%5Yb$R4DZ7^ISoqH<~+4&KoQ0kB}eHt{R z3+BsrcUEbh4$rhX4;rl6h~+`1m_wOUbL!`70qk0-C4gLlnD|Qlyou*JI-O@hOA=M= zd6=Xi7ZK?p+@8rcYe%z4sgv4fczf7bPPOl>wiTi z)IAr#AXWkr?7(;>Z_;P;*cR98P#&_`TUB5`*hen2gorpG8!12yhF&=e4M&m3o{!={ zG)9YKawFkg6WWtFJ)YXNwL}0GsA5c;>#5?f{_~mJJb@O}A%Fj2@a1#rOM!xG26*PJ z|AluWOS}0~ucxyXmBX-Y&_K1@XC?282HFhNOyo0$U&c@Fd?PyWk}}r0ruhkTfqrnN z_W7-s8!kY4N@P@s)#T0<2^m8626e#d`fZiBJA{OD{KtQ?&@L$)qC=rHy+QLIB38R| zYyZerKQCd^8n>2w$O>ALtd1Ijtzk+G+ma{sUiqN-{VBflbyKD_No;QW9k=E0wxX6{o(Wf7# zZpCQ;{A@}#8k*5wRB3gL)fLq(3Z%S4iB$jJx1*q|!Oi(x_;cPDdq;8oKKIFV+X#g2 zW1U;);UjoAM)J}v`RO*5I_a2-qE{MsBiC|Yt!(+#_5DAZTTx^b2Tqk+3Ei)|B4kCr zE!u{|QMAG*Y3B`1wifhSLhqo4uY``BsfjG_j{RAip<||8hxJGXl_Oo#Q<(1@KUAdr za^KdH5=>%**rd?4jIacdUC6ionaq5V2b}DvX-6@cQD^d(JSr&}QuYLeU`T>GqF}pu z+)Dqzvui6sSaid@VFfpY*JBSaw&tYalcatDnBY1 zQQyhK1s5*jCXV{<(cBQ4ifUEWT|Ja52A4ta80!o{qX-y7lra4GDyR01!aR235sZeK zgr;07b5U%|Pp4UKe_Sqw`QjuZtR`?6UV{qMM%~I)7S7=%Erv2qQ^FWdPs%BUSpXW| z8NdOapBgHPUV(skExyRgwUR0mwBXnMPokGk0DA$Q+IbW+GRlX64)=Da4=l6jEeyfW z(`dVCosiX(bUk?Tu8Hz7$j-xj}!*8`!N)b<$E zqX=dhQQLXJLoG#|{&e<>dYXoTN$MNQX9{Ah99A(-=8T$F4(%1U-5!F|jN=CKsaaoi zeDah~R|_zs@}Y#M`5bHfj~7Q=YoS|Buh0V|&H;UZz|)*e+`zHU)8>r;`SXZHM2*_gjoaP$#bUNqo0&h(-0GXj? z*pXexlX3sOPe^!S2o#~r$)W#BnYtng?l=2=So?n4@6npMLBU7DHlhk4slDwC zi?gm-8kFV+L68K_mv=M>(t7bwyG*y$o|*l8lJQw5NW8C03=CTDNJgzd_VkPkwOEaT z@nd{<$M_B|Gk_C7&amVuX*XaZ82Tj?>Y& z^CK|N?c?fR=xyA#{^Ms%Tdv~#O_=M0>JYB;8-^lOLydl%7++DdO)>b>!|g`JR}OU6 zgKfE$*&}s*P5Yz-$X@UUSx_{HiuX|zg)3tT9;%Si}gHscH3CzLbLQ3}G=aiAl#T_Ik z@rU^xB>Y@I*THZAsHk;LZH~dro3qfQ4*3!MBcWUj=qRb;y--~CIsX95gc|Eh5o9|? zw1K_iP!4p+1NalsJtVklAnSj8mNYrdo-tIQMdj70Mw{z**`L<}%I&`!UPP5@R7EKQ z;D5l2=xtjM>&-0HQ!4EXjzXr*#RM{tm(KkKT6zl=F0zuVstH#VY=2qN6*w!{&KHmj z@@@x+*eGvV0S<>R!=Mg~Y?pN^re?FuBb2mO%|ttT;wJlA$aZfBls$m~Ln`C>BJkGG zL})cY{R8`q+Q>BBxaGb^gvb$XPGkrtiZ;ZjL>Su~I}E3$8^T}@|Lc}haDR|FS4~;> za~atV{)GwEA~skhRH2P?t-Ks&TAV#OecKokRZ_}jn9HBVPt$-L{LRAO_%Na z4XT`SZ0zc~bH!H{RDg*-H=BR5E6R-ss5x9t(P*6hOAj)W;zu# zqf-lPmhzDi=Q%8BoK)jcM+vZ@Xw1mvsKO`h;|=`(Y6b5hc_XK|rofeOjk6hyo!B3CJDJwfz<5$s zkBk_9)T_ifT+lnETb>7iNr*wg4FoOo@ivm3OMOM3wCa{?SC8 zW1@Sxg$g3EM7T8zJntxU>_(VZ)5Y{iw4*y z*7(y!gJLMVh*}N(*22hJ{!tdW{?bu(5L7bMy_^yI{$khSPE>JLIq~hflc3ybV!rp6 zZ(^uz33a{v3I0?dEjrHa^$L^@+zwN7gZ46D=#%+o7jkF-&`;M@u|Sf z>{u_n-+E{{O~QscV3OKN3&HXtg0b55hc2INUQwH%xC-Rn>`W7}+%h~h3JEsS=N9AN zeOMDwYF-jN>w2n=_x%prEyYC|Ek}ewWZR<4`k+4cl=NZ3T~=a>E7 zpaUkg+=4!gjYI`Nx%bcxXTZt!(R}i9e%`+dtz4UPL@sJQjG~J4Fgiu=nh3QIb`E>) z+XnrjUrR}ou798&ec^t5oqN9Kg437BaUGVgd|m)OgVcE(6Iqzp#L&&=#4VtQi^h!Z&d z_jkGY2U1lmQVd(qa?-m1WwhH2iO=RagYBK~^FO%1@QufsWNF1#J=*c|JpCG^ zig)Wo+61gTzwc-^ft0xo*=S>ualXX3rkq^e!T9f@;Th z&6In)Z68Rh1n?n06W?O{i zMnxv5JlFcE_yz_rI~kIpRNA$mBvL0s9iWC5iOuJ}99dA(uhmX-VqT6vl0mx7&%!T?TL15wSpJed38NKbeWWF5CehAB|s2hr@|L>{VYx z1-?{49+~+`M%bvxq`sHUxF+$O6*xoX`#Q4`s67J>CJ5;aJ@L-iB&)WHP~^TjjX*`{ z(>Eo(4L^SSKXqd0!cD0j!S|PiBF#KkQP^elNnb9(lE&z`am8wgs$x#iA=a*yP$wq& zzUP7)!)Y7=PQX9zTs@sMuPJ3LXZO zFRp7AfIb4%76dBofI88NRwpjwFYowdn7D=T4u&gs6`N;e)QVVz)ah{`Ez5po^^jbn zJ|Q4DAspARPDsd$)Q7?=p+b8C^^l~RjA2G`@17qOLUt)%QghDfV3nu|i>MLeV}$p& z!25aSlZ)IP`;|9c=nA_m(~3GIRV8XPPtNY@Jen|%eHpIL*RaY)r77pJ)D&X6wF{Zh zejBb2>6?#BT)4hMgX-Jg{s~Z=LqkNyHv_x3oQL!muA+J;*B+mHZ;LwgC3@9*{Uq3D zD1uQl3OZST|4TbS^EzK6j9X7uX@+q4{6kK-xKM)uBPA+T<0^YP`$7U8a3ToR3-;F9 zCyL;`50j|+I8$lWuAP_i|Hyjlu&CDWeOUCED1(L4j*18p(j|jBiYN$5h_tkTfONAJ zg+V2yTbdb47(y6_Oml}_Ug zYas#7iWRIoe#y#P;KLW63>nFYxTvynFr*pOH~!n^Ytvtysa+ya4oA_H6Q44Go$`A` z5%a*^X>@sL%*kKxb?lEM-aI zHjEIo@Xl2ZggYRgm8uVWeS@hKh)>;m<3N}&aUd)dudEzbcP#9c20ckY^2)gRSO5Ic z2x-^Cs6`+d?m@KgHAMZR4TbF|fv<-1@=FH?=ZtnM7m515CMV&(CWy_1?b{lzu0X=Li2}WPC5YcOO z%P$+*eitpJ6aP%6m+eHMU{?p0lQ6)vhM%=xpGRAyvC zAgmiW&dm3zJ^aL;J@Z0EN5;}8Ig`)D*SOWsGPP`zPS9k7mUn!@qdc!koO>8IcQ%Y zr&ptEC~3?}11UX}Rc z58#rZU%oDAfq)fJ*LQAw1X`&D6ZDm?F3(^g=DnQ>*Awr4z2W~5jM3Q>qx*-d<*b6n zZ=RAdy zK@LD2ezVhrj>2*P6Nr2{hx>Py9^&q=-c`nnzU|J5hq;e?ntxI&c9v`Hpz+g^#Hy{6 zFCz*XqNHY3FaV*)NuhwoSDtIRc~$sdd|tt2iC=!XJGBCt+?`GXh&^t^E-oMhNRjAP z(;?M-Uxc(P7bKp4G*z5qa))US^VJ!71wixoFBv9#%`$HEw0rfb_ws0w|A!3&f`HBQ zQR97*BDIA_TTAN2lGqin6e9q;R*)0AI52@<|KFV;%>=Z!R>PKp-jn#3ETFV8lNWpA zPCQLyZRRfmIr!DIGlQ&ER&pf%8NAShm;8lCPEb);`jdwoxkR;864a zPfkb?P#Up1XkHvfY2fhk^S{Du`OFKJ0tT9mh9rJ##$cjh<6pe*qaehKM^J&uNo|ot zLt#^})?sr)(UtYL+*34b2V&pZiKaj$j3W8pt_%96es^$`mUUbjtjoxrtEP-t0_~K4 z)d0N*2VZ|A8rs*+vP2w&89UJhKwWGD9#jhJn1P{5DUXd9`57VDelfyLMnHHg-HtWz zW75zNmyNTny>B<|N9r|f5GrVB<+<6i-^Ryph1%Y5ph(FB-K%Kzh2NUam(WK1mkF~Q z-_bv!1COB4T^DY7vkVMemRZT_6A}i*I_l;Ce!{PP(mEksSE%0^1k!4zPjr$0c?JK7ATpf_wJ`) z2iln?fZMT#3lpEC>x z3*Vk6c`gkQiwEMQBS%&Uy-^Zq*vo!$j9Hu;@CP5xNg@ZJO*3TkdVyLu7|8LvWn(?y z1(=CIf_gDM(Gn(?aWJ_GiLYt}^M<_d{}p3a_m3Q92cm9WB|d5}wQY|_{#&eDnlqCw z+pY>1@pDyB&PQpAqeszJ9MnK4A#g)c(7+d`#{LI$PbrS}w*?yEIt{P>#2Jn|8>z|{ z0w9wY4Fvb^K(brk(96VZpb3b7bs3p#s+hBo)n}R7;Jgkww`o)d9 zHc2qJ5~f*o$kSe6ZsboXx zpW%=IG_(~;s5gqWOFZwj0iE-Ip>qFq5RGjHkkNqdKygriMu`2HAeKCM6EqSBQ?3u{ zS<stu|{df!viO2lR$=H>5ca&`SN^YT8O1nfL2By$Vdd0LoCmM>gy=3HJZMX(VF($xA1`ty==qqZ4W%6G1tP1=`V-$`>fXFD3`0qz!<;-9(K+>#C zGaw78sJ`TbV|F;-TM`7?g2M{GgPu5h^hJtRUY=kQkZx&$wencgmAFxMi53fUTqr($ zb8#J`qE4Ea`>SB=JWz5Y2{^jj{ShtX*Vr$-sn_WmM1^q0{-DC>^9I(#ejW_03)qR zN?3#-;9q%!QVf;9nXg%60Icvt=P&nD%9+crynd8;FMFpuu9-`W-(-O2Zf0piQ<5TiWENuw%| zGfu>Qy3S|N!=F+2k@9Q_;<1D@{ z;=%tM+2kqVW}2W4DwX1_C=*8u{O0r32@b9{TWI*R%`H~<+7bIt&D#G)K;i0(ug%`L z0s7(3-L#~B{b(Q{d5xb?w$|RLioDVfplO7&X(_$*C!Z_>z@Zy602yL$ za$qt+&W!pUwl-soNePrHYJ5K=h``V*L-LZTyB%h>^P@$-9MK)9e8U-;zy*`rp_ z?!Dgp%Qd-)wNBXyssVJY9H^NollGld-ZQV6?m2eXDTTHtnpp@QcH%htc3%YB8roN}a8VI?^Q6^($0JnD3%5XB*1&XIfUS^K*|V z)|)n7tcmvOVeWkGPA?Ni&N2F+NidRz=iYvFWL^kGaD&tJ+-R@6WO-0Y>f04C^||!H z$1Bo>!i2LPFQFY)bJdSbMIWz`?B3r1@{FfzmcM3B@AO_dPxUWfaQ@|>9b7LX>%rpi z3;SPFeK}{_fmu)jfL3y((#{uDxkj~)_~(V5QHw&;7}M_=2|?X9Dwu?oo78ugWw`4H z2h{wh$0X$oQD90&*Qrf2X`{1R?6z4-Dln}q6(H?ykhjIWiSqrXl3gDqW7m*@UEy*J z*VM!zmvgMS%^RKFgmv0L3+#AkSB}Mi9qFgq6XI^m4L6{omJnoKz>u_9qheEAb4HL%~BW71XDABnn?G~;%pwbe3kU{}dOmI^_?6F6KkQnif& zT_O?CX;H8B0PSS7mg8w#6$6JwB$uxoc05=r;?^0iU9-jIwfJ=OZgENUdca$?yQ=4I zoo2n*q6G+nlKIymm(Gm%3zmz<1Fu$g@N7+AU;hi9fSUV*;3v|LY$^vWqYYyj8@aKF zZac=9Zg+0-*lhWWzVs_#L<8lPPB!xALK8HN{Fm_P#}1*7ORX?chVzhB?r=HP!73or$kuVQ&;YXg_ z`1*P(9#wuFXig+OWA`Y^RNv;W#GIK|;sZaQqk><-Et^GD5>w6npq=k*<7jCkOu{$J zXF*hvsr&}W={UN0^*5^x%Z{%HDC(i^H2*^1>3L!w9DvBtG;&-(in&LrfYF&{X1*J= zx85MILO?FXrdDSd9jpe;pbI3&(SAN^ci$j5*y=DZT&gi!%iKc8jh6U2Yq$CB6Vwf! z{DeH6b$g1}x&kmuHfr#%`%t76GG=aVet`T|xZrnOzD2L{91u=1xXIZ%d zlSj(0+N8Y|gLn)}=%j8P1k}}w?qA7lQTY`ZA8@7cm-%VS3zFKtZ_U}EMp@SdEH89m zUeM#;i-Q_dCFVwC-L(lKyMuk)SCy}Q?55QRjtvZu#YSj*q&3Dmza$x-%Z>GBJt3b{bG&}}N4RkYeZ<#GZ+gg=AbSye~uGOLZAb4u3&Fn)39dKEcTSzzeL0M-EBSvEXY8>%O~Gwy(qAK*j<9UadSfSE$3(3 zIuF-f-oBcB1Ay>KdsWh7+~_ChDtn2H$_QtXvMmvXuwDjr@qTP4RKg)NfiG4}^~ zH`C2Pp2-PfE3o|=fvGygIL2PH1ik8vVas9cPc3m-n#$@{Q13% zjELhKtUJ19m!4B)5CA%+bTCXvMtJs#dZv}%Q ziDnl$uH$f31_jNeM;2Jg(B-v08`vZ^;SuJD7gFuWR#J@ z!l7}H)dJQ=jA60S!JebW^xrI{`o?);#A!o&BP1TXbGKKx7Y zn_443`vm%d={+ju=lKstPUFUd{hQ(pBV*%VgC-t_Z0pdeVyY~acV7tOp>)Nj?y6wl z6BWp8(BRNL8+_Uj{|~UlTU~X;>I54xv}&iUKJ?o?^>b{ZPFZRX z9|*MLMwP<^C6lY6W8#D4L>YONB$wtJT;jkA&G|JX$**4hsMIi<25OT}Ok8h+rMc+D zs`%k6JpjK7dHaoprp#5YeN;+@wqK0XpNY}z;1p8{v`}v3;+rltt=}i4X|!H7v0yLt z9ml5;S|4qCExq6Ujil+u_ibT&IlA#-I!)fZplDLkW#Qv~`7;A%*T%gXsxqqh;fqH_lWqfMpCF`8T3Qp!)7Lk=?y zgO!vVsi9ZpN<5g#z!n1rsbUQ5mD{NP+MVxQjY)bZtVyNg3zK!C#9uLCt?%ZXStp~nhG@5?f?f-!&Uxl zNauqCn8b*uRaitG#lLSXw6!e?J2{mFx(O+}!E9VNz(F)wjxCilRFeZAX80r)4ojit zXwU|SN;>f_n8EztVR!m(CQ{wovT;T9#lOND@)=3k&lw3bC4*pWNRmdg>r*fQmB{Ej}XR@6)EIqraT7 zweGeDdsEO?xf$i1Mc{YXpaZcG1nkk)S}uCikVQ5HVS+9ee=Bk;Ycz6B;5ab!C z8hu{Kt~i{0-Z^G*^6_QXkJr;DA=i7~fnAvgYi}O5N(6hoLr$2uyn@$c!}5>U;7Sv0 zpwFvCl7SyowZ>K9t1qt9-DuC539~4W=P?OeRZFYGde~A!ky>T-uf-#4-uia&w(?7y zu>%vQ_k7-9HI{+LoV7Y2R-zi)Qhaid_tNuf?EAbqTlyTGO5o#ic&}8D@yeB?x;A6; zcf_!hZDYzRJ>$x1AhxIm1bgAs2X$($WpYj7DuScRcYDA;8wC)RYKKW|pL0i<>G>I1 zL%5Yrx$u$zHG##)N#=K_IV2sr8NtBrw_ZVS3H|0f|7`cqSGKsn=?dwe^RSf_Dl7** z%`!1%z2*_j?+>wlZ|Q*TAO&Y?S$m!5SSWFDt3L~vA8&A-CW}CRJ!0q^W^{dP0-Wf~ zf&;B$I(j6f1*P}?+-#2o#O4<9qvMIhwgT&NzW+XEjBH6GeL2i z0;B5RG(?Jvuhk?0g@VK^^B0E)-f`Q;80N``>}^AK;|R*Suf;5Bl9XnYPlNDYO(Ik2 z?3AAfXF^db-MA%D9RH6KhSd^xP2x$Y!i=&2+{X`AKJQoT=>||mfKFi^CAV+Kxi$4G zg`9GpPxCN*K*o|!=L6-&LS-A-S2{ea4rpCNl#1|_a1jS(o42i_DLr%^KihN zTic6kv$wUF_O}#hWL3sW{4n&wsOK_S5)&(83AZgxCW}tDfr1bv?kS_iT)+#{OtG!? z<%3903j#-7p*gu1&TD;LG# zU=BX8@{eN$>q!&{C)Z>h#gAKb%KLKjvF?Z6>WX$sZRh$VEk>|ktGA$?-l3#W$+SLn zB}mNcVG4LqBLNHoa4cXn`^mIV)|6qCw@eGlWgHews^r2aege7vAIC)waISVa3{w3* z9jd8qOH5n%i5|1uUSrzeYqUv~a!E7Hr|TG(pR>^Yw)7J2y#^w8B$F#=`$o+;?5V|z z!cvv@Y-0}M7PY5ZIU_T|QKb9}_$K{=i+Dj6aA9|f)44xEMU2#~l+`Y=bXPYj5@C&lmj^m=qqgOrYgM?G=jPY>48JFyxsw z_Q2_7BwK#sCz=sB1bYPS1vmS`#!Fu-`tYzW)qn9xwFgPkNfVpIrRS)x2r3r-8v{cr zj&7&0DArsltT<$Pt_@5!rUXV?Y^XaC`KY(2KB8C^;R~e$zKfCdVx)_y?#|jFu);>} z`);~c2g1`VjMSrKqLe;7Z(Jw;jHqY$=?`S{pkK;oiruGHHfuvY*(6h2ZWmp8sfL{R1}ser47FIx8szOoF&1Iq8O8b<^ry7pY=vE0N? zeD}<O*`b*~$A!1u31e z!)Sg9`@91Xuql56oR-zfQ(&s~jpV`f4!7uGblQrOT^LPCjmG5rDV{~-#fOI-Gj&;7 z3ME$L>GrJS7{^PU{Q2!uthd?P(h175bhdVO;J~MUQj@QqeT5Qv*8+}JI5qWOL0#4d zw-sz~25ja(5CY_qn!T_@#i{^A{q4@lO4rWbgk9(6cahuhYHCq4;%(-AQ>bE`#^;i9 z`F`B7XhS-NM*fTaiVfUdCvgt*GRxjVM(~1S9_RYevc~lz5-@D-LaBJn=h{x1)~Ai{ z24vBQ)^Q0&8-ko1!`uSScDB~gt4clhOg3>2@)0tUC`pb#^`QA>s4hStbU{v4qb413 zH~LCj1p^*Ln%wx8p(m&O=-%%IGDBQJBZBzL9pTI%#^g5x*J5t@EbFPh7Z@;wFd^#K zS>y89g~pW;@Y;v7Yt71j#%u^*t8T`DRA?gdr6aVVB3~wO-GH}J1M%_l$*DvI1t?- z?^-TBpFdmQTecMFDQ{R?_x1T_0xNOtkdFW1+VY~0U z!Vl_ENt5RUMmuaKpnjQulRpK?4uBJBIb6UQ-DL*xZs2g#53F5?`(zL~|JrgfB-Uh_ zWbs9HrA%re`05F{*I?7e*35Fhn2o9UKBIP72tQ`_;j#&ohO4}NmmS~aRonl7^;!J$ zL&0-t^W6FM(oX(L1fjD@+1SNCav68-EF*H#HQn%1+JghorHl<%c>ijWc<6*PP4<1g zk-6;VPVj%oiDK+D)a1N2xi!-!6hxnV59lQr9#-hrS+_%N@Ays>H$~KU=A5y7e)v-z zMlSuadK@jqEM<||O25D4aCA~1>a_5Fn0i(uOLia6K`oR)gMqXOXM9`K=_~}*9!Byl z8(N+sv0f_}7?(3zDp64L$YE^W-T7B3A&=h!1ixS=81-22mqlJ9=)LH8zj{pT`}<^c zh?~Tjn0gkQQ@MdGddTNbR&*?}`qzUT)_3w2SX=NV1ll?jSX%`;OD2I&)?aV9Xe_0I>cGvLpNo9<@TD^Rsxnst0H~o4LJHUR|RZT9TEt|2tWe&^nrh&eyx;MMhzCe}wv!Ou@u)2^ryNWt zBhgvLt@>LCT}*OZ!|0I{a6?viGV|;FG`sU4hKOzywP#yhQZI~BWijvA7|Cop>e|gjq zLe<&DHYHmRJECOorRA%orGw_pv|sxg&Zb{^g*m|Fc_sm=xm@#*fx9Og1|J;MI@>qVtCH$ihsut#JPw(udGOCA{c)v;xm5XXuek`rd zwWpp2qvd;)J#IucsRABRUtQnHpMmX|7321#Yy>^m9DfzH9RN=D+{ZM!7Q$a>?W9~f zC3Y$a1NNVF@JkqTZDk$xEoA&K*=Jnq=;XbRq40FOoRU&0Ki`agO8pLbHaRV?P z&Vut2X#OQOwOv_OM)(3hF8rU|{`O#&yB$!GFu9gmuVl`EnT?X)e%nCLSg(}H0J2}9 zsA>?n4siWRZ=fa@@FglhMyWMq__h6kTDL>9=sSD=vJrXO zQvvWe@JC88^421SY*_?V#S*yTDM4~f-+w3Z@Ki_>mzuRMn|n6ahCOuUdk6Je6lslz z>yCxMXmue^1@UUxdMv^CfcOOZI*o2y74o9_2#j=xl_P62e9^UZF7s=_-TnO3;0xi{ zlmb?tu#)j>?Mv*k={%=~qEUP94Z%o#P(0kCz){OGHv!-IIxO^j4e#pyyU$MO3xe4XFzhlDz%$Z3F3~?!2 zcGGa0L#%z|V;0!c{kPe}#y&>lWK?U@7a1=_QVBs6sOV+SX&yV=*l_gp-A<}R#`&{a z5oJL(xW79ZMn$2I9Ga=(!ZlbUSnefga1?j^e*gpp7Ih?yT%QW-w&fhTT-U=5JPbzO z^~|3v0!VUd-Ki39Ukg@U7jOU8!UNwu`VO=goha{{S9t85t< z1+A);c!s8xjf-Aor4fgJqN`!_EM&dukd?X@O@{T6`jx0rC?YAJh}rPm zZwkyT#qRO0(;9%(v$$THhYw8@?vb(ds&aP3l>*qFjv-$CkK^=O_k)$wIN z$3var4{^uwuK+k#uaiYtJC4kD4 z#BN}WAwTTJ;O~Ri4+Xm}M*^n0yC+^w!(ik0iK8S-hSd&%5e3`)>X{p7TEN7Fm(C#u zhkm+0V9HIJ;vhU};kI>?K)m|{k>a4H(4N*0k!FlU*D+CpV8SIP>0xY*%9-JkzW2~C8kKt`>{IXane!RzR$FHZxs(La~ z$x!&L7T>RLzySSz8+HGHx8ds2$!Q!hGAwGKsNxHGzR!B@^b*LV{K<%1I$0tv5MM^R zTo!BJ-x^OCRURVcHro|a2c?4l6P_f!9|uI3cj)Ky_D}SsT@>|w)$~m!IL=LjuEV{u z>Tp0w9TT3%ID+Fvso<*~Aa7~T^c_x%PQtmyoU*@=k)WBxliNqZAy7a;yRKwMI6YkG z_{b)@dZhWCK7J$MjdqJ0(WvUeCt(^Y6T^Q%wBreAYx!0(mi$#2HEKqRhL_mxK4j8M zddT!U*)Db*(GhKsd@p2V7ic(m0h)a9N!ubX80u%r#prkfdVig(0NkpGt1(IF9h~G%p8$^v&BJy2U&xftm9g!z^Ch4Rww~)({;))LUsC{Wxp{jNxz|l`b z0^>Ao^!y<#ZAJ$Df-s&dWgC9zCq=5zwUzj*5nIZI{vffZ>*uV*F^`a4;#QVmN}B?%IOoyNjnK8ml3mXJira0Jt>Mt1O|wM9 zOU!&wCO1*qpIe=4`Sw%#W+d4jPOOK2x|RZ+d^VbR#zrnE^+Dk+zEpL!9;aH*Vz5*+ za7AqP>!L}DN_9>VqN7j03#a1JfRIB^IWhsHQH(GLu0t|7Tq)VDjBlAe?F0A|D0PP` z0VvF|ItKNn4%^~J$6cW%5FtcUq|*|hqyqcq6IMr_%WqHvUFdYtijR3`97ODJN!#(Y z(5%DG$g|)njXim82Imtf*^;W#4BN#D)4$X6^ zrMx-r=UD@oSAJg5#`LO}?# zO9p}u_+Q721NUFn-c`EgoRdF4B00J25FUO0QwMC=;alci1o6ZoG9$TF7F+L5KBcg3gn9}?)r~;5^v+7s)~LYN_c+s0eoKXU zovtT#w>O`PaHrND6HhFM61hOaFWH)LwHH}*r;<1*wcRq~v&qshAy8(acEWz&<{&E= z&NftY3t)N^6PUK|L}qIa(QU0dl%+x%A)AX;k@%yn*o2DbASgo>gXYjyKWQiZr}zZF zI`23$dG9I&K%Y5h&-X_ESbo}Kl4}sJ>Tu@A?}X@t97M@wS%_X8V9X0dfB?~Z>iUApn69xK26+_v$+8Lf?gAU6<_ zDghioVF}ss{f&dY02o^tdyr-sS}C)fMPE@NfNd0l5bFZ7kI!j5vO&iLPwB#8phks3^KWwRh?@x=or|QSSxkBg163|Tp9%R zK8Eo9z&vD;2KlMiod}O&qq(#eleXJ9>K?itNt}@tfr_NniU z9-N)Bv1fqfkl_a1BDb4WSQEhYHVFO$L(X6xLy55i!8VbJXnzfiPp!U<-n$uK8bGOh zxPLz9?OcCW0t#H;6@a#aw*)H$K13Om4fk6RVl=<@o&`1bJ3ZhZK9g64QboTa`tZOY zIP_DPVBZ`kfPpWXgV`nU4g+J!@Zc>^krXPP@_;?I6q4t&35M=Ce10Uf7q)K%Fr_*j zShOhQ%5??K1Fog7(K+}#5UOVt$h5Umolep;s3h$cGJYpM(RFa<~FPiK=LaFt8 z15@QcKID4DntqYNwYnVC+RWQe5)J3Qx4cRG@8M(N>Pc|fB>I)w2)clUXbARqS-yT7 zLMZJ^HSXMCU2`mGzG#)m^2{2zR0{Z_o5x#5d*ZJM8ByDT z=<42k2aG>yGI&FiIWq*HD9S8F!m50h@3Tt#!54rXpw}=Gvdr#AXuMt8TQUl$=}L7y zsLvt;kA<-O_4|uA?I+B=1LyUqP3OOTZ!Jj<1-oGJgF0l z#{3EL!Uxo zmDhl=UNODn$d>HfzEAZFbcxU?(ZRKPTUiY?T991fT3z~g zeZkQA5E$^Q^QF=ik~x>2iO_8$(*}C6ABM4yMPzkyW(*GWluarDHBV5l1vNYI3_yw* z;~z$`e*e;h@o_NYV{Mr)yIqgD3Vb1@;G(pXfS@w+1st|Nmc>Uh?VWGO`w| zEHQaE_u#y)5=4Z769pu`(_;XkSSU|AQOF2g+Hce(IAZ%oVJcu_Zoocb{1PEoAyCD( zJ>1+M!Pg@B+ydadNzTR#1husHiA_9H_m<~i$_Y%R4)9|C2VA{Q8ei{tlx~r7H0R^1 z%(=MN!m+0uTe{w_o*094eyZpfNTJGQL>`pb__il@Cxptrfs{gC&Em#h%0gQ>OHANm0>^l$^6p@is2g=jyvbzwCEL4S?LL{F%TYEnEX z8w6=XM=9X|7z1T_&KfJadjIFa7iz6>s!X>fkFP8_^PDTTmSqC&33s@6nH(y}8qz{-H*YLODlTRUMuDgH&v(BxW*%r!F+YECNUPc|Emp z1IQ1M1ZqzE)U>{q{mq2;2pdXOt1XLhq&V6zlQ5agqZyrQonNpiE$mH*RsPgf>QzwT=;cj#i=DavGcBA zc150=OUCxl40ZoGl?DIPCrQs}xL&N)Rh%QN#*R#9FhiUxE?x z?~&O6WAtz23v%BGqEk2%dn<|2PeLd^L*in0cM1361cxqp^>(M$cUo|-4Q4E*RWEukO>rLFp?8Ez8@!mVumsJ+=6;(!#toPC@0^b_-hG?manr`ZgM{ zr=mLh9=3aT4G9bshNaMK|CmtjHjPp;Yy+4Wg?Cb09!M+E+D_rTI5f$qSnP@jw zA($$TT@q7~c9U00mKb1?jC7N?>w!yLFM>%R2~F@=2~dhL*!X>M57_{juMMki1ogpe z3p%2G9PUhUPk#oY8wv%{!fOIQVH`jLP7O21iF1IYLeg>k;6QkoQ9$HN{F?}j%mAjW z$uw`AN`!@bwR~Lh%ff4W@q!%qRY7GvcpdR9tKYW!Ey@zdKo>Mo>EYL2l{TPTxwq&* zcOP)R(`SkH`H4AWYO3b;=ofnJS_k$RgDd1MlZbE<^sn2X9pxVe!4gxdVX3VP ze>4KymSSbGm+btipG&Y^jx7A~>BZqHq)#FH;g$~4ub-|hQ4!sbeVI*#e(#eeGHs-;K$%u`^6*3u zbJ`3S8vO=nbus&^`qpidsI+#zRG0Y3bQ-VMJA=06AD;kk9ApQ>3u~h{9qESk@25st ziyJO;L3hR<{64g1ognWVVKV>=SR_-eE5SmM?q{(NXz$hS!X2Cq=S&W7h&sL31D~lAPjswCt z45WnDI10uIv+4oX#v^}qJcz*utHKc+#ATli+Pmi90~F)EY~`)nQI3R9tf9Q|Kwa9L z$)n{wMy^4a^}GH0^KP)egKpHET|z2kzcg4Atk-kMg&suJR{`N%ukN@g){9#IczRXp zxQ3dvJhWE4wK=`mmHxs-y`|~xfr#Pq$>K1MSuiXDuv9j0>obAC_3S+F2u+4M_KLg<+e zK*xb+5+%M`Sbyp0LR1bc&1Sw9;wBRx@(%`-BJFsUxhbY#%U3KDWSS#Yo%aw;lRrq?0y$`6bbswfAPW=;pixXDz`nuNEf z-Z3$JD?|b|n^=zYO^CKZSXD#P?0$OV7|k%5UeULYS;2Cqjx$duGKV&83{0-`p zBLVe(rnCP7aC*<{ItF{TeGpTU$nI}4$!q93fhrSyi+aycQipz}{Nvr;b8vSGzf$a`UNK1bnpCb39>hkXQN5v!9 zw8}nqff1Xy+Rxh$cd1j0_VJONQsiR2?hBm6R`s!)6%;kaHK=N;i{zWkB@XLzf6$Ov zGzdC259xRRn1vGiU6%{}VIcf?t^G@8juFU?`$Lpnl41L+IV>{)ETMr0mSQ+PJLkN7 zxXcplZg7eyP3<=#6~hIBJ0yid?zw28XVRPQy~&46P3I5gQ*r|$4X+WRzsU4oVLZlf zZlI4v+`YD8HeR3N>{rGmsEho97mGtHG9Of^FsmpUeb5a}IZ&_jf)8?;?4oM}1{gpa zl$0PRw4y;=u>dC6RB=hMJ-)hvak3s*rtI^K9usUz+m6TOCQ*}*v)?8lzRKL0bt*>NgdVJQXJr4t;nYT~PJ z_f0ZYO z2id6Pub(FpM) zBcl3h%edF*&llHz9LGz!TUuA?R|&3V6BOv%>~b%%mA)3e!yrI--{W#R81(SCb&~_{ z*)P*iZDzIE@jD(n69*Xr8k9Z;2;=V2L}o}=LhG1wM;Yy6qM3;gV~e85T9`FGE@Sb4i4|+1esL+o6)&I3o`?aS? zWhpP8F@5CIV8$~5>sU3L^?d%@?K0+@^dz{J>T@}ksCy;*NkRw9$hf! z-qtm&VdwVQe83Z@IC3CstJ|?oJ8hQTdmWXOR8LpMwQK#D!L7RO1yQ@3W;YpMe`w>C zKa~1oCv9!s4s7?m#WaadF_LhrzfPt`B^5*%FQW_+vx2O}DNJVy@LTxF>FX9VSIuUS zkrQHCTn*A)MMePAb>MFZPh6)RJ>@2ooE79Q&Z?N^f3e&az&8mk;MC*eFh*llHsNU% z#~y$5SunKG7lSZqyT@0&yod4p7pD=P78etq0EPDt`cM8q&QB*LL_(~HXzOU_{n*;! zmmnXpKX24??5Ti>)4Y-S+g{d^x$f5^lk^oaZ7$Iy1G&x_cbq%6&g8hryHWS_Nl z+F+Jj%U+Y<16LtGvQFsuvYlVOU+XONIQ=n0EEB2Bz}2+_)5ktB<0QZo=ArX-$FSc( zn_u$Yn%~v1_7@!Sy^B+5T(_dN`EviSRbF-&YhLDlT^04iYPT*osZ73aH=!?Tn|Bi? zOAYOW`ILznzd+Dghe(ZlPWE*DxwBQ=cu9XPkF0YQ8r+@D6>PzDd60Gdo(&BRC=w>v zY9+RY*|=@umi244K+hyqOnnyYyYC2g0^bez-??NVp@2&C{T=hG9nxV?Vs*RSMrq}^4Yh3;T?l)x>I;F< z8P`<&v&~zVwv~7Y8|o|y4QoF$Y$060gu~Mj+PmCgCnqwWvkY>%Ytv%5WW~3~>q(Xq zI#*q}SO1h{X3<|gnTGgEP4aF!E$VLuT+^p(uHkBrENpndsz?3&kgbT7%-Wi~&d`{o z_63@gvXfh9A`XJaB~aI4fX;I;V3I&5sBd>Z*Jw}fhwaxLfh{x(`JN`InU6zH<2$CV zjbqErx=yHT0(U9V7RcjEQZp3TW$6^n6+Q5*50kTM8O8FF>j?AnX_Qvdp?U6NNJYs@{)?eRA>()_XkRyc;AY95)Bhc+J?tuwcX z)lY7v&!#)DBu7D=UyY7BOBl3_AW7Ia#z%P?Mh^fE!hb9>^|FkE-{An+3ZlShvzo`m zG^bP=Uh&GnB4}1wIa@UwBhnILB)>FeJIQs6(qI-i+&)AynFF7_r>nz96XRGod&t(h zEEbONJNm!|;rDM-s}_3Z6Gmdb1ZBR13RQ7To?w)!SNAO?8P&JhzoUH7zP%_vb?%Y4 zYyh}H{405*4fv(&Ho$EiBG$3(4>PN9p^hZ+XQ@<1hA#^}#&0|Z@v-pfTKjb$+t>Za zBA5IA+|88vPjfgXVfM+Z7r&?kplv?LhjE|a#JiT1kx_4lY=BAqpz+-G zCw|trWgT0n+I(W4p2(*w;O~1OzL>%fu3ra*FFY51sSwf6jE^?CGex7OM#&-PRp<+g z8lWL&`)j`h?G;che+`v6^mZ*IKFQs~*V|^-p%2+pg&Ba8j&c0?`b@CFVt9G}u zaM^%WF+Q%s435ecN{)_@-K>Y)Lz6cafn|&OPh1b0pcHCk!`1L%W#QAy*2 zeo6BbE@pzmpqK+*%g=0S!Yh%YnGe9hPdtGzXcVV)_<%QQW;1u+Dg8mb5lD#iqrrW%))ZRc|T4J%h z4z3JzP~UW8^04{$lj4E#S9f>Zt1vg9ACkAX56yA358FbW8>XCc+|7sw2hh_6X%u~ZpX(S}4IpFnM|s>T;FI z_`Qt5NwC^spOvDhU%q+b$7~a5>eMe{5$M@8TUZ-N({qgrY_VSm-5=_nka_WEM|_SA zWHb_hxCI(QMBea7c&*@Nnn<_Kju^(u`gcbuoU{hS3cJvVCy9c4V8nMdY4OHD*$QaN zWWC%49+Hl5ykHLZkhRLX&5b8jiN!gB-_^RAbL+O3T%86IfA zNizMS3fghT0mpPNL*&xuzVRi_(+X$w>A9}^RAmi`j~*ZO|B-d(@lfvX|3B4fIVn1) zQi|rNQ%aWXTPR8^vL)FPGqUdnW89}jQ?j+7u@@2*WkmLh5Q8FQo$Tw(*au_zUH6R6 zIiK(EpYwQ}$24P>`+mQ#_v?DTUYC{kQ5nB}V(?k~o3-fiiqWZG?HJDIlM*05ya^#b z*)I-P)R5*Z_s&Ko+TCs&j0|e2Z^AU~d)l_PdxFc!K-#`%3tB=VE$u^(rqKwp<52qD z)r@bwcV&Iz0p8;%)dKomW`%I%IRk6+xtS9^;p2NE7;F3kqV-VcMcUp>v%b*jgi0uf z{l4C1E7}y$P9gcKE$0O%Jh5~v1=46y+JX}eFsE2{#GyO<;^0hKxiDZz{g3-H)z4ZB zqMe#A@F$>q;T9cuVtbD~uO0kU0C}Wn&rESU``<{FM@MQ#qs81!y(%-#w9ft6_TWl| z_5HTg&E7}#<;0-n1DBZ9g&fUVX~f;KO}-{A6pGKQ>k}W+v2tg*I%FL?d@t*IOpBaJ z?*SK*`9m*TOx6djvc0U{w%baL`snRhR1!O?>HS^Kq_5mVrr^LnuI}pauHW#S6(*}x z>qNiB*CEZOpFhuck`IqkYC8X(sD48N7V|)=Kmdn9)S~!Wt~4iK_IaOi#>EP%Vyt`> zVWI1idwR_IYr2oudN!6+P2nRhYF(O~u9{=VDJBPtrCv_3Osq@uzMtc^AxRCQJo@Dd zVny4!R2ODuH%A$yw3YxAtp=bGSB;2MgoYV$7l8^XZY{!-sX(Y1wt7Atl}feGL#VD8 z()soQ!`up&+1O!ld8h&JfFf)h-a)cl`2EYfnuDwXk95wj&5)uMl@@w2=B3fTawMhJAL)vR4-(^Uc%JVM5aCX6OLPhe)vc}LMRM(@3O?cJxoje zh2*nR(I2gdmE*;OZ2V;gr{<0L9V#2N=H(xwcO1HWi6}hMe6n>PNA1GOI0oTI{nU9+KwC3#l<&o5?shwk2^u2v=&_2>BQ<8)pM z0|)v#^|1>*x(Ar9>3+A+7qY#5;tKzlxr>?H(h-$?pmfyMx!V!jrJ&RmVeUZX?RbYA z@V$e6IwUS<0?sBk`%&GIMt5|tE&dAwSp-vfUEmS2ivCkPW_=dem1kJkUJQ}{5Fb}O zDL*JN;M%AE)yv*;4%UdNS6yagm}S4BOz^AQxd;zvM(&S0IuY*i4qEn8!v7FGFgvy| zF!rrAPeOn^nQUhJ?C|BwCFL*m)ay#Wv>n`cE5FpX##FF5|=)BI{ zyRw7vQ8z!KyPzXwPO17YZv-XLO|+7yf73$&lRD|7O5&fcX|qC>d;D?<+rY6z>O3|9 zrB;=$v0C+WPa;P8g^Rt!itLiWpK3M*e=TXk1gAc|?m>&;qeX=T>GgZ`<7R|oETg7moHP$?IikF*Y&$>+KC6(K z7Z1%$MN^~^D_W|vedq;#YScgS3|wo)71j2SnnX^Z-OR^iF&SYfeXAF>lc)o|S$MT- z!EciJrV`uZ%yK^13Pcpw-I1>8`g&9hRMdB)*Ia$xC^mXuz&n|+dDbOhb<*Fc@j^Rj zRCO^7Mg4Q$LmeIw{plmbBZ_ESNJj5YrSrlujx(*O!V1Ic|6jF?)Yp4-i3 z1sxBhcu;-B$=NLoT(plD^J3Gd94)iWaoP{I#VYr-MdQ!rnEB^c*XuT=jvGklFDV0w zkq&yb!ii73Gh@LCb)#>}x2EgH=!0k+_v4$#~szr}RX1N5cXKM>CIVYXT=vG{y3U;ho- zpP~(v?h~{)JR%o3LJz(J6T;|U&Qywc#AumyR)A~7H!=;D(DaoS>K=x;Q8{Yz<3;*6 zj};oc=_M;{fqfkYJIn}+BI3b!`sXMRDijl#apo z-oaZ);W;_Qf9xXt1-E(++^cSP(5{w_;0?3r`Rejqk)5P3%K@?S?kH~v1@Zaa#_zA1 zT{pwM3)4K%sVS(j>{pV1Pje8V6|@BZva-b+AgG%DN%7amfr`EU#a%4K!|n7(F(@AN zhC)-tQBpmi^bT5*_#=)&huc-NC0+do{~I)-os$ z$(-dR9L_7eU-nE3L2O6+QIBTr@=I`?56r6W;@K zlaKC6Y(GhA(XTfS5jfl6dH!>5=~9&NTdPWJ*_?B8PfTeACG+|KY0AjDDL&+vqkT7g z4WM$r7$ShIV0pFDD7S-M@R`{&wh->o_&5Ygs%8^h5%VM%jbI0QLL~0O3$3Z)TT)+1;dN{!4j(KmsrQtuL zZZrr)h?cMfyqa$IgvZUx`YD)+=BK9tCvKQuJaQ=2vcB-?!$4&TnT36y?v=Voo@-3D zrr%Rk;yskT?5Mtp6_hbwd=su&PC1h>MOWq&!tvSS83?tYBft$^o(9uz2?}!Csi4|> zbHRhsG~3wx%ketSZ*DC`!%k#OW9;9GIeB@fRn5q)txyhA&ZjsP?2pIheDvrT=Ne$2 ztHVA$8QpA#cOg~#7$oOSn&FSaR{zUzo%Bzp(j)S?gf{(Kh6mCyEvC7wtcz);Y)V>! zGU1uBV{;zE)pQkrvCsDt#(W~vP7dUcnDhsn!_L2p$L^elI39Uha#~9QHk^Q8eoBp| zP#4*j4b9_X4`GpoKQ0@O1=kxtgwlduZ(5j{cC@+UJT{oR8s31Ylk=7ITCcE$#oK&O zT3diW_G`=f6gw>OvqCog;^>}!m9#w4zFf84BVCoU1}@=aT&Q~-U4hHYgaavRsh0=O z?Ql;Ix{SF||9CS|wk-uxC@z5VfvF28F{|M&*T2@&JDgzvu_HX_eiNd`X%YVJ zzd;6O-h?(3u1fEIt!7jGcrAKPKqcTAwO=1ELR>3>@jB)ff$@cOB{ODz%cz$o=7uWX z!hXdbS2Yb{h$9MF!qAH0RR7X3xV;C^cVcv#0@j;X@TE8 z2E?b#%~MBSc}%P-NgUuMq6=&%=}MhY?BzscKw^UBp>~3D{L_@r!Om<;+_uj;-h)S5 zgcERV!;3oGQ`kdt%?*j@qs5vf)K6fgsv7+ToVZus-shxD)Xi_HNi>nz?$RnLlWwz{ zG-LNmRH>(zS**cHyQ(?R7$#l2F6!KggNRKM6~Yi{SMzj=XZCe(vF z1Gq|;nWg3{U6*2R3((%a=vyLq=y;tYcZ8d?VwC!IoWh@_n&teBJ9cjfBG@{^)X9Yv zF*DV#_fKXDaJ1ZoM+eQjLc#;ck4h5S(}>%0T;Jy!jJuV{9Oiv8pp2oM()%6!VXBUgXsM6| zUiF@#?;2vrWzwTMd5artV*8o2k|}H7*v4E_0~Jv)S>9YxfEG4AZI#nNj3u_Go_^r0 z+oV<0m`i9o^;TPVIrr$A#1}zU(?EhG`CPneSd|^Sa^O%PHSmY2T)y^@4M1l#A+`0{ zh;;j5(R@SLnLQiJNS-#h<_9#LK9Z?R{#k>?I zihLNJGA;1jVoQy$6yxM6yv#$79iE}&DJ8+|yOfF0@7e`t4qm<#_o?S9bb)jY|Lj;D zoWWYMffI!)$9kSK-E0+$V}9vqD?F1a!shS-|Mq*;Fz#^+<(DKR=|zc^0WtXMw$Exd z7fJ@BMG8L`>mpjsX^U6krC6q!i+jWR?Jq#L6tVHi6V#FMeja4qam->=GxXu`AJJVF zU;9dQQ7oR*_63`-d*{X)MeV;5cYl}r5Y!jD5WxXT$W|O-+{#15I2=kFQwkLyi$v(aq6LzSkbe& ziFvyp(SJB@?^*1?mQd^c)yVlEvD~9?hmvGP&=ZuI%OAy+Z0cbt?VPC=Jj~m|WZu!K zvXa^z3CD) zfDA?g?uX={YsyA%$8Ic2H_vOZpe7hFZEb4Cq^Ml-`4AxBV&%mZjACmgkKQ~jo~MtK zT)}X-w)$(Y3VNmIXBIHc`8#s_Q)}PJCzUOR*StLk@xtQn?CdYdTxSBnckl^)6%N)E zJYDWFl_^itiIYyCtR55`)%-){mpJA)n9#ZK2PAE7P77NnvAv`-PPr%aGZr(dxr=_S zU9vRg>EX+2s47O3f2D(g_ANgg3SvhzmoPdq9tS7$o=w85DNp;w0dL7Ip?9tVMHZ31 zd0OmO;M!cy%0xsME9%TZde+}M7=2|>={U6Vl`flMPiPhw<2Eb#hBdVBtMYGJq4P|L zXw>E<4+1Cv?EJmV6=m_0?n3!fzXt+Bv)M@8AJ=hGS}m6A>@@GP0 z{M!rGGgPs=)OcvhkN@uNttn@6PYwtA-lVX$@>9DVyjbGWt_2_Yqti&ENnv&WWr)wR zfp}Ln8(Ub4#IH$!QUr2@UA=)0A+1%aXUM}A^WcB*JIP+ngbn z#l{(>pU|5aJtcCb;&*|Hw>Y>2CQL*z2>vn(3!<0Ofk|W>K#mP4ZD2EEqIN6mh%iRO z$Xc~ucpK_hH2q>`p$0P$HCqcT0LV80$PUE}(10UQxq9FY!ze-E`DA-0f>OOthQO7F zLIyP`%vq{wdA@E!n6CZdZXM|ntN4>a!BgfGj%e>dw?xScosZKvn10ki`hADbOME(u{GMwHhF?bV<<;#m zv?hZ3Z7zo!L9_PI)l}cQKmN2mwTv`sct0RRU>AfO;a*rprf2-yO$1+;QMs`=`5|jI z(e5)H`EDFSJ}>?GvFcBF9sP3HA&R%W|EyILgR97Js(3ii%Yf&cDex;Hn&=@JR~Pra zi()iQ?(1waetM7Z^XNg&?akdIntQfX@9$Lj@@P_-8n2R1OO2oGaIv;VRf!Mo~`sylx7T!wwa(>F)OoI3G<5!_3 zA)p-faA@IAsFEL|uoM_(tIU2wR>h+seyW=&igssGq`DtR*Vyc>9+iYJ;@;#ThR9X5 z-feaxTn8*%QI<{81T(b2Tk2@lJu7afs3gjYa4y!o>v5ssYVM z99#t#S;ooX+KKy0dY=8+KUNBJ6=oN`DK=NeNKu+)QdyZFhRW|95UKl3_0fkPpOX!u z#b8acRoL1mP|3kMUL21ST5tTjw9Zz79S=2H%2ykcmE!IA->O*^?-_4VvZ-``kF3EX zcqu=o$W5tS69Wks?bE&B0QtPXZ*wRvh3)Z&1+zTKSK&DVrWXD2-m%gy+2z2T_tehD ziU&Fmw{7g3&^iuW1hD{xG&t8*d+vzX(Yf+-;)Mq%m2kZ}HMaz5Wz#YcW2{JX{gNvtLeuCnjcg)MLWWE!;o0C5;163mNH z{8^}<^hI85Mp!vlBcaRH)QW(v;dIqr_R~qU387V(QAmP=5B@PseDw9d!|>e>AFLg1 zi$JFlNnLP5k>`h{0+KN06%3GQ1KuRsmkPfiP&sG=q98XrT1glRNue2fI;a0G&=seD zCY9(H{8W<|6l?FETPY zL#>?t>VN4QP*m~0v&*inf2UBk@R2e4F*>8x1>5@+;s$;a!?R*N;=Lw!QmK3`8+FAB z<1OoAq3Z}3UeEaN9sxiMLq8aShA==!Sbyy+ZWDW$-$t@NDoO`iBui&~in|LfacwQ6*Hb;}>!F}%CX}Fi6l5XZ%o2)yb+z#5oAt~n zUof-$MX^@!e%|=!X59_2VyiJVhs#|yfs@6jxT?_dnUnNQG74`}uqL_+I7fl$^XIZM(&*M1BY;kG2?tNC--!e zq!>{$sz!4+YTx0!y$wj%)LjlSfyUqZ4fUWJ!~eG$qX}7be&bh=FQ5>Tay@BCK}TWY z^P039+!nq+bWa`J)1kJ$-O*wWoUV1G4EbP)k`da!47hn0Rbpdt@AOa3+kuFKMaj1* zzx(nLe}>^y(possUc9>l&f(SN!Zy_ttxgQZx&BI+)dG!sJc?8lbg(7OdO8>oakd*p zDrAv=y%E}r*bsbyY=}(fF;UdJ7PGNo7t1_&Vt%e?G}A37Y7EtF+rJWVN?4G910NsM+Ad51hz)%re*VS183mx zrz$wleD*Qhb*)(E=eWc@~TdT&?Y7;IW!7xyUk`%ZJE#t`@pq0c1*CvF>!N4<&%*VmU* z)#$s?19A`gguqj&MDL-4pxcN;W!(eHL8!y zUdsWYquW1n4w+r*J*H*8H3457^~7K%U>9Q*`q!A)6Wm+kfq@tQL_wgAVf( z7gyG_R@YKk)3|P@*BqBXo`DF$9G|g~3ngB(q;OWYh`z(pc4v|!?x*BA!hH`#p&t}c zhQ3=Sg@MmWwLy1rxF2GmiC;)cCCoqOYe508_2sBt9lgi7?Cp{})JxIg+jZ$doMu7b z5X=<^j)iafxhj}K)@oOh1hd0bVq1|_a**_j<`boI+7NPXr}M6=*>KP<;B8^(9oi`+ zg3%cDZk)M07ak97A}B*Z)IUoFdnodOH2N)sLcnO4?2IoCRlAk)FGb`t*FLlm)=82b z4pu2d_m5zqK_DAA0U6^$u%kcaLs}%!XW1lKWP)CY`gzdpzJ-mtfjS}U1_GpqztB)? zQPTMT1Z?aeZaBg-yQG#T-kX(Bn3S%U*&I#$iq%j|5_E&C zwTO7ONOPQ!9fJfG!QTgjw(QB|r7=VhP)}z5I2SKu6z5k|ZU;co3Mq(sf#h(V8l7Tw zvr7`NBpzst-wgvx9(Qb_cWzsn`9$t+w)3rnb-GU zylCH16DI~osa;IhC-6k%^nLUNjYPA)k_-**zxp3kt(@eje?Jr@oIR-N9O)dr83<#- z+wEJyl$mDy*rDSqS89gkn!3I@A42(T>de)99nQCsrhFyXb@Yosi zPL&_}usev&6Fo?!AG%8_u+nwSsD){6I??3Bhf%zlny1#0M z;Gp?att=7K@lEz#u5S+gkVWAWFl_sV%9V}g`ETH4!ATE7i_BUP=W^!qiHIvB~Hom(Lib{#S$l9S#b1S2Q^f7af^iD zno*0}&NpF7!dAQ8PEz)D(rA%F_-LiFaAq>+IoQwUy-%q8^43-$T;5gy1rDYu!GKoj zyoJyNm8@?1^`|ppH=)<{68S_BsK%D{ES?K8sB;QqN#kX|L#6^eyoSq5Oxg;dJEd>- zZGr&$j=#lXgFP#PwL@6aj--+(y>dFa&r)%^yMjQDhLu^hIx#!%y1=+a`4P6YT5taB zQ1x{ImvXyj%lT1H(r$zhH-Ovm-aS}q8%k-kPkjjdD!w&+(qMxYsR=Y79{)-ppPKCX zS9j!IggbD;7eDu{i3)-os%I=|Q!GY*BW?Y`sGtmmBDC~m2Y*lYem+>VDG7MX$)ezj z7oUbKawdwXS-n6WOwg|bb`*@Fc-&l18~&%1aGE~+8c6m?5!I=00u?N3bEgjes~(ex z=dO=)8XakMVN8g%Ppy*#g&9G9peG`$nm!KwaXRVXfFd;4_Z81apGkAuaIWBP3lCRr zY0S}}k2n&5-)tI)RlO0t#+FWQ1cw#6y>xw)NA+Bu&kAbS#p=$|Cd9;6B|5wM<7--wWgbc$oB?xSsxyK9Fu7e-O6!Q^n zvBBCFpoEde!a4)VA*F1zD_rzHCuBSO)Qv9Jk7KgFvNHX+PjX5x-I(y;i^!i)dJ!wj zlK5JnWzaxrB#llj78G&=7XEGPiR#c+<(rsN@*0t!%NPErlPaj4WbYN((V$M)>H0XN zpL2+j*7o-+Gj%-DNmM?^?2A5??Xk5bQ*r5MSOP=2+VXG3hHOnk&)=~2?A-6@z`qwX z7*Mp^K1eNmOe_97{fsfQRNhv&(**~Zr%b%X&zl{Y_1Ez-(^pz+CTh`1zuY$XTxOt~ zK=#v{QXsV-C8_m5LIMs=oPuBM^dt`EFNr}ap#A4P z?Tw`Nl8oc#;-yWbO@8O>1k<}LfJpiqteyYLF@~*L#^;F}?83OP5!bN!BolZHP>KyQ zj~LxBKfrtFA0YRUY^Fs^C5<^7t`RX6L(@A+HcOX!Q469ZC(#9@R^(bI=rMumSIi!r zW@T*?2j4ad;{F?6#VykS7j^B|^{><+?qc^rrVqDHJ2m+(7D%^!47}drnp87cueXoj z=_yQFo)YJ({I58JaW9q(;*TdBnnG`N6zvugGpsp)oSQh}1tS@P3Fx#MkJAxXz_<-G z7`Ibxz-cYS@;$jU@#eK9r1!e!r-hTLEP<;_yG~sXs#C+_Pb?GcUxW^6278W2kKBF! zU2249n|fljp=`tEklds{&nlPM?;}2omQhn1(PS+1`N^aY=(|SGh{%wK%%&Ie5v@iv z#`mgR-y&^zN?6Me$(?h4-EVcF0$Y}ldG*E)66S)oXkkXuI2pma|LNH0EBxKE#5 zELm31HPN^{K*iST|$9bxB$h~n1Mn6&=jFz7@FRVT1&-O_v-6m2dz zsuL@}Ffp!5V-9EXZkVLnC+D)HM)*u7U!w;Z-NNzT{BK?Z|3$r}uKE5`{8fv0Ezc3p z?n5KAf=h-p*InK~<$ZnOY2b0%OTMPA3# z-8Ps`EXZxetx7=*P+#Z$bhp!0w7R+QwrcZ*TK>VU1`9q3?H;G%-7j7aK9`J82cNZD8BY;vv#?m+P6dXHM?nj?skNgAgpfREed!^dtIGvK(FIj*Ad zBVOfo?|HK7W(xSpUah34JcOyivvHsDl!A7|9rtV_X4F31*x(;j*?sF_YLAcC+rOu3 za-02kddhfs{EA5>Z~JB|=q?ihT$~NT#3`AOuGG^5);>#Bgg^4!r+c-3KCQI!dLSD| zTw^95`$&^kDF8)wSQ{{6q4V2-KfBUj0CanWVE_pRr!2>MQ3Wg2XH|HsE^{ zpB0Z}+_n?6$*PhJxQ9e2&1huGRvx`celf=x$P+s-v4`fh?srq^We&`a|Xf^J}qLUgIh%S8hJ;p8V?wt6h&C)9GsFVBLNo3tAP?bq;&-8FeLBh7+w}YW%UNqHkT*P zTg+yUuBWQvS(zClnTJt3t6|ClcnMd?2u^PXbf%9wYCk4VNVD3-&-Gi%Sb>nX;+aC7 z73!@Sf2nxHo??t_Q@fsU!Yv%BophlvN}R6$_4oU5^C5rl%=DzMrw@vCt&tj68SuWF zZ65avOgX~3@8?ybRT?_mU$4A@)m>OjD6xJaaT6Nwd+r1Y9sT{256S$F>7@4g{Sd|b zw9yG%3>*kYJ)wFHp;JN(a!OD&C|K{X;y z2L`gkQOCygm`q~sUCpdqe9eF#B*(qxaWl>0U|Y*9zN7okuGz;|CMt6WAXBd7UrV9N7yBL z5IMDc79ucMj+-gV4G-j1rO!V{WFSIIfe1!-PCQ;1@lI~Iip$QDp=D#-a@!>}n-e&m zr`04uuf_Q!IPts7}mO@%mn2!GaX28#T}AU=bRYYqP+=DP`r;GAod~MGTbjYJ*I*XX>DW`1|Ln zm$}_lZI`{wAarEbNnOn>c$%aBYs#B*MEjf~1|-GsP3CQ76)`+xJV(7;n36W5UdG>M zezK8f$Q^9c6e)WTq2mt3Fke<~50=$s$IxIF&j9q7EWs++4t^9yC}Q-Jn{M&h4U-tD8LovHo@ zwVN4EQ8zi~-x1YL)ZV0oQmK;`EbFn|H_bNc7(DdcZB8>O_@H(xI+EGoo;KJ$0WbMn z)=17~kB2=X|GY=K+nSY4C{*$HkN4c&q2{Fnlc)}Pmb5BvW(6_K#;%}IK4{!rj|JYg zt28d$zDqOrYlu*o8sG`IRUHH2#kFw$`JmC*UKGgcLB(wBqr$?{0bb+i4D%TK)cph% zN3cRnUu1Hv5V>KoB?)&mhtpa_3lJyI0Yh!Uk7(d7s%@Fy#8I#j^zXj!gG%#+@PfVK66Z%bg?D5VDdBysH;8UvWI z_Eog7*)0PqgQ0!jdz=%}eJs23o1)hBC_TsfEQN)wrj=X?DH`?WEw3x_9N;-|(>J38 zaxdD{?ML-e9r2@j#@_mb>bWGGx~DoEH1A@Wd|mj9 zqYn?Qklkd75I@CF#Y_G6e6dL{zbkEUqw3Jd;E^-yZ_{&^cKb6fho}zOmj9KwWNK{J zK=;Mz~dKY{m`E`s9RrB_zmo-ed*Pfd02L{e3Z7Qi8VT%hYy} z_Vt-imk-!iOl&`BuFm|hgxF;O9Hq6;J7+?|@TU50joUDDAm)w#r?spPhgmy1_hkNL zqaNm6wzcZZYyHqU`c%^YC3V3~l7@T*&Bxru&Y>Eg2%s%`e^;PZ8vnRMg@qL^`F!j} zIZJ`a2KEgwO((azyHtE_cBv^@hv>2cSs5kEi>~yDl!3eHL8SJ< zTH|&zf)O~gEOR0Ds^zQk^ul{Wb8f#0K^xS&fx~+;ih@8c;^bdy6nFOn>$WYH@mkq8 zKCm`i&_z&$$-XGDy<;wj)U!F_*_`6iTQa1334wG+yt+q{H?_^%mpPvU0lRe{*~Q=& z!ozE{zW5pPxxH2+e(53)^JZ>R$@tWV@l&u+t5{0Cn@Q)Cy%6EkZkis0>``N#=(#!i zMYZjB^DcPb`RS9MiU>{m5xb?gr> z8hKoCOhN|w#jZ?cc$AsnuPW-e9+;sv-dbP2aCu+8j)M5{fk_N<+vMT;uk^vk>rwb- z;JD$g$v+`8m8S#eQUO_Bvug;=HBJ|Se0JIc4#$WHRt89X5VrZGx_L_K(Io|?ldbdN z2Fm8IKm^$(YgtQ*{h}VCmK^uSxgO4e|2SVU2ntJ3a=U}Q9!jU~_U|~sA%z_K5k>2c zGUz2*Dp<8QYtP48je9+m+ut>E;QxeXzGug-g@;h_9hC@<6cEbte{1VPhB(db1+u}R zVrO?76nX_Ea^vUiBL{A`xUhr`uP2kM1~o;!g7G7oygwr_V39R&vQp7W7zzM@_?wj4 zOTIMta?xB-PW(eyCVNYD%8=93(D9DlHEO*fU3Mi#(=B*NFFkJ8P~_!`Cl7V3hEUZh zzv;#nn{kDiXQAWD!F;}T%GtEx*J>vqEaMor8PW+Yf)Kv6?9Gle|7x{lESy_80i`C< z&?bPU0P+Tn!Dt9I8vZ7&X2ZA?LRGtM;-MJ`sbD72ZE%6)_G@O#^k4SPK{f}}1>3Yy zu1!boX5>yqyN184(}JejYtA>X03yA6{iDvkRY^_6s5;wxoh!k2>QZ{NDML_UE6)S$RsktrHj*r589|YX;uWWy_i%i@^fk$NHFGoVVNs1a! z!1sjO%}zKqB}|VOvK!Pa--j~uFp2MUb7IT_U_i)KhHM3mW)iJ@sEPEbj?{n98OG*t zEGPd!XG=@Gp6Ty9%Sqqht;4lAw9Z0jWu?Kk&j-=EvaKUTUqf=pAxf?le{Oy{U>@gd zn&1*Fagj%iQx4jWzc&-_>7(!$8N|Fujyhd;8o6tud!pHZ(F)@TEG9#H3WWsioC`~S zZ~N@=_Gw<&wNuAEYrLI*PB&VZGZQx+6^jZgY1NH;(U?A<=r#WkE+8)rI=q0hKE)bN zvZ!4=qWe?#qN*2v+>4I49XiPFxFs9N;&0~^Kxml#xY?`R@PfzRKO&_5VU`*FvypB+ zgDie0BiGZ|Fl1^A&vDArtEVV1*9e-Rh5mb@Y8%}n@=oA%Pwb$WeOPCA#onQFvE+V< zOI%Hqwvvcap|p>@WlsF2Xk`HhkB@r3(zjBYJwt6o6!K~8dm@8I`GlH9c~IkGwo0_H z4eW+(*!^$tzY3)ZAu#CrA0*lX4JC9Dh$P8R24B{$U5 zRHN}D>!y8kamsThUCFiz648iA7%~(3Cz|e!&Z-(*nN?Mi>d@+F#`9DO1jEGWap8YY642o~@!W<6TJ?G+I{n z$1s|XvVyVRvH!tz>ezyn$#52OB6y2?i zQY^}O6!SIrM3oMeA1mg=n@Y2SJKP;!w7webj_15Bv{6S)@6;%IOD+j1&uyxmJh-f3 zOXV*WbNbwGiJ%be%7+8)OFcb`<&zp?&mz9FKch>ghaxR|JKia@lU}%#tzva)EfqJA zo=5F&UW0!(%|0&k$T+tvN6k3Ns&GMY}bM^&O}3@ zD?hUd)mg&3Tp(ViLH-^Q!)T8wD9#w5(ERycsNH*-n@^6b;!s)E{;G!!|p$7 zArwHIAu&tof~4?M&&(_c!5u*ilaxiY-a_$Obf{COMp8+>*VwDKVGA0TFhSSK`!u{4 zp}lKSHlh?|JSI@a!^O~djQCEoJN&-1%0Eoo^!-UzoKmAiOX7%+4Nq*hwewJP!N#`e z2Z*VXQDpp*flS42ERzZVK*sUOBXFTY&tjxq{GxA6P_Lnkio}2NSn52|wWY5Cq{C{@ zm&0$*k=vgO6Yso&@V#F2gZBA)E;Y|W>{FTr+Za~P?I$x)JqSse9U4={-+N^q*!F;I zkU}?dNQ#G!L_ouSBvo|9p%9y%`Us60cs!(h#sG_C z`ucS~H>FgqKj(EZv##*3)MzQfZX73y$Ev0d_N%&Y*jC@aRB?|=HmTw~224ij`rn$t za=fl4r^2!AcR%W|h|qKYu$G8cHvyH`63D)vYx=NsWy(;O^P7s%#fWQfD$eU!M(No# zq;y^lLy25XU3M8Utc7jbZXISa=T8gz@>|OD%<4PYY1L@1_NAy*IBoN1-@aR4ggR{6 zOCX{=pIYxopneZkynh|G*q1EFvON?P?2J71s<~E*wnEDtRTRiY#)Lgq-9K-nIUrQG zv>W^dP2BMU&53y`m@FG&U))}Yc%WGyw7}c_Hv_~4I6XVRcfK>U*>FuDI)hSR_%HJh$tmtIx+=TUVikPdv~{*(VeE2|Pz+E}*`wfPmfcj$Jb?br4jflEy| zF1J#2;wan2xe=xVZ>IE@>)e-*`|~I}VS@FFvV1bD*t3b1SP$$_xaz03|&In~wAz7Z%lKKkS<_o!z4h^ryhm z;nM0J*Zj-SS`9)A*Zlb&WF+E)!*y z)9@P(t!^O3oLk*M$-weiPS&UX5HCh)*PmQh(@{0Ry1KOK3gf43bH`91ZrzDf`$eZJdYQ#)_Bc@w-3T?|jv|Y|t zV4u^ozO$nSZ_ReaiuymnOyg&#TQa|=`UQj@_BIfO2JBBCKqSxxl=G_a_adYTO1QaS zuh;uT>eYx}8e|(rxDjx3LTb#Rjl>mr%Ny~%FE5lPHaY;#H`XGSYLH|ixD?tOx$!ogQjCwRTPMu1Jf2n;JuECn* zdsAuAN;`f?mzJ7sno5Jrjr!CewcZELXQzatybX3?+>a}yAoCo@Kfo*w{*}TV$?)np z$%>cr;j4w-hrjt9ecvuSIo+Lx+CLZua&0kNQIgB?_U(*|mGSNgpi1b@hR^#pi@_ij z4=^%r`H6AKUCW6Nq>m{XMYDsI8fD)0$o`+2>}tkXfCi%DRV!IRO@K-(Q5L5eg^Pjj z7(iP?0mwt1@Wn`_o@M2ha~@yG73ARm0mK{?h*_y}bfZp0-K*bR7z@{f#`3w;VDOWx z#Ck`T#oEL6cH4yFHh)LSsL9bI{dNnpIxYUe_QY3=d|e~P_9VNlEvcf2LjId6>U`y* zOYp>*hlCCz*u4vN8(W0ghPpKmKdLpB7cs~}r2k|<1;*OJc zJj}`$p{}knQDb-+iye?t$G=I#pLzeBv+Xdt5bCwQ>0iHd1^HOP=UEcg>cO|GDt)Xr^r zJ2n(;P;|Hg?&D8K&ap1IL*>6&4CX(IU%IrCG=?CjFg0me`&F?y|Lkc!@VRVjrCnsz zQ*SJo^!xZo^VUg=In_xA&qIy`e3(26^#SA&Dby#2PPHXKoTZNS`gmaBIB3*Djmf&a zGRmgD(Iy+gc&tP#(O}W!wjL6xXLqz(tY%3Jxd{l-;Qkn&qt#~L?sxLyBYkQ06u~92 zQgHI#$yVa*Za$H#a5X0Vi%T@g4)_ab93eP)Lu>_Lz((M>*iDX2h9Nur>!d9?xW)PL zCwOPp{nmEH>aYft1L>xs@r-<=q0p8Q%xCqJM1Rq27SCsiAih_0HZ4uuv<0WCjdyH0 z@6=DGe0DbwYSEo(Z)_PqMs_9C{VB(pc@-@;9-D7iWBVp(0J}4lP&wQ0kp5fct8i04EmQNOeOfHbfgjw> z0nBmX2j5g5ip)P#fn)#hhwI7eKi5;2n8)enHLhuj+6|L6%`X1Fule$xt52l&3v5F= zmS#~Wp`qS`N-uCH!p(2ie|2e%y1L}>fmZ}vZ!a`-mnu_}I{s!*s2?DsgqtNEi;WGG zmh`By8+jT!Wv+@QFoUUNl<jNuB|DnD3r_#EI{4KzYKfp})ilfBqV0!ratO)Z zg8#?rkTOI_OpCN~D3}bOu>QKb&zK8wP^{6DrF8e3+c7=NW^DuUs5E-9#gm4Y%}(#u ze=CFjJ0}SQ8R&s@jJui=(ZK|r9k6xB|Lb$O5r~q@;ByEd)fN0oOOP~ebNbm@Uwd12 zhiRJ}b?I+Dliy77l8o5XNlW37Vjk&j%2Gg8nC8T}g)uoZI{g?%qjh+R=LGj#`udCRZH~=!B>OE>DC2dDoHR!}a+1av zOrrJpE4F5GH)1qk6uX|uci(=y(A(CxS;e{o^l~v(1;N+{daZ*&f3Pz+4!(QGbA={$ z6ldd3D=3a`^0s{25nv1YN@ovry12u})HCV)X_xj!1zEamg7G~O4MoxImvr%e#73Sw zi7zX1C^%?7@QuX?dmJr}qUCj;dfQ6HfYe zy3N7-JMR5Nt-i#Aov{@6{}Dj8rA50Yqk*>3G&6Lycs+KVjV%l$tyrU(EJ;@N^Zjy= z8mB5bIp&##-br~xI2$|Y7|EB(dF+<%@l+?zJdSgRre594u=a?WK|dxl1};kD%(?u{ zkg<5?;W*3X5Z>DbscGOSWt?A6n@5AUX*=%{#LU1W-FT5D^jfUJQ*>JL2dRy4?bN}Jwu3uoIU?xead!Q2-M}?iDn6O}bd29yVCZ?1~G1)b9^~W*by{0{&KL0$bG#z|l&# zS2L*1@VD*E!%g11N2TNx?tD-)sv#wMPDh(N<-QY2bPW=JlGBy|TA4QFpJ=O{V5Q-J zz(Ku^s^E3>Rv8^HYyZP}@f%pgVkD;ja43jGs_(E{C3=c;2=CF?YJWX#kXPb1BGUU) zz*Ga5klfss4!?BrjeXb|SE@VzYEBpv++eo!M{Y5!Ss@Fng!H_Wy>NfQyU9-LZo0%> z8GI28);fp&@H?R+AFwpfAUj@iNqlqIGRjvMr~7ixK~&|nK8dyW_5!@| zHpwC@`Wx1Q#uj`d;nC1UyAY*^e%^~(ClE^J>|R#J(o^c{fG=uT%cv)gzVL>6fah5w znToDr%~;e7*yKk{zq}t8UgjdKjz5+9c()$JBJK ziJ#8e&Ep$)n~T&mGl-`mzzE>$LST8H4rBc&SvXFvv#n9nu2I0Uk*zTQggKt`leSH0 z#$MxV3Sj&vLzw{118=bc%wK8fg zr)@6@VPxyDYV7E|m`JKh`ntY}S}WkW8?iG#vB!530HsMh`)I*9>=&{c*?t9qPs-ejP>~QjvyI) zk*m`Vk<$EG7Zs0OPJ}xI|A}}B*yfE&ZRK(6XXGjJqB3|hmKXg)I^tzy6&I^FD@x{L za)Hxti*k@*#K@=aH`Tv_^gCB(ZmeyGG}3;t2HbAPqtzFTlH`y`D-^6n16yD{E{(%R zzEr8ckbLH$8x(-xiAO_VxEW;#8YMF>rfC#3G6NG}>uH}7I2kb!BtV z!?B5<-&MzB%c(O7xqTLTgveEP=y4M{gp7-=fg|IlM%k*D(LHF$*adERii+ZbXGD6h zwkKfS3#r3Z2WP}Q&;|z3z9HnW6bPXCyTxTv*vQ-YsEF3x;QzwP+@ck(nft-g!XZCV#@K z7ay>RP!3R(98It1@S%2ofvC>A4=M{Vrr_DOP3DDZh-Fy^lZ-XzzxeFL{2dvH$Iy9N zisloy0^;A<7U!IPK(so<{)yoPwqj6G|ZIXK^XhPJy#_b{8%ud zAPS2(DAF$lnNcEvls$Igk~gAW#>4+fK_$Og)GTMumVC^byLU@ICuB=xaYA&+E#bss zoGaO?m?^FOxu>~omde& z=Ka17(>P~Pc%V}?3fRd5VT7Bfgq8bOnoXO`M_71;4Plvs{8xa=UoECOYC;(dok!o}V5!i0+uH*e>ZZ!m9WpRgN5D`8q|%}V1@YE$xn zwrG%$QBBoj86gXebPoaU#_g6G=b1msCUHY8wKAS{Sd@v<%2)E6UuqiVx6>bzFvVi@ zKca+H5t^jv&wgc5%^aS#=C1w%g8nY94x+WwDZva2aW3c zhkXM2q=A@b26q_TAM@b}5+LH>i*sKM!Lkx8fk)Vg*<-o$MI+7(|7=NmNajYOVBMSD zi)k3WeEYxlxK!Me(I1*)xCioebc0}bRltw^0wTG&wUT7vH`VSAOK&9A@as5SOe>TO zUO5qRQm+&#u7e0B0xiYHnS(Y=q&=4ZRIw-#(d9B^DG{~~ane}B^8q(cV=kK^$(I@j z?Xkj5OffHF|0!B}!II;!Q-MGANLQ~t`8UVA(!I)6tXY>?z#RChFKjIzp;s<(`}`#8Bd?Q!bF#b+&ayfYGcJbKgeDeinRd2;HzLP7>5tg8a? z#fW+DPOM=09<(lFRm?os(X%@lz6o-El`^$g?$J)16XWbJd*2V@tvV~(BIAS9&IVgE zn>No(+N*i%1s|MM!E1BfiFyBd9qWRfC$le3Vap$XO4N*I$oQ>MSv-PKrUPNoH>#|e zma%;)5;scbr$AQ5@`T1ApEAA|QUdWyZZLUx^9Sg-0A=(njwk!I0kSPk&ce~KO195z zVal(yEYCL7T^@xT6Sj?Ed-o-8@+;_RIa|B+u ztRmwDT*W+AONBj(vF?^o>Lm&KW`L}8ZtW@~91FpJ_t}>hAlFaRbyvlnh;2w!>f1^q zF_c3)^d1ux1m;H57|N#xQa4dK#zWa&-6V~0TyqOv#KlbN?1hNu(UkR3#x|HLvc0kq zj(O;hEcyFX%h`1bPQYgHJ&?^rr53=jKEnGmR#J%16`(xqg*Y559hXYpg&-&lUnxl zJ^#xLg{yu%6m*GzciL&_gc*TkbZM{Pb?47V){T0mce2fxUL&l@w7do_RCUteR`Xm4 zckuJ)_=GnJ=BQ=3GW;pb+H1{#tFa=$_&+!tkrKA6lD)iVfMC&I#6z1?v#u@xC#U_^?K=Gcof_!8# zIGOCaP-DRqF=hJ5*BozvalDbbfEfotVb9!=_Xz9g$6^@@O~yk59Ub3?B$)deQ~5VZ z02;VkX``WjtSL)lg5sy4H$5!D1in~AUJCk&f>d8i@p9yWm6n{zmiiZ^pfg+P%z*I} z<#L49C!&?D#&KHvagb$AjufUUn=E6->@bCaX!36j#}$6-bk`tWS+{b?4x+U?>K$16 zk+-QMllVD&UDrm7IQiKE{bzwYZFMHEQQ@mdE$d7lomn?2;Yy~iwdeh|_&|%_hAg(? zGVaVA4nCh(r2V+#m>Q}g#7yX-nI|q=eUV0F2=rA9jBQv&UWI7;OGy(!883%2ikb1u zZJDDK<8wi~}DEY~HQKtZW53yW2ot>&%M@*?LQt&VF z7usBNgj~gZl`pwk`8;QY@^oSmD}88a8)7z@xau4cV}i4LiVgFG;Nd6k3yIDwXX{** zRY^>b)ap~Zn$8hC?SG}HVs(}ee>pP)d>&CS~{cq+3tf)Sbf zxYu8U9y(OVWVYKUJYpj2NthX!`_T#2qhU8B$0t1q*2=$f#Sls-WW9mL zQHe@bl%Mh@(9D=!WP#RMp>}U56wyuaqc@*v+P%Z~X%8eqq#ewjeEdZFw2wo*#T+Q< zN%>6beIoHao6LSVi4z&k=(IwFr=%nH_5`D{`J0UxgF7}paFP3hAabVx&xGaTUMfZj zN+u_@MBQZt?P|k|2NlA25RpgyypwqW({$spMo?nBec*EYz;P|nej7q`U3l@E|C5*K z!y#vuV60g6)8@r`ZZF;a8I_1}#%>%zAwKALS6AC*`5{hgauGgZcS7_>>JFkznAOcE zOaAoaigq`FALX~MhH=aoZ|XW?6iuwr+tjA6d9R0aUisn3pE>6g#L`wL{!HMDgF#om zbYMB#Vd@XObKJaxx`*f;WvHA$!k-Ho(^Fih2GpM?COginJ~CF`>)}*i?|}) zEC$Hl>CFg>xPFTCW{>l?kx{EH4eDwwE?Rqt3G@zQ=#E7V6=^E{myhRBC^%~ghJ zHQ3vZh7U2OLY+l~`?c|U`fOfg;&OPuFr$f`Au!LU{IQw=!U6=Z9Lr=QSqcOY8<5_ z()-5<(KTL%%Z?4O@UAdVd8If|>uh;A54$FBJMt}T9$*gTEqB1S&FajO5tD67qt@#+ zp^B7O=s>@fzzntmTc^UvcdB&#&ULK4d6viR_pjd;v3+3iNH-QD|NVS<` z4s?=0Ijo4I$~GW_Ze^!(7%nX42s5_Sp5ED=$G^6Ad2#iHor9rfU_Q_itoz|Kz{pla za)kIC_uu=SIU@hc9`75~H}_qHi)nuL6$~Lv6Q$ zXO+yxUY~)?k%C&&GY-vJ8K6yUjtb{1SNd>I^=x^}r)$kMSa0&X5BF~9*8K=08fp2q zZ2r;Xp|l4BR}R=a{e~r$ykzUY%rcIT$Nrg6G@3ljbez#>b4zw-A@%wN&zX!~CWbNZ zeGpyty!);7PcGNN;kL7}_%r8C z=rxQi#9#|1XI6ETQInmn9ZBlNWLk6)(N5d{B^+auboOgleMjwUiRtj=cD&#WF5O-oI|~w-ul+C)1<{Y@=Uh^@g=NrL zCq){svYna^=_BYRbMWj%#AvX+4Di2^dMLe)0Q$Nl5*QI6X0vQzqG6=>s zo%S=P_vctWzwBLlC&L8h9zPXv859OO-g<>&2OKQ~PFe=Zw_mrUbD4!rUt@M#)>R&^ zhYYVat3|~ViK9OgJR!;2Z>vS_W(PNEh>rQPRDS5FWe|n`MB?8E%6369hY=*{4p(!WMyq zNL)w?e}LM+l#LF%=RU`L6k=`~w~O{Vh?)rO-Gj^DmF+R@Qoy}qG`>?Vxr@1>DwT*-%b?dZDa#tc$o7^zib&m0! zQ*W%8x%_p>e^ukM}fTTz2>2#TsklXH>p z+}c;CxpP?gmf-y;s&C?CC?~{^nph{J!8tsMq3U~iQacY?940(U8(cG(q7=RKw`H@# z<=SK9ta}*8%V|YRa_vj#>U3tb`ygYu^bJBd+)PW6xpeWiJ@9ijfskp0)~Ie*n@T0U@h-ufR!LK4sh>*tSjnw9aGq zu$%@7Wo>~<+*|++2pOCj5G*lPu@Yd z*DkAXcwh6F;fmPNc-guRG)KQho(_UMCE{UY(WZCr>z|(BC(2B#bOGa+o6h)24%7=; z#db&M>tOSp4_u7B_f6gPRlbc}3+9(Jz083LGaGWXpUWCXk?pF{ATO_Ec;HB9G*Mxd zE=p+9?+Rhbuk}Dp1M=kUqrC5gqh^vnwGXd{=@czHKtK}kts?sP{-boFINk*KRFv`; z?Y?0$U$&2KdL^Ep#3;_03O4>PQSCxx`S|KW%lQ zOHRiO=jj+VkHk{0BO*1d#_in>lWWv}&~m$?OA_mI;k1EN<}oFwSLm(u4jneZt`?V* zemXD3-3K_s;I9NVN2`i!1p-nh&Vl~jmMP!uTTLL^%xq>iKUp4(t#!z6T(Olc!LcX8 zG(^{_rPG1v<3#&G$qKM;@}O+aW>DHh)t3T{IXh|Y2rb)akpwwSq^aYbBi-fDnF8nU z63I9D6%08n7(mP|b*z!xd%Zx!xgPBwla zKQ~gFA^SdoRLim_U$;>T(6vGCf=B0;}mLhIGkYU?izdcMefSw`Z+za1^Gz3hdh zcjD?Gp8ZWV^WdXz88kYUuHVMK-6Gf297Jg!-8@ypn262UFr@i4DXW5ggZxJF!k;Ly z==tG#JLvR5G8ok&*PGF1HK%wgaa3R`@Zm<3d9&s1l!@b zw&QJtJ+EP|0%sXZjpw6dSOi_%ts){FbYAf*LO~Wwl$mBWrBQjKTZ(X>Iuz~P?7aFQ znoGk`CcC790uvJ+0nD{5v|#X26ixgu_d!ng-;IMPOCkYts~f;rzV5^&G&iB@FCGt( zCiK0!(VYQ8O5+&^rsna-&tU_T3Fs6!7G!le7YuwT4n=*fiMf~{fE{|3Z^Y1S=VkkR z>M50NBxnKrL`zSHwvWPT0GqZgCECS?rPH-T&{?MFf6g+H;~OGlAqc)Qhl^AF!+pPk zd~;cgTnWybA=~HvpB$asD^;XtB=bi_|GUb8K4?H0UgPVWzc&cb5E_+rDyUhm+mH2j z0iK*w~?~< zDkjVOv7n1N-5@OKw=EqhRBd)q>xnE0=Zv}r5B(Qm^6~z$@*aoC*ouJyoq5?TG5ZSF zkE2r!xNYRi8gOYxC>L4LzIdcwRC5taTaMrNq$jK=j+Oq{eoP6|hO7&pdb9Z^Gq|v>ghidi6$`Jm!oV%+AQPuhY z+vQU0Fq)smC)4b-|C5ISqFA}AF^balpBE5F*p#4HWe^hy=b=p!^eY-%C-R7^DcKlm zT0JT8dE_~3$H*hF_5IRiyIgrV-b{zTn6p}NeY2A!SX!B`>)Mq5SUXB1 zvAjU(U^^@dn?n&*w8OA?cHEUO;bW4jJ?e(QAY#Q_%G|ry@~QgrSx{RKo6_{|#LVf= z;Cv`jzU}Z{sg6j)6B>IZh7=-|S+Zh}s_ZUd5YDZ2!fcg9LkQ8;ay~_%{GvM2e!bJW zVXBB*R36>lUMlkXm@9i4y@n{+MkFcBfA_GY}NK(W^Av=Z4kpBFFTGUD~47%__= z>$4ka$nHxUpvUkD$4e{qdCe%Tn5x6yNG;*!+sug94I3!RXRsXC%F(&^+4XydHA87; z&tok}W%1`0ct(F~=mW@MAHqD9Gy^+PEm5W;ZU2uHxkj0XF)p>`rrkX0khWL+=v#vu zguk#X8ZmKBU*lE0Uabw&${!SU$ChuR87#-oOiee41n*PkRc{suf)#jwD#$ zVw=FZr`-zd({$hi1Z&|1sxE)OPz(qU%az3>1I;cuX8m1_97E)-O~)NW_WtA4n1i&| zGFL&n3I$_5{fCM-L99mm?^21w8O8(z>z(6`tB>b{z!cd^^owCw`4Wp;EFF?4$u@&$O$U)jv6#t-?S2XX)85i~50upY|KJW~uNO zF21%ElJ;PDBfmTd9scpl+YV&8t&J9y*zjhq$;Y9{^Mq7b!nfCjds}sH6b^znkoz{V zu99n@lx3RN+CP{p)H#ODY$MOg(WpMAJ{Dc7qt(3UqdPAwC@5GURavLby-^$6&m*ed zralTN2x!~iEAX&Rl}lpk21mV2eH@EE_<3?p7aWaIA2{x1x*3WUqCv_SuiM(r*YI+N zT@54EypJv$tg0)%2u>X(n&hU`V&@7m0r4Yd02;)J}5u z8g4aZ!RbD|V0BDo{Hx;Bhu3D>o%SlZ7SlrGwuLV>ez1?6B7d+X#hAvujcm%H@Y3Wa z3o@Q2IBE>>z+U}#>hYG+vy_UbWX5v8l& zfw$BZG9ub{6GVs0l~pb?**cE%{!c)>SH*wD{^H9g0@v9rQ0j>l>i|^+Zo;ZPpx+%i8st=?nvFm?hA}jP_dT))6R1yELu#(>p7^K>L|Rs%s(1vKiY2 zh`KrK^)-3g^kuNkhzi)iIsdof03A{mal5+LY7LtvBuSzmNzGud_Q1rU6A&ZW$dd}{ zs5|l7OnM}s;j}*Sq)>yQm9R;8g0x%Q%%Q@0cj4#`V|VOv;;YB4FkJ=~7sMWPI+fyU z)a9MUvbBg71gMmiL1%;k^S4u*L7Qn1MS_^0ie!&De-)}7kP7tm zGEk04^W02gY6Z^O9BDIWTk@|6(758dY445H666fVzdSgwSDHSZq}tgQK# zDDjmkudVJ=uHxwr7ZW_{jH}-pMVWwN2YRn4pb`d?R_D5$Hbn}Nv_v9gXUxt|qJb)W z3Hz_=(lv3w>vgtUshr`BFgdM;0i+muqFEVN4%3jWg@)C0UsOt=66$Fg5UM0?fAli9 zRdo|ouAXUSDEqiD7}WNhQCpQPCwRn|&{tH{7L6p`0B=fRt1b_H4pbre$I{B;a@

g}V*^%F%OB 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 B06G8w diff --git a/docs/handbook_bd/initiating-a-sets-workflow.html b/docs/handbook_bd/initiating-a-sets-workflow.html index 94355d69d..7c40520b7 100644 --- a/docs/handbook_bd/initiating-a-sets-workflow.html +++ b/docs/handbook_bd/initiating-a-sets-workflow.html @@ -367,8 +367,8 @@

6.1 Initiating a sets workflow reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, compounds = compounds)

This workflow will do all the steps for positive and negative data.

-
- +
+

Only a few modifications were necessary:

  • The analysis information is obtained for positive and negative data (i.e. per set)
  • diff --git a/docs/handbook_bd/inspecting-results.html b/docs/handbook_bd/inspecting-results.html index 6269262af..01fad3556 100644 --- a/docs/handbook_bd/inspecting-results.html +++ b/docs/handbook_bd/inspecting-results.html @@ -472,17 +472,17 @@

    5.1 Inspecting results
    # obtain table with all features (only first columns for readability)
     as.data.table(fList)[, 1:6]

#>             analysis                     ID     ret        mz      area intensity
-#>    1:  solvent-pos-1 f_11153843066718860591  13.176  98.97537 4345232.0    391476
-#>    2:  solvent-pos-1 f_17304646661409971475   7.181 100.11197  797112.1    426956
-#>    3:  solvent-pos-1 f_15881243262297365935 192.178 100.11211 9609998.0    750532
-#>    4:  solvent-pos-1 f_18080080214774628297  19.171 100.11217 5784411.0    370376
-#>    5:  solvent-pos-1 f_11424365621253057373   4.786 100.11220  551723.6    567312
+#>    1:  solvent-pos-1 f_18251015669602421518  13.176  98.97537 4345232.0    391476
+#>    2:  solvent-pos-1 f_11564647952231462913   7.181 100.11197  797112.1    426956
+#>    3:  solvent-pos-1 f_16113807400422414888 192.178 100.11211 9609998.0    750532
+#>    4:  solvent-pos-1 f_16618588240594263584  19.171 100.11217 5784411.0    370376
+#>    5:  solvent-pos-1 f_18381313828824973023   4.786 100.11220  551723.6    567312
 #>   ---                                                                            
-#> 2920: standard-pos-3  f_6056923640388483791 318.892 425.18866  666531.5    232636
-#> 2921: standard-pos-3 f_11037327286434816087   9.114 427.03242  362024.1    114744
-#> 2922: standard-pos-3 f_11146478671595375797 318.892 427.18678  200193.5     77768
-#> 2923: standard-pos-3 f_14679658011301960594 382.682 432.23984  217612.9     97648
-#> 2924: standard-pos-3  f_1695489413189550685   9.114 433.00457 3086864.0    912920
+#> 2920: standard-pos-3 f_13197285925347709436 318.892 425.18866 666531.5 232636 +#> 2921: standard-pos-3 f_6615663783219273103 9.114 427.03242 362024.1 114744 +#> 2922: standard-pos-3 f_7682755621657089473 318.892 427.18678 200193.5 77768 +#> 2923: standard-pos-3 f_16397861522540151945 382.682 432.23984 217612.9 97648 +#> 2924: standard-pos-3 f_4700490907711567021 9.114 433.00457 3086864.0 912920
# Returns group info and intensity values for each feature group
 as.data.table(fGroups, average = TRUE) # average intensities for replicates
#>              group      ret       mz standard-pos
diff --git a/docs/handbook_bd/introduction-1.html b/docs/handbook_bd/introduction-1.html
index 744123168..21297efa9 100644
--- a/docs/handbook_bd/introduction-1.html
+++ b/docs/handbook_bd/introduction-1.html
@@ -411,8 +411,8 @@ 

4.1.2 Workflow output

4.1.3 Overview of all functions and their output

-
- +
+

Figure 4.1: Workflow functions and output classes.

diff --git a/docs/handbook_bd/search_index.json b/docs/handbook_bd/search_index.json index 2a74195de..a2395ca1d 100644 --- a/docs/handbook_bd/search_index.json +++ b/docs/handbook_bd/search_index.json @@ -1 +1 @@ -[["index.html", "patRoon handbook 1 Introduction", " patRoon handbook Rick Helmus 2022-03-08 1 Introduction Nowadays there are various software tools available to process data from non-target analysis (NTA) experiments. Individual tools such as ProteoWizard, XCMS, OpenMS, MetFrag and mass spectrometry vendor tools are often combined to perform a complete data processing workflow. During this workflow, raw data files may undergo pre-treatment (e.g. conversion), chromatographic and mass spectral data are combined to extract so called features (or ‘peaks’) and finally annotation is performed to elucidate chemical identities. The aim of patRoon is to harmonize the many available tools in order to provide a consistent user interface without the need to know all the details of each individual software tool and remove the need for tedious conversion of data when multiple tools are used. The name is derived from a Dutch word that means pattern and may also be an acronym for hyPhenated mAss specTROmetry nOn-target aNalysis. The workflow of non-target analysis is typically highly dependent on several factors such as the analytical instrumentation used and requirements of the study. For this reason, patRoon does not enforce a certain workflow. Instead, most workflow steps are optional, are highly configurable and algorithms can easily be mixed or even combined. Furthermore, patRoon supplies a straightforward interface to easily inspect, select, visualize and report all data that is generated during the workflow. The documentation of patRoon consists of three parts: A tutorial (accessible at here) This handbook The reference manual (accessible in R with ?`patRoon-package` or online here) New users are highly recommended to start with the tutorial: this document provides an interactive introduction in performing a basic NTA processing workflow with patRoon. The handbook provides a more thorough overview of all concepts, functionalities and provides instructions and many examples on working with patRoon. Finally, the reference manual provides all the gritty details for all functionalities, and is meant if you want to know more details or need a quick reminder how a function should be used. pre, code { white-space: pre !important; overflow-x: auto !important; max-height: 275px; overflow-y: auto; } blockquote { background-color: aliceblue; padding: 0.25em 0.75em; } p.caption { font-size: 0.8em; } "],["installation.html", "2 Installation", " 2 Installation patRoon depends on various other software tools to perform the non-target analysis workflow steps and to implement various other functionality. Most of these dependencies are automatically installed when you install the patRoon R package, however, some may need to be manually installed and/or configured. NOTE It is highly recommended to perform installation steps in a ‘clean’ R session to avoid errors when installing or upgrading packages. As such it is recommended to close all open (R Studio) sessions and open a plain R console to perform the installation. "],["automatic-installation-windows-only.html", "2.1 Automatic installation (Windows only)", " 2.1 Automatic installation (Windows only) An installation script is provided that automatically installs and configures all dependencies and finally installs patRoon itself. At this moment, this script only works with Microsoft Windows. You don’t have to install anything else to use it, simply open R and execute these commands: source("https://raw.githubusercontent.com/rickhelmus/patRoon/master/install_patRoon.R") installPatRoon() A simple text based wizard will start and asks you what to install and how to do it. You can re-run this installer at any time, for instance, if something went wrong or you want to install additional dependencies. "],["docker-image.html", "2.2 Docker image", " 2.2 Docker image Docker images are provided to easily install a reproducible environment with R, patRoon and nearly all of its dependencies. This section assumes you have a basic understanding of Docker and have it installed. If not, please refer to the many guides available on the Internet. The Docker images of patRoon were originally only used for automated testing, however, since these contain a complete working environment of patRoon they are also suitable for using the software. They come with all external dependencies (except ProteoWizard), R dependencies and MetFrag libraries. Furthermore, the Docker image also contains RStudio server, which makes using patRoon even easier. Below are some example shell commands on how to run the image. # run an interactive R console session docker run --rm -it patroonorg/patroonrs # run a linux shell, from which R can be launched docker run --rm -it patroonorg/patroonrs bash # run rstudio server, accessible from localhost:8787 # login with rstudio/yourpasswordhere docker run --rm -p 8787:8787 -u 0 -e PASSWORD=yourpasswordhere patroonorg/patroonrs /init # same as above, but mount a local directory (~/myvolume) as local volume so it can be used for persistent storage # please ensure that ~/myvolume exists! docker run --rm -p 8787:8787 -u 0 -e PASSWORD=yourpasswordhere -v ~/myvolume:/home/rstudio/myvolume patroonorg/patroonrs /init Note that the first two commands run as the default user rstudio, while the last two as root. The last commands launch RStudio server. You can access it by browsing to localhost:8787 and logging in with user rstudio and the password defined by the PASSWORD variable from the command (yourpasswordhere in the above example). The last command also links a local volume in order to obtain persistence of files in the container’s home directory. The Docker image is based on the excellent work from the rocker project. For more information on RStudio related options see their documentation for the RStudio image. "],["manual-installation.html", "2.3 Manual installation", " 2.3 Manual installation The manual installation is for users who don’t use Windows or Docker, prefer to do a manual installation or simply want to know what happens behind the scenes. The manual installation consists of three phases: Installing some prerequisite R packages Install and configure (non-R) dependencies Install patRoon 2.3.1 R prerequisites When installing patRoon Windows users have the option to install from a customized (miniCRAN) repository (patRoonDeps). This repository provides a central repository for patRoon and all its R packages. An advantage is that installation will be faster and you will not need to install Rtools. Note that you will need to have the latest R version installed in order to use this repository. When you decide to use the patRoonDeps repository you can simply skip this step. Otherwise (i.e. you will use regular repositories instead), the following will install the R dependencies. install.packages(c("BiocManager", "remotes")) BiocManager::install("CAMERA") # needed for finding/grouping features with KPIC2 BiocManager::install("ropls") remotes::install_github("rickhelmus/KPIC2") # needed for RAMClustR for componentization remotes::install_github("cbroeckl/RAMClustR") # needed for nontarget for componentization remotes::install_github("blosloos/nontargetData") remotes::install_github("blosloos/nontarget") # needed for cliqueMS for componentization remotes::install_github("rickhelmus/cliqueMS") # note: repository is a fork with minor bug fixes # only needed for Bruker DataAnalysis integration # NOTE: a fork is installed that fixes some issues with the latest R versions remotes::install_github("BSchamberger/RDCOMClient") # only when using the R interface (not recommended by default) remotes::install_github("c-ruttkies/MetFragR/metfRag") # needed for feature quality calculations with MetaClean BiocManager::install(c("BiocStyle", "Rgraphviz")) remotes::install_github("KelseyChetnik/MetaClean") Note that only the CAMERA installation is mandatory, the rest involves installation of optional packages. If you are unsure which you need then you can always install the packages at a later stage. 2.3.2 Other dependencies Depending on which functionality is used, the following external dependencies may need to be installed: Software Remarks Java JDK Mandatory for e.g. plotting structures and using MetFrag. Rtools Necessary on Window and when patRoon is not installed from patRoonDeps. ProteoWizard Needed for automatic data-pretreatment (e.g. data file conversion and centroiding, Bruker users may use DataAnalysis integration instead). OpenMS Recommended. Used for e.g. finding and grouping features. MetFrag CL Recommended. Used for annotation with MetFrag. MetFrag CompTox DB Database files necessary for usage of the CompTox database with MetFrag. Note that a recent version of MetFrag (>=2.4.5) is required. Note that the lists with additions for smoking metadata and wastewater metadata are also supported. MetFrag PubChemLite DB Database file needed to use PubChemLite with MetFrag. SIRIUS For obtaining feature data and formula and/or compound annotation. BioTransformer For prediction of transformation products. See the BioTransformer page for installation details. If you have trouble compiling the jar file you can download it from here. SAFD For finding features with SAFD. Please follow all the installation on the SAFD webpage. OpenBabel Used in some cases for suspect screening (e.g. to calculate molecular masses for suspects with only InChI information). Otherwise optional. pngquant Used to reduce size of HTML reports, definitely optional. Most of these packages are optional and only needed if their algorithms are used during the workflow. If you are unsure which are needed, simply skip them for now and install them at a later stage. After installation of these dependencies you may need to configure their filepaths (OpenMS and ProteoWizard are usually found automatically). To configure the file locations you should set some global package options with the options() R function, for instance: options(patRoon.path.pwiz = "C:/ProteoWizard") # location of ProteoWizard installation folder options(patRoon.path.SIRIUS = "C:/sirius-win64-3.5.1") # location where SIRIUS was extracted options(patRoon.path.OpenMS = "/usr/local/bin") # directory with the OpenMS binaries options(patRoon.path.pngquant = "~/pngquant") # directory containing pngquant binary options(patRoon.path.MetFragCL = "~/MetFrag2.4.5-CL.jar") # full location to the jar file options(patRoon.path.MetFragCompTox = "C:/CompTox_17March2019_SelectMetaData.csv") # full location to desired CompTox CSV file options(patRoon.path.MetFragPubChemLite = "~/PubChemLite_14Jan2020_tier0.csv") # full location to desired PubChemLite CSV file options(patRoon.path.BioTransformer = "~/biotransformer/biotransformer-3.0.1.jar") options(patRoon.path.obabel = "C:/Program Files/OpenBabel-3.0.0") # directory with OpenBabel binaries These commands have to be executed everytime you start a new R session (e.g. as part of your script). However, it is probably easier to add them to your ~/.Rprofile file so that they are executed automatically when you start R. If you don’t have this file yet you can simply create it yourself (for more information see e.g. this SO answer). 2.3.3 patRoon installation Finally, it is time to install patRoon itself. As mentioned before, Windows users (who have the latest R version) can install patRoon and all its package dependencies from the patRoonDeps repository: # install from patRoonDeps (only Windows with latest R version) install.packages("patRoon", repos = "https://rickhelmus.github.io/patRoonDeps/", type = "binary") Otherwise, installation occurs directly from GitHub: remotes::install_github("rickhelmus/patRoon") Optional example data is installed via GitHub: # optional example data remotes::install_github("rickhelmus/patRoonData") Afterwards, you can run the verifyDependencies() function to see if patRoon can find all its dependencies (you may need to restart R beforehand): patRoon::verifyDependencies() "],["workflow-concepts.html", "3 Workflow concepts", " 3 Workflow concepts In a non-target workflow both chromatographic and mass spectral data is automatically processed in order to provide a comprehensive chemical characterization of your samples. While the exact workflow is typically dependent on the type of study, it generally involves of the following steps: Note that patRoon supports flexible composition of workflows. In the scheme above you can recognize optional steps by a dashed line. The inclusion of each step is only necessary if a further steps depends on its data. For instance, annotation and componentization do not depend on each other and can therefore be executed in any order or simply be omitted. A brief description of all steps is given below. During data pre-treatment raw MS data is prepared for further analysis. A common need for this step is to convert the data to an open format so that other tools are able to process it. Other pre-treatment steps may involve re-calibration of m/z data or performing advanced filtering operations. The next step is to extract features from the data. While different terminologies are used, a feature in patRoon refers to a single chromatographic peak in an extracted ion chromatogram for a single m/z value (within a defined tolerance). Hence, a feature contains both chromatographic data (e.g. retention time and peak height) and mass spectral data (e.g. the accurate m/z). Note that with mass spectrometry multiple m/z values may be detected for a single compound as a result of adduct formation, natural isotopes and/or in-source fragments. Some algorithms may try to combine these different masses in a single feature. However, in patRoon we generally assume this is not the case (and may optionally be done afterwards during the componentization step described below). Features are sometimes simply referred to as ‘peaks’. Features are found per analysis. Hence, in order to compare a feature across analyses, the next step is to group them. This step is essential as it finds equal features even if their retention time or m/z values slightly differ due to analytical variability. The resulting feature groups are crucial input for subsequent workflow steps. Prior to grouping, retention time alignment between analyses may be performed to improve grouping of features, especially when processing multiple analysis batches at once. Outside patRoon feature groups may also be defined as profiles, aligned or grouped features or buckets. Depending on the study type, suspect screening is then performed to limit the features that should be considered for further processing. As its name suggests, with suspect screening only those features which are suspected to be present are considered for further processing. These suspects are retrieved from a suspect list which contains the m/z and (optionally) retention times for each suspect. Typical suspect lists may be composed from databases with known pollutants or from predicted transformation products. Note that for a ‘full’ non-target analysis no suspect screening is performed, hence, this step is simply omitted and all features are to be considered. The feature group data may then be subjected to componentization. A component is defined as a collection of multiple feature groups that are somehow related to each other. Typical examples are features that belong to the same chemical compound (i.e. with different m/z values but equal retention time), such as adducts, isotopes and in-source fragments. Other examples are homologous series and features that display a similar intensity trend across samples. If adducts or isotopes were annotated during componentization then this data may be used to prioritize the feature groups. The last step in the workflow commonly involves annotation. During this step MS and MS/MS data are collected in so called MS peak lists, which are then used as input for formula and compound annotation. Formula annotation involves automatic calculation of possible formulae for each feature based on its m/z, isotopic pattern and MS/MS fragments, whereas compound annotation (or identification) involves the assignment of actual chemical structures to each feature. Note that during formula and compound annotation typically multiple candidates are assigned to a single feature. To assist interpretation of this data each candidate is therefore ranked on characteristics such as isotopic fit, number of explained MS/MS fragments and metadata from an online database such as number of scientific references or presence in common suspect lists. To summarize: Data-pretreatment involves preparing raw MS data for further processing (e.g. conversion to an open format) Features describe chromatographic and m/z information (or ‘peaks’) in all analyses. A feature group consists of equal features across analyses. With suspect screening only features that are considered to be on a suspect list are considered further in the workflow. Componentization involves consolidating different feature groups that have a relationship to each other in to a single component. MS peak lists Summarizes all MS and MS/MS data that will be used for subsequent annotation. During formula and compound annotation candidate formulae/structures will be assigned and ranked for each feature. The next chapters will discuss how to generate this data and process it. Afterwards, several advanced topics are discussed such as combining positive and negative ionization data, screening for transformation products and other advanced functionality. "],["generating-workflow-data.html", "4 Generating workflow data ", " 4 Generating workflow data "],["introduction-1.html", "4.1 Introduction", " 4.1 Introduction 4.1.1 Workflow functions Each step in the non-target workflow is performed by a function that performs the heavy lifting of a workflow step behind the scenes and finally return the results. An important goal of patRoon is to support multiple algorithms for each workflow step, hence, when such a function is called you have to specify which algorithm you want to use. The available algorithms and their characteristics will be discussed in the next sections. An overview of all functions involved in generating workflow data is shown in the table below. Workflow step Function Output S4 class Data pre-treatment convertMSFiles(), recalibrarateDAFiles() - Finding features findFeatures() features Grouping features groupFeatures() featureGroups Suspect screening screenSuspects() featureGroupsScreening Componentization generateComponents() components MS peak lists generateMSPeakLists() MSPeakLists Formula annotation generateFormulas() formulas Compound annotation generateCompounds() compounds 4.1.2 Workflow output The output of each workflow step is stored in objects derived from so called S4 classes. Knowing the details about the S4 class system of R is generally not important when using patRoon (and well written resources are available if you want to know more). In brief, usage of this class system allows a general data format that is used irrespective of the algorithm that was used to generate the data. For instance, when features have been found by OpenMS or XCMS they both return the same data format. Another advantage of the S4 class system is the usage of so called generic functions. To put simply: a generic function performs a certain task for different types of data objects. A good example is the plotSpectrum() function which plots an (annotated) spectrum from data of MS peak lists or from formula or compound annotation: # mslists, formulas, compounds contain results for MS peak lists and # formula/compound annotations, respectively. plotSpectrum(mslists, ...) # plot raw MS spectrum plotSpectrum(formulas, ...) # plot annotated spectrum from formula annotation data plotSpectrum(compounds, ...) # likewise but for compound annotation. 4.1.3 Overview of all functions and their output Figure 4.1: Workflow functions and output classes. The next sections in this chapter will further detail on how to actually perform the non-target workflow steps to generate data. The transformation product screening workflows are discussed in a separate chapter. "],["preparations.html", "4.2 Preparations", " 4.2 Preparations 4.2.1 Data pre-treatment Prior to performing the actual non-target data processing workflow some preparations often need to be made. Often data has to be pre-treated, for instance, by converting it to an open format that is usable for subsequent workflow steps or to perform mass re-calibration. Some common functions are listed below. Task Function Algorithms Supported file formats Conversion convertMSFiles() OpenMS, ProteoWizard, DataAnalysis All common (algorithm dependent) Advanced (e.g. spectral filtering) convertMSFiles() ProteoWizard All common Mass re-calibration recalibrarateDAFiles() DataAnalysis Bruker The convertMSFiles() function supports conversion between many different file formats typically used in non-target analysis. Furthermore, other pre-treatment steps are available (e.g. centroiding, filtering) when the ProteoWizard algorithm is used. For an overview of these functionalities see the MsConvert documentation. Some examples: # Converts a single mzXML file to mzML format convertMSFiles("standard-1.mzXML", to = "mzML", algorithm = "openms") # Converts all Thermo files with ProteoWizard (the default) in the analyses/raw # directory and stores the mzML files in analyses/raw. Afterwards, only MS1 # spectra are retained. convertMSFiles("analyses/raw", "analyses/mzml", from = "thermo", centroid = "vendor", filters = "msLevel 1") NOTE Most algorithms further down the workflow require the mzML or mzXML file format and additionally require that mass peaks have been centroided. When using the ProteoWizard algorithm (the default), centroiding by vendor algorithms is generally recommended (i.e. by setting centroid=\"vendor\" as shown in the above example). When Bruker MS data is used it can be automatically re-calibrated to improve its mass accuracy. Often this is preceeded by calling the setDAMethod() function to set a DataAnalysis method to all files in order to configure automatic re-calibration. The recalibrarateDAFiles() function performs the actual re-calibration. The getDACalibrationError() function can be used at anytime to request the current calibration error of each analysis. An example of these functions is shown below. # anaInfo is a data.frame with information on analyses (see next section) setDAMethod(anaInfo, "path/to/DAMethod.m") # configure Bruker files with given method that has automatic calibration setup recalibrarateDAFiles(anaInfo) # trigger re-calibration for each analysis getDACalibrationError(anaInfo) # get calibration error for each analysis (NOTE: also shown when previous function is finished) 4.2.2 Analysis information The final bits of preparation is constructing the information for the analyses that need to be processed. In patRoon this is referred to as the analysis information and often stored in a variable anaInfo (of course you are free to choose a different name!). The analysis information should be a data.frame with the following columns: path: the directory path of the file containing the analysis data analysis: the name of the analysis. This should be the file name without file extension. group: to which replicate group the analysis belongs. All analysis which are replicates of each other get the same name. blank: which replicate group should be used for blank subtraction. conc (optional, advanced) A numeric value describing the concentration or any other value for which the intensity in this sample may correlate, for instance, dilution factor, sampling time etc. This column is only required when you want to obtain quantitative information (e.g. concentrations) using the as.data.table() method function (see ?featureGroups for more information). The generateAnalysisInfo() function can be used to (semi-)automatically generate a suitable data.frame that contains all the required information for a set of analysis. For, instance: # Take example data from patRoonData package (triplicate solvent blank + triplicate standard) generateAnalysisInfo(paths = patRoonData::exampleDataPath(), groups = c(rep("solvent-pos", 3), rep("standard-pos", 3)), blanks = "solvent-pos") #> path analysis group blank #> 1 /usr/local/lib/R/site-library/patRoonData/extdata/pos solvent-pos-1 solvent-pos solvent-pos #> 2 /usr/local/lib/R/site-library/patRoonData/extdata/pos solvent-pos-2 solvent-pos solvent-pos #> 3 /usr/local/lib/R/site-library/patRoonData/extdata/pos solvent-pos-3 solvent-pos solvent-pos #> 4 /usr/local/lib/R/site-library/patRoonData/extdata/pos standard-pos-1 standard-pos solvent-pos #> 5 /usr/local/lib/R/site-library/patRoonData/extdata/pos standard-pos-2 standard-pos solvent-pos #> 6 /usr/local/lib/R/site-library/patRoonData/extdata/pos standard-pos-3 standard-pos solvent-pos (Note that for the example data the patRoonData::exampleAnalysisInfo() function can also be used.) Alternatively, the newProject() function discussed in the next section can be used to interactively construct this information. 4.2.3 Automatic project generation with newProject() The previous sections already highlighted some steps that have to be performed prior to starting a new non-target analysis workflow: data pre-treatment and gathering information on the analysis. Most of the times you will put this and other R code a script file so you can recall what you have done before (i.e. reproducible research). The newProject() function can be used to setup a new project. When you run this function it will launch a small tool (see screenshot below) where you can select your analyses and configure the various workflow steps which you want to execute (e.g. data pre-treatment, finding features, annotation etc). After setting everything up the function will generate a template script which can easily be edited afterwards. In addition, you have the option to create a new RStudio project, which is advantegeous as it neatly seperates your data processing work from the rest. NOTE At the moment newProject() only works with RStudio. "],["features.html", "4.3 Features", " 4.3 Features Collecting features from the analyses consists of finding all features, grouping them across analyses (optionally after retention time alignment), and if desired suspect screening: 4.3.1 Finding and grouping features Several algorithms are available for finding features. These are listed in the table below alongside their usage and general remarks. Algorithm Usage Remarks OpenMS findFeatures(algorithm = \"openms\", ...) Uses the FeatureFinderMetabo algorithm XCMS findFeatures(algorithm = \"xcms\", ...) Uses xcms::xcmsSet() function XCMS (import) importFeatures(algorithm = \"xcms\", ...) Imports an existing xcmsSet object XCMS3 findFeatures(algorithm = \"xcms3\", ...) Uses xcms::findChromPeaks() from the new XCMS3 interface XCMS3 (import) importFeatures(algorithm = \"xcms3\", ...) Imports an existing XCMSnExp object enviPick findFeatures(algorithm = \"envipick\", ...) Uses enviPick::enviPickwrap() KPIC2 findFeatures(algorithm = \"kpic2\", ...) Uses the KPIC2 R package KPIC2 (import) importFeatures(algorithm = \"kpic2\", ...) Imports features from KPIC2 SIRIUS findFeatures(algorithm = \"sirius\", ...) Uses SIRIUS to find features SAFD findFeatures(algorithm = \"safd\", ...) Uses the SAFD algorithm (experimental) DataAnalysis findFeatures(algorithm = \"bruker\", ...) Uses Find Molecular Features from DataAnalysis (Bruker only) Most often the performance of these algorithms heavily depend on the data and parameter settings that are used. Since obtaining a good feature dataset is crucial for the rest of the workflow, it is highly recommended to experiment with different settings (this process can also be automated, see the feature optimization section for more details). Some common parameters to look at are listed in the table below. However, there are many more parameters that can be set, please see the reference documentation for these (e.g. ?findFeatures). Algorithm Common parameters OpenMS noiseThrInt, chromSNR, chromFWHM, mzPPM, minFWHM, maxFWHM (see ?findFeatures) XCMS / XCMS3 peakwidth, mzdiff, prefilter, noise (assuming default centWave algorithm, see ?findPeaks.centWave / ?CentWaveParam) enviPick dmzgap, dmzdens, drtgap, drtsmall, drtdens, drtfill, drttotal, minpeak, minint, maxint (see ?enviPickwrap) KPIC2 kmeans, level, min_snr (see ?findFeatures and ?getPIC / ?getPIC.kmeans) SIRIUS The sirius algorithm is currently parameterless SAFD mzRange, maxNumbIter, resolution, minInt (see ?findFeatures) DataAnalysis See Find -> Parameters… -> Molecular Features in DataAnalysis. NOTE Support for SAFD is still experimental and some extra work is required to set everything up. Please see the reference documentation for this algorithm (?findFeatures). NOTE DataAnalysis feature settings have to be configured in DataAnalysis prior to calling findFeatures(). Similarly, for grouping features across analyses several algorithms are supported. Algorithm Usage Remarks OpenMS groupFeatures(algorithm = \"openms\", ...) Uses the FeatureLinkerUnlabeled algorithm (and MapAlignerPoseClustering for retention alignment) XCMS groupFeatures(algorithm = \"xcms\", ...) Uses xcms::group() xcms::retcor() functions XCMS (import) importFeatureGroupsXCMS(...) Imports an existing xcmsSet object. XCMS3 groupFeatures(algorithm = \"xcms3\", ...) Uses xcms::groupChromPeaks() and xcms::adjustRtime() functions XCMS3 (import) importFeatureGroupsXCMS3(...) Imports an existing XCMSnExp object. KPIC2 groupFeatures(algorithm = \"kpic2\", ...) Uses the KPIC2 package KPIC2 (import) importFeatureGroupsKPIC2(...) Imports a PIC set object SIRIUS groupFeatures(anaInfo, algorithm = \"sirius\") Finds and groups features with SIRIUS ProfileAnalysis importFeatureGroups(algorithm = \"brukerpa\", ...) Import .csv file exported from Bruker ProfileAnalysis TASQ importFeatureGroups(algorithm = \"brukertasq\", ...) Imports a Global result table (exported to Excel file and then saved as .csv file) NOTE: Grouping features with the sirius algorithm will perform both finding and grouping features with SIRIUS. This algorithm cannot work with features from another algorithm. Just like finding features, each algorithm has their own set of parameters. Often the defaults are a good start but it is recommended to have look at them. See ?groupFeatures for more details. When using the XCMS algorithms both the ‘classical’ interface and latest XCMS3 interfaces are supported. Currently, both interfaces are mostly the same regarding functionalities and implementation. However, since future developments of XCMS are primarily focused the latter this interface is recommended. Some examples of finding and grouping features are shown below. # The anaInfo variable contains analysis information, see the previous section # Finding features fListOMS <- findFeatures(anaInfo, "openms") # OpenMS, with default settings fListOMS2 <- findFeatures(anaInfo, "openms", noiseThrInt = 500, chromSNR = 10) # OpenMS, adjusted minimum intensity and S/N fListXCMS <- findFeatures(anaInfo, "xcms", ppm = 10) # XCMS fListXCMSImp <- importFeatures(anaInfo, "xcms", xset) # import XCMS xcmsSet object fListXCMS3 <- findFeatures(anaInfo, "xcms3", CentWaveParam(peakwidth = c(5, 15))) # XCMS3 fListEP <- findFeatures(anaInfo, "envipick", minint = 1E3) # enviPick fListKPIC2 <- findFeatures(anaInfo, "kpic2", kmeans = TRUE, level = 1E4) # KPIC2 fListSIRIUS <- findFeatures(anaInfo, "sirius") # SIRIUS # Grouping features fGroupsOMS <- groupFeatures(fListOMS, "openms") # OpenMS grouping, default settings fGroupsOMS2 <- groupFeatures(fListOMS2, "openms", rtalign = FALSE) # OpenMS grouping, no RT alignment fGroupsOMS3 <- groupFeatures(fListXCMS, "openms", maxGroupRT = 6) # group XCMS features with OpenMS, adjusted grouping parameter # group enviPick features with XCMS3, disable minFraction fGroupsXCMS <- groupFeatures(fListEP, "xcms3", xcms::PeakDensityParam(sampleGroups = analInfo$group, minFraction = 0)) # group with KPIC2 and set some custom grouping/aligning parameters fGroupsKPIC2 <- groupFeatures(fListKPIC2, "kpic2", groupArgs = list(tolerance = c(0.002, 18)), alignArgs = list(move = "loess")) fGroupsSIRIUS <- groupFeatures(anaInfo, "sirius") # find/group features with SIRIUS 4.3.2 Suspect screening NOTE: you may need to install OpenBabel, for instance, when only InChI data is available for mass calculation. After features have been grouped a so called suspect screening step may be performed to find features that may correspond to suspects within a given suspect list. The screenSuspects() function is used for this purpose, for instance: suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "2-Hydroxyquinoline"), mz = c(120.0556, 137.0709, 146.0600)) fGroupsSusp <- screenSuspects(fGroups, suspects) 4.3.2.1 Suspect list format The example above has a very simple suspect list with just three compounds. The format of the suspect list is quite flexible, and can contain the following columns: name: The name of the suspect. Mandatory and should be unique and file-name compatible (if not, the name will be automatically re-named to make it compatible). rt: The retention time in seconds. Optional. If specified any feature groups with a different retention time will not be considered to match suspects. mz, SMILES, InChI, formula, neutralMass: at least one of these columns must hold data for each suspect row. The mz column specifies the ionized mass of the suspect. If this is not available then data from any of the other columns is used to determine the suspect mass. adduct: The adduct of the suspect. Optional. Set this if you are sure that a suspect should be matched by a particular adduct ion and no data in the mz column is available. fragments_mz and fragments_formula: optional columns that may assist suspect annotation. In most cases a suspect list is best made as a csv file which can then be imported with e.g. the read.csv() function. This is exactly what happen when you specify a suspect list when using the newProject() function. Quite often, the ionized masses are not readily available and these have to be calculated. In this case, data in any of the SMILES/InChI/formula/neutralMass columns should be provided. Whenever possible, it is strongly recommended to fill in SMILES column (or InChI), as this will assist annotation. Applying this to the above example: suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "2-Hydroxyquinoline"), SMILES = c("[nH]1nnc2ccccc12", "NC(=O)Nc1ccccc1", "Oc1ccc2ccccc2n1")) fGroupsSusp <- screenSuspects(fGroups, suspects, adduct = "[M+H]+") #> Trying to calculate missing InChI data in suspect list... Done! Filled in 3 (100.0%) entries. #> Trying to calculate missing InChIKey data in suspect list... Done! Filled in 3 (100.0%) entries. #> Trying to calculate missing formula data in suspect list... Done! Filled in 3 (100.0%) entries. #> Calculating neutral masses for each suspect... #> ================================================================================ #> ================================================================================ #> Found 3/3 suspects (100.00%) Since suspect matching now occurs by the neutral mass it is required that the adduct information for the feature groups are set. This is done either by setting the adduct function argument to screenSuspects or by feature group adduct annotations. Finally, when the adduct is known for a suspect it can be specified in the suspect list: # Aldicarb is measured with a sodium adduct. suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "Aldicarb"), SMILES = c("[nH]1nnc2ccccc12", "NC(=O)Nc1ccccc1", "CC(C)(C=NOC(=O)NC)SC"), adduct = c("[M+H]+", "[M+H]+", "[M+Na]+")) fGroupsSusp <- screenSuspects(fGroups, suspects) To summarize: If a suspect has data in the mz column it will be directly matched with the m/z value of a feature group. Otherwise, if the suspect has data in the adduct column, the m/z value for the suspect is calculated from its neutral mass and the adduct and then matched with the m/z of a feature group. Otherwise, suspects and feature groups are matched by their the neutral mass. The fragments_mz and fragments_formula columns in the suspect list can be used to specify known fragments for a suspect, which can help suspect annotation. The former specifies the ionized m/z of known MS/MS peaks, whereas the second specifies known formulas. Multiple values can be given by separating them with a semicolon: suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "2-Hydroxyquinoline"), SMILES = c("[nH]1nnc2ccccc12", "NC(=O)Nc1ccccc1", "Oc1ccc2ccccc2n1"), fragments_formula = c("C6H6N", "C6H8N;C7H6NO", ""), fragments_mz = c("", "", "118.0652")) 4.3.2.2 Removing feature groups without hits Note that any feature groups that were not matched to a suspect are not removed by default. If you want to remove these, you can use the onlyHits parameter: fGroupsSusp <- screenSuspects(fGroups, suspects, onlyHits = TRUE) # remove any non-hits immediately The advantage of removing non-hits is that it may significantly reduce the complexity of your dataset. On the other hand, retaining all features allows you to mix a full non-target analysis with a suspect screening workflow. The filter() function (discussed here) can also be used to remove feature groups without a hit at a later stage. 4.3.2.3 Combining screening results The amend function argument to screenSuspects can be used to combine screening results from different suspect lists. fGroupsSusp <- screenSuspects(fGroups, suspects) fGroupsSusp <- screenSuspects(fGroupsSusp, suspects2, onlyHits = TRUE, amend = TRUE) In this example the suspect lists defined in suspects and suspects2 are both used for screening. By setting amend=TRUE the original screening results (i.e. from suspects) are preserved. Note that onlyHits should only be set in the final call to screenSuspects to ensure that all feature groups are screened. "],["componentization.html", "4.4 Componentization", " 4.4 Componentization In patRoon componentization refers to grouping related feature groups together in components. There are different methodologies to generate components: Similarity on chromatographic elution profiles: feature groups with similar chromatographic behaviour which are assuming to be the same chemical compound (e.g. adducts or isotopologues). Homologous series: features with increasing m/z and retention time. Intensity profiles: features that follow a similar intensity profile in the analyses. MS/MS similarity: feature groups with similar MS/MS spectra are clustered. Transformation products: Components are formed by grouping feature groups that have a parent/transformation product relationship. This is further discussed in its own chapter. The following algorithms are currently supported: Algorithm Usage Remarks CAMERA generateComponents(algorithm = \"camera\", ...) Clusters feature groups with similar chromatographic elution profiles and annotate by known chemical rules (adducts, isotopologues, in-source fragments). RAMClustR generateComponents(algorithm = \"ramclustr\", ...) As above. cliqueMS generateComponents(algorithm = \"cliquems\", ...) As above, but using feature components. OpenMS generateComponents(algorithm = \"openms\", ...) As above. Uses MetaboliteAdductDecharger. nontarget generateComponents(algorithm = \"nontarget\", ...) Uses the nontarget R package to perform unsupervised homologous series detection. Intensity clustering generateComponents(algorithm = \"intclust\", ...) Groups features with similar intensity profiles across analyses by hierarchical clustering. MS/MS clustering generateComponents(algorithm = \"specclust\", ...) Clusters feature groups with similar MS/MS spectra. Transformation products generateComponents(algorithm = \"tp\", ...) Discussed in its own chapter. 4.4.1 Features with similar chromatographic behaviour Isotopes, adducts and in-source fragments typically result in detection of multiple mass peaks by the mass spectrometer for a single chemical compound. While some feature finding algorithms already try to collapse (some of) these in to a single feature, this process is often incomplete (if performed at all) and it is not uncommon that multiple features will describe the same compound. To overcome this complexity several algorithms can be used to group features that undergo highly similar chromatographic behavior but have different m/z values. Basic chemical rules are then applied to the resulting components to annotate adducts, in-source fragments and isotopologues, which may be highly useful for general identification purposes. Note that some algorithms were primarily designed for datasets where features are generally present in the majority of the analyses (as is relatively common in metabolomics). For environmental analyses, however, this is often not the case. For instance, consider the following situation with three feature groups that chromatographically overlap and therefore could be considered a component: Feature group m/z analysis 1 analysis 2 analysis 3 #1 100.08827 Present Present Absent #2 122.07021 Present Present Absent #3 138.04415 Absent Absent Present Based on the mass differences from this example a cluster of [M+H]+, [M+Na]+ and [M+K]+ could be assumed. However, no features of the first two feature groups were detected in the third sample analysis, whereas the third feature group wasn’t detected in the first two sample analysis. Based on this it seems unlikely that feature group #3 should be part of the component. For the algorithms that operate on a ‘feature group level’ (CAMERA and RAMClustR), the relMinReplicates argument can be used to remove feature groups from a component that are not abundant. For instance, when this value is 0.5 (the default), and all the features of a component were detected in four different replicate groups in total, then only those feature groups are kept for which its features were detected in at least two different replicate groups (i.e. half of four). Another approach to reduce unlikely adduct annotations is to use algorithms that operate on a ‘feature level’ (cliqueMS and OpenMS). These algorithms generate components for each sample analysis individually. The ‘feature components’ are then merged by a consensus approach where unlikely annotations are removed (the algorithm is described further in the reference manual, ?generateComponents). Each algorithm supports many different parameters that may significantly influence the (quality of the) output. For instance, care has to be taken to avoid ‘over-clustering’ of feature groups which do not belong in the same component. This is often easily visible since the chromatographic peaks poorly overlap or are shaped differently. The checkComponents function (discussed here) can be used to quickly verify componentization results. For a complete listing all arguments see the reference manual (e.g. ?generateComponents). Once the components with adduct and isotopes annotations are generated this data can be used to prioritize and improve the workflow. Some example usage is shown below. # Use CAMERA with defaults componCAM <- generateComponents(fGroups, "camera", ionization = "positive") # CAMERA with customized settings componCAM2 <- generateComponents(fGroups, "camera", ionization = "positive", extraOpts = list(mzabs = 0.001, sigma = 5)) # Use RAMClustR with customized parameters componRC <- generateComponents(fGroups, "ramclustr", ionization = "positive", hmax = 0.4, extraOptsRC = list(cor.method = "spearman"), extraOptsFM = list(ppm.error = 5)) # OpenMS with customized parameters componOpenMS <- generateComponents(fGroups, "openms", ionization = "positive", chargeMax = 2, absMzDev = 0.002) # cliqueMS with default parameters componCliqueMS <- generateComponents(fGroups, "cliquems", ionization = "negative") 4.4.2 Homologues series Homologues series can be automatically detected by interfacing with the nontarget R package. Components are made from feature groups that show increasing m/z and retention time values. Series are first detected within each replicate group. Afterwards, series from all replicates are linked in case (partial) overlap occurs and this overlap consists of the same feature groups (see figure below). Linked series are then finally merged if this will not cause any conflicts with other series: such a conflict typically occurs when two series are not only linked to each other. Figure 4.2: Linking of homologues series top: partial overlap and will be linked; bottom: no linkage due to different feature in overlapping series. The series that are linked can be interactively explored with the plotGraph() function (discussed here). Common function arguments to generateComponents() are listed below. Argument Remarks ionization Ionization mode: \"positive\" or \"negative\". Not needed if adduct annotations are available. rtRange, mzRange Retention and m/z increment range. Retention times can be negative to allow series with increasing m/z values and decreasing retention times. elements Vector with elements to consider. rtDev, absMzDev Maximum retention time and m/z deviation. ... Further arguments passed to the homol.search() function. # default settings componNT <- generateComponents(fGroups, "nontarget", ionization = "positive") # customized settings componNT2 <- generateComponents(fGroups, "nontarget", ionization = "positive", elements = c("C", "H"), rtRange = c(-60, 60)) 4.4.3 Intensity and MS/MS similarity The previous componentization methods utilized chemical properties to relate features. The two componentization algorithms described in this section use a statistical approach based on hierarchical clustering. The first algorithm normalizes all feature intensities and then clusters features with similar intensity profiles across sample analyses together. The second algorithm compares all MS/MS spectra from all feature groups, and then uses hierarchical clustering to generate components from feature groups that have a high MS/MS spectrum similarity. Some common arguments to generateComponents() are listed below. It is recommended to test various settings (especially for method) to optimize the clustering results. Argument Algorithm Default Remarks method All \"complete\" Clustering method. See ?hclust metric intclust \"euclidean\" Metric used to calculate the distance matrix. See ?daisy. normFunc intclust max Function used to normalize data. Feature intensities within a feature group are divided by the result of when this function is called with their intensity values. average intclust TRUE Whether intensities of replicates should first be averaged. MSPeakLists specclust - The MS peak lists object used for spectral similarity calculations specSimParams specclust getDefSpecSimParams() Parameters used for spectral similarity calculation. maxTreeHeight, deepSplit, minModuleSize All 1, TRUE, 1 Used for dynamic cluster assignment. See ?cutreeDynamicTree. The components are generated by automatically assigning clusters using the dynamicTreeCut R package. However, the cluster assignment can be performed manually or with different parameters, as is demonstrated below. The resulting components are stored in an object from the componentsIntClust or componentsSpecClust S4 class, which are both derived from the componentsClust class (which in turn is derived from the components class). Several methods are defined that can be used on these objects to re-assign clusters, perform plotting operations and so on. Below are some examples. For plotting see the relevant visualization section. More info can be found in the reference manual (e.g. ?componentsIntClust, ?componentsSpecClust and ?componentsClust). # generate intensity profile components with default settings componInt <- generateComponents(fGroups, "intclust") # manually re-assign clusters componInt <- treeCut(componInt, k = 10) # automatic re-assignment of clusters (adjusted max tree height) componInt <- treeCutDynamic(componInt, maxTreeHeight = 0.7) # MS/MS similarity components componMSMS <- generateComponents(fGroups, "specclust", MSPeakLists = mslists) "],["incorpAdductIso.html", "4.5 Incorporating adduct and isotopic data", " 4.5 Incorporating adduct and isotopic data With mass spectrometry it is common that multiple m/z values are detected for a single compound. These may be different adducts (e.g. [M+H]+, [M+Na]+, [M-H]-), the different isotopes of the molecule or a combination thereof. When multiple m/z values are measured for the same compound, the feature finding algorithm may yield a distinct feature for each, which adds complexity to the data. In the previous section it was discussed how componentization can help to find feature groups that belong to the same adduct and/or isotope clusters. This section explains how this data can be used to simplify the feature dataset. Furthermore, this section also covers adduct annotations for feature groups which may improve and simplify the general workflow. 4.5.1 Selecting features with preferential adducts/isotopes The selectIons function forms the bridge between feature group and componentization data. This function uses the adduct and isotope annotations to select preferential feature groups. For adduct clusters this means that only the feature group that has a preferential adduct (e.g. [M+H]+) is kept while others (e.g. [M+Na]+) are removed. If none of the adduct annotations are considered preferential, the most intense feature group is kept instead. For isotopic clusters typically only the feature group with the monoisotopic mass (i.e. M0) is kept. The behavior of selectIons is configurable with the following parameters: Argument Remarks prefAdduct The preferential adduct. Usually \"[M+H]+\" or \"[M-H]-\". onlyMonoIso If TRUE and a feature group is with isotopic annotations then it is only kept if it is monoisotopic. chargeMismatch How charge mismatches between adduct and isotope annotations are dealt with. Valid options are \"isotope\", \"adduct\", \"none\" or \"ignore\". See the reference manual for selectIons for more details. In case componentization did not lead to an adduct annotation for a feature group it will never be removed and simply be annotated with the preferential adduct. Similarly, when no isotope annotations are available and onlyMonoIso=TRUE, the feature group will not be removed. Although selectIons operates fairly conservative, it is still recommended to verify the componentization results in advance, for instance with the checkComponents function discussed here. Furthermore, the next subsection explains how adduct annotations can be corrected manually if needed. An example usage is shown below. fGroupsSel <- selectIons(fGroups, componCAM, "[M+H]+") #> No isotope annotations available! #> Removed 21 feature groups detected as unwanted adducts/isotopes #> Annotated 13 feature groups with adducts #> Remaining 111 feature groups set as default adduct [M+H]+ 4.5.2 Setting adduct annotations for feature groups The adducts() function can be used to obtain a character vector with adduct annotations for each feature group. When no adduct annotations are available it will simply return an empty character vector. When the selectIons function is used it will automatically add adduct annotations based on the componentization data. In addition, the adducts()<- function can be used to manually add or change adduct annotations. adducts(fGroups) # no adduct annotations #> character(0) adducts(fGroupsSel)[1:5] # adduct annotations set by selectIons() #> M109_R192_20 M111_R330_23 M114_R269_25 M116_R317_29 M120_R268_30 #> "[M+H]+" "[M+H]+" "[M+H]+" "[M+H]+" "[M+K]+" adducts(fGroupsSel)[3] <- "[M+Na]+" # modify annotation adducts(fGroupsSel)[1:5] # verify #> M109_R192_20 M111_R330_23 M114_R269_25 M116_R317_29 M120_R268_30 #> "[M+H]+" "[M+H]+" "[M+Na]+" "[M+H]+" "[M+K]+" NOTE Adduct annotations are always available with sets workflows. 4.5.3 Using adduct annotations in the workflow When feature groups have adduct annotations available this may simplify and improve the workflow. The adduct and ionization arguments used for suspect screening, formula/compound annotation and some componentization algorithms do not have to be set anymore, since this data can be obtained from the adduct annotations. Furthermore, these algorithms may improve their results, since the algorithms are now able to use adduct information for each feature group individually, instead of assuming that all feature groups have the same adduct. "],["annotation.html", "4.6 Annotation", " 4.6 Annotation The annotation consists of collecting MS peak lists and then formula and/or compound annotation: Note that compound annotation is normally not dependent upon formula annotation. However, formula data can be used to improve ranking of candidates afterwards by the addFormulaScoring() function, which will be discussed later in this section. Furthermore, suspect annotation is not mandatory, and may use data from peak lists, formulae and/or comounds. 4.6.1 MS peak lists Algorithm Usage Remarks mzR generateMSPeakLists(algorithm = \"mzr\", ...) Uses mzR for spectra retrieval. Recommended default. DataAnalysis generateMSPeakLists(algorithm = \"bruker\", ...) Loads data after automatically generating MS and MS/MS spectra in DataAnalysis DataAnalysis FMF generateMSPeakLists(algorithm = \"brukerfmf\", ...) Uses spectra from the find molecular features algorithm. The recommended default algorithm is mzr: this algorithm is generally faster and is not limited to a vendor data format as it will read the open mzML and mzXML file formats. On the other hand, when DataAnalysis is used with Bruker data the spectra can be automatically background subtracted and there is no need for file conversion. Note that the brukerfmf algorithm only works when findFeatures() was called with the bruker algorithm. When generateMSPeakists() is called it will Find all MS and MS/MS spectra that ‘belong’ to a feature. For MS spectra this means that all spectra close to the retention time of a feature will be collected. In addition, for MS/MS normally only spectra will be considered that have a precursor mass close to that of the feature (however, this can be disabled for data that was recorded with data independent acquisition (DIA, MS^E, bbCID, …)). Average all MS and MS/MS spectra to produce peak lists for each feature. Average all peak lists for features within the same group. Data from either (2) or (3) is used for subsequent annotation steps. Formula calculation can use either (as a trade-off between possibly more accurate results by outlier removal vs speed), whereas compound annotation will always use data from (3) since annotating single features (as opposed to their groups) would take a very long time. There are several common function arguments to generateMSPeakLists() that can be used to optimize its behaviour: Argument Algorithm(s) Remarks maxMSRtWindow mzr, bruker Maximum time window +/- the feature retention time (in seconds) to collect spectra for averaging. Higher values may significantly increase processing times. precursorMzWindow mzr Maximum precursor m/z search window to find MS/MS spectra. Set to NULL to disable (i.e. for DIA experiments). topMost mzr Only retain feature data for no more than this amount analyses with highest intensity. For instance, a value of 1 will only keep peak lists for the feature with highest intensity in a feature group. bgsubtr bruker Perform background subtraction (if the spectra type supports this, e.g. MS and bbCID) minMSIntensity, minMSMSIntensity bruker, brukerfmf Minimum MS and MS/MS intensity. Note that DataAnalysis reports many zero intensity peaks so a value of at least 1 is recommended. MSMSType bruker The type of spectra that should be used for MSMS: \"BBCID\" for bbCID experiments, otherwise \"MSMS\" (the default). In addition, several parameters can be set that affect spectral averaging. These parameters are passed as a list to the avgFeatParams (mzr algorithm only) and avgFGroupParams arguments, which affect averaging of feature and feature group data, respectively. Some typical parameters include: clusterMzWindow: Maximum m/z window used to cluster mass peaks when averaging. The better the MS resolution, the lower this value should be. topMost: Retain no more than this amount of most intense mass peaks. Useful to filter out ‘noisy’ peaks. minIntensityPre / minIntensityPost: Mass peaks below this intensity will be removed before/after averaging. See ?generateMSPeakLists for all possible parameters. A suitable list object to set averaging parameters can be obtained with the getDefAvgPListParams() function. # lower default clustering window, other settings remain default avgPListParams <- getDefAvgPListParams(clusterMzWindow = 0.001) # Apply to both feature and feature group averaging plists <- generateMSPeakLists(fGroups, "mzr", avgFeatParams = avgPListParams, avgFGroupParams = avgPListParams) 4.6.2 Formulae Formulae can be automatically calculated for all features using the generateFormulas() function. The following algorithms are currently supported: Algorithm Usage Remarks GenForm generateFormulas(algorithm = \"genform\", ...) Bundled with patRoon. Reasonable default. SIRIUS generateFormulas(algorithm = \"sirius\", ...) Requires MS/MS data. DataAnalysis generateFormulas(algorithm = \"bruker\", ...) Requires FMF features (i.e. findFeatures(algorithm = \"bruker\", ...)). Uses SmartFormula algorithms. Calculation with GenForm is often a good default. It is fast and basic rules can be applied to filter out obvious non-existing formulae. A possible drawback of GenForm, however, is that may become slow when many candidates are calculated, for instance, due to a relative high feature m/z (e.g. >600) or loose elemental restricitions. More thorough calculation is performed with SIRIUS: this algorithm often yields fewer and often more plausible results. However, SIRIUS requires MS/MS data (hence features without will not have results) and formula prediction may not work well for compounds that structurally deviate from the training sets used by SIRIUS. Calculation with DataAnalysis is only possible when features are obtained with DataAnalysis as well. An advantage is that analysis files do not have to be converted, however, compared to other algorithms calculation is often relative slow. There are two methods for formula assignment: Formulae are first calculated for each individual feature within a feature group. These results are then pooled, outliers are removed and remaining formulae are assigned to the feature group (i.e. calculateFeatures = TRUE). Formulae are directly calculated for each feature group by using group averaged peak lists (see previous section) (i.e. calculateFeatures = FALSE). The first method is more thorough and the possibility to remove outliers may sometimes result in better formula assignment. However, the second method is much faster and generally recommended for large number of analyses. By default, formulae are either calculated by only MS/MS data (SIRIUS) or with both MS and MS/MS data (GenForm/Bruker). The latter also allows formula calculation when no MS/MS data is present. Furthermore, with Bruker algorithms, data from both MS and MS/MS formula data can be combined to allow inclusion of candidates that would otherwise be excluded by e.g. poor MS/MS data. However, a disadvantage is that formulae needs to be calculated twice. The MSMode argument (listed below) can be used to customize this behaviour. An overview of common parameters that are typically set to customize formula calculation is listed below. Argument Algorithm(s) Remarks relMzDev genform, sirius The maximum relative m/z deviation for a formula to be considered (in ppm). elements genform, sirius Which elements to consider. By default \"CHNOP\". Try to limit possible elements as much as possible. calculateFeatures genform, sirius Whether formulae should be calculated first for all features (see discussion above) (always TRUE with DataAnalysis). featThresholdAnn All Minimum relative amount (0-1) that a candidate formula for a feature group should be found among all annotated features (e.g. 1 means that a candidate is only considered if it was assigned to all annotated features). adduct All The adduct to consider for calculation (e.g. \"[M+H]+\", \"[M-H]-\", more details in the adduct section). Don’t set this when adduct annotations are available. MSMode genform, bruker Whether formulae should be generated only from MS data (\"ms\"), MS/MS data (\"msms\") or both (\"both\"). The latter is default, see discussion above. profile sirius Instrument profile, e.g. \"qtof\", \"orbitrap\", \"fticr\". Some typical examples: formulasGF <- generateFormulas(fGroups, mslists, "genform") # GenForm, default settings formulasGF2 <- generateFormulas(fGroups, mslists, "genform", calculateFeatures = FALSE) # direct feature group assignment (faster) formulasSIR <- generateFormulas(fGroups, mslists, "sirius", elements = "CHNOPSClBr") # SIRIUS, common elements for pollutant formulasSIR2 <- generateFormulas(fGroups, mslists, "sirius", adduct = "[M-H]-") # SIRIUS, negative ionization formulasBr <- generateFormulas(fGroups, mslists, "bruker", MSMode = "MSMS") # Only consider MSMS data (SmartFormula3D) 4.6.3 Compounds An important step in a typical non-target workflow is structural identification for features of interest. Afterall, this information may finally reveal what a feature is. The first step is to find all possible structures in a database that may be assigned to the feature (based on e.g. monoisotopic mass or formula). These candidates are then scored to rank likely candidates, for instance, on correspondence with in-silico or library MS/MS spectra and environmental relevance. Structure assignment in patRoon is performed automatically for all feature groups with the generateCompounds() function. Currently, this function supports two algorithms: Algorithm Usage Remarks MetFrag generateCompounds(algorithm = \"metfrag\", ...) Supports many databases (including custom) and scorings for candidate ranking. SIRIUS with CSI:FingerID generateCompounds(algorithm = \"sirius\", ...) Incorporates prior comprohensive formula calculations. Compound annotation is often a relative time and resource intensive procedure. For this reason, features are not annotated individually, but instead a feature group as a whole is annotated, which generally saves significant amounts of computational requirements. Nevertheless, it is not uncommon that this is the most time consuming step in the workflow. For this reason, prioritization of features is highly important, even more so to avoid ‘abusing’ servers when an online database is used for compound retrieval. Selecting the right database is important for proper candidate assignment. Afterall, if the ‘right’ chemical compound is not present in the used database, it is impossible to assign the correct structure. Luckily, however, several large databases such as PubChem and ChemSpider are openly available which contain tens of millions of compounds. On the other hand, these databases may also lead to many unlikely candidates and therefore more specialized (or custom databases) may be preferred. Which database will be used is dictated by the database argument to generateCompounds(), currently the following options exist: Database Algorithm(s) Remarks pubchem \"metfrag\", \"sirius\" PubChem is currently the largest compound database and is used by default. chemspider \"metfrag\" ChemSpider is another large database. Requires security token from here (see next section). comptox \"metfrag\" The EPA CompTox contains many compounds and scorings relevant to environmental studies. Needs manual download (see next section). pubchemlite \"metfrag\" A specialized subset of the PubChem database. Needs manual download (see next section). for-ident \"metfrag\" The FOR-IDENT (STOFF-IDENT) database for water related substances. kegg \"metfrag\", \"sirius\" The KEGG database for biological compounds hmdb \"metfrag\", \"sirius\" The HMDB contains many human metabolites. bio \"sirius\" Selects all supports biological databases. csv, psv, sdf \"metfrag\" Custom database (see next section). CSV example. 4.6.3.1 Configuring MetFrag databases and scoring Some extra configuration may be necessary when using certain databases with MetFrag. In order to use the ChemSpider database a security token should be requested and set with the chemSpiderToken argument to generateCompounds(). The CompTox and PubChemLite databases need to be manually downloaded from CompTox (or variations with smoking or wastewater metadata) and PubChemLite. The file location of this and other local databases (csv, psv, sdf) needs to be manually configured, see the examples below and/or ?generateCompounds for more information on how to do this. # PubChem: the default compsMF <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+") # ChemSpider: needs security token compsMF2 <- generateCompounds(fGroups, mslists, "metfrag", database = "chemspider", chemSpiderToken = "MY_TOKEN_HERE", adduct = "[M+H]+") # CompTox: set global option to database path options(patRoon.path.MetFragCompTox = "~/CompTox_17March2019_SelectMetaData.csv") compsMF3 <- generateCompounds(fGroups, mslists, "metfrag", database = "comptox", adduct = "[M+H]+") # CompTox: set database location without global option compsMF4 <- generateCompounds(fGroups, mslists, "metfrag", database = "comptox", adduct = "[M+H]+", extraOpts = list(LocalDatabasePath = "~/CompTox_17March2019_SelectMetaData.csv")) # Same, but for custom database compsMF5 <- generateCompounds(fGroups, mslists, "metfrag", database = "csv", adduct = "[M+H]+", extraOpts = list(LocalDatabasePath = "~/mydb.csv")) An example of a custom .csv database can be found here. With MetFrag compound databases are not only used to retrieve candidate structures but are also used to obtain metadata for further ranking. Each database has its own scorings, a table with currently supported scorings can be obtained with the compoundScorings() function (some columns omitted): name metfrag database default score Score TRUE fragScore FragmenterScore TRUE metFusionScore OfflineMetFusionScore TRUE individualMoNAScore OfflineIndividualMoNAScore TRUE numberPatents PubChemNumberPatents pubchem TRUE numberPatents Patent_Count pubchemlite TRUE pubMedReferences PubChemNumberPubMedReferences pubchem TRUE pubMedReferences ChemSpiderNumberPubMedReferences chemspider TRUE pubMedReferences NUMBER_OF_PUBMED_ARTICLES comptox TRUE pubMedReferences PubMed_Count pubchemlite TRUE extReferenceCount ChemSpiderNumberExternalReferences chemspider TRUE dataSourceCount ChemSpiderDataSourceCount chemspider TRUE referenceCount ChemSpiderReferenceCount chemspider TRUE RSCCount ChemSpiderRSCCount chemspider TRUE formulaScore FALSE smartsInclusionScore SmartsSubstructureInclusionScore FALSE smartsExclusionScore SmartsSubstructureExclusionScore FALSE suspectListScore SuspectListScore FALSE retentionTimeScore RetentionTimeScore FALSE CPDATCount CPDAT_COUNT comptox TRUE TOXCASTActive TOXCAST_PERCENT_ACTIVE comptox TRUE dataSources DATA_SOURCES comptox TRUE pubChemDataSources PUBCHEM_DATA_SOURCES comptox TRUE EXPOCASTPredExpo EXPOCAST_MEDIAN_EXPOSURE_PREDICTION_MG/KG-BW/DAY comptox TRUE ECOTOX ECOTOX comptox TRUE NORMANSUSDAT NORMANSUSDAT comptox TRUE MASSBANKEU MASSBANKEU comptox TRUE TOX21SL TOX21SL comptox TRUE TOXCAST TOXCAST comptox TRUE KEMIMARKET KEMIMARKET comptox TRUE MZCLOUD MZCLOUD comptox TRUE pubMedNeuro PubMedNeuro comptox TRUE CIGARETTES CIGARETTES comptox TRUE INDOORCT16 INDOORCT16 comptox TRUE SRM2585DUST SRM2585DUST comptox TRUE SLTCHEMDB SLTCHEMDB comptox TRUE THSMOKE THSMOKE comptox TRUE ITNANTIBIOTIC ITNANTIBIOTIC comptox TRUE STOFFIDENT STOFFIDENT comptox TRUE KEMIMARKET_EXPO KEMIMARKET_EXPO comptox TRUE KEMIMARKET_HAZ KEMIMARKET_HAZ comptox TRUE REACH2017 REACH2017 comptox TRUE KEMIWW_WDUIndex KEMIWW_WDUIndex comptox TRUE KEMIWW_StpSE KEMIWW_StpSE comptox TRUE KEMIWW_SEHitsOverDL KEMIWW_SEHitsOverDL comptox TRUE ZINC15PHARMA ZINC15PHARMA comptox TRUE PFASMASTER PFASMASTER comptox TRUE peakFingerprintScore AutomatedPeakFingerprintAnnotationScore FALSE lossFingerprintScore AutomatedLossFingerprintAnnotationScore FALSE agroChemInfo AgroChemInfo pubchemlite FALSE bioPathway BioPathway pubchemlite FALSE drugMedicInfo DrugMedicInfo pubchemlite FALSE foodRelated FoodRelated pubchemlite FALSE pharmacoInfo PharmacoInfo pubchemlite FALSE safetyInfo SafetyInfo pubchemlite FALSE toxicityInfo ToxicityInfo pubchemlite FALSE knownUse KnownUse pubchemlite FALSE disorderDisease DisorderDisease pubchemlite FALSE identification Identification pubchemlite FALSE annoTypeCount FPSum pubchemlite TRUE annoTypeCount AnnoTypeCount pubchemlite TRUE The first two columns contain the generic and original MetFrag naming schemes for each scoring type. While both naming schemes can be used, the generic is often shorter and harmonized with other algorithms (e.g. SIRIUS). The database column specifies for which databases a particular scoring is available (empty if not database specific). Most scorings are selected by default (as specified by the default column), however, this behaviour can be customized by using the scoreTypes argument: # Only in-silico and PubChem number of patents scorings compsMF1 <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+", scoreTypes = c("fragScore" "numberPatents")) # Custom scoring in custom database compsMF2 <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+", database = "csv", extraOpts = list(LocalDatabasePath = "~/mydb.csv"), scoreTypes = c("fragScore", "myScore", "myScore2")) By default ranking is performed with equal weight (i.e. 1) for all scorings. This can be changed by the scoreWeights argument, which should be a vector containing the weights for all scorings following the order of scoreTypes, for instance: compsMF <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+", scoreTypes = c("fragScore" "numberPatents"), scoreWeights = c(1, 2)) Sometimes thousands or more structural candidates are found when annotating a feature group. In this situation processing all these candidates will too involving (especially when external databases are used). To avoid this a default cut-off is set: when the number of candidates exceed a certain amount the search will be aborted and no results will be reported for that feature group. The maximum number of candidates can be set with the maxCandidatesToStop argument. The default value is relative conservative, especially for local databases it may be useful to increase this number. 4.6.3.2 Timeout and error handling The use of online databases has the drawback that an error may occur, for instance, as a result of a connection error. Furthermore, MetFrag typically returns an error when too many candidates are found (as set by the maxCandidatesToStop argument). By default processing is restarted if an error has occurred (configured by the errorRetries argument). Similarly, the timeoutRetries and timeout arguments can be used to avoid being ‘stuck’ on obtaining results, for instance, due to an unstable internet connection. If no compounds could be assigned due to an error a warning will be issued. In this case it is best to see what went wrong by manually checking the log files, which by default are stored in the log/metfrag folder. 4.6.3.3 Formula scoring Ranking of candidate structures may further be improved by incorporating formula information by using the addFormulaScoring() function: comps <- addFormulaScoring(coms, formulas, updateScore = TRUE) Here, corresponding formula and explained fragments will be used to calculate a formulaScore for each candidate. Note that SIRIUS candidates are already based on calculated formulae, hence, running this function on SIRIUS results is less sensable unless scoring from another formula calculation algorithm is desired. 4.6.3.4 Further options and parameters There are many more options and parameters that affect compound annotation. For a full overview please have a look at the reference manual (e.g. by running ?generateCompounds). 4.6.4 Suspect annotation The data obtained during the previously described annotation steps can be used to improve a suspect screening workflow. The annotateSuspects() method uses the annotation data to calculate various annotation properties for each suspect, such as their rank in formula/compound candidates, which fragments from the suspect list were matched, and a rough indication of the identification level according to Schymanski et al. (2014) fGroupsSusp <- annotateSuspects(fGroupsSusp, MSPeakLists = mslists, formulas = formulas, compounds = compounds) #> Annotating 5 suspects... #> ================================================================================ The calculation of identification levels is performed by a set of pre-defined rules. The genIDLevelRulesFile() can be used to inspect the default rules or to create your own rules file, which can subsequently passed to annotateSuspects() with the IDFile argument. See ?annotateSuspects for more details on the file format and options. The default identification levels can be summarized as follows: Level Description Rules 1 Target match Retention time deviates <12 seconds from suspect list. At least 3 (or all if the suspect list contains less) fragments from the suspect list must match. 2a Good MS/MS library match Suspect is top ranked in the compounds results. The individualMoNAScore is at least 0.9 and all other candidates have no MoNA library score. 3a Fair library match The individualMoNAScore is at least 0.4. 3b Known MS/MS match At least 3 (or all if the suspect list contains less) fragments from the suspect list must match. 3c Good in-silico MS/MS match The annotation MS/MS similarity (annSimComp column) is at least 0.7. 4a Good formula MS/MS match Suspect is top ranked formula candidate, annotation MS/MS similarity (annSimForm column) is at least 0.7 and isotopic match (isoScore) of at least 0.5. The latter two scores are at least 0.2 higher than next best ranked candidate. 4b Good formula isotopic pattern match Suspect is top ranked formula candidate and isotopic match (isoScore) of at least 0.9 and at least 0.2 higher than next best ranked candidate. 5 Unknown All else. In general, the more data provided by the suspect list and to annotateSuspects(), the better identification level estimation works. For instance, when considering the default rules, either the fragments_mz or fragments_formula column is necessary to be able assign a level 3b. Similarly, the suspect list needs retention times (as well as fragment data) to be able to assign level 1. As you can imagine, providing the annotation workflow objects (i.e. MSPeakLists, formulas, compounds) to annotateSuspects() is necessary for calculation of most levels. The annotateSuspects() function will log decisions for identification level assignments to the log/ sub-directory in the current working directory. This is useful to inspect level assignments and especially useful when you customized any rules. NOTE: The current identification level rules are only optimized for GenForm and MetFrag annotation algorithms. References "],["processing.html", "5 Processing workflow data", " 5 Processing workflow data The previous chapter mainly discussed how to create workflow data. This chapter will discuss how to use the data. "],["inspecting-results.html", "5.1 Inspecting results", " 5.1 Inspecting results Several generic functions exist that can be used to inspect data that is stored in a particular object (e.g. features, compounds etc): Generic Classes Remarks length() All Returns the length of the object (e.g. number of features, compounds etc) algorithm() All Returns the name of the algorithm used to generate the object. groupNames() All Returns all the unique identitifiers (or names) of the feature groups for which this object contains results. names() featureGroups, components Returns names of the feature groups (similar to groupNames()) or components show() All Prints general information. \"[[\" / \"$\" operators All Extract general information, see below. as.data.table() / as.data.frame() All Convert data to a data.table or data.frame, see below. analysisInfo(), analyses(), replicateGroups() features, featureGroups Returns the analysis information, analyses or replicate groups for which this object contains data. groupInfo() featureGroups Returns feature group information (m/z and retention time values). screenInfo() featureGroupsScreening Returns information on hits from suspect screening. componentInfo() components Returns information for all components. annotatedPeakList() formulas, compounds Returns a table with annotated mass peaks (see below). The common R extraction operators \"[[\", \"$\" can be used to obtain data for a particular feature groups, analysis etc: # Feature table (only first columns for readability) fList[["standard-1"]][, 1:6] #> NULL # Feature group intensities fGroups$M120_R268_30 #> [1] 264836 245372 216560 fGroups[[1, "M120_R268_30"]] # only first analysis #> [1] 264836 # obtains MS/MS peak list (feature group averaged data) mslists[["M120_R268_30"]]$MSMS #> ID mz intensity precursor #> 1: 5 105.0698 6183.111 FALSE #> 2: 6 106.0653 7643.556 FALSE #> 3: 8 107.0728 7760.667 FALSE #> 4: 15 120.0556 168522.667 TRUE #> 5: 17 121.0587 13894.667 FALSE #> 6: 18 121.0884 10032.889 FALSE #> 7: 19 122.0964 147667.778 FALSE #> 8: 20 123.0803 36631.111 FALSE #> 9: 21 123.0996 15482.444 FALSE #> 10: 22 124.0805 35580.667 FALSE # get all formula candidates for a feature group formulas[["M120_R268_30"]][, 1:7] #> neutral_formula ion_formula neutralMass ion_formula_mz error dbe isoScore #> 1: C6H5N3 C6H6N3 119.0483 120.0556 1.8 6 0.92461 # get all compound candidates for a feature group compounds[["M120_R268_30"]][, 1:4] #> explainedPeaks score neutralMass SMILES #> 1: 0 2.8673850 119.0483 C1=CC2=NNN=C2C=C1 #> 2: 0 1.4569407 119.0483 C1=CC=C(C=C1)N=[N+]=[N-] #> 3: 0 1.1555020 119.0483 C1=CC2=C(N=C1)N=CN2 #> 4: 0 1.0911519 119.0483 C1=CC2=C(C=NN2)N=C1 #> 5: 0 1.0910125 119.0483 C1=CNC2=NC=NC=C21 #> --- #> 26: 0 0.8722331 119.0483 C1=CN=C(C=N1)CC#N #> 27: 0 0.8617554 119.0483 C1=CC2=NC=NN2C=C1 #> 28: 0 0.8580143 119.0483 C1=CC2=CN=NN2C=C1 #> 29: 0 0.7249048 119.0483 C1=CC(=[N+]=[N-])C=CC1=N #> 30: 0 0.6442352 119.0483 C(C#N)C(CC#N)C#N # get a table with information of a component components[["CMP7"]][, 1:6] #> group ret mz isogroup isonr charge #> 1: M143_R206_64 205.787 143.0700 NA NA NA #> 2: M159_R208_103 208.280 159.0650 NA NA NA #> 3: M161_R208_104 207.582 161.0806 NA NA NA #> 4: M181_R209_159 208.580 181.0469 NA NA NA A more sophisticated way to obtain data from a workflow object is to use as.data.table() or as.data.frame(). These functions will convert all information within the object to a table (data.table or data.frame) and allow various options to add extra information. An advantage is that this common data format can be used with many other functions within R. The output is in a tidy format. NOTE If you are not familiar with data.table and want to know more see data.table. Briefly, this is a more efficient and largely compatible alternative to the regular data.frame. NOTE The as.data.frame() methods defined in patRoon simply convert the results from as.data.table(), hence, both functions are equal in their usage and are defined for the same object classes. Some typical examples are shown below. # obtain table with all features (only first columns for readability) as.data.table(fList)[, 1:6] #> analysis ID ret mz area intensity #> 1: solvent-pos-1 f_11153843066718860591 13.176 98.97537 4345232.0 391476 #> 2: solvent-pos-1 f_17304646661409971475 7.181 100.11197 797112.1 426956 #> 3: solvent-pos-1 f_15881243262297365935 192.178 100.11211 9609998.0 750532 #> 4: solvent-pos-1 f_18080080214774628297 19.171 100.11217 5784411.0 370376 #> 5: solvent-pos-1 f_11424365621253057373 4.786 100.11220 551723.6 567312 #> --- #> 2920: standard-pos-3 f_6056923640388483791 318.892 425.18866 666531.5 232636 #> 2921: standard-pos-3 f_11037327286434816087 9.114 427.03242 362024.1 114744 #> 2922: standard-pos-3 f_11146478671595375797 318.892 427.18678 200193.5 77768 #> 2923: standard-pos-3 f_14679658011301960594 382.682 432.23984 217612.9 97648 #> 2924: standard-pos-3 f_1695489413189550685 9.114 433.00457 3086864.0 912920 # Returns group info and intensity values for each feature group as.data.table(fGroups, average = TRUE) # average intensities for replicates #> group ret mz standard-pos #> 1: M109_R192_20 191.8729 109.0759 183482.67 #> 2: M111_R330_23 330.4093 111.0439 84598.67 #> 3: M114_R269_25 268.6919 114.0912 85796.00 #> 4: M116_R317_29 316.7348 116.0527 766888.00 #> 5: M120_R268_30 268.4092 120.0554 242256.00 #> --- #> 138: M316_R363_635 363.4894 316.1741 89904.00 #> 139: M318_R349_638 349.1087 318.1450 83320.00 #> 140: M352_R335_664 334.9418 352.2019 74986.67 #> 141: M407_R239_672 239.3580 407.2227 186568.00 #> 142: M425_R319_676 319.4959 425.1885 214990.67 # As above, but with extra suspect screening information # (select some columns to simplify the output below) as.data.table(fGroupsSusp, average = TRUE, collapseSuspects = NULL, onlyHits = TRUE)[1:3, c("group", "susp_name", "susp_compRank", "susp_annSimBoth", "susp_estIDLevel")] #> group susp_name susp_compRank susp_annSimBoth susp_estIDLevel #> 1: M120_R268_30 1H-benzotriazole 1 0.0000000 4b #> 2: M137_R249_53 N-Phenyl urea 1 0.6443557 5 #> 3: M146_R309_68 2-Hydroxyquinoline 2 0.9896892 3c # Returns all peak lists for each feature group as.data.table(mslists) #> group type ID mz intensity precursor #> 1: M120_R268_30 MS 1 100.1120 178952.381 FALSE #> 2: M120_R268_30 MS 2 102.1277 202359.667 FALSE #> 3: M120_R268_30 MS 3 114.0912 37647.548 FALSE #> 4: M120_R268_30 MS 4 115.0752 66685.238 FALSE #> 5: M120_R268_30 MS 5 120.0554 113335.857 TRUE #> --- #> 235: M192_R355_191 MS 51 299.1274 44083.126 FALSE #> 236: M192_R355_191 MS 52 299.1471 7390.267 FALSE #> 237: M192_R355_191 MSMS 14 119.0496 588372.444 FALSE #> 238: M192_R355_191 MSMS 18 120.0524 70273.333 FALSE #> 239: M192_R355_191 MSMS 31 192.1384 71978.667 TRUE # Returns all formula candidates for each feature group with scoring # information, neutral loss etc as.data.table(formulas)[, 1:6] #> group neutral_formula ion_formula neutralMass ion_formula_mz error #> 1: M120_R268_30 C6H5N3 C6H6N3 119.0483 120.0556 1.80000000 #> 2: M137_R249_53 C7H8N2O C7H9N2O 136.0637 137.0709 2.90000000 #> 3: M146_R309_68 C9H7NO C9H8NO 145.0528 146.0600 1.66666667 #> 4: M192_R355_191 C12H17NO C12H18NO 191.1310 192.1383 0.03333333 # Returns all compound candidates for each feature group with scoring and other metadata as.data.table(compounds)[, 1:4] #> group explainedPeaks score neutralMass #> 1: M120_R268_30 0 2.8673850 119.0483 #> 2: M120_R268_30 0 1.4569407 119.0483 #> 3: M120_R268_30 0 1.1555020 119.0483 #> 4: M120_R268_30 0 1.0911519 119.0483 #> 5: M120_R268_30 0 1.0910125 119.0483 #> --- #> 248: M192_R355_191 0 0.6851763 191.1310 #> 249: M192_R355_191 0 0.6764365 191.1310 #> 250: M192_R355_191 0 0.6713679 191.1310 #> 251: M192_R355_191 0 0.6519220 191.1310 #> 252: M192_R355_191 0 0.6497224 191.1310 # Returns table with all components (including feature group info, annotations etc) as.data.table(components)[, 1:6] #> name cmp_ret cmp_retsd neutral_mass analysis size #> 1: CMP1 347.2929 0.0000000 <NA> standard-pos-2 2 #> 2: CMP1 347.2929 0.0000000 <NA> standard-pos-2 2 #> 3: CMP2 349.6343 4.6805095 225.1589/188.20157 standard-pos-3 6 #> 4: CMP2 349.6343 4.6805095 225.1589/188.20157 standard-pos-3 6 #> 5: CMP2 349.6343 4.6805095 225.1589/188.20157 standard-pos-3 6 #> --- #> 86: CMP28 313.3489 0.3104371 <NA> standard-pos-2 3 #> 87: CMP28 313.3489 0.3104371 <NA> standard-pos-2 3 #> 88: CMP29 268.3442 0.3843289 81.08705 standard-pos-1 3 #> 89: CMP29 268.3442 0.3843289 81.08705 standard-pos-1 3 #> 90: CMP29 268.3442 0.3843289 81.08705 standard-pos-1 3 Finally, the annotatedPeakList() function is useful to inspect annotation results for a formula or compound candidate: # formula annotations for the first formula candidate of feature group M137_R249_53 annotatedPeakList(formulas, index = 1, groupName = "M137_R249_53", MSPeakLists = mslists) #> ID mz intensity precursor ion_formula dbe ion_formula_mz error neutral_loss #> 1: 2 94.06500 9406.111 FALSE C6H8N 3.5 94.06513 1.30 CHNO #> 2: 6 98.97522 2212.000 FALSE <NA> NA NA NA <NA> #> 3: 7 105.06971 1662.111 FALSE <NA> NA NA NA <NA> #> 4: 14 120.04434 7176.222 FALSE C7H6NO 5.5 120.04439 0.40 H3N #> 5: 19 122.07222 2246.000 FALSE <NA> NA NA NA <NA> #> 6: 21 135.08004 1565.556 FALSE <NA> NA NA NA <NA> #> 7: 23 137.07039 5348.667 TRUE C7H9N2O 4.5 137.07094 3.35 #> 8: 24 137.09572 2026.889 FALSE <NA> NA NA NA <NA> #> 9: 26 138.09116 12356.667 FALSE <NA> NA NA NA <NA> #> 10: 27 139.07503 5020.667 FALSE <NA> NA NA NA <NA> # compound annotation for first candidate of feature group M137_R249_53 annotatedPeakList(compounds, index = 1, groupName = "M137_R249_53", MSPeakLists = mslists) #> ID mz intensity precursor ion_formula ion_formula_MF neutral_loss score #> 1: 2 94.06500 9406.111 FALSE C6H8N [C6H6N+H]+H+ CHNO 405 #> 2: 6 98.97522 2212.000 FALSE <NA> <NA> <NA> NA #> 3: 7 105.06971 1662.111 FALSE <NA> <NA> <NA> NA #> 4: 14 120.04434 7176.222 FALSE C7H6NO [C7H6NO]+ H3N 305 #> 5: 19 122.07222 2246.000 FALSE <NA> <NA> <NA> NA #> 6: 21 135.08004 1565.556 FALSE <NA> <NA> <NA> NA #> 7: 23 137.07039 5348.667 TRUE <NA> <NA> <NA> NA #> 8: 24 137.09572 2026.889 FALSE <NA> <NA> <NA> NA #> 9: 26 138.09116 12356.667 FALSE <NA> <NA> <NA> NA #> 10: 27 139.07503 5020.667 FALSE <NA> <NA> <NA> NA More advanced examples for these functions are shown below. # Feature table, can also be accessed by numeric index fList[[1]] mslists[["standard-1", "M120_R268_30"]] # feature data (instead of feature group averaged) formulas[[1, "M120_R268_30"]] # feature data (if available, i.e. calculateFeatures=TRUE) components[["CMP1", 1]] # only for first feature group in component as.data.frame(fList) # classic data.frame format, works for all objects as.data.table(fGroups) # return non-averaged intensities (default) as.data.table(fGroups, features = TRUE) # include feature information as.data.table(mslists, averaged = FALSE) # peak lists for each feature as.data.table(mslists, fGroups = fGroups) # add feature group information as.data.table(formulas, countElements = c("C", "H")) # include C/H counts (e.g. for van Krevelen plots) # add various information for organic matter characterization (common elemental # counts/ratios, classifications etc) as.data.table(formulas, OM = TRUE) as.data.table(compounds, fGroups = fGroups) # add feature group information as.data.table(compounds, fragments = TRUE) # include information of all annotated fragments annotatedPeakList(formulas, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, onlyAnnotated = TRUE) # only include annotated peaks annotatedPeakList(compounds, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, formulas = formulas) # include formula annotations "],["filtering.html", "5.2 Filtering", " 5.2 Filtering During a non-target workflow it is not uncommon that some kind of data-cleanup is necessary. Datasets are often highly complex, which makes separating data of interest from the rest highly important. Furthermore, general cleanup typically improves the quality of the dataset, for instance by removing low scoring annotation results or features that are unlikely to be ‘correct’ (e.g. noise or present in blanks). For this reason patRoon supports many different filters that easily clean data produced during the workflow in a highly customizable way. All major workflow objects (e.g. featureGroups, compounds, components etc.) support filtering operations by the filter() generic. This function takes the object to be filtered as first argument and any remaining arguments describe the desired filter options. The filter() generic function then returns the modified object back. Some examples are shown below. # remove low intensity (<500) features features <- filter(features, absMinIntensity = 500) # remove features with intensities lower than 5 times the blank fGroups <- filter(fGroups, blankThreshold = 5) # only retain compounds with >1 explained MS/MS peaks compounds <- filter(compounds, minExplainedPeaks = 1) The following sections will provide a more detailed overview of available data filters. NOTE Some other R packages (notably dplyr) also provide a filter() generic function. To use the filter() function from different packages you may need to explicitly specify which one to use in your script. This can be done by prefixing it with the package name, e.g. patRoon::filter(...), dplyr::filter(...) etc. 5.2.1 Features There are many filters available for feature data: Filter Classes Remarks absMinIntensity, relMinIntensity features, featureGroups Minimum intensity preAbsMinIntensity, preRelMinIntensity featureGroups Minimum intensity prior to other filtering (see below) retentionRange, mzRange, mzDefectRange, chromWidthRange features, featureGroups Filter by feature properties absMinAnalyses, relMinAnalyses featureGroups Minimum feature abundance in all analyses absMinReplicates, relMinReplicates featureGroups Minimum feature abundance in different replicates absMinFeatures, relMinFeatures featureGroups Only keep analyses with at least this amount of features absMinReplicateAbundance, relMinReplicateAbundance featureGroups Minimum feature abundance in a replicate group maxReplicateIntRSD featureGroups Maximum relative standard deviation of feature intensities in a replicate group. blankThreshold featureGroups Minimum intensity factor above blank intensity rGroups featureGroups Only keep (features of) these replicate groups results featureGroups Only keep feature groups with formula/compound annotations or componentization results Application of filters to feature data is important for (environmental) non-target analysis. Especially blank and replicate filters (i.e. blankThreshold and absMinReplicateAbundance/relMinReplicateAbundance) are important filters and are highly recommended to always apply for cleaning up your dataset. All filters are available for feature group data, whereas only a subset is available for feature objects. The main reason is that other filters need grouping of features between analyses. Regardless, in patRoon filtering feature data is less important, and typically only needed when the number of features are extremely large and direct grouping is undesired. From the table above you can notice that many filters concern both absolute and relative data (i.e. as prefixed with abs and rel). When a relative filter is used the value is scaled between 0 and 1. For instance: # remove features not present in at least half of the analyses within a replicate group fGroups <- filter(fGroups, relMinReplicateAbundance = 0.5) An advantage of relative filters is that you will not have to worry about the data size involved. For instance, in the above example the filter always takes half of the number of analyses within a replicate group, even when replicate groups have different number of analyses. Note that multiple filters can be specified at once. Especially for feature group data the order of filtering may impact the final results, this is explained further in the reference manual (i.e. ?`feature-filtering`). Some examples are shown below. # filter features prior to grouping: remove any features eluting before first 2 minutes fList <- filter(fList, retentionRange = c(120, Inf)) # common filters for feature groups fGroups <- filter(fGroups, absMinIntensity = 500, # remove features <500 intensity relMinReplicateAbundance = 1, # features should be in all analysis of replicate groups maxReplicateIntRSD = 0.75, # remove features with intensity RSD in replicates >75% blankThreshold = 5, # remove features <5x intensity of (average) blank intensity removeBlanks = TRUE) # remove blank analyses from object afterwards # filter by feature properties fGroups <- filter(mzDefectRange = c(0.8, 0.9), chromWidthRange = c(6, 120)) # remove features not present in at least 3 analyses fGroups <- filter(fGroups, absMinAnalyses = 3) # remove features not present in at least 20% of all replicate groups fGroups <- filter(fGroups, relMinReplicates = 0.2) # only keep data present in replicate groups "repl1" and "repl2" # all other features and analyses will be removed fGroups <- filter(fGroups, rGroups = c("repl1", "repl2")) # only keep feature groups with compound annotations fGroups <- filter(fGroups, results = compounds) # only keep feature groups with formula or compound annotations fGroups <- filter(fGroups, results = list(formulas, compounds)) 5.2.2 Suspect screening Several additional filters are available for feature groups obtained with screenSuspects(): Filter Classes Remarks onlyHits featureGroupsScreening Only retain feature groups assigned to one or more suspects. selectHitsBy featureGroupsScreening Select the feature group that matches best with a suspect (in case there are multiple). selectBestFGroups featureGroupsScreening Select the suspect that matches best with a feature group (in case there are multiple). maxLevel, maxFormRank, maxCompRank featureGroupsScreening Only retain suspect hits with identification/annotation ranks below a threshold. minAnnSimForm, minAnnSimComp, minAnnSimBoth featureGroupsScreening Remove suspect hits with annotation similarity scores below this value. absMinFragMatches, relMinFragMatches featureGroupsScreening Only keep suspect hits with a minimum (relative) number of fragment matches from the suspect list. NOTE: most filters only remove suspect hit results. Set onlyHits=TRUE to also remove any feature groups that end up without suspect hits. The selectHitsBy and selectBestFGroups filters are useful to remove duplicate hits (one suspect assigned to multiple feature groups or multiple feature groups assigned to the same suspect, respectively). The former selects based on either best identification level (selectHitsBy=\"level\") or highest mean intensity (selectHitsBy=\"intensity\"). The selectBestFGroups can only be TRUE/FALSE and always selects by best identification level. Some examples are shown below. # only keep feature groups assigned to at least one suspect fGroupsSusp <- filter(fGroupsSusp, onlyHits = TRUE) # remove duplicate suspect to feature group matches and keep the best fGroupsSusp <- filter(fGroupsSusp, selectHitsBy = "level") # remove suspect hits with ID levels >3 and make sure no feature groups # are present without suspect hits afterwards fGroupsSusp <- filter(fGroupsSusp, maxLevel = 3, onlyHits = TRUE) 5.2.3 Annotation There are various filters available for handling annotation data: Filter Classes Remarks absMSIntThr, absMSMSIntThr, relMSIntThr, relMSMSIntThr MSPeakLists Minimum intensity of mass peaks topMSPeaks, topMSMSPeaks MSPeakLists Only keep most intense mass peaks withMSMS MSPeakLists Only keep results with MS/MS data minMSMSPeaks MSPeakLists Only keep an MS/MS peak list if it contains a minimum number of peaks (excluding the precursor peak) annotatedBy MSPeakLists Only keep MS/MS peaks that have formula or compound annotations minExplainedPeaks formulas, compounds Minimum number of annotated mass peaks elements, fragElements, lossElements formulas, compounds Restrain elemental composition topMost formulas, compounds Only keep highest ranked candidates minScore, minFragScore, minFormulaScore compounds Minimum compound scorings scoreLimits formulas, compounds Minimum/Maximum scorings OM formulas, compounds Only keep candidates with likely elemental composition found in organic matter Several intensity related filters are available to clean-up MS peak list data. For instance, the topMSPeaks/topMSMSPeaks filters provide a simple way to remove noisy data by only retaining a defined number of most intense mass peaks. Note that none of these filters will remove the precursor mass peak of the feature itself. The filters applicable to formula and compound annotation generally concern minimal scoring or chemical properties. The former is useful to remove unlikely candidates, whereas the second is useful to focus on certain study specific chemical properties (e.g. known neutral losses). Common examples are shown below. # intensity filtering mslists <- filter(mslists, absMSIntThr = 500, # minimum MS mass peak intensity of 500 relMSMSIntThr = 0.1) # minimum MS/MS mass peak intensity of 10% # only retain 10 most intens mass peaks # (feature mass is always retained) mslists <- filter(mslists, topMSPeaks = 10) # remove MS/MS peaks without compound annotations mslists <- filter(mslists, annotatedBy = compounds) # remove MS/MS peaks not annotated by either a formula or compound candidate mslists <- filter(mslists, annotatedBy = list(formulas, compounds)) # only keep formulae with 1-10 sulphur or phosphorus elements formulas <- filter(formulas, elements = c("S1-10", "P1-10")) # only keep candidates with MS/MS fragments that contain 1-10 carbons and 0-2 oxygens formulas <- filter(formulas, fragElements = "C1-10O0-2") # only keep candidates with CO2 neutral loss formulas <- filter(formulas, lossElements = "CO2") # only keep the 15 highest ranked candidates with at least 1 annotated MS/MS peak compounds <- filter(compounds, minExplainedPeaks = 1, topMost = 15) # minimum in-silico score compounds <- filter(compounds, minFragScore = 10) # candidate should be referenced in at least 1 patent # (only works if database lists number of patents, e.g. PubChem) compounds <- filter(compounds, scoreLimits = list(numberPatents = c(1, Inf)) NOTE As of patRoon 2.0 MS peak lists are not re-generated after a filtering operation (unless the reAverage parameter is explicity set to TRUE). The reason for this change is that re-averaging invalidates any formula/compound annotation data (e.g. used for plotting and reporting) that were generated prior to the filter operation. 5.2.4 Components Finally several filters are available for components: Filter Remarks size Minimum component size adducts, isotopes Filter features by adduct/istopes annotation rtIncrement, mzIncrement Filter homologs by retention/mz increment range Note that these filters are only applied if the components contain the data the filter works on. For instance, filtering by adducts will not affect components obtained from homologous series. As before, some typical examples are shown below. # only keep components with at least 4 features componInt <- filter(componInt, minSize = 4) # remove all features from components are not annotated as an adduct componRC <- filter(componRC, adducts = TRUE) # only keep protonated and sodium adducts componRC <- filter(componRC, adducts = c("[M+H]+", "[M+Na]+")) # remove all features not recognized as isotopes componRC <- filter(componRC, isotopes = FALSE) # only keep monoisotopic mass componRC <- filter(componRC, isotopes = 0) # min/max rt/mz increments for homologs componNT <- filter(componNT, rtIncrement = c(10, 30), mzIncrement = c(16, 50)) NOTE As mentioned before, components are still in a relative young development phase and results should always be verified! 5.2.5 Negation All filters support negation: if enabled all specified filters will be executed in an opposite manner. Negation may not be so commonly used, but allows greater flexibility which is sometimes needed for advanced filtering steps. Furthermore, it is also useful to specifically isolate the data that otherwise would have been removed. Some examples are shown below. # keep all features/analyses _not_ present from replicate groups "repl1" and "repl2" fGroups <- filter(fGroups, rGroups = c("repl1", "repl2"), negate = TRUE) # only retain features with a mass defect outside 0.8-0.9 fGroups <- filter(mzDefectRange = c(0.8, 0.9), negate = TRUE) # remove duplicate suspect hits and only keep the _worst_ hit fGroupsSusp <- filter(fGroupsSusp, selectHitsBy = "level", negate = TRUE) # remove candidates with CO2 neutral loss formulas <- filter(formulas, lossElements = "CO2", negate = TRUE) # select 15 worst ranked candidates compounds <- filter(compounds, topMost = 15, negate = TRUE) # only keep components with <5 features componInt <- filter(componInt, minSize = 5, negate = TRUE) "],["subset.html", "5.3 Subsetting", " 5.3 Subsetting The previous section discussed the filter() generic function to perform various data cleaning operations. A more generic way to select data is by subsetting: here you can manually specify which parts of an object should be retained. Subsetting is supported for all workflow objects and is performed by the R subset operator (\"[\"). This operator either subsets by one or two arguments, which are referred to as the i and j arguments. Class Argument i Argument j Remarks features analyses featureGroups analyses feature groups MSPeakLists analyses feature groups peak lists for feature groups will be re-averaged when subset on analyses (by default) formulas feature groups compounds feature groups components components feature groups For objects that support two-dimensional subsetting (e.g. featureGroups, MSPeakLists), either the i or j argument is optional. Furthermore, unlike subsetting a data.frame, the position of i and j does not change when only one argument is specified: df[1, 1] # subset data.frame by first row/column df[1] # subset by first column df[1, ] # subset by first row fGroups[1, 1] # subset by first analysis/feature group fGroups[, 1] # subset by first feature group (i.e. column) fGroups[1] # subset by first analysis (i.e. row) The subset operator allows three types of input: A logical vector: elements are selected if corresponding values are TRUE. A numeric vector: select elements by numeric index. A character vector: select elements by their name. When a logical vector is used as input it will be re-cycled if necessary. For instance, the following will select by the first, third, fifth, etc. analysis. fGroups[c(TRUE, FALSE)] In order to select by a character you will need to know the names for each element. These can, for instance, be obtained by the groupNames() (feature group names), analyses() (analysis names) and names() (names for components or feature groups for featureGroups objects) generic functions. Some more examples of common subsetting operations are shown below. # select first three analyses fList[1:3] # select first three analyses and first 500 feature groups fGroups[1:3, 1:500] # select all feature groups from first component fGroupsNT <- fGroups[, componNT[[1]]$group] # only keep feature groups with formula annotation results fGroupsForms <- fGroups[, groupNames(formulas)] # only keep feature groups with either formula or compound annotation results fGroupsAnn <- fGroups[, union(groupNames(formulas), groupNames(compounds))] # select first 15 components components[1:15] # select by name components[c("CMP1", "CMP5")] # only retain feature groups in components for which compound annotations are # available components[, groupNames(compounds)] In addition, feature groups can also be subset by given replicate groups or annotation/componentization results (similar to filter()). Similarly, suspect screening results can also be subset by given suspect names. # equal as filter(fGroups, rGroups = ...) fGroups[rGroups = c("repl1", "repl2")] # equal as filter(fGroups, results = ...) fGroups[results = compounds] # only keep feature groups assigned to given suspects fGroupsSusp[suspects = c("1H-benzotriazole", "2-Hydroxyquinoline")] NOTE As of patRoon 2.0 MS peak lists are not re-generated after a subsetting operation (unless the reAverage parameter is explicity set to TRUE). The reason for this change is that re-averaging invalidates any formula/compound annotation data (e.g. used for plotting and reporting) that were generated prior to the subset operation. 5.3.1 Prioritization workflow An important use case of subsetting is prioritization of data. For instance, after statistical analysis only certain feature groups are deemed relevant for the rest of the workflow. A common prioritization workflow is illustrated below: During the first step the workflow object is converted to a suitable format, most often using the as.data.frame() function. The converted data is then used as input for the prioritization strategy. Finally, these results are then used to select the data of interest in the original object. A very simplified example of such a process is shown below. featTab <- as.data.frame(fGroups, average = TRUE) # prioritization: sort by (averaged) intensity of the "sample" replicate group # (from high to low) and then obtain the feature group identifiers of the top 5. featTab <- featTab[order(featTab$standard, decreasing = TRUE), ] groupsOfInterest <- featTab$group[1:5] # subset the original data fGroups <- fGroups[, groupsOfInterest] # fGroups now only contains the feature groups for which intensity values in the # "sample" replicate group were in the top 5 "],["deleting-data.html", "5.4 Deleting data", " 5.4 Deleting data The delete() generic function can be used to manually delete workflow data. This function is used internally within patRoon to implement filtering and subsetting operations, but may also be useful for advanced data processing. Like the subset operator this function accepts a i and j parameter to specify which data should be operated on: Class Argument i Argument j features analysis feature index featureGroups analysis feature group formulas, compounds feature group candidate index components component feature group If i or j is not specified (NULL) then data is removed for the complete selection. Some examples are shown below: # delete 2nd feature in analysis-1 fList <- delete(fList, i = "analysis-1", j = 2) # delete first ten features in all analyses fList <- delete(fList, i = NULL, j = 1:10) # completely remove third/fourth analyses from feature groups fGroups <- delete(fGroups, i = 3:4) # delete specific feature group fGroups <- delete(fGroups, j = "M120_R268_30") # delete range of feature groups fGroups <- delete(fGroups, j = 500:750) # remove all results for a feature group formulas <- delete(formulas, i = "M120_R268_30") # remove top candidate for all feature groups compounds <- delete(compounds, j = 1) # remove a component components <- delete(components, i = "CMP1") # remove specific feature group from a component components <- delete(components, i = "CMP1", j = "M120_R268_30") # remove specific feature group from all components components <- delete(components, j = "M120_R268_30") The j parameter can also be a function: in this case it is called repeatedly on parts of the data to select what should be deleted. How the function is called and what it should return depends on the workflow data class: Class Called on every First argument Second argument Return value features analysis data.table with features analysis name Features indices (as integer or logical) featureGroups feature group vector with group intensities feature group name The analyses of the features to remove (as character, integer, logical) formulas, compounds feature group data.table with annotations feature group name Candidate indices (rows) components component data.table with the component component name The feature groups (as character, integer) Some examples for this: # remove features with intensities below 5000 fList <- delete(fList, j = function(f, ...) f$intensity <= 5E3) # same, but for features in all feature groups from specific analyses fGroups <- delete(i = 1:3, j = function(g, ...) g <= 5E3) # remove formula candidates with high relative mass deviation formulas <- delete(formulas, j = function(ft, ...) ft$error > 5) "],["unOv.html", "5.5 Unique and overlapping features", " 5.5 Unique and overlapping features Often an analysis batch is composed of different sample groups, such as different treatments, influent/effluent etc. In such scenarios it may be highly interesting to evaluate uniqueness or overlap between these samples. Furthermore, extracting overlapping or unique features is a simple but effective prioritization strategy. The overlap() and unique() functions can be used to extract overlapping and unique features between replicate groups, respectively. Both functions return a subset of the given featureGroups object. An overview of their arguments is given below. Argument Function(s) Remarks which unique(), overlap() The replicate groups to compare. relativeTo unique() Only return unique features compared to these replicate groups (NULL for all). Replicate groups in which are ignored. outer unique() If TRUE then only return features which are also unique among the compared replicates groups. exclusive overlap Only keep features that only overlap between the compared replicate groups. Some examples: # only keep features uniquely present in replicate group "repl1" fGroupsUn1 <- unique(fGroups, which = "repl1") # only keep features in repl1/repl2 which are not in repl3 fGroupsUn2 <- unique(fGroups, which = c("repl1", "repl2"), relativeTo = "repl3") # only keep features that are only present in repl1 OR repl2 fGroupsUn3 <- unique(fGroups, which = c("repl1", "repl2"), outer = TRUE) # only keep features overlapping in repl1/repl2 fGroupsOv1 <- overlap(fGroups, which = c("repl1", "repl2")) # only keep features overlapping in repl1/repl2 AND are not present in any other # replicate group fGroupsOv2 <- overlap(fGroups, which = c("repl1", "repl2"), exclusive = TRUE) In addition, several plotting functions are discussed in the visualization section that visualize overlap and uniqueness of features. "],["specSim.html", "5.6 MS similarity", " 5.6 MS similarity The spectral similarity is used to compare spectra from different features. For this purpose the spectrumSimilarity function can be used. This function operates on MS peak lists, and accepts the following function arguments: Argument Remarks MSPeakLists The MS peak lists object from which peak lists data should be taken. groupName1, groupName2 The name(s) of the first and second feature group(s) to compare analysis1, analysis2 The analysis names of the data to be compared. Set this when feature data (instead of feature group data) should be compared. MSLevel The MS level: 1 or 2 for MS and MS/MS, respectively. specSimParams Parameters that define how similarities are calculated. NAToZero If TRUE then NA values are converted to zeros. NA values are reported if a comparison cannot be made because of missing peak list data. The specSimParams argument defines the parameters for similarity calculations. It is a list, and the default values are obtained with the getDefSpecSimParams() function: getDefSpecSimParams() #> $method #> [1] "cosine" #> #> $removePrecursor #> [1] FALSE #> #> $mzWeight #> [1] 0 #> #> $intWeight #> [1] 1 #> #> $absMzDev #> [1] 0.005 #> #> $relMinIntensity #> [1] 0.05 #> #> $minPeaks #> [1] 1 #> #> $shift #> [1] "none" #> #> $setCombineMethod #> [1] "mean" The method field describes the calculation measure: this is either \"cosine\" or \"jaccard\". The shift field is primarily useful when comparing MS/MS data and defines if and how a spectral shift should be performed prior to similarity calculation: \"none\": The default, no shifting is performed. \"precursor\" The mass difference between the precursor mass of both spectra (i.e. the feature mass) is first calculated. This difference is then subtracted from each of the mass peaks of the second spectrum. This shifting increases similarity if the MS fragmentation process itself occurs similarly (i.e. if both features show similar neutral losses). \"both” This combines both shifting methods: first peaks are aligned that have the same mass, then the precursor strategy is applied for the remaining mass peaks. This shifting method yields higher similarities if either fragment masses or neutral losses are similar. To override a default setting, simply pass it as an argument to getDefSpecSimParams: getDefSpecSimParams(shift = "both") For more details on the various similarity calculation parameters see the reference manual (?getDefSpecSimParams). Some examples are shown below: # similarity between MS spectra with default parameters spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M137_R249_53") #> [1] 0.4088499 # similarity between MS/MS spectra with default parameters spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M192_R355_191", MSLevel = 2) #> [1] 0.08589848 # As above, with jaccard calculation spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M192_R355_191", MSLevel = 2, specSimParams = getDefSpecSimParams(method = "jaccard")) #> [1] 0.1111111 # With shifting spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M192_R355_191", MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) #> [1] 0.08589848 The spectrumSimilarity function can also be used to calculate multiple similarities. Simply specify multiple feature group names for the groupNameX parameters. Alternatively, if you want to compare the same set of feature groups with each other pass their names only as the groupName1 parameter: # compare two pairs spectrumSimilarity(mslists, groupName1 = c("M120_R268_30", "M137_R249_53"), groupName2 = c("M146_R309_68", "M192_R355_191"), MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) #> M146_R309_68 M192_R355_191 #> M120_R268_30 0.520052 0.08589848 #> M137_R249_53 0.197720 0.03372542 # compare all spectrumSimilarity(mslists, groupName1 = groupNames(mslists), MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) #> M120_R268_30 M137_R249_53 M146_R309_68 M192_R355_191 #> M120_R268_30 1.00000000 0.20406381 0.52005204 0.08589848 #> M137_R249_53 0.20406381 1.00000000 0.19772004 0.03372542 #> M146_R309_68 0.52005204 0.19772004 1.00000000 0.08524785 #> M192_R355_191 0.08589848 0.03372542 0.08524785 1.00000000 "],["visualization.html", "5.7 Visualization", " 5.7 Visualization 5.7.1 Features and annatation data Several generic functions are available to visualize feature and annotation data: Generic Classes Remarks plot() featureGroups, featureGroupsComparison Scatter plot for retention and m/z values plotInt() featureGroups Intensity profiles across analyses plotChroms() featureGroups, components Plot extracted ion chromatograms (EICs) plotSpectrum() MSPeakLists, formulas, compounds, components Plots (annotated) spectra plotStructure() compounds Draws candidate structures plotScores() formulas, compounds Barplot for candidate scoring plotGraph() componentsNT Draws interactive graphs of linked homologous series The most common plotting functions are plotChroms(), which plots chromatographic data for features, and plotSpectrum(), which will plot (annotated) spectra. An overview of their most important function arguments are shown below. Argument Generic Remarks rtWindow plotChroms() Extra time (in s) +/- retention limits of plotted features (useful to zoom out) retMin plotChroms() If TRUE plot retention times in minutes topMost plotChroms() Only draw this amount of highest intensity features in each group. topMostByRGroup plotChroms() If TRUE then the topMost parameter specifies the top most intense features in each replicate group to draw (e.g. topMost=1 would draw the most intense feature for each replicate group). showPeakArea, showFGroupRect plotChroms() Fill peak areas / draw rectangles around feature groups? title plotChroms(), plotSpectrum() Override plot title colourBy plotChroms() Colour individual feature groups (\"fGroups\") or replicate groups (\"rGroups\"). By default nothing is coloured (\"none\") showLegend plotChroms() Display a legend? (only if colourBy!=\"none\") onlyPresent plotChroms() Only plot EICs for analyses where a feature was detected? Setting to FALSE is useful to inspect if a feature was ‘missed’. xlim, ylim plotChroms(), plotSpectrum() Override x/y axis ranges, i.e. to manually set plotting range. groupName, analysis, precursor, index plotSpectrum() What to plot. See examples below. MSLevel plotSpectrum() Whether to plot an MS or MS/MS spectrum (only MSPeakLists) formulas plotSpectrum() Whether formula annotation should be added (only compounds) plotStruct plotSpectrum() Whether the structure should be added to the plot (only compounds) mincex plotSpectrum() Minimum annotation font size (only formulas/compounds) Note that we can use subsetting to select which feature data we want to plot, e.g. plotChroms(fGroups[1:2]) # only plot EICs from first and second analyses. #> Verifying if your data is centroided... plotChroms(fGroups[, 1]) # only plot all features of first group #> Verifying if your data is centroided... The plotStructure() function will draw a chemical structure for a compound candidate. In addition, this function can draw the maximum common substructure (MCS) of multiple candidates in order to assess common structural features. # structure for first candidate plotStructure(compounds, index = 1, groupName = "M120_R268_30") # MCS for first three candidates plotStructure(compounds, index = 1:3, groupName = "M120_R268_30") Some other common and less common plotting operations are shown below. plot(fGroups) # simple scatter plot of retention and m/z values plotChroms(fGroups) # plot EICs for all features #> Verifying if your data is centroided... # get overview of all feature groups plotChroms(fGroups, colourBy = "fGroup", # unique colour for each group topMost = 1, # only most intense feature in each group showPeakArea = TRUE, # show integrated areas showFGroupRect = FALSE, showLegend = FALSE) # no legend (too busy for many feature groups) #> Verifying if your data is centroided... plotChroms(fGroups[, 1], # only plot all features of first group colourBy = "rGroup") # and mark them individually per replicate group #> Verifying if your data is centroided... plotChroms(components, index = 7, fGroups = fGroups) # EICs from a component #> Verifying if your data is centroided... plotSpectrum(mslists, "M120_R268_30") # non-annotated MS spectrum plotSpectrum(mslists, "M120_R268_30", MSLevel = 2) # non-annotated MS/MS spectrum # formula annotated spectrum plotSpectrum(formulas, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists) # compound annotated spectrum, with added formula annotations plotSpectrum(compounds, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, formulas = formulas, plotStruct = TRUE) # custom intensity range (e.g. to zoom in) plotSpectrum(compounds, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, ylim = c(0, 5000), plotStruct = FALSE) plotSpectrum(components, index = 7) # component spectrum # Inspect homologous series plotGraph(componNT) 5.7.2 Overlapping and unique data There are three functions that can be used to visualize overlap and uniqueness between data: Generic Classes plotVenn featureGroups, featureGroupsComparison, formulas, compounds plotUpSet featureGroups, featureGroupsComparison, formulas, compounds plotChord featureGroups, featureGroupsComparison The most simple comparison plot is a Venn diagram (i.e. plotVenn()). This function is especially useful for two or three-way comparisons. More complex comparisons are better visualized with UpSet diagrams (i.e. plotUpSet()). Finally, chord diagrams (i.e. plotChord()) provide visually pleasing diagrams to assess overlap between data. These functions can either be used to compare feature data or different objects of the same type. The former is typically used to compare overlap or uniqueness between features in different replicate groups, whereas comparison between objects is useful to visualize differences in algorithmic output. Besides visualization, note that both operations can also be performed to modify or combine objects (see unique and overlapping features and algorithm consensus). As usual, some examples are shown below. plotUpSet(fGroups) # compare replicate groups plotVenn(fGroups, which = c("repl1", "repl2")) # compare some replicate groups plotChord(fGroups, average = TRUE) # overlap between replicate groups # compare with custom made groups plotChord(fGroups, average = TRUE, outer = c(repl1 = "grp1", repl2 = "grp1", repl3 = "grp2", repl4 = "grp3")) # compare GenForm and SIRIUS results plotVenn(formsGF, formsSIR, labels = c("GF", "SIR")) # manual labeling 5.7.3 MS similarity The plotSpectrum function is also useful to visually compare (annotated) spectra. This works for MSPeakLists, formulas and compounds object data. plotSpectrum(mslists, groupName = c("M120_R268_30", "M137_R249_53"), MSLevel = 2) plotSpectrum(compounds, groupName = c("M120_R268_30", "M146_R309_68"), index = c(1, 1), MSPeakLists = mslists) The specSimParams argument, which was discussed in MS similarity, can be used to configure the similarity calculation: plotSpectrum(mslists, groupName = c("M120_R268_30", "M137_R249_53"), MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) 5.7.4 Hierarchical clustering results In patRoon hierarchical clustering is used for some componentization algorithms and to cluster candidate compounds with similar chemical structure (see compound clustering). The functions below can be used to visualize their results. Generic Classes Remarks plot() All Plots a dendrogram plotInt() componentsIntClust Plots normalized intensity profiles in a cluster plotHeatMap() componentsIntClust Plots an heatmap plotSilhouettes() componentsClust Plot silhouette information to determine the cluster amount plotStructure() compoundsCluster Plots the maximum common substructure (MCS) of a cluster plot(componInt) # dendrogram plot(compsClust, groupName = "M120_R268_30") # dendrogram for clustered compounds plotInt(componInt, index = 4) # intensities of 4th cluster plotHeatMap(componInt) # plot heatmap plotHeatMap(componInt, interactive = TRUE) # interactive heatmap (with zoom-in!) plotSilhouettes(componInt, 5:20) # plot silhouettes (e.g. to obtain ideal cluster amount) 5.7.5 Generating EICs in DataAnalysis If you have Bruker data and the DataAnalysis software installed, you can automatically add EIC data in a DataAnalysis session. The addDAEIC() will do this for a single m/z in one analysis, whereas the addAllDAEICs() function adds EICs for all features in a featureGroups object. # add a single EIC with background subtraction addDAEIC("mysample", "~/path/to/sample", mz = 120.1234, bgsubtr = TRUE) # add TIC for MS/MS signal of precursor 120.1234 (value of mz is ignored for TICs) addDAEIC("mysample", "~/path/to/sample", mz = 100, ctype = "TIC", mtype = "MSMS", fragpath = "120.1234", name = "MSMS 120") addAllDAEICs(fGroups) # add EICs for all features addAllDAEICs(fGroups[, 1:50]) # as usual, subsetting can be used for partial data "],["intReview.html", "5.8 Interactively explore and review data", " 5.8 Interactively explore and review data The checkFeatures and checkComponents functions start a graphical user interface (GUI) which allows you to interactively explore and review feature and components data, respectively. checkFeatures(fGroups) # inspect features and feature groups checkComponents(componCAM, fGroups) # inspect components Both functions allow you to easily explore the data in an interactive way. Furthermore, these functions allow you to remove unwanted data. This is useful to remove for example features that are actually noise and feature groups that shouldn’t be in the same component. To remove an unwanted feature, feature group or components, simply uncheck its ‘keep’ checkbox. The next step is to save the selections you made. A check session is a file that stores which data should be removed. Once the session file is saved the filter function can be used to actually remove the data: fGroupsF <- filter(fGroups, checkFeaturesSession = TRUE) componCAMF <- filter(componCAM, checkComponentsSession = TRUE) If you saved the session and you re-launch the GUI it will restore the selections made earlier. The clearSession argument can be used to fully clear a session before starting the GUI, hence, all the data will be restored to their ‘keep state’. checkFeatures(fGroups, clearSession = TRUE) # start GUI with fresh session It is also possible to use multiple different sessions. This is especially useful if you do not want to overwrite previous session data or want to inspect different objects. In this case the session file name should be specified: checkFeatures(fGroups, "mysession.yml") fGroupsF <- filter(fGroups, checkFeaturesSession = "mysession.yml") The default session names are \"checked-features.yml\" and \"checked-components.yml\" for feature and component data, respectively. The extension of session file names is .yml since the YAML file format is used. An advantage of this format is that it is easily readable and editable with a text editor. Note that the session data is tied to the feature group names of your data. This means that, for instance, when you re-group your feature data after changing some parameters, the session data you prepared earlier cannot be used anymore. Since probably quite some manual work went into creating the session file, a special function is available to import a session that was made for previous data. This function tries its best to guess the new feature group name based on similarity of their retention times and m/z values. checkFeatures(fGroups) # do manual inspection fGroups <- groupFeatures(fList, ...) # re-group with different parameters importCheckFeaturesSession("checked-features.yml", "checked-features-new.yml", fGroups) checkFeatures(fGroups, session = "checked-features-new.yml") # inspect new data Take care to monitor the messages that importCheckFeaturesSession may output, as it may be possible that some ‘old’ feature groups are not found or are matched by multiple candidates of the new dataset. Some additional parameters exist to the functions described in this section. As usualy check the reference manual for more details (e.g. ?checkFeatures). NOTE Although the GUI tools described here allow you to easily filter out results, it is highly recommended to first prioritize your data to avoid doing a lot of unneeded manual work. "],["report.html", "5.9 Reporting", " 5.9 Reporting The previous sections showed various functionalies to inspect and visualize results. An easy and automated way to do this automatically is by using the reporting functionality of patRoon. The following three reporting functions are available: reportCSV(): exports workflow data to comma-separated value (csv) files reportPDF(): generates simple reports by plotting workflow data in portable document files (PDFs) reportHTML(): generates interactive and easily explorable reports There are many different arguments available to configure the reporting process. Some common arguments are listed below; for a complete listing see the reference manual (e.g. ?reporting). Argument Functions Remarks fGroups, formulas, compounds, formulas, components, compsCluster All Objects to plot. Only fGroups is mandatory. MSPeakLists reportPDF(), reportHTML() The MSPeakLists object that was used to generate annotation data. Only needs to be specified if formulas or compounds are reported. path All Directory path where report files will be stored (\"report\" by default). formulasTopMost, compoundsTopMost reportPDF(), reportHTML() Report no more than this amount of highest ranked candidates. EICOnlyPresent reportPDF(), reportHTML() Only plot an EIC for an analysis if a feature was detected. selfContained reportHTML() Outputs to a single and self contained .html file. Handy to share reports, but not recommended for large amounts of data. Which data will be reported is fully configurable. The only workflow object that must be specified are the feature groups (i.e. with the fGroups argument), all other data (e.g. compounds, components) are optional. This means that reporting can be performed at every stage during the workflow, which, for instance, can be useful to quickly inspect results when testing out various settings to generate workflow data. When formula or compound results are reported with reportPDF() or reportHTML() then only the top ranked candidates are considered. This limtation is often necessary as reporting many candidates will take considerable time. By default the top 5 for each feature group are reported, however, this number can be changed with the formulasTopMost and compoundsTopMost arguments. Some typical examples: reportHTML(fGroups) # simple interactive report with feature data # generate PDFs with feature and compound annotation data reportPDF(fGroups, compounds = compounds, MSPeakLists = mslists) reportCSV(fGroups, path = "myReport") # change destination path # generate report with all workflow types and increase maximum number of # compound candidates to top 10 reportHTML(fGroups, formulas = formulas, compounds = compounds, components = components, MSPeakLists = mslists, compsCluster = compsClust, compoundsTopMost = 10) "],["setsWorkflow.html", "6 Sets workflows", " 6 Sets workflows In LC-HRMS screening workflows it is typically desired to be able to detect a broad range of chemicals. For this reason, the samples are often measured twice: with positive and negative ionization. Most data processing steps are only suitable for data with the same polarity, for instance, due to the fact that the m/z values in mass spectra are inherently different (e.g. [M+H]+ vs [M-H]-) and MS/MS fragmentation occurs differently. As a result, the screening workflow has to be done twice, which generally requires more time and complicates comparing and interpretation of the complete (positive and negative) dataset. In patRoon version 2.0 the sets workflow is introduced. This allows you to perform a single non-target screening workflow from different sets of analyses files. Most commonly, each set represents a polarity, hence, there is a positive and negative set. However, more than two sets are supported, and other distinctions between sets are also possible, for instance, samples that were measured with different MS/MS techniques. Another important advantage of the sets workflow is that MS/MS data from different sets can be combined to provide more comprehensive annotations of features. The most important limitation is that (currently) the chromatographic method that was used when analyzing the samples from each set needs to be equal, since retention times are used to group features among the sets. Performing a sets workflow usually only requires small modifications compared to a ‘regular’ patRoon workflow. This chapter outlines how to perform such workflows and how to use its unique functionality for data processing. It is assumed that the reader is already familiar with performing ‘regular’ workflows, which were discussed in the previous chapters. "],["initiating-a-sets-workflow.html", "6.1 Initiating a sets workflow", " 6.1 Initiating a sets workflow A sets workflow is not much different than a ‘regular’ (or non-sets) workflow. For instance, consider the following workflow: anaInfo <- patRoonData::exampleAnalysisInfo("positive") fList <- findFeatures(anaInfo, "openms") fGroups <- groupFeatures(fList, "openms") fGroups <- filter(fGroups, absMinIntensity = 10000, relMinReplicateAbundance = 1, maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE) mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform", adduct = "[M+H]+") compounds <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+") reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, compounds = compounds) This example uses the example data from patRoonData to obtain a feature group dataset, which is cleaned-up afterwards. Then, feature groups are annotated and all the results are reported. Converting this to a sets workflow: anaInfoPos <- patRoonData::exampleAnalysisInfo("positive") anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative") fListPos <- findFeatures(anaInfoPos, "openms") fListNeg <- findFeatures(anaInfoNeg, "openms") fList <- makeSet(fListPos, fListNeg, adducts = c("[M+H]+", "[M-H]-")) fGroups <- groupFeatures(fList, "openms") fGroups <- filter(fGroups, absMinIntensity = 10000, relMinReplicateAbundance = 1, maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE) mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform") compounds <- generateCompounds(fGroups, mslists, "metfrag") reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, compounds = compounds) This workflow will do all the steps for positive and negative data. Only a few modifications were necessary: The analysis information is obtained for positive and negative data (i.e. per set) Features are found for each set separately. makeSet is used to combine the feature data There is no need to specify the adduct anymore in the annotation steps. NOTE The analysis names for the analysis information must be unique for each row, even among sets. Furthermore, replicate groups should not contain analyses from different sets. The key principle to make sets workflows work is performed by makeSet. This method function takes different features objects (or featureGroups, discussed later) to combine the feature data across sets. During this step features are neutralized: the feature m/z data is converted to neutral feature masses. This step ensures that when features are grouped with groupFeatures, its algorithms are able to find the same feature among different sets, even when different MS ionization modes were used during acquisition. However, please note that (currently) no additional chromatographic alignment steps between sets are performed. For this reason, the chromatographic methodology that is used to acquire the data must be the same for all sets. The feature neutralization step relies on adduct data. In the example above, it is simply assumed that all features measured with positive mode are protonated (M+H) species, and all negative features are deprotonated (M-H). It is also possible to use adduct annotations for neutralization; this is discussed later. NOTE The newProject tool can be used to easily generate a sets workflow. Simply select “both” for the Ionization option. "],["generating-sets-workflow-data.html", "6.2 Generating sets workflow data", " 6.2 Generating sets workflow data As was shown in the previous section, the generation of workflow data with a sets workflow largely follows that as what was discussed in the previous chapters. The same generator functions are used: Workflow step Function Output S4 class Grouping features groupFeatures() featureGroupsSet Suspect screening screenSuspects() featureGroupsScreeningSet MS peak lists generateMSPeakLists() MSPeakListsSet Formula annotation generateFormulas() formulasSet Compound annotation generateCompounds() compoundsSet Componentization generateComponents() algorithm dependent (the data pre-treatment and feature finding steps have been omitted as they are not specific to sets workflows). While the same function generics are used to generate data, the class of the output objects differ (e.g. formulasSet instead of formulas). However, since all these classes inherit from their non-sets workflow counterparts, using the workflow data in a sets workflow is nearly identical to what was discussed in the previous chapters (further discussed in the next section). As discussed before, an important step is the neutralization of features. Other workflow steps also have internal mechanics to deal with data from different sets: Workflow step Handling of set data Finding/Grouping features Neutralization of m/z values Suspect screening Merging results from screening performed for each set Componentization Algorithm dependent (discussed below) MS peak lists MS data is obtained and stored per set. The final peak lists are combined (not averaged) Formula/Compound annotation Annotation is performed for each set separately and used to generate a final consensus In most cases the algorithms of the workflow steps are first performed for each set, and this data is then merged. To illustrate the importance of this, consider these examples A suspect screening with a suspect list that contains known MS/MS fragments Annotation where MS/MS fragments are used to predict the chemical formula Componentization in order to establish adduct assignments for the features In all cases data is used that is highly dependent on the MS method (eg polarity) that was used to acquire the sample data. Nevertheless, all the steps needed to obtain and combine set data are performed automatically in the background, and are therefore largely invisible. NOTE Because feature groups in sets workflows always have adduct annotations, it is never required to specify the adduct or ionization mode when generating annotations, components or do suspect screening (i.e. the adduct/ionization arguments should not be specified). 6.2.1 Componentization When the componentization algorithms related to adduct/isotope annotations (e.g. CAMERA, RAMClustR and cliqueMS) and nontarget are used, then componentization occurs per set and the final object (a componentsSet or componentsNTSet) contains all the components together. Since these algorithms are highly dependent upon MS data polarity, no attempt is made to merge components from different sets. The other componentization algorithms work on the complete data. For more details, see the reference manual (?generateComponents). 6.2.2 Formula and compound annotation For formula and compound annotation, the data generated for each set is combined to generate a set consensus. The annotation tables are merged, scores are averaged and candidates are re-ranked. More details can be found in the reference manual (e.g. ?generateCompounds). In addition, it possible to only keep candidates that exist in a minimum number of sets. For this, the setThreshold and setThresholdAnn argument can be used: # candidate must be present in all sets formulas <- generateFormulas(fGroups, mslists, "genform", setThreshold = 1) # candidate must be present in all sets with annotation data compounds <- generateCompounds(fGroups, mslists, "metfrag", setThresholdAnn = 1) In the first example, a formula candidate for a feature group is only kept if it was found for all of the sets. In the second example, a compound candidate is only kept if it was present in all of the sets with annotation data available. The following examples of a common positive/negative sets workflow illustrate the differences: Candidate annotations candidate present setThreshold=1 setThresholdAnn=1 #1 +, - +, - Keep Keep #2 +, - + Remove Remove #3 + + Remove Keep For more information refer to the reference manual (e.g. ?generateCompounds). "],["setsAdducts.html", "6.3 Selecting adducts to improve grouping", " 6.3 Selecting adducts to improve grouping The selectIons() and adduct() functions discussed before can also improve sets workflows. This is because the adduct annotations can be used to improve feature neutralization, which in turn will improve grouping features between positive and negative ionization data. Once adduct annotations are set the features will be re-neutralized and re-grouped. A typical workflow with selectIons looks like this: # as before ... anaInfoPos <- patRoonData::exampleAnalysisInfo("positive") anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative") fListPos <- findFeatures(anaInfoPos, "openms") fListNeg <- findFeatures(anaInfoNeg, "openms") fGroupsPos <- groupFeatures(fListPos, "openms") fGroupsNeg <- groupFeatures(fListNeg, "openms") fList <- makeSet(fListPos, fListNeg, adducts = c("[M+H]+", "[M-H]-")) fGroups <- groupFeatures(fList, "openms") fGroups <- filter(fGroups, absMinIntensity = 10000, relMinReplicateAbundance = 1, maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE) components <- generateComponents(fGroups, "openms") fGroups <- selectIons(fGroups, components, c("[M+H]+", "[M-H]-")) # do rest of the workflow... The first part of the workflow is exactly the same as was introduced in the beginning of this chapter. Furthermore, note that for sets workflows, selectIons needs a preferential adduct for each set. The adducts function can also be used to obtain and modify adduct annotations. For sets workflows, these functions operate per set: adducts(fGroups, set = "positive")[1:5] adducts(fGroups, set = "positive")[4] <- "[M+K]+" If you want to modify annotations for multiple sets, it is best to delay the re-gouping step: adducts(fGroups, set = "positive", reGroup = FALSE)[4] <- "[M+K]+" adducts(fGroups, set = "negative", reGroup = TRUE)[10] <- "[M-H2O]-" Setting reGroup=FALSE will not perform any re-neutralization and re-grouping, which preserves feature group names and safes processing time. However, it is crucial that the re-grouping step is eventually performed at the end. "],["processing-data.html", "6.4 Processing data", " 6.4 Processing data All data objects that are generated during a sets workflow inherit from the classes from a ‘regular’ workflow. This means that, with some minor exceptions, all of the data processing functionality discussed in the previous chapter (e.g. subsetting, inspection, filtering, plotting, reporting) is also applicable to a sets workflow. For instance, the as.data.table() method can be used for general inspection: as.data.table(compounds)[1:5, c("group", "score", "compoundName", "set")] #> group score compoundName set #> 1: M198_R317_272 4.025217 3-(4-chlorophenyl)-1,1-dimethylurea positive,negative #> 2: M198_R317_272 1.946688 3-(3-chlorophenyl)-1,1-dimethylurea positive,negative #> 3: M198_R317_272 1.745251 1-(4-chlorophenyl)-3-ethylurea positive,negative #> 4: M198_R317_272 1.838637 3-amino-5-chloro-N,N-dimethylbenzamide positive,negative #> 5: M198_R317_272 2.366149 5-[[(2R)-azetidin-2-yl]methoxy]-2-chloropyridine positive,negative In addition, some the data processing functionality contains additional functionality for a sets workflow: # only keep feature groups that have positive data fGroupsPos <- fGroups[, sets = "positive"] # only keep feature groups that have feature data for all sets fGroupsF <- filter(fGroups, relMinSets = 1) # only keep feature groups with features present in both polarities fGroupsPosNeg <- overlap(fGroups, which = c("positive", "negative"), sets = TRUE) # only keep feature groups with features that are present only in positive mode fGroupsOnlyPos <- unique(fGroups, which = "positive", sets = TRUE) And plotting: plotVenn(fGroups, sets = TRUE) # compare positive/negative features plotSpectrum(compounds, index = 1, groupName = "M198_R317_272", MSPeakLists = mslists, plotStruct = TRUE) The reference manual for the workflow objects contains specific notes applicable to sets workflows (?featureGroups, ?compounds etc). "],["advanced.html", "6.5 Advanced", " 6.5 Advanced 6.5.1 Initiating a sets workflow from feature groups The makeSet function can also be used to initiate a sets workflow from feature groups: # as before ... anaInfoPos <- patRoonData::exampleAnalysisInfo("positive") anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative") fListPos <- findFeatures(anaInfoPos, "openms") fListNeg <- findFeatures(anaInfoNeg, "openms") fGroupsPos <- groupFeatures(fListPos, "openms") fGroupsNeg <- groupFeatures(fListNeg, "openms") fGroups <- makeSet(fGroupsPos, fGroupsNeg, groupAlgo = "openms", adducts = c("[M+H]+", "[M-H]-")) # do rest of the workflow... In this case makeSet combines the positive and negative (un-grouped) features, neutralizes them and re-groups them all together (with the algorithm specified by groupAlgo). While this option involves some extra steps, an advantage is that allows processing the feature data before they are combined, e.g.: fGroupsPos <- groupFeatures(fListPos, "openms") fGroupsNeg <- groupFeatures(fListNeg, "openms") # apply intensity theshold filters. Lower threshold for negative. fGroupsPos <- filter(fGroupsPos, absMinIntensity = 1E4) fGroupsNeg <- filter(fGroupsNeg, absMinIntensity = 1E3) fGroups <- makeSet(fGroupsPos, fGroupsNeg, groupAlgo = "openms", adducts = c("[M+H]+", "[M-H]-")) Visually, this workflow looks like this: Of course, any other processing steps on the feature groups data such as subsetting and visually checking features are also possible before the sets workflow is initiated. Furthermore, it is also possible to perform adduct annotations prior to grouping, which is an alternative way to improve neutralization to what was discussed before. 6.5.2 Inspecting and converting set objects The following generic functions may be used to inspect or convert data from sets workflows: Generic Purpose Notes sets Return the names of the sets in this object. setObjects Obtain the raw data objects that were used to construct this object. Not available for features and feature groups. unset Converts this object to a regular workflow object. The set argument must be given to specify which of the set data is to be converted. This function will restore the original m/z values of features. These methods are heavily used internally, but rarely needed otherwise. More details can be found in the reference manual. "],["TPs.html", "7 Transformation product screening", " 7 Transformation product screening This chapter describes the various functionality for screening of transformation products (TPs), which are introduced since patRoon 2.0. Screening for TPs, i.e. chemicals that are formed from a parent chemical by e.g. chemical or biological processes, has broad applications. For this reason, the TP screening related functionality is designed to be flexible, thus allowing one to use a workflow that is best suited for a particular study. Regardless, the TP screening workflow in patRoon can be roughly summarized as follows: Parent screening During this step a common patRoon workflow is used to screen for the parent chemicals of interest. This could be a full non-target analysis with compound annotation or a relative simple suspect or target screening. Obtaining TPs Data is obtained of potential TPs for the parents of interest. The TPs may originate from a library or predicted in-silico. Note that in some workflows this step is omitted (discussed later). TP screening A suspect screening is performed to find the TPs in the analysis data. Linking parents and TPs In the step the parent features are linked with the TP features. Several post-processing functionality exists to improve and prioritize the data. The next sections will outline more details on these steps are performed and configured. The last section in this chapter outlines several example workflows. NOTE The newProject tool can be used to easily generate a workflow with transformation product screening. "],["genTPs.html", "7.1 Obtaining transformation product data", " 7.1 Obtaining transformation product data The generateTPs function is used to obtain TPs for a particular set of parents. Like other workflow generator functions (findFeatures, generateCompounds), several algorithms are available that do the actual work. Algorithm Usage Remarks BioTransformer generateTPs(algorithm = \"biotransformer\", ...) Predicts TPs with full structural information Library generateTPs(algorithm = \"library\", ...) Obtains transformation products from a library (PubChem transformations or custom) Metabolic logic generateTPs(algorithm = \"logic\", ...) Uses pre-defined logic to predict TPs based on common elemental differences (e.g. hydroxylation, demethylation). Based on Schollee et al. (2015). The biotransformer and library algorithms provide full structural information of the TPs (e.g. formula, SMILES, predicted Log P). However, these algorithms also depend on the full chemical structure of the parent compound. Hence, these algorithms are typically suitable when parents are known in advance or were found by a suspect screening. On the other hand, metabolic logic only requires the feature mass, and this simplicity allows it to predict TPs for all features. This algorithm is most suitable for full non-target analysis, however, extra care must be taken to rule out false positives. An overview of common arguments for TP generation is listed below. Argument Algorithm(s) Remarks parents biotransformer, library The input parents. See section below. fGroups logic The input feature groups to calculate TPs for. type biotransformer The prediction type: \"env\", \"ecbased\", \"cyp450\", \"phaseII\", \"hgut\", \"superbio\", \"allHuman\". See BioTransformer for more details. TPLibrary/transformations library/logic Custom TP library/transformation rules. adduct logic The assumed adduct of the parents (e.g. \"[M+H]+\"). Not needed when adduct annotations are available. 7.1.1 Parent input The input parent structures for the biotransformer and library algorithms must be one the following: A suspect list (follows the same format as suspect screening) A feature groups object with screening results (e.g. obtained with screenSuspects, see suspect screening) A compounds object obtained with compound annotation In the former two cases the parent information is taken from the suspect list or from the hits in a suspect screening worklow, respectively. The last case is more suitable for when the parents are not completely known. In this case, the candidate structures from a compound annotation are used as input to obtain TPs. Since all the candidates are used, it is highly recommend to filter the object in advance, for instance, with the topMost filter. For library, the parent input is optional: if no parents are specified then TP data for all parents in the database is used. For the logic algorithm TPs are predicted directly for feature groups. Since this algorithm can only perform very basic validity checks, it is strongly recommended to first prioritize the feature group data. Some typical examples: # predict environmental TPs with BioTransformer for all parents in a suspect list TPsBT <- generateTPs("biotransformer", parents = patRoonData::suspectsPos, type = "env") # obtain all TPs from the default library TPsLib <- generateTPs("library") # get TPs for the parents from a suspect screening TPsLib <- generateTPs("library", parents = fGroupsScr) # calculate TPs for all feature groups TPsLogic <- generateTPs("logic", fGroups, adduct = "[M+H]+") 7.1.2 Processing data Similar to other workflow data, several generic functions are available to inspect the data: Generic Classes Remarks length() All Returns the total number of transformation products names() All Returns the names of the parents parents() All Returns a table with information about the parents products() All Returns a list with for each parent a table with TPs as.data.table(), as.data.frame All Convert all the object information into a data.table/data.frame \"[[\" / \"$\" operators All Extract TP information for a specified parent Some examples: # just show a few columns in this example, there are many more! # note: the double dot syntax (..cols) is necessary since the data is stored as data.tables cols <- c("name", "formula", "InChIKey") parents(TPs)[1:5, ..cols] #> name formula InChIKey #> 1: (-)-bisoprolol C18H31NO4 VHYCDWMUTMEGQY-KRWDZBQOSA-N #> 2: (-)-Epigallocatechin C15H14O7 XMOCLSLCDHWDHP-IUODEOHRSA-N #> 3: (-)-Epigallocatechin gallate C22H18O11 WMBWREPUVVBILR-WIYYLYMNSA-N #> 4: (-)-ethosuximide C7H11NO2 HAPOVYFOVVWLRS-SSDOTTSWSA-N #> 5: (-)-etodolac C17H21NO3 NNYBQONXHNTVIJ-QGZVFWFLSA-N TPs[["DEET"]][, ..cols] #> name formula InChIKey #> 1: DEET-TP-N,N-diethyl-m-hydroxymethylbenzamide C12H17NO2 FRZJZRVZZNTMAW-UHFFFAOYSA-N #> 2: DEET-TP-N-Ethyl-N-(2-hydroxyethyl)-3-methylbenzamide C12H17NO2 KVTUZBGZTRABBQ-UHFFFAOYSA-N #> 3: DEET-TP-acetaldehyde C2H4O IKHGUXGNUITLKF-UHFFFAOYSA-N #> 4: DEET-TP-N-ethyl-m-toluamide C10H13NO FPINATACRXASTP-UHFFFAOYSA-N TPs[[2]][, ..cols] #> name formula InChIKey #> 1: (-)-Epigallocatechin-TP-(-)-Epigallocatechin, 3p-hydroxy-glucuronide C21H22O13 CQDATFYRGVZXLF-ZVHNUXTDSA-N as.data.table(TPs)[1:5, 1:3] #> parent transformation name #> 1: (-)-bisoprolol O-deisopropylation / Human Phase I (-)-bisoprolol-TP-(-)-bisoprolol, O-deisopropyl #> 2: (-)-Epigallocatechin Aromatic-OH glucuronidation / Human Phase II (-)-Epigallocatechin-TP-(-)-Epigallocatechin, 3p-hydroxy-glucuronide #> 3: (-)-Epigallocatechin gallate Aromatic-OH glucuronidation / Human Phase II (-)-Epigallocatechin gallate-TP-(-)-Epigallocatechin gallate, 3p-hydroxy-glucuronide #> 4: (-)-Epigallocatechin gallate Aromatic-OH glucuronidation / Human Phase II (-)-Epigallocatechin gallate-TP-(-)-Epigallocatechin gallate, 4p-hydroxy-glucuronide #> 5: (-)-ethosuximide Aliphatic Hydroxylation / Human Phase I (-)-ethosuximide-TP-3-(1-Hydroxyethyl)-3-methylpyrrolidine-2,5-dione In addition, the following generic functions are available to modify or convert the object data: Generic Classes Remarks \"[\" operator All Subset this object on given parents filter transformationProductsBT Filters this object convertToSuspects All Generates a suspect list of all TPs (and optionally parents) that is suitable for screenSuspects convertToMFDB transformationProductsBT, transformationProductsLibrary Generates a MetFrag database for all TPs (and optionally parents) TPs2 <- TPs[1:10] # only keep results for first ten parents # remove transformation products that are isomers to their parent or sibling TPs # may simplify data as these are often difficult to identify TPsF <- filter(TPs, removeParentIsomers = TRUE, removeTPIsomers = TRUE) # remove duplicate transformation products from each parent # these can occur if different pathways yield the same TPs TPsF <- filter(TPs, removeDuplicates = TRUE) # only keep TPs that have a structural similarity to their parent of >= 0.5 TPsF <- filter(TPs, minSimilarity = 0.5) # do a suspect screening for all TPs and their parents suspects <- convertToSuspects(TPs, includeParents = TRUE) fGroupsScr <- screenSuspects(fGroups, suspects, onlyHits = TRUE) # use the TP data for a specialized MetFrag database convertToMFDB(TPs, "TP-database.csv", includeParents = FALSE) compoundsTPs <- generateCompounds(fGroups, mslists, "metfrag", database = "csv", extraOpts = list(LocalDatabasePath = "TP-database.csv")) The convertToSuspects function is always part of a workflow with biotransformer or library TPs. This is discussed further in the next section. The convertToMFDB function is especially handy with biotransformer workflows, as it allows generating a compound database for TPs that may not be available in other databases. This is further demonstrated in the first example. 7.1.3 Custom libraries and transformations By default the library and logic algorithms use data that is installed with patRoon (based on PubChem transformations and Schollee et al. (2015), respectively). However, it is also possible to use custom data. To use a custom TP library a simple data.frame is needed with the names, SMILES and optionally log P values for the parents and TPs. The log P values are used for prediction of the retention time direction of a TP compared to its parent, as is discussed further in the next section. The following small library has two TPs for benzotriazole and one for DEET: myTPLib <- data.frame(parent_name = c("1H-Benzotriazole", "1H-Benzotriazole", "DEET"), parent_SMILES = c("C1=CC2=NNN=C2C=C1", "C1=CC2=NNN=C2C=C1", "CCN(CC)C(=O)C1=CC=CC(=C1)C"), TP_name = c("1-Methylbenzotriazole", "1-Hydroxybenzotriazole", "N-ethyl-m-toluamide"), TP_SMILES = c("CN1C2=CC=CC=C2N=N1", "C1=CC=C2C(=C1)N=NN2O", "CCNC(=O)C1=CC=CC(=C1)C")) myTPLib #> parent_name parent_SMILES TP_name TP_SMILES #> 1 1H-Benzotriazole C1=CC2=NNN=C2C=C1 1-Methylbenzotriazole CN1C2=CC=CC=C2N=N1 #> 2 1H-Benzotriazole C1=CC2=NNN=C2C=C1 1-Hydroxybenzotriazole C1=CC=C2C(=C1)N=NN2O #> 3 DEET CCN(CC)C(=O)C1=CC=CC(=C1)C N-ethyl-m-toluamide CCNC(=O)C1=CC=CC(=C1)C To use this library, simply pass it to the TPLibrary argument: TPs <- generateTPs("library", TPLibrary = myTPLib) Similarly, for logic a table with custom transformation rules can be specified for TP calculations: myTrans <- data.frame(transformation = c("hydroxylation", "demethylation"), add = c("O", ""), sub = c("", "CH2"), retDir = c(-1, -1)) myTrans #> transformation add sub retDir #> 1 hydroxylation O -1 #> 2 demethylation CH2 -1 The add and sub columns are used to denote the elements that are added or subtracted by the reaction. These are used to calculate mass differences between parents and TPs. The retDir column is used to indicate the retention time direction of the parent compared to the TP: -1 (elutes before parent), 1 (elutes after parent) or 0 (similar or unknown). The next section describes how this data can be used to filter TPs. The custom rules can be used by passing them to the transformations argument: TPs <- generateTPs("logic", fGroups, adduct = "[M+H]+", transformations = myTrans) References "],["linking-parent-and-transformation-product-features.html", "7.2 Linking parent and transformation product features", " 7.2 Linking parent and transformation product features This section discusses one of the most important steps in a TP screening workflow, which is to link feature groups of parents with those of candidate transformation products. During this step, components are made, where each component consist of one or more feature groups of detected TPs for a particular parent. Note that componentization was already introduced before, but for very different algorithms. However, the data format for TP componentization is highly similar. After componentization, several filters are available to clean and prioritize the data. These can even allow workflows without obtaining potential TPs in advance, which is discussed in the last subsection. 7.2.1 Componentization Like other algorithms, the generateComponents generic function is used to generate TP components, by setting the algorithm parameter to \"tp\". The following arguments are of importance: Argument Remarks fGroups The input feature groups for the parents fGroupsTPs The input feature groups for the TPs ignoreParents Set to TRUE to ignore feature groups in fGroupsTPs that also occur in fGroups TPs The input transformation products, ie as generated by generateTPs() MSPeakLists, formulas, compounds Annotation objects used for similarity calculation between the parent and its TPs minRTDiff The minimum retention time difference (seconds) of a TP for it to be considered to elute differently than its parent. 7.2.1.1 Feature group input The fGroups, fGroupsTPs and ignoreParents arguments are used by the componentization algorithm to identify which feature groups can be considered as parents and which as TPs. Three scenarios are possible: fGroups=fGroupsTPs and ignoreParents=FALSE: in this case no distinction is made, and all feature groups are considered a parent or TP (default if fGroupsTPs is not specified). fGroups and fGroupsTPs contain different subsets of the same featureGroups object and ignoreParents=FALSE: only the feature groups in fGroups/fGroupsTPs are considered as parents/TPs. As above, but with ignoreParents=TRUE: the same distinction is made as above, but any feature groups in fGroupsTPs are ignored if also present in fGroups. The first scenario is often used if it is unknown which feature groups may be parents or which are TPs. Furthermore, this scenario may also be used if the dataset is sufficiently simple, for instance, because a suspect screening with the results from convertToSuspects (discussed in the previous section) would reliably discriminate between parents and TPs. A workflow with the first scenario is demonstrated in the second example. In all other cases it is recommended to use either the second or third scenario, since making a prior distinction between parent and TP feature groups greatly simplifies the dataset and reduces false positives. A relative simple example where this can be used is when there are two sample groups: before and after treatment. componTP <- generateComponents(algorithm = "tp", fGroups = fGroups[rGroups = "before"], fGroupsTPs = fGroups[rGroups = "after"]) In this example, only those feature groups present in the “before” replicate group are considered as parents, and those in “after” may be considered as a TP. Since it is likely that there will be some overlap in feature groups between both sample groups, the ignoreParents flag can be used to not consider any of the overlap for TP assignments: componTP <- generateComponents(algorithm = "tp", fGroups = fGroups[rGroups = "before"], fGroupsTPs = fGroups[rGroups = "after"], ignoreParents = TRUE) More sophisticates ways are of course possible to provide an upfront distinction between parent/TP feature groups. In the fourth example a workflow is demonstrated where fold changes are used. NOTE The feature groups specified for fGroups/fGroupsTPs must always originate from the same featureGroups object. For the library and biotransformer algorithms it is mandatory that a suspect screening of parents and TPs is performed prior to componentization. This is necessary for the componentization algorithm to map the feature groups that belong to a particular parent or TP. To do so, the convertToSuspects function is used to prepare the suspect list: # set includeParents to TRUE since both the parents and TPs are needed suspects <- convertToSuspects(TPs, includeParents = TRUE) fGroupsScr <- screenSuspects(fGroups, suspects, onlyHits = TRUE) # do the componentization # a similar distinction between fGroups/fGroupsScr as discussed above can of course also be done componTP <- generateComponents(fGroups = fGroupsScr, ...) If a parent screening was already performed in advance, for instance when the input parents to generateTPs are screening results, the screening results for parents and TPs can also be combined. The second example demonstrates this. Note that in the case a parent suspect is matched to multiple feature groups, a component is made for each match. Similarly, if multiple feature groups match to a TP suspect, all of them will be incorporated in the component. When TPs were generated with the logic algorithm a suspect screening must also be carried out in advance. However, in this case it is not necessary to include the parents (since each parent equals a feature group no mapping is necessary). The onlyHits variable to screenSuspects must not be set in order to keep the parents. # only screen for TPs suspects <- convertToSuspects(TPs, includeParents = FALSE) # but keep all other feature groups as these may be parents fGroupsScr <- screenSuspects(fGroups, suspects, onlyHits = FALSE) # do the componentization... 7.2.1.2 Annotation similarity calculation If additional annotation data for parents and TPs is given to the componentization algorithm, it will be used to calculate various similarity properties. Often, the chemical structure for a transformation product is similar to that of its parent. Hence, there is a good chance that a parent and its TPs also share similar MS/MS data. Firstly, if MS peak lists are provided, then the spectrum similarity is calculated between each parent and its potential TP candidates. This is performed with all the three different alignment shifts (see the spectrum similarity section for more details). In case formulas and/or compounds objects are specified, then a parent/TP comparison is made by counting the number of fragments and neutral losses that they share (by using the formula annotations). This property is mainly used for non-target workflows where the identity for a parent and TP is not yet well established. For this reason, fragments and neutral losses reported for all candidates for the parent/TP feature group are considered. Hence, it is highly recommend to pre-treat the annotation objects, for instance, with the topMost filter. If both formulas and compounds are given the results are pooled. Note that each unique fragment/neutral loss is only counted once, thus multiple formula/compound candidates with the same annotations will not skew the results. 7.2.2 Processing data The output of TP componentization is an object of the componentsTPs class. This derives from the ‘regular’ components class, therefore, all the data processing functionality described before (extraction, subsetting, filtering etc) are also valid for TP components. Several additional filters are available to prioritize the data: Filter Remarks retDirMatch If TRUE only keep TPs with an expected chromatographic retention direction compared to the parent. minSpecSim, minSpecPrec, minSpecSimBoth The minimum spectrum similarity between the parent and TP. Calculated with no, \"precursor\" and \"both\" alignment shifting (see spectrum similarity). minFragMatches, minNLMatches Minimum number of formula fragment/neutral loss matches between parent and TP (discussed in previous section). formulas A formulas object used to further verify candidate TPs that were generated by the logic algorithm. The retDirMatch filter compares the expected and observed retention time direction of a TP in order to decide if it should be kept. The direction is a value of either -1 (TP elutes before parent), +1 (TP elutes after parent) or 0 (TP elutes very close to the parent or its direction is unknown). The directions are taken from the generated transformation products. For the library and biotransformer algorithms the log P values are compared of a TP and its parent. Here, it is assumed that lower log P values result in earlier elution (i.e. typical with reversed phase LC). For the logic algorithm the retention time direction is taken from the transformation rules table. Note that specifying a large enough value for the minRTDiff argument to generateComponents is important to ensure that some tolerance exists while comparing retention time directions of parent and TPs. This filter does nothing if either the observed or expected direction is zero. When TPs data was generated with the logic algorithm it is recommended to use the formulas filter. This filter uses formula annotations to verify that (1) a parent feature group contains the elements that are subtracted during the transformation and (2) the TP feature group contains the elements that were added during the transformation. Since the ‘right’ candidate formula is most likely not yet known, this filter looks at all candidates. Therefore, it is recommended to filter the formulas object, for instance, with the topMost filter. 7.2.3 Omitting transformation product input The TPs argument to generateComponents can also be omitted. In this case every feature group of fGroupTPs is considered to be a potential TP for the potential parents specified for fGroups. An advantage is that the screening workflow is not limited to any known TPs or transformations. However, such a workflow has high demands on prioritiation steps before and after the componentization to rule out the many false positives that may occur. When no transformation data is supplied it is crucial to make a prior distinction between parent and TP feature groups. Afterwards, the MS/MS spectral and other annotation similarity filters mentioned in the previous section may be a powerful way to further prioritize data. The fourth example demonstrates such a workflow. 7.2.4 Reporting TP components The TP components can be reported with the reportHTML function. This is done by setting the components function argument (i.e. equally to all other component types). The results will be displayed with a customized format that allows easy exploring of each parent with its TPs. reportHTML(fGroups, components = componTP) "],["TPsExamples.html", "7.3 Example workflows", " 7.3 Example workflows The next subsections demonstrate several approaches to perform a TP screening workflow with patRoon. In all examples it is assumed that feature groups were already obtained (with the findFeatures and groupFeatures functions) and stored in the fGroups variable. The workflows with patRoon are designed to be flexible, and the examples here are primarily meant to implement your own workflow. Furthermore, some of the techniques used in the examples can also be combined. For instance, the Fold change classification and MS/MS similarity filters applied in the fourth example could also be applied to any of the other examples. 7.3.1 Screen predicted TPs for targets The first example is a simple workflow where TPs are predicted for a set of given parents with BioTransformer and subsequently screened. A MetFrag compound database is generated and used for annotation. # predict TPs for a fixed list of parents TPs <- generateTPs("biotransformer", parents = patRoonData::suspectsPos) # screen for the TPs suspectsTPs <- convertToSuspects(TPs, includeParents = FALSE) fGroupsTPs <- screenSuspects(fGroups, suspectsTPs, adduct = "[M+H]+", onlyHits = TRUE) # perform annotation of TPs mslistsTPs <- generateMSPeakLists(fGroupsTPs, "mzr") convertToMFDB(TPs, "TP-database.csv", includeParents = FALSE) # generate MetFrag database compoundsTPs <- generateCompounds(fGroupsTPs, mslistsTPs, "metfrag", adduct = "[M+H]+", database = "csv", extraOpts = list(LocalDatabasePath = "TP-database.csv")) 7.3.2 Screening TPs from a library for suspects In this example TPs of interest are obtained for the parents that surfaced from of a suspect screening. The steps of this workflow are: Suspect screening parents. Obtain TPs for the suspect hits from a library. A second suspect screening is performed for TPs and the original parent screening results are amended. Note that the parent data is needed for componentization. Both parents and TPs are annotated using a database generated from their chemical structures. Some prioritization is performed by Only keeping candidate structures for which in-silico fragmentation resulted in at least one annotated MS/MS peak. Only keeping suspect hits with an estimated identification level of 3 or better. The TP components are made and only feature groups with parent/TP assignments are kept. All results are reported. # step 1 fGroupsScr <- screenSuspects(fGroups, patRoonData::suspectsPos, adduct = "[M+H]+") # step 2 TPs <- generateTPs("library", parents = fGroupsScr) # step 3 suspects <- convertToSuspects(TPs) fGroupsScr <- screenSuspects(fGroupsScr, suspects, adduct = "[M+H]+", onlyHits = TRUE, amend = TRUE) # step 4 mslistsScr <- generateMSPeakLists(fGroupsScr, "mzr") convertToMFDB(TPs, "TP-database.csv", includeParents = TRUE) compoundsScr <- generateCompounds(fGroupsScr, mslistsScr, "metfrag", adduct = "[M+H]+", database = "csv", extraOpts = list(LocalDatabasePath = "TP-database.csv")) # step 5a compoundsScr <- filter(compoundsScr, minExplainedPeaks = 1) # step 5b fGroupsScrAnn <- annotateSuspects(fGroupsScr, MSPeakLists = mslistsScr, compounds = compoundsScr) fGroupsScrAnn <- filter(fGroupsScrAnn, maxLevel = 3, onlyHits = TRUE) # step 6 componTP <- generateComponents(fGroupsScrAnn, "tp", TPs = TPs, MSPeakLists = mslistsScr, compounds = compoundsScr) fGroupsScrAnn <- fGroupsScrAnn[results = componTP] # step 7 reportHTML(fGroupsScrAnn, MSPeakLists = mslistsScr, compounds = compoundsScr, components = componTP) 7.3.3 Non-target screening of predicted TPs This example uses metabolic logic to calculate possible TPs for all feature groups from a complete non-target screening. This example demonstrates how a workflow can be performed when little is known about the identity of the parents. The steps of this workflow are: Formula annotations are performed for all feature groups. These results are then limited to the top 5 candidates, and only feature groups with annotations are kept. The TPs are calculated for all remaining feature groups. A suspect screening is performed to find the TPs. Unlike the previous example feature groups without hits are kept (discussed here). The components are generated The components are filtered: The TPs must follow an expected retention time direction The parent/TPs should have at least one candidate formula that fits with the transformation. Only feature groups are kept with parent/TP assignments and all results are reported. # steps 1-2 mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform", adduct = "[M+H]+") formulas <- filter(formulas, topMost = 5) fGroups <- fGroups[results = formulas] # step 3 TPs <- generateTPs("logic", fGroups = fGroups, adduct = "[M+H]+") # step 4 suspects <- convertToSuspects(TPs) fGroupsScr <- screenSuspects(fGroups, suspects, adduct = "[M+H]+", onlyHits = FALSE) # step 5 componTP <- generateComponents(fGroupsScr, "tp", TPs = TPs, MSPeakLists = mslists, formulas = formulas) # step 6 componTP <- filter(componTP, retDirMatch = TRUE, formulas = formulas) # step 7 fGroupsScr <- fGroupsScr[results = componTP] reportHTML(fGroupsScr, MSPeakLists = mslists, formulas = formulas, components = componTP) 7.3.4 Non-target screening of TPs by annotation similarities This example shows a workflow where no TP data from a prediction or library is used. Instead, this workflow relies on statistics and MS/MS data to find feature groups which may potentially have a parent - TP relationship. The workflow is similar to that of the previous example. The steps of this workflow are: Fold changes (FC) between two sample groups are calculated to classify which feature groups are decreasing (i.e. parents) or increasing (i.e. TPs). Feature groups without classification are removed. Formula annotations are performed like the previous example. The componentization is performed and the FC classifications are used to specify which feature groups are to be considered parents or TPs. Only TPs are kept that show a high MS/MS spectral similarity and share at least one fragment with their parent. Only feature groups are kept with parent/TP assignments and all results are reported. # step 1 tab <- as.data.table(fGroups, FCParams = getFCParams(c("before", "after"))) groupsParents <- tab[classification == "decrease"]$group groupsTPs <- tab[classification == "increase"]$group # step 2 fGroups <- fGroups[, union(groupsParents, groupsTPs)] # step 3 mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform", adduct = "[M+H]+") formulas <- filter(formulas, topMost = 5) fGroups <- fGroups[results = formulas] # step 4 componTP <- generateComponents(algorithm = "tp", fGroups = fGroups[, groupsParents], fGroupsTPs = fGroups[, groupsTPs], MSPeakLists = mslists, formulas = formulas) # step 5 componTP <- filter(componTP, minSpecSimBoth = 0.75, minFragMatches = 1) # step 6 fGroups <- fGroups[results = componTP] reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, components = componTP) "],["advanced_usage.html", "8 Advanced usage ", " 8 Advanced usage "],["adducts.html", "8.1 Adducts", " 8.1 Adducts When generating formulae and compound annotations and some other functionalities it is required to specify the adduct species. Behind the scenes, different algorithms typically use different formats. For instance, in order to specify a protonated species… GenForm either accepts \"M+H\" and \"+H\" MetFrag either accepts the numeric code 1 or \"[M+H]+\" SIRIUS accepts \"[M+H]+\" In addition, most algorithms only accept a limited set of possible adducts, which do not necessarily all overlap with each other. The GenFormAdducts() and MetFragAdducts() functions list the possible adducts for GenForm and MetFrag, respectively. In order to simplify the situation patRoon internally uses its own format and converts it automatically to the algorithm specific format when necessary. Furthermore, during conversion it checks if the specified adduct format is actually allowed by the algorithm. Adducts in patRoon are stored in the adduct S4 class. Objects from this class specify which elements are added and/or subtracted, the final charge and the number of molecules present in the adduct (e.g. 2 for a dimer). adduct(add = "H") # [M+H]+ adduct(sub = "H", charge = -1) # [M-H]- adduct(add = "K", sub = "H2", charge = -1) # [M+K-H2]- adduct(add = "H3", charge = 3) # [M+H3]3+ adduct(add = "H", molMult = 2) # [2M+H]+ A more easy way to generate adduct objects is by using the as.adduct() function: as.adduct("[M+H]+") as.adduct("[M+H2]2+") as.adduct("[2M+H]+") as.adduct("[M-H]-") as.adduct("+H", format = "genform") as.adduct(1, isPositive = TRUE, format = "metfrag") In fact, the adduct argument to workflow functions such as generateFormulas() and generateCompounds() is automatically converted to an adduct class with the as.adduct() function if necessary: formulas <- generateFormulas(..., adduct = adduct(sub = "H", charge = -1)) formulas <- generateFormulas(..., adduct = "[M-H]-") # same as above More details can be found in the reference manual (?adduct and ?`adduct-utils`). "],["fOpt.html", "8.2 Feature parameter optimization", " 8.2 Feature parameter optimization Many different parameters exist that may affect the output quality of feature finding and grouping. To avoid time consuming manual experimentation, functionality is provided to largely automate the optimization process. The methodology, which uses design of experiments (DoE), is based on the excellent Isotopologue Parameter Optimization (IPO) R package. The functionality of this package is directly integrated in patRoon. Some functionality was added or changed, the most important being support for other feature finding and grouping algorithms besides XCMS and basic optimization support for qualitative parameters. Nevertheless, the core optimization algorithms are largely untouched. This section will introduce the most important concepts and functionality. Please see the reference manual for more information (e.g. ?`feature-optimization`). NOTE The SIRIUS and SAFD algorithms are currently not (yet) supported. 8.2.1 Parameter sets Before starting an optimization experiment we have to define parameter sets. These sets contain the parameters and (initial) numeric ranges that should be tested. A parameter set is defined as a regular list, and can be easily constructed with the generateFeatureOptPSet() and generateFGroupsOptPSet() functions (for feature finding and feature grouping, respectively). pSet <- generateFeatureOptPSet("openms") # default test set for OpenMS pSet <- generateFeatureOptPSet("openms", chromSNR = c(5, 10)) # add parameter # of course manually making a list is also possible (e.g. if you don't want to test the default parameters) pSet <- list(noiseThrInt = c(1000, 5000)) When optimizing with XCMS or KPIC2 a few things have to be considered. First of all, when using the XCMS3 interface (i.e. algorithm=\"xcms3\") the underlying method that should be used for finding and grouping features and retention alignment should be set. In case these are not set default methods will be used. pSet <- list(method = "centWave", ppm = c(2, 8)) pSet <- list(ppm = c(2, 8)) # same: centWave is default # get defaults, but for different grouping/alignment methods pSetFG <- generateFGroupsOptPSet("xcms3", groupMethod = "nearest", retAlignMethod = "peakgroups") In addition, when optimizing feature grouping (both XCMS interfaces and KPIC2) we need to set the grouping and retention alignment parameters in two different nested lists: these are groupArgs/retcorArgs (algorithm=\"xcms\"), groupParams/retAlignParams (algorithm=\"xcms3\") or groupArgs/alignArgs (algorithm=\"kpic2\"). pSetFG <- list(groupParams = list(bw = c(20, 30))) # xcms3 pSetFG <- list(retcorArgs = list(gapInit = c(0, 7))) # xcms pSetFG <- list(groupArgs = list(mz_weight = c(0.3, 0.9))) # kpic2 When a parameter set has been defined it should be used as input for the optimizeFeatureFinding() or optimizeFeatureGrouping() functions. ftOpt <- optimizeFeatureFinding(anaInfo, "openms", pSet) fgOpt <- optimizeFeatureGrouping(fList, "openms", pSetFG) # fList is an existing features object Similar to findFeatures(), the first argument to optimizeFeatureFinding() should be the analysis information. Note that it is not uncommon to perform the optimization with only a subset of (representative) analyses (i.e. to reduce processing time). ftOpt <- optimizeFeatureFinding(anaInfo[1:2, ], "openms", pSet) # only use first two analyses From the parameter set a design of experiment will be automatically created. Obviously, the more parameters are specified, the longer such an experiment will take. After an experiment has finished, the optimization algorithm will start a new experiment where numeric ranges for each parameter are increased or decreased in order to more accurately find optimum values. Hence, the numeric ranges specified in the parameter set are only initial ranges, and will be changed in subsequent experiments. After each experiment iteration the results will be evaluated and a new experiment will be started as long as better results were obtained during the last experiment (although there is a hard limit defined by the maxIterations argument). For some parameters it is recommended or even necessary to set hard limits on the numeric ranges that are allowed to be tested. For instance, setting a minimum feature intensity threshold is highly recommended to avoid excessive processing time and potentially suboptimal results due to excessive amounts of resulting features. Configuring absolute parameter ranges is done by setting the paramRanges argument. # set minimum intensity threshold (but no max) ftOpt <- optimizeFeatureFinding(anaInfo, "openms", list(noiseThrInt = c(1000, 5000), # initial testing range paramRanges = list(noiseThrInt = c(500, Inf))) # never test below 500 Depending on the used algorithm, several default absolute limits are imposed. These may be obtained with the getDefFeaturesOptParamRanges() and getDefFGroupsOptParamRanges() functions. The common operation is to optimize numeric parameters. However, parameters that are not numeric (i.e. qualitative) need a different approach. In this case you will need to define multiple parameter sets, where each set defines a different qualitative value. ftOpt <- optimizeFeatureFinding(anaInfo, "openms", list(chromFWHM = c(4, 8), isotopeFilteringModel = "metabolites (5% RMS)"), list(chromFWHM = c(4, 8), isotopeFilteringModel = "metabolites (2% RMS)")) In the above example there are two parameter sets: both define the numeric chromFWHM parameter, whereas the qualitative isotopeFilteringModel parameter has a different value for each. Note that we had to specify the chromFWHM twice, this can be remediated by using the templateParams argument: ftOpt <- optimizeFeatureFinding(anaInfo, "openms", list(isotopeFilteringModel = "metabolites (5% RMS)"), list(isotopeFilteringModel = "metabolites (2% RMS)"), templateParams = list(chromFWHM = c(4, 8))) As its name suggests, the templateParams argument serves as a template parameter set, and its values are essentially combined with each given parameter set. Note that current support for optimizing qualitative parameters is relatively basic and time consuming. This is because tests are essentially repeated for each parameter set (e.g. in the above example the chromFWHM parameter is optimized twice, each time with a different value for isotopeFilteringModel). 8.2.2 Processing optmization results The results of an optimization process are stored in objects from the S4 optimizationResult class. Several methods are defined to inspect and visualize these results. The optimizedParameters() function is used to inspect the best parameter settings. Similarly, the optimizedObject() function can be used to obtain the object that was created with these settings (i.e. a features or featureGroups object). optimizedParameters(ftOpt) # best settings for whole experiment #> $chromFWHM #> [1] 3.75 #> #> $mzPPM #> [1] 13.5 #> #> $minFWHM #> [1] 1.4 #> #> $maxFWHM #> [1] 24 optimizedObject(ftOpt) # features object with best settings for whole experiment #> A featuresOpenMS object #> Hierarchy: #> features #> |-- featuresOpenMS #> --- #> Object size (indication): 595 kB #> Algorithm: openms #> Total feature count: 3681 #> Average feature count/analysis: 3681 #> Analyses: solvent-pos-1 (1 total) #> Replicate groups: solvent-pos (1 total) #> Replicate groups used as blank: solvent-pos (1 total) Results can also be obtained for specific parameter sets/iterations. optimizedParameters(ftOpt, 1) # best settings for first parameter set #> $chromFWHM #> [1] 3.75 #> #> $mzPPM #> [1] 13.5 #> #> $minFWHM #> [1] 1.4 #> #> $maxFWHM #> [1] 24 optimizedParameters(ftOpt, 1, 1) # best settings for first parameter set and experiment iteration #> $chromFWHM #> [1] 5 #> #> $mzPPM #> [1] 10 #> #> $minFWHM #> [1] 1 #> #> $maxFWHM #> [1] 34 optimizedObject(ftOpt, 1) # features object with best settings for first parameter set #> A featuresOpenMS object #> Hierarchy: #> features #> |-- featuresOpenMS #> --- #> Object size (indication): 595 kB #> Algorithm: openms #> Total feature count: 3681 #> Average feature count/analysis: 3681 #> Analyses: solvent-pos-1 (1 total) #> Replicate groups: solvent-pos (1 total) #> Replicate groups used as blank: solvent-pos (1 total) The plot() function can be used to visualize optimization results. This function will plot graphs for results of all tested parameter pairs. The graphs can be contour, image or perspective plots (as specified by the type argument). plot(ftOpt, paramSet = 1, DoEIteration = 1) # contour plots for first param set/experiment plot(ftOpt, paramSet = 1, DoEIteration = 1, type = "persp") # pretty perspective plots Please refer to the reference manual for more methods to inspect optimization results (e.g. ?optimizationResult). "],["peakQual.html", "8.3 Chromatographic peak qualities", " 8.3 Chromatographic peak qualities The algorithms used by findFeatures detect chromatographic peaks automatically to find the features. However, it is common that not all detected features have ‘proper’ chromatographic peaks, and some features could be just noise. The MetaClean R package supports various quality measures for chromatographic peaks. The quality measures include Gaussian fit, symmetry, sharpness and others. In addition, MetaClean averages all feature data for each feature group and adds a few additional group specific quality measures (e.g. retention time consistency). Please see Chetnik, Petrick, and Pandey (2020) for more details. The calculations are integrated into patRoon, and are easily performed with the calculatePeakQualities() generic function. fList <- calculatePeakQualities(fList) # calculate for all features #> Verifying if your data is centroided... #> Calculating feature peak qualities and scores... fGroups <- calculatePeakQualities(fGroups) # calculate for all features and groups #> Verifying if your data is centroided... #> Calculating feature peak qualities and scores... #> Verifying if your data is centroided... #> Calculating group peak qualities and scores... #> ================================================================================ Most often the featureGroups method is only used, unless you want to filter features (discussed below) prior to grouping. An extension in patRoon is that the qualities are used to calculate peak scores. The score for each quality measure is calculated by normalizing and scaling the values into a 0-1 range, where zero is the worst and one the best. Note that most scores are relative, hence, the values should only be used to compare features among each other. Finally, a totalScore is calculated which sums all individual scores and serves as a rough overall score indicator for a feature (group). The qualities and scores are easily obtained with the as.data.table() function. # (limit rows/columns for clarity) as.data.table(fList)[1:5, 26:30] #> GaussianSimilarityScore SharpnessScore TPASRScore ZigZagScore totalScore #> 1: 0.6314046 3.443351e-02 0.9956949 0.9103221 6.302180 #> 2: 0.9633994 9.900530e-10 0.9944988 0.3565674 6.513205 #> 3: 0.3613087 7.565147e-10 0.8006569 0.9999449 5.651379 #> 4: 0.9151027 8.600747e-03 0.9405262 0.9637153 5.892201 #> 5: 0.3676623 1.000000e+00 0.9907657 0.8435805 5.825267 # the qualities argument is necessary to include the scores. # valid values are: "quality", "score" or "both" as.data.table(fGroups, qualities = "both")[1:5, 25:29] #> TPASRScore ZigZagScore ElutionShiftScore RetentionTimeCorrelationScore totalScore #> 1: 0.7305554 0.9962254 0.8421657 0.9937370 7.930701 #> 2: 0.0000000 0.9744541 0.9960804 0.6808412 5.962788 #> 3: 0.6140008 0.9171568 0.9015949 0.9683740 7.471384 #> 4: 0.8227904 0.8907734 0.9403958 0.9948720 8.450124 #> 5: 0.9848653 0.8667116 0.5754979 0.9978621 8.739507 The feature quality values can also be reviewed interactively with reports generated with reportHTML (see Reporting) and with checkFeatures (see here). The filter function can be used filter out low scoring features and feature groups: # only keep features with at least 0.3 Modality score and 0.5 symmetry score fList <- filter(fList, qualityRange = list(ModalityScore = c(0.3, Inf), SymmetryScore = c(0.5, Inf))) # same as above fGroups <- filter(fGroups, featQualityRange = list(ModalityScore = c(0.3, Inf), SymmetryScore = c(0.5, Inf))) # filter group averaged data fGroups <- filter(fGroups, groupQualityRange = list(totalScore = c(0.5, Inf))) 8.3.1 Applying machine learning with MetaClean An important feature of MetaClean is to use the quality measures to train a machine learning model to automatically recognize ‘good’ and ‘bad’ features. patRoon provides a few extensions to simplify training and using a model. Furthermore, while MetaClean was primarily designed to work with XCMS, the extensions of patRoon allow the usage of data from all the algorithms supported by patRoon. The getMCTrainData function can be used to convert data from a feature check session to training data that can be used by MetaClean. This allows you to use interactively select good/bad peaks. The workflow looks like this: # untick the 'keep' checkbox for all 'bad' feature groups checkFeatures(fGroupsTrain, "train_session.yml") # get train data. This gives comparable data as MetaClean::getPeakQualityMetrics() trainData <- getMCTrainData(fGroupsTrain, "train_session.yml") # use train data with MetaClean with MetaClean::runCrossValidation(), # MetaClean::getEvaluationMeasures(), MetaClean::trainClassifier() etc # --> see the MetaClean vignette for details Once you have created a model with MetaClean it can be used with the predictCheckFeaturesSession() function: predictCheckFeaturesSession(fGroups, "model_session.yml", model) This will generate another check session file: all the feature groups that are considered good will be with a ‘keep’ state, the others without. As described elsewhere, the checkFeatures function is used to review the results from a session and the filter function can be used to remove unwanted feature groups. Note that calculatePeakQualitites() must be called before getMCTrainData/predictCheckFeaturesSession can be used. NOTE MetaClean only predicts at the feature group level. Thus, only the kept feature groups from a feature check session will be used for training, and any indivual features that were marked as removed will be ignored. References "],["exporting-and-converting-feature-data.html", "8.4 Exporting and converting feature data", " 8.4 Exporting and converting feature data The feature group data obtained during the workflow can be exported to various formats with the export() generic function. There are currently three formats supported: \"brukerpa\" (Bruker ProfileAnalysis), \"brukertasq\" (Bruker TASQ) and \"mzmine\" (mzMine). The former exports a ‘bucket table’ which can be loaded in ProfileAnalysis, the second and third export a target list that can be processed with TASQ and mzMine, respectively. The getXCMSSet() function converts a features or featureGroups object to an xcmsSet object which can be used for further processing with xcms. Similarly, the getXCMSnExp() function can be used for conversion to an XCMS3 style XCMSnExp object, and the getPICSet() function can be used to convert features to KPIC2 data. Some examples for these functions are shown below. export(fGroups, "brukertasq", out = "my_targets.csv") # convert features to xcmsSet. # NOTE: loadRawData should only be FALSE when the analysis data files cannot be # loaded by the algorithm (e.g. when features were obtained with DataAnalysis and data was not exported to mz(X)ML) xset <- getXCMSSet(fList, loadRawData = TRUE) xsetg <- getXCMSSet(fGroups, loadRawData = TRUE) # get grouped xcmsSet # using the new XCMS3 interface xdata <- getXCMSnExp(fList) xdata <- getXCMSnExp(fGroups) # KPIC2 conversion. Like XCMS it optionally loads the raw data. picSet <- getPICSet(fList, loadRawData = TRUE) "],["consensus.html", "8.5 Algorithm consensus", " 8.5 Algorithm consensus With patRoon you have the option to choose between several algorithms for most workflow steps. Each algorithm is typically characterized by its efficiency, robustness, and may be optimized towards certain data properties. Comparing their output is therefore advantegeuous in order to design an optimum workflow. The consensus() generic function will compare different results from different algorithms and returns a consensus, which may be based on minimal overlap, uniqueness or simply a combination of all results from involved objects. The output from the consensus() function is of similar type as the input types and is therefore compatible to any ‘regular’ further data processing operations (e.g. input for other workflow steps or plotting). Note that a consensus can also be made from objects generated by the same algorithm, for instance, to compare or combine results obtained with different parameters (e.g. different databases used for compound annotation). The consensus() generic is defined for most workflow objects. Some of its common function arguments are listed below. Argument Classes Remarks obj, ... All Two or more objects (of the same type) that should be compared to generate the consensus. compThreshold, relAbundance, absAbundance, formThreshold compounds, formulas, featureGroupsComparison The minimum overlap (relative/absolute) for a result (feature, candidate) to be kept. uniqueFrom compounds, formulas, featureGroupsComparison Only keep unique results from specified objects. uniqueOuter compounds, formulas, featureGroupsComparison Should be combined with uniqueFrom. If TRUE then only results are kept which are also unique between the objects specified with uniqueFrom. Note that current support for generating a consensus between components objects is very simplistic; here results are not compared, but the consensus simply consists a combination of all the components from each object. Generating a consensus for feature groups involves first generating a featureGroupsComparison object. This step is necessary since (small) deviations between retention times and/or mass values reported by different feature finding/grouping algorithms complicates a direct comparison. The comparison objects are made by the comparison() function, and its results can be visualized by the plotting functions discussed in the previous chapter. Some examples are shown below compoundsCons <- consensus(compoundsMF, compoundsSIR) # combine MetFrag/SIRIUS results compoundsCons <- consensus(compoundsMF, compoundsSIR, compThreshold = 1) # only keep results that overlap fGroupComp <- comparison(fGroupsXCMS, fGroupsOpenMS, fGroupsEnviPick, groupAlgo = "openms") plotVenn(fGroupComp) # visualize overlap/uniqueness fGroupsCons <- consensus(fGroupComp, uniqueFrom = 1:2) # only keep results unique in OpenMS+XCMS fGroupsCons <- consensus(fGroupComp, uniqueFrom = 1:2, uniqueOuter = TRUE) # as above, but also exclude any overlap between OpenMS/XCMS "],["compclust.html", "8.6 Compound clustering", " 8.6 Compound clustering When large databases such as PubChem or ChemSpider are used for compound annotation, it is common to find many candidate structures for even a single feature. While choosing the right scoring settings can significantly improve their ranking, it is still very much possible that many candidates of potential interest remain. In this situation it might help to perform compound clustering. During this process, all candidates for a feature are clustered hierarchically on basis of similar chemical structure. From the resulting cluster the maximum common substructure (MCS) can be derived, which represents the largest possible substructure that ‘fit’ in all candidates. By visual inspection of the MCS it may be possible to identify likely common structural properties of a feature. In order to perform compound clustering the makeHCluster() generic function should be used. This function heavily relies on chemical fingerprinting functionality provided by rcdk. compounds <- generateCompounds(...) # get our compounds compsClust <- makeHCluster(compounds) This function accepts several arguments to fine tune the clustering process: method: the clustering method (e.g. \"complete\" (default), \"ward.D2\"), see ?hclust for options fpType: finger printing type (\"extended\" by default), see ?get.fingerprint fpSimMethod: similarity method for generating the distance method (\"tanimoto\" by default), see ?fp.sim.matrix For all arguments see the reference manual (?makeHClust). The resulting object is of type compoundsCluster. Several methods are defined to modify and inspect these results: # plot MCS of first cluster from candidates of M109_R116_61 plotStructure(compsClust, groupName = "M109_R116_61", 1) # plot dendrogram plot(compsClust, groupName = "M109_R116_61") # re-assign clusters for a feature group compsClust <- treeCut(compsClust, k = 5, groupName = "M109_R116_61") # ditto, but automatic cluster determination compsClust <- treeCutDynamic(compsClust, minModuleSize = 3, groupName = "M109_R116_61") For a complete overview see the reference manual (?compoundsCluster). "],["basic-quantitative-and-regression-analysis.html", "8.7 Basic quantitative and regression analysis", " 8.7 Basic quantitative and regression analysis While patRoon is currently primarily focused on qualitative analyses, some basic quantitative analysis can also be performed, for instance, to estimate concentrations of features. In fact, other types of data that may be useful for regression analysis can be set such as sample dilution factor or sampling time. The latter may, for instance, be used to isolate features with increasing or decreasing intensity. Regardless of what kind of regression analysis is performed, here we simply refer the values to be calculated as concentrations. In order to use this functionality, an extra column (conc) should be added to the analysis information, for instance: # obtain analysis information as usual, but add some concentrations. # The blanks are set to NA, whereas the standards are set to increasing levels. anaInfo <- generateAnalysisInfo(paths = patRoonData::exampleDataPath(), groups = c(rep("solvent", 3), rep("standard", 3)), blanks = "solvent", concs = c(NA, NA, NA, 1, 2, 3)) For analyses with known concentrations (e.g. standards) the conc column should be set; for all others the value should be set to NA. The as.data.table() function (or as.data.frame()) can then be used to calculate regression data and estimate concentrations: # use areas for quantitation and make sure that feature data is reported # (otherwise no concentrations are calculated) # (only relevant columns are shown for clarity) as.data.table(fGroups, areas = TRUE, features = TRUE, regression = TRUE) #> group conc RSQ intercept slope conc_reg #> 1: M109_R192_20 1 0.71446367 193338.67 -4928 1.3649892 #> 2: M109_R192_20 2 0.71446367 193338.67 -4928 1.2700216 #> 3: M109_R192_20 3 0.71446367 193338.67 -4928 3.3649892 #> 4: M111_R330_23 1 0.08902714 85338.67 -370 -0.8468468 #> 5: M111_R330_23 2 0.08902714 85338.67 -370 5.6936937 #> --- #> 422: M407_R239_672 2 0.99560719 210036.00 -11734 2.0767002 #> 423: M407_R239_672 3 0.99560719 210036.00 -11734 2.9616499 #> 424: M425_R319_676 1 0.46488086 193198.67 10896 1.6194322 #> 425: M425_R319_676 2 0.46488086 193198.67 10896 0.7611356 #> 426: M425_R319_676 3 0.46488086 193198.67 10896 3.6194322 Calculated concentrations are stored in the conc_reg column, alongside while other regression data (i.e. RSQ, intercept, slope columns). To perform basic trend analysis the RSQ (i.e. R squared) can be used: fGroupsTab <- as.data.table(fGroups, areas = TRUE, features = FALSE, regression = TRUE) # subset fGroups with reasonable correlation increasingFGroups <- fGroups[, fGroupsTab[RSQ >= 0.8, group]] "],["FCCalc.html", "8.8 Fold changes", " 8.8 Fold changes A specific statistical way to prioritize feature data is by Fold changes (FC). This is a relative simple method to quickly identify (significant) changes between two sample groups. A typical use case is to compare the feature intensities before and after an experiment. To perform FC calculations we first need to specify its parameters. This is best achieved with the getFCParams() function: getFCParams(c("before", "after")) #> $rGroups #> [1] "before" "after" #> #> $thresholdFC #> [1] 0.25 #> #> $thresholdPV #> [1] 0.05 #> #> $zeroMethod #> [1] "add" #> #> $zeroValue #> [1] 0.01 #> #> $PVTestFunc #> function (x, y) #> t.test(x, y, paired = TRUE)$p.value #> <bytecode: 0x56455aa57e80> #> <environment: 0x56455aa585b8> #> #> $PVAdjFunc #> function (pv) #> p.adjust(pv, "BH") #> <bytecode: 0x56455aa58190> #> <environment: 0x56455aa585b8> In this example we generate a list with parameters in order to make a comparison between two replicate groups: before and after. Several advanced parameters are available to tweak the calculation process. These are explained in the reference manual (?featureGroups). The as.data.table function for feature groups is used to perform the FC calculations. myFCParams <- getFCParams(c("solvent-pos", "standard-pos")) # compare solvent/standard as.data.table(fGroups, FCParams = myFCParams)[, c("group", "FC", "FC_log", "PV", "PV_log", "classification")] #> group FC FC_log PV PV_log classification #> 1: M99_R14_1 8.837494e-01 -0.17829070 0.22523941 0.64735561 insignificant #> 2: M99_R4_2 8.500464e-01 -0.23438649 0.77848844 0.10874783 insignificant #> 3: M100_R7_3 8.009186e-01 -0.32027248 0.80475149 0.09433821 FC #> 4: M100_R5_4 4.140000e+06 21.98119934 0.53420412 0.27229277 FC #> 5: M100_R28_5 9.594972e-01 -0.05964952 0.97571237 0.01067819 insignificant #> --- #> 676: M425_R319_676 2.149907e+07 24.35777069 0.00983421 2.00726053 increase #> 677: M427_R10_677 1.059937e+00 0.08397893 0.37317466 0.42808786 insignificant #> 678: M427_R319_678 7.776800e+06 22.89074521 0.53420412 0.27229277 FC #> 679: M432_R383_679 9.816400e+06 23.22676261 0.34750809 0.45903508 FC #> 680: M433_R10_680 1.132909e+00 0.18003240 0.29525423 0.52980387 insignificant The classification column allows you to easily identify if and how a feature changes between the two sample groups. This can also be used to prioritize feature groups: tab <- as.data.table(fGroups, FCParams = myFCParams) # only keep feature groups that significantly increase or decrease fGroupsChanged <- fGroups[, tab[classification %in% c("increase", "decrease")]$group] The plotVolcano function can be used to visually the FC data: plotVolcano(fGroups, myFCParams) "],["caching.html", "8.9 Caching", " 8.9 Caching In patRoon lengthy processing operations such as finding features and generating annotation data is cached. This means that when you run such a calculation again (without changing any parameters), the data is simply loaded from the cache data instead of re-generating it. This in turn is very useful, for instance, if you have closed your R session and want to continue with data processing at a later stage. The cache data is stored in a sqlite database file. This file is stored by default under the name cache.sqlite in the current working directory (for this reason it is very important to always restore your working directory!). However, the name and location can be changed by setting a global package option: options(patRoon.cache.fileName = "~/myCacheFile.sqlite") For instance, this might be useful if you want to use a shared cache file between projects. After a while you may see that your cache file can get quite large. This is especially true when testing different parameters to optimize your workflow. Furthermore, you may want to clear the cache after you have updated patRoon and want to make sure that the latest code is used to generate the data. At any point you can simply remove the cache file. A more fine tuned approach which doesn’t wipe all your cached data is by using the clearCache() function. With this function you can selectively remove parts of the cache file. The function has two arguments: what, which specifies what should be removed, and file which specifies the path to the cache file. The latter only needs to be specified if you want to manage a different cache file. In order to figure what is in the cache you can run clearCache() without any arguments: clearCache() #> Please specify which cache you want to remove. Available are: #> - EICData (3 rows) #> - MSPeakListsAvg (4 rows) #> - MSPeakListsMzR (97 rows) #> - MSPeakListsSetAvg (2 rows) #> - annPeakListSet (1 rows) #> - annotateSuspects (1 rows) #> - calculatePeakQualities (3 rows) #> - componentsCAMERA (1 rows) #> - componentsNontarget (1 rows) #> - compoundsCluster (1 rows) #> - compoundsMetFrag (30 rows) #> - dataCentroided (12 rows) #> - featAnnUnset (2 rows) #> - featureGroupsOpenMS (5 rows) #> - featuresOpenMS (69 rows) #> - filterFGroups_blank (3 rows) #> - filterFGroups_intensity (9 rows) #> - filterFGroups_minReplicates (85 rows) #> - filterFGroups_replicateAbundance (6 rows) #> - filterFGroups_replicate_group (18 rows) #> - filterFGroups_retention (2 rows) #> - filterMSPeakLists (4 rows) #> - formulasFGroupConsensus (2 rows) #> - formulasGenForm (89 rows) #> - formulasSIRIUS (5 rows) #> - loadIntensities (69 rows) #> - mzREIC (3403 rows) #> - reportPlots (334 rows) #> - screenSuspects (4 rows) #> - screenSuspectsPrepList (3 rows) #> - specData (12 rows) #> - all (removes complete cache database) Using this output you can re-run the function again, for instance: clearCache("featuresOpenMS") clearCache(c("featureGroupsOpenMS", "formulasGenForm")) # clear multiple clearCache("OpenMS") # clear all with OpenMS in name (ie partial matched) clearCache("all") # same as simply removing the file "],["parallelization.html", "8.10 Parallelization", " 8.10 Parallelization Some steps in the non-target screening workflow are inherently computationally intensive. To reduce computational times patRoon is able to perform parallelization for most of the important functionality. This is especially useful if you have a modern system with multiple CPU cores and sufficient RAM. For various technical reasons several parallelization techniques are used, these can be categorized as parallelization of R functions and multiprocessing. The next sections describe both parallelization approaches in order to let you optimize the workflow. 8.10.1 Parellization of R functions Several functions of patRoon support parallelization. Function Purpose Remarks findFeatures Obtain feature data Only envipick and kpic2 algorithms generateComponents Generate components Only cliquems algorithm. optimizeFeatureFinding, optimizeFeatureGrouping Optimize feature finding/grouping parameters Discussed here. calculatePeakQualities Calculate feature (group) qualities Discussed here. The parallelization is achieved with the future and future.apply R packages. To enable parallelization of these functions the parallel argument must be set to TRUE and the future framework must be properly configured in advance. For example: # setup three workers to run in parallel future::plan("multisession", workers = 3) # find features with enviPick in parallel fList <- findFeatures(anaInfo, "envipick", parallel = TRUE) It is important to properly configure the right future plan. Please see the documentation of the future package for more details. 8.10.2 Multiprocessing patRoon relies on several external (command-line) tools to generate workflow data. These commands may be executed in parallel to reduce computational times (‘multiprocessing’). The table below outlines the tools that are executed in parallel. Tool Used by Notes msConvert convertMSFiles(algorithm=\"pwiz\", ...) FileConverter convertMSFiles(algorithm=\"openms\", ...) FeatureFinderMetabo findFeatures(algorithm=\"openms\", ...) julia findFeatures(algorithm=\"safd\", ...) SIRIUS findFeatures(algorithm=\"sirius\", ...) MetaboliteAdductDecharger generateComponents(algorithm=\"openms\", ...) GenForm generateFormulas(agorithm=\"genform\", ...) SIRIUS generateFormulas(agorithm=\"sirius\", ...), generateCompounds(agorithm=\"sirius\", ...) Only if splitBatches=TRUE MetFrag generateCompounds(agorithm=\"metfrag\", ...) pngquant reportHTML(...) Only if optimizePng=TRUE BioTransformer generateTPs(algorithm = \"biotransformer\") Disabled by default (see ?generateTPs for details). Multiprocessing is either performed by executing processes in the background with the processx R package (classic interface) or by futures, which were introduced in the previous section. An overview of the characteristics of both parallelization techniques is shown below. classic future requires little or no configuration configuration needed to setup works with all tools doesn’t work with pngquant and slower with GenForm only supports parallelization on the local computer allows both local and cluster computing Which method is used is controlled by the patRoon.MP.method package option. Note that reportHTML() will always use the classic method for pngquant. 8.10.2.1 Classic multiprocessing interface The classic interface is the ‘original’ method implemented in patRoon, and is therefore well tested and optimized. It is easier to setup, works well with all tools, and is therefore the default method. It is enabled as follows: options(patRoon.MP.method = "classic") The number of parallel processes is configured through the patRoon.MP.maxProcs option. By default it is set to the number of available CPU cores, which results usually in the best performance. However, you may want to lower this, for instance, to keep your computer more responsive while processing or limit the RAM used by the data processing workflow. options(patRoon.MP.maxProcs = 2) # do not execute more than two tools in parallel. This will change the parallelization for the complete workflow. However, it may be desirable to change this for only a part the workflow. This is easily achieved with the withOpt() function. # do not execute more than two tools in parallel. options(patRoon.MP.maxProcs = 2) # ... but execute up to four GenForm processes withOpt(MP.maxProcs = 4, { formulas <- generateFormulas(fGroups, "genform", ...) }) The withOpt function will temporarily change the given option(s) while executing a given code block and restore it afterwards (it is very similar to the with_options() function from the withr R package). Furthermore, notice how withOpt() does not require you to prefix the option names with patRoon.. 8.10.2.2 Multiprocessing with futures The primary goal of the “future” method is to allow parallel processing on one or more external computers. Since it uses the future R package, many approaches are supported, such as local parallelization (similar to the classic method), cluster computing via multiple networked computers and more advanced HPC approaches such as slurm via the future.batchtools R package. This parallelization method can be activated as follows: options(patRoon.MP.method = "future") # set a future plan # example 1: start a local cluster with four nodes future::plan("cluster", workers = 4) # example 2: start a networked cluster with four nodes on PC with hostname "otherpc" future::plan("cluster", workers = rep("otherpc", 4)) Please see the documentation of the respective packages (e.g. future and future.batchtools) for more details on how to configure the workers. The withOpt() function introduced in the previous subsection can also be used to temporarily switch between parallelization approaches, for instance: # default to future parallelization options(patRoon.MP.method = "future") future::plan("cluster", workers = 4) # ... do workflow # do classic parallelization for GenForm withOpt(MP.method = "classic", { formulas <- generateFormulas(fGroups, "genform", ...) }) # .. do more workflow 8.10.2.3 Logging Most tools that are executed in parallel will log their output to text files. These files may contain valuable information, for instance, when an error occurred. By default, the logfiles are stored in the log directory placed in the current working directory. However, you can change this location by setting the patRoon.MP.logPath option. If you set this option to FALSE then no logging occurs. 8.10.3 Notes when using parallelization with futures Some important notes when using the future parallelization method: GenForm currently performs less optimal with future multiprocessing to the classic approach. Nevertheless, it may still be interesting to use the future method to move the computations to another system to free up resources on your local system. Behind the scenes the future.apply package is used to schedule the tools to be executed. The patRoon.MP.futureSched option sets the value for the future.scheduling argument to the future_lapply() function, and therefore allows you to tweak the scheduling. Make sure that patRoon and in case of multiprocessing that the tool to be executed (MetFrag, SIRIUS etc.) are exactly the same version on all computing hosts. Make sure that patRoon is properly configured on all hosts, e.g. set the patRoon.path.XXX options to ensure all tools can be found. For MetFrag annotation: if a local database such as PubChemLite is used, it must be present on each computing node as well. Furthermore, the local computer (even if not used for the computations) also must have this file present. Like the previous point, make sure that the patRoon.path.XXX options are set properly. If you encounter errors then it may be handy to switch to future::plan(\"sequential\") and see if it works or you get more descriptive error messages. In order to restart the nodes, for instance after re-configuring patRoon, updating R packages etc, simply re-execute future::plan(...). Setting the future.debug package option to TRUE may give you more insight what is happening to find problems. "],["references.html", "9 References", " 9 References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] +[["index.html", "patRoon handbook 1 Introduction", " patRoon handbook Rick Helmus 2022-03-08 1 Introduction Nowadays there are various software tools available to process data from non-target analysis (NTA) experiments. Individual tools such as ProteoWizard, XCMS, OpenMS, MetFrag and mass spectrometry vendor tools are often combined to perform a complete data processing workflow. During this workflow, raw data files may undergo pre-treatment (e.g. conversion), chromatographic and mass spectral data are combined to extract so called features (or ‘peaks’) and finally annotation is performed to elucidate chemical identities. The aim of patRoon is to harmonize the many available tools in order to provide a consistent user interface without the need to know all the details of each individual software tool and remove the need for tedious conversion of data when multiple tools are used. The name is derived from a Dutch word that means pattern and may also be an acronym for hyPhenated mAss specTROmetry nOn-target aNalysis. The workflow of non-target analysis is typically highly dependent on several factors such as the analytical instrumentation used and requirements of the study. For this reason, patRoon does not enforce a certain workflow. Instead, most workflow steps are optional, are highly configurable and algorithms can easily be mixed or even combined. Furthermore, patRoon supplies a straightforward interface to easily inspect, select, visualize and report all data that is generated during the workflow. The documentation of patRoon consists of three parts: A tutorial (accessible at here) This handbook The reference manual (accessible in R with ?`patRoon-package` or online here) New users are highly recommended to start with the tutorial: this document provides an interactive introduction in performing a basic NTA processing workflow with patRoon. The handbook provides a more thorough overview of all concepts, functionalities and provides instructions and many examples on working with patRoon. Finally, the reference manual provides all the gritty details for all functionalities, and is meant if you want to know more details or need a quick reminder how a function should be used. pre, code { white-space: pre !important; overflow-x: auto !important; max-height: 275px; overflow-y: auto; } blockquote { background-color: aliceblue; padding: 0.25em 0.75em; } p.caption { font-size: 0.8em; } "],["installation.html", "2 Installation", " 2 Installation patRoon depends on various other software tools to perform the non-target analysis workflow steps and to implement various other functionality. Most of these dependencies are automatically installed when you install the patRoon R package, however, some may need to be manually installed and/or configured. NOTE It is highly recommended to perform installation steps in a ‘clean’ R session to avoid errors when installing or upgrading packages. As such it is recommended to close all open (R Studio) sessions and open a plain R console to perform the installation. "],["automatic-installation-windows-only.html", "2.1 Automatic installation (Windows only)", " 2.1 Automatic installation (Windows only) An installation script is provided that automatically installs and configures all dependencies and finally installs patRoon itself. At this moment, this script only works with Microsoft Windows. You don’t have to install anything else to use it, simply open R and execute these commands: source("https://raw.githubusercontent.com/rickhelmus/patRoon/master/install_patRoon.R") installPatRoon() A simple text based wizard will start and asks you what to install and how to do it. You can re-run this installer at any time, for instance, if something went wrong or you want to install additional dependencies. "],["docker-image.html", "2.2 Docker image", " 2.2 Docker image Docker images are provided to easily install a reproducible environment with R, patRoon and nearly all of its dependencies. This section assumes you have a basic understanding of Docker and have it installed. If not, please refer to the many guides available on the Internet. The Docker images of patRoon were originally only used for automated testing, however, since these contain a complete working environment of patRoon they are also suitable for using the software. They come with all external dependencies (except ProteoWizard), R dependencies and MetFrag libraries. Furthermore, the Docker image also contains RStudio server, which makes using patRoon even easier. Below are some example shell commands on how to run the image. # run an interactive R console session docker run --rm -it patroonorg/patroonrs # run a linux shell, from which R can be launched docker run --rm -it patroonorg/patroonrs bash # run rstudio server, accessible from localhost:8787 # login with rstudio/yourpasswordhere docker run --rm -p 8787:8787 -u 0 -e PASSWORD=yourpasswordhere patroonorg/patroonrs /init # same as above, but mount a local directory (~/myvolume) as local volume so it can be used for persistent storage # please ensure that ~/myvolume exists! docker run --rm -p 8787:8787 -u 0 -e PASSWORD=yourpasswordhere -v ~/myvolume:/home/rstudio/myvolume patroonorg/patroonrs /init Note that the first two commands run as the default user rstudio, while the last two as root. The last commands launch RStudio server. You can access it by browsing to localhost:8787 and logging in with user rstudio and the password defined by the PASSWORD variable from the command (yourpasswordhere in the above example). The last command also links a local volume in order to obtain persistence of files in the container’s home directory. The Docker image is based on the excellent work from the rocker project. For more information on RStudio related options see their documentation for the RStudio image. "],["manual-installation.html", "2.3 Manual installation", " 2.3 Manual installation The manual installation is for users who don’t use Windows or Docker, prefer to do a manual installation or simply want to know what happens behind the scenes. The manual installation consists of three phases: Installing some prerequisite R packages Install and configure (non-R) dependencies Install patRoon 2.3.1 R prerequisites When installing patRoon Windows users have the option to install from a customized (miniCRAN) repository (patRoonDeps). This repository provides a central repository for patRoon and all its R packages. An advantage is that installation will be faster and you will not need to install Rtools. Note that you will need to have the latest R version installed in order to use this repository. When you decide to use the patRoonDeps repository you can simply skip this step. Otherwise (i.e. you will use regular repositories instead), the following will install the R dependencies. install.packages(c("BiocManager", "remotes")) BiocManager::install("CAMERA") # needed for finding/grouping features with KPIC2 BiocManager::install("ropls") remotes::install_github("rickhelmus/KPIC2") # needed for RAMClustR for componentization remotes::install_github("cbroeckl/RAMClustR") # needed for nontarget for componentization remotes::install_github("blosloos/nontargetData") remotes::install_github("blosloos/nontarget") # needed for cliqueMS for componentization remotes::install_github("rickhelmus/cliqueMS") # note: repository is a fork with minor bug fixes # only needed for Bruker DataAnalysis integration # NOTE: a fork is installed that fixes some issues with the latest R versions remotes::install_github("BSchamberger/RDCOMClient") # only when using the R interface (not recommended by default) remotes::install_github("c-ruttkies/MetFragR/metfRag") # needed for feature quality calculations with MetaClean BiocManager::install(c("BiocStyle", "Rgraphviz")) remotes::install_github("KelseyChetnik/MetaClean") Note that only the CAMERA installation is mandatory, the rest involves installation of optional packages. If you are unsure which you need then you can always install the packages at a later stage. 2.3.2 Other dependencies Depending on which functionality is used, the following external dependencies may need to be installed: Software Remarks Java JDK Mandatory for e.g. plotting structures and using MetFrag. Rtools Necessary on Window and when patRoon is not installed from patRoonDeps. ProteoWizard Needed for automatic data-pretreatment (e.g. data file conversion and centroiding, Bruker users may use DataAnalysis integration instead). OpenMS Recommended. Used for e.g. finding and grouping features. MetFrag CL Recommended. Used for annotation with MetFrag. MetFrag CompTox DB Database files necessary for usage of the CompTox database with MetFrag. Note that a recent version of MetFrag (>=2.4.5) is required. Note that the lists with additions for smoking metadata and wastewater metadata are also supported. MetFrag PubChemLite DB Database file needed to use PubChemLite with MetFrag. SIRIUS For obtaining feature data and formula and/or compound annotation. BioTransformer For prediction of transformation products. See the BioTransformer page for installation details. If you have trouble compiling the jar file you can download it from here. SAFD For finding features with SAFD. Please follow all the installation on the SAFD webpage. OpenBabel Used in some cases for suspect screening (e.g. to calculate molecular masses for suspects with only InChI information). Otherwise optional. pngquant Used to reduce size of HTML reports, definitely optional. Most of these packages are optional and only needed if their algorithms are used during the workflow. If you are unsure which are needed, simply skip them for now and install them at a later stage. After installation of these dependencies you may need to configure their filepaths (OpenMS and ProteoWizard are usually found automatically). To configure the file locations you should set some global package options with the options() R function, for instance: options(patRoon.path.pwiz = "C:/ProteoWizard") # location of ProteoWizard installation folder options(patRoon.path.SIRIUS = "C:/sirius-win64-3.5.1") # location where SIRIUS was extracted options(patRoon.path.OpenMS = "/usr/local/bin") # directory with the OpenMS binaries options(patRoon.path.pngquant = "~/pngquant") # directory containing pngquant binary options(patRoon.path.MetFragCL = "~/MetFrag2.4.5-CL.jar") # full location to the jar file options(patRoon.path.MetFragCompTox = "C:/CompTox_17March2019_SelectMetaData.csv") # full location to desired CompTox CSV file options(patRoon.path.MetFragPubChemLite = "~/PubChemLite_14Jan2020_tier0.csv") # full location to desired PubChemLite CSV file options(patRoon.path.BioTransformer = "~/biotransformer/biotransformer-3.0.1.jar") options(patRoon.path.obabel = "C:/Program Files/OpenBabel-3.0.0") # directory with OpenBabel binaries These commands have to be executed everytime you start a new R session (e.g. as part of your script). However, it is probably easier to add them to your ~/.Rprofile file so that they are executed automatically when you start R. If you don’t have this file yet you can simply create it yourself (for more information see e.g. this SO answer). 2.3.3 patRoon installation Finally, it is time to install patRoon itself. As mentioned before, Windows users (who have the latest R version) can install patRoon and all its package dependencies from the patRoonDeps repository: # install from patRoonDeps (only Windows with latest R version) install.packages("patRoon", repos = "https://rickhelmus.github.io/patRoonDeps/", type = "binary") Otherwise, installation occurs directly from GitHub: remotes::install_github("rickhelmus/patRoon") Optional example data is installed via GitHub: # optional example data remotes::install_github("rickhelmus/patRoonData") Afterwards, you can run the verifyDependencies() function to see if patRoon can find all its dependencies (you may need to restart R beforehand): patRoon::verifyDependencies() "],["workflow-concepts.html", "3 Workflow concepts", " 3 Workflow concepts In a non-target workflow both chromatographic and mass spectral data is automatically processed in order to provide a comprehensive chemical characterization of your samples. While the exact workflow is typically dependent on the type of study, it generally involves of the following steps: Note that patRoon supports flexible composition of workflows. In the scheme above you can recognize optional steps by a dashed line. The inclusion of each step is only necessary if a further steps depends on its data. For instance, annotation and componentization do not depend on each other and can therefore be executed in any order or simply be omitted. A brief description of all steps is given below. During data pre-treatment raw MS data is prepared for further analysis. A common need for this step is to convert the data to an open format so that other tools are able to process it. Other pre-treatment steps may involve re-calibration of m/z data or performing advanced filtering operations. The next step is to extract features from the data. While different terminologies are used, a feature in patRoon refers to a single chromatographic peak in an extracted ion chromatogram for a single m/z value (within a defined tolerance). Hence, a feature contains both chromatographic data (e.g. retention time and peak height) and mass spectral data (e.g. the accurate m/z). Note that with mass spectrometry multiple m/z values may be detected for a single compound as a result of adduct formation, natural isotopes and/or in-source fragments. Some algorithms may try to combine these different masses in a single feature. However, in patRoon we generally assume this is not the case (and may optionally be done afterwards during the componentization step described below). Features are sometimes simply referred to as ‘peaks’. Features are found per analysis. Hence, in order to compare a feature across analyses, the next step is to group them. This step is essential as it finds equal features even if their retention time or m/z values slightly differ due to analytical variability. The resulting feature groups are crucial input for subsequent workflow steps. Prior to grouping, retention time alignment between analyses may be performed to improve grouping of features, especially when processing multiple analysis batches at once. Outside patRoon feature groups may also be defined as profiles, aligned or grouped features or buckets. Depending on the study type, suspect screening is then performed to limit the features that should be considered for further processing. As its name suggests, with suspect screening only those features which are suspected to be present are considered for further processing. These suspects are retrieved from a suspect list which contains the m/z and (optionally) retention times for each suspect. Typical suspect lists may be composed from databases with known pollutants or from predicted transformation products. Note that for a ‘full’ non-target analysis no suspect screening is performed, hence, this step is simply omitted and all features are to be considered. The feature group data may then be subjected to componentization. A component is defined as a collection of multiple feature groups that are somehow related to each other. Typical examples are features that belong to the same chemical compound (i.e. with different m/z values but equal retention time), such as adducts, isotopes and in-source fragments. Other examples are homologous series and features that display a similar intensity trend across samples. If adducts or isotopes were annotated during componentization then this data may be used to prioritize the feature groups. The last step in the workflow commonly involves annotation. During this step MS and MS/MS data are collected in so called MS peak lists, which are then used as input for formula and compound annotation. Formula annotation involves automatic calculation of possible formulae for each feature based on its m/z, isotopic pattern and MS/MS fragments, whereas compound annotation (or identification) involves the assignment of actual chemical structures to each feature. Note that during formula and compound annotation typically multiple candidates are assigned to a single feature. To assist interpretation of this data each candidate is therefore ranked on characteristics such as isotopic fit, number of explained MS/MS fragments and metadata from an online database such as number of scientific references or presence in common suspect lists. To summarize: Data-pretreatment involves preparing raw MS data for further processing (e.g. conversion to an open format) Features describe chromatographic and m/z information (or ‘peaks’) in all analyses. A feature group consists of equal features across analyses. With suspect screening only features that are considered to be on a suspect list are considered further in the workflow. Componentization involves consolidating different feature groups that have a relationship to each other in to a single component. MS peak lists Summarizes all MS and MS/MS data that will be used for subsequent annotation. During formula and compound annotation candidate formulae/structures will be assigned and ranked for each feature. The next chapters will discuss how to generate this data and process it. Afterwards, several advanced topics are discussed such as combining positive and negative ionization data, screening for transformation products and other advanced functionality. "],["generating-workflow-data.html", "4 Generating workflow data ", " 4 Generating workflow data "],["introduction-1.html", "4.1 Introduction", " 4.1 Introduction 4.1.1 Workflow functions Each step in the non-target workflow is performed by a function that performs the heavy lifting of a workflow step behind the scenes and finally return the results. An important goal of patRoon is to support multiple algorithms for each workflow step, hence, when such a function is called you have to specify which algorithm you want to use. The available algorithms and their characteristics will be discussed in the next sections. An overview of all functions involved in generating workflow data is shown in the table below. Workflow step Function Output S4 class Data pre-treatment convertMSFiles(), recalibrarateDAFiles() - Finding features findFeatures() features Grouping features groupFeatures() featureGroups Suspect screening screenSuspects() featureGroupsScreening Componentization generateComponents() components MS peak lists generateMSPeakLists() MSPeakLists Formula annotation generateFormulas() formulas Compound annotation generateCompounds() compounds 4.1.2 Workflow output The output of each workflow step is stored in objects derived from so called S4 classes. Knowing the details about the S4 class system of R is generally not important when using patRoon (and well written resources are available if you want to know more). In brief, usage of this class system allows a general data format that is used irrespective of the algorithm that was used to generate the data. For instance, when features have been found by OpenMS or XCMS they both return the same data format. Another advantage of the S4 class system is the usage of so called generic functions. To put simply: a generic function performs a certain task for different types of data objects. A good example is the plotSpectrum() function which plots an (annotated) spectrum from data of MS peak lists or from formula or compound annotation: # mslists, formulas, compounds contain results for MS peak lists and # formula/compound annotations, respectively. plotSpectrum(mslists, ...) # plot raw MS spectrum plotSpectrum(formulas, ...) # plot annotated spectrum from formula annotation data plotSpectrum(compounds, ...) # likewise but for compound annotation. 4.1.3 Overview of all functions and their output Figure 4.1: Workflow functions and output classes. The next sections in this chapter will further detail on how to actually perform the non-target workflow steps to generate data. The transformation product screening workflows are discussed in a separate chapter. "],["preparations.html", "4.2 Preparations", " 4.2 Preparations 4.2.1 Data pre-treatment Prior to performing the actual non-target data processing workflow some preparations often need to be made. Often data has to be pre-treated, for instance, by converting it to an open format that is usable for subsequent workflow steps or to perform mass re-calibration. Some common functions are listed below. Task Function Algorithms Supported file formats Conversion convertMSFiles() OpenMS, ProteoWizard, DataAnalysis All common (algorithm dependent) Advanced (e.g. spectral filtering) convertMSFiles() ProteoWizard All common Mass re-calibration recalibrarateDAFiles() DataAnalysis Bruker The convertMSFiles() function supports conversion between many different file formats typically used in non-target analysis. Furthermore, other pre-treatment steps are available (e.g. centroiding, filtering) when the ProteoWizard algorithm is used. For an overview of these functionalities see the MsConvert documentation. Some examples: # Converts a single mzXML file to mzML format convertMSFiles("standard-1.mzXML", to = "mzML", algorithm = "openms") # Converts all Thermo files with ProteoWizard (the default) in the analyses/raw # directory and stores the mzML files in analyses/raw. Afterwards, only MS1 # spectra are retained. convertMSFiles("analyses/raw", "analyses/mzml", from = "thermo", centroid = "vendor", filters = "msLevel 1") NOTE Most algorithms further down the workflow require the mzML or mzXML file format and additionally require that mass peaks have been centroided. When using the ProteoWizard algorithm (the default), centroiding by vendor algorithms is generally recommended (i.e. by setting centroid=\"vendor\" as shown in the above example). When Bruker MS data is used it can be automatically re-calibrated to improve its mass accuracy. Often this is preceeded by calling the setDAMethod() function to set a DataAnalysis method to all files in order to configure automatic re-calibration. The recalibrarateDAFiles() function performs the actual re-calibration. The getDACalibrationError() function can be used at anytime to request the current calibration error of each analysis. An example of these functions is shown below. # anaInfo is a data.frame with information on analyses (see next section) setDAMethod(anaInfo, "path/to/DAMethod.m") # configure Bruker files with given method that has automatic calibration setup recalibrarateDAFiles(anaInfo) # trigger re-calibration for each analysis getDACalibrationError(anaInfo) # get calibration error for each analysis (NOTE: also shown when previous function is finished) 4.2.2 Analysis information The final bits of preparation is constructing the information for the analyses that need to be processed. In patRoon this is referred to as the analysis information and often stored in a variable anaInfo (of course you are free to choose a different name!). The analysis information should be a data.frame with the following columns: path: the directory path of the file containing the analysis data analysis: the name of the analysis. This should be the file name without file extension. group: to which replicate group the analysis belongs. All analysis which are replicates of each other get the same name. blank: which replicate group should be used for blank subtraction. conc (optional, advanced) A numeric value describing the concentration or any other value for which the intensity in this sample may correlate, for instance, dilution factor, sampling time etc. This column is only required when you want to obtain quantitative information (e.g. concentrations) using the as.data.table() method function (see ?featureGroups for more information). The generateAnalysisInfo() function can be used to (semi-)automatically generate a suitable data.frame that contains all the required information for a set of analysis. For, instance: # Take example data from patRoonData package (triplicate solvent blank + triplicate standard) generateAnalysisInfo(paths = patRoonData::exampleDataPath(), groups = c(rep("solvent-pos", 3), rep("standard-pos", 3)), blanks = "solvent-pos") #> path analysis group blank #> 1 /usr/local/lib/R/site-library/patRoonData/extdata/pos solvent-pos-1 solvent-pos solvent-pos #> 2 /usr/local/lib/R/site-library/patRoonData/extdata/pos solvent-pos-2 solvent-pos solvent-pos #> 3 /usr/local/lib/R/site-library/patRoonData/extdata/pos solvent-pos-3 solvent-pos solvent-pos #> 4 /usr/local/lib/R/site-library/patRoonData/extdata/pos standard-pos-1 standard-pos solvent-pos #> 5 /usr/local/lib/R/site-library/patRoonData/extdata/pos standard-pos-2 standard-pos solvent-pos #> 6 /usr/local/lib/R/site-library/patRoonData/extdata/pos standard-pos-3 standard-pos solvent-pos (Note that for the example data the patRoonData::exampleAnalysisInfo() function can also be used.) Alternatively, the newProject() function discussed in the next section can be used to interactively construct this information. 4.2.3 Automatic project generation with newProject() The previous sections already highlighted some steps that have to be performed prior to starting a new non-target analysis workflow: data pre-treatment and gathering information on the analysis. Most of the times you will put this and other R code a script file so you can recall what you have done before (i.e. reproducible research). The newProject() function can be used to setup a new project. When you run this function it will launch a small tool (see screenshot below) where you can select your analyses and configure the various workflow steps which you want to execute (e.g. data pre-treatment, finding features, annotation etc). After setting everything up the function will generate a template script which can easily be edited afterwards. In addition, you have the option to create a new RStudio project, which is advantegeous as it neatly seperates your data processing work from the rest. NOTE At the moment newProject() only works with RStudio. "],["features.html", "4.3 Features", " 4.3 Features Collecting features from the analyses consists of finding all features, grouping them across analyses (optionally after retention time alignment), and if desired suspect screening: 4.3.1 Finding and grouping features Several algorithms are available for finding features. These are listed in the table below alongside their usage and general remarks. Algorithm Usage Remarks OpenMS findFeatures(algorithm = \"openms\", ...) Uses the FeatureFinderMetabo algorithm XCMS findFeatures(algorithm = \"xcms\", ...) Uses xcms::xcmsSet() function XCMS (import) importFeatures(algorithm = \"xcms\", ...) Imports an existing xcmsSet object XCMS3 findFeatures(algorithm = \"xcms3\", ...) Uses xcms::findChromPeaks() from the new XCMS3 interface XCMS3 (import) importFeatures(algorithm = \"xcms3\", ...) Imports an existing XCMSnExp object enviPick findFeatures(algorithm = \"envipick\", ...) Uses enviPick::enviPickwrap() KPIC2 findFeatures(algorithm = \"kpic2\", ...) Uses the KPIC2 R package KPIC2 (import) importFeatures(algorithm = \"kpic2\", ...) Imports features from KPIC2 SIRIUS findFeatures(algorithm = \"sirius\", ...) Uses SIRIUS to find features SAFD findFeatures(algorithm = \"safd\", ...) Uses the SAFD algorithm (experimental) DataAnalysis findFeatures(algorithm = \"bruker\", ...) Uses Find Molecular Features from DataAnalysis (Bruker only) Most often the performance of these algorithms heavily depend on the data and parameter settings that are used. Since obtaining a good feature dataset is crucial for the rest of the workflow, it is highly recommended to experiment with different settings (this process can also be automated, see the feature optimization section for more details). Some common parameters to look at are listed in the table below. However, there are many more parameters that can be set, please see the reference documentation for these (e.g. ?findFeatures). Algorithm Common parameters OpenMS noiseThrInt, chromSNR, chromFWHM, mzPPM, minFWHM, maxFWHM (see ?findFeatures) XCMS / XCMS3 peakwidth, mzdiff, prefilter, noise (assuming default centWave algorithm, see ?findPeaks.centWave / ?CentWaveParam) enviPick dmzgap, dmzdens, drtgap, drtsmall, drtdens, drtfill, drttotal, minpeak, minint, maxint (see ?enviPickwrap) KPIC2 kmeans, level, min_snr (see ?findFeatures and ?getPIC / ?getPIC.kmeans) SIRIUS The sirius algorithm is currently parameterless SAFD mzRange, maxNumbIter, resolution, minInt (see ?findFeatures) DataAnalysis See Find -> Parameters… -> Molecular Features in DataAnalysis. NOTE Support for SAFD is still experimental and some extra work is required to set everything up. Please see the reference documentation for this algorithm (?findFeatures). NOTE DataAnalysis feature settings have to be configured in DataAnalysis prior to calling findFeatures(). Similarly, for grouping features across analyses several algorithms are supported. Algorithm Usage Remarks OpenMS groupFeatures(algorithm = \"openms\", ...) Uses the FeatureLinkerUnlabeled algorithm (and MapAlignerPoseClustering for retention alignment) XCMS groupFeatures(algorithm = \"xcms\", ...) Uses xcms::group() xcms::retcor() functions XCMS (import) importFeatureGroupsXCMS(...) Imports an existing xcmsSet object. XCMS3 groupFeatures(algorithm = \"xcms3\", ...) Uses xcms::groupChromPeaks() and xcms::adjustRtime() functions XCMS3 (import) importFeatureGroupsXCMS3(...) Imports an existing XCMSnExp object. KPIC2 groupFeatures(algorithm = \"kpic2\", ...) Uses the KPIC2 package KPIC2 (import) importFeatureGroupsKPIC2(...) Imports a PIC set object SIRIUS groupFeatures(anaInfo, algorithm = \"sirius\") Finds and groups features with SIRIUS ProfileAnalysis importFeatureGroups(algorithm = \"brukerpa\", ...) Import .csv file exported from Bruker ProfileAnalysis TASQ importFeatureGroups(algorithm = \"brukertasq\", ...) Imports a Global result table (exported to Excel file and then saved as .csv file) NOTE: Grouping features with the sirius algorithm will perform both finding and grouping features with SIRIUS. This algorithm cannot work with features from another algorithm. Just like finding features, each algorithm has their own set of parameters. Often the defaults are a good start but it is recommended to have look at them. See ?groupFeatures for more details. When using the XCMS algorithms both the ‘classical’ interface and latest XCMS3 interfaces are supported. Currently, both interfaces are mostly the same regarding functionalities and implementation. However, since future developments of XCMS are primarily focused the latter this interface is recommended. Some examples of finding and grouping features are shown below. # The anaInfo variable contains analysis information, see the previous section # Finding features fListOMS <- findFeatures(anaInfo, "openms") # OpenMS, with default settings fListOMS2 <- findFeatures(anaInfo, "openms", noiseThrInt = 500, chromSNR = 10) # OpenMS, adjusted minimum intensity and S/N fListXCMS <- findFeatures(anaInfo, "xcms", ppm = 10) # XCMS fListXCMSImp <- importFeatures(anaInfo, "xcms", xset) # import XCMS xcmsSet object fListXCMS3 <- findFeatures(anaInfo, "xcms3", CentWaveParam(peakwidth = c(5, 15))) # XCMS3 fListEP <- findFeatures(anaInfo, "envipick", minint = 1E3) # enviPick fListKPIC2 <- findFeatures(anaInfo, "kpic2", kmeans = TRUE, level = 1E4) # KPIC2 fListSIRIUS <- findFeatures(anaInfo, "sirius") # SIRIUS # Grouping features fGroupsOMS <- groupFeatures(fListOMS, "openms") # OpenMS grouping, default settings fGroupsOMS2 <- groupFeatures(fListOMS2, "openms", rtalign = FALSE) # OpenMS grouping, no RT alignment fGroupsOMS3 <- groupFeatures(fListXCMS, "openms", maxGroupRT = 6) # group XCMS features with OpenMS, adjusted grouping parameter # group enviPick features with XCMS3, disable minFraction fGroupsXCMS <- groupFeatures(fListEP, "xcms3", xcms::PeakDensityParam(sampleGroups = analInfo$group, minFraction = 0)) # group with KPIC2 and set some custom grouping/aligning parameters fGroupsKPIC2 <- groupFeatures(fListKPIC2, "kpic2", groupArgs = list(tolerance = c(0.002, 18)), alignArgs = list(move = "loess")) fGroupsSIRIUS <- groupFeatures(anaInfo, "sirius") # find/group features with SIRIUS 4.3.2 Suspect screening NOTE: you may need to install OpenBabel, for instance, when only InChI data is available for mass calculation. After features have been grouped a so called suspect screening step may be performed to find features that may correspond to suspects within a given suspect list. The screenSuspects() function is used for this purpose, for instance: suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "2-Hydroxyquinoline"), mz = c(120.0556, 137.0709, 146.0600)) fGroupsSusp <- screenSuspects(fGroups, suspects) 4.3.2.1 Suspect list format The example above has a very simple suspect list with just three compounds. The format of the suspect list is quite flexible, and can contain the following columns: name: The name of the suspect. Mandatory and should be unique and file-name compatible (if not, the name will be automatically re-named to make it compatible). rt: The retention time in seconds. Optional. If specified any feature groups with a different retention time will not be considered to match suspects. mz, SMILES, InChI, formula, neutralMass: at least one of these columns must hold data for each suspect row. The mz column specifies the ionized mass of the suspect. If this is not available then data from any of the other columns is used to determine the suspect mass. adduct: The adduct of the suspect. Optional. Set this if you are sure that a suspect should be matched by a particular adduct ion and no data in the mz column is available. fragments_mz and fragments_formula: optional columns that may assist suspect annotation. In most cases a suspect list is best made as a csv file which can then be imported with e.g. the read.csv() function. This is exactly what happen when you specify a suspect list when using the newProject() function. Quite often, the ionized masses are not readily available and these have to be calculated. In this case, data in any of the SMILES/InChI/formula/neutralMass columns should be provided. Whenever possible, it is strongly recommended to fill in SMILES column (or InChI), as this will assist annotation. Applying this to the above example: suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "2-Hydroxyquinoline"), SMILES = c("[nH]1nnc2ccccc12", "NC(=O)Nc1ccccc1", "Oc1ccc2ccccc2n1")) fGroupsSusp <- screenSuspects(fGroups, suspects, adduct = "[M+H]+") #> Trying to calculate missing InChI data in suspect list... Done! Filled in 3 (100.0%) entries. #> Trying to calculate missing InChIKey data in suspect list... Done! Filled in 3 (100.0%) entries. #> Trying to calculate missing formula data in suspect list... Done! Filled in 3 (100.0%) entries. #> Calculating neutral masses for each suspect... #> ================================================================================ #> ================================================================================ #> Found 3/3 suspects (100.00%) Since suspect matching now occurs by the neutral mass it is required that the adduct information for the feature groups are set. This is done either by setting the adduct function argument to screenSuspects or by feature group adduct annotations. Finally, when the adduct is known for a suspect it can be specified in the suspect list: # Aldicarb is measured with a sodium adduct. suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "Aldicarb"), SMILES = c("[nH]1nnc2ccccc12", "NC(=O)Nc1ccccc1", "CC(C)(C=NOC(=O)NC)SC"), adduct = c("[M+H]+", "[M+H]+", "[M+Na]+")) fGroupsSusp <- screenSuspects(fGroups, suspects) To summarize: If a suspect has data in the mz column it will be directly matched with the m/z value of a feature group. Otherwise, if the suspect has data in the adduct column, the m/z value for the suspect is calculated from its neutral mass and the adduct and then matched with the m/z of a feature group. Otherwise, suspects and feature groups are matched by their the neutral mass. The fragments_mz and fragments_formula columns in the suspect list can be used to specify known fragments for a suspect, which can help suspect annotation. The former specifies the ionized m/z of known MS/MS peaks, whereas the second specifies known formulas. Multiple values can be given by separating them with a semicolon: suspects <- data.frame(name = c("1H-benzotriazole", "N-Phenyl urea", "2-Hydroxyquinoline"), SMILES = c("[nH]1nnc2ccccc12", "NC(=O)Nc1ccccc1", "Oc1ccc2ccccc2n1"), fragments_formula = c("C6H6N", "C6H8N;C7H6NO", ""), fragments_mz = c("", "", "118.0652")) 4.3.2.2 Removing feature groups without hits Note that any feature groups that were not matched to a suspect are not removed by default. If you want to remove these, you can use the onlyHits parameter: fGroupsSusp <- screenSuspects(fGroups, suspects, onlyHits = TRUE) # remove any non-hits immediately The advantage of removing non-hits is that it may significantly reduce the complexity of your dataset. On the other hand, retaining all features allows you to mix a full non-target analysis with a suspect screening workflow. The filter() function (discussed here) can also be used to remove feature groups without a hit at a later stage. 4.3.2.3 Combining screening results The amend function argument to screenSuspects can be used to combine screening results from different suspect lists. fGroupsSusp <- screenSuspects(fGroups, suspects) fGroupsSusp <- screenSuspects(fGroupsSusp, suspects2, onlyHits = TRUE, amend = TRUE) In this example the suspect lists defined in suspects and suspects2 are both used for screening. By setting amend=TRUE the original screening results (i.e. from suspects) are preserved. Note that onlyHits should only be set in the final call to screenSuspects to ensure that all feature groups are screened. "],["componentization.html", "4.4 Componentization", " 4.4 Componentization In patRoon componentization refers to grouping related feature groups together in components. There are different methodologies to generate components: Similarity on chromatographic elution profiles: feature groups with similar chromatographic behaviour which are assuming to be the same chemical compound (e.g. adducts or isotopologues). Homologous series: features with increasing m/z and retention time. Intensity profiles: features that follow a similar intensity profile in the analyses. MS/MS similarity: feature groups with similar MS/MS spectra are clustered. Transformation products: Components are formed by grouping feature groups that have a parent/transformation product relationship. This is further discussed in its own chapter. The following algorithms are currently supported: Algorithm Usage Remarks CAMERA generateComponents(algorithm = \"camera\", ...) Clusters feature groups with similar chromatographic elution profiles and annotate by known chemical rules (adducts, isotopologues, in-source fragments). RAMClustR generateComponents(algorithm = \"ramclustr\", ...) As above. cliqueMS generateComponents(algorithm = \"cliquems\", ...) As above, but using feature components. OpenMS generateComponents(algorithm = \"openms\", ...) As above. Uses MetaboliteAdductDecharger. nontarget generateComponents(algorithm = \"nontarget\", ...) Uses the nontarget R package to perform unsupervised homologous series detection. Intensity clustering generateComponents(algorithm = \"intclust\", ...) Groups features with similar intensity profiles across analyses by hierarchical clustering. MS/MS clustering generateComponents(algorithm = \"specclust\", ...) Clusters feature groups with similar MS/MS spectra. Transformation products generateComponents(algorithm = \"tp\", ...) Discussed in its own chapter. 4.4.1 Features with similar chromatographic behaviour Isotopes, adducts and in-source fragments typically result in detection of multiple mass peaks by the mass spectrometer for a single chemical compound. While some feature finding algorithms already try to collapse (some of) these in to a single feature, this process is often incomplete (if performed at all) and it is not uncommon that multiple features will describe the same compound. To overcome this complexity several algorithms can be used to group features that undergo highly similar chromatographic behavior but have different m/z values. Basic chemical rules are then applied to the resulting components to annotate adducts, in-source fragments and isotopologues, which may be highly useful for general identification purposes. Note that some algorithms were primarily designed for datasets where features are generally present in the majority of the analyses (as is relatively common in metabolomics). For environmental analyses, however, this is often not the case. For instance, consider the following situation with three feature groups that chromatographically overlap and therefore could be considered a component: Feature group m/z analysis 1 analysis 2 analysis 3 #1 100.08827 Present Present Absent #2 122.07021 Present Present Absent #3 138.04415 Absent Absent Present Based on the mass differences from this example a cluster of [M+H]+, [M+Na]+ and [M+K]+ could be assumed. However, no features of the first two feature groups were detected in the third sample analysis, whereas the third feature group wasn’t detected in the first two sample analysis. Based on this it seems unlikely that feature group #3 should be part of the component. For the algorithms that operate on a ‘feature group level’ (CAMERA and RAMClustR), the relMinReplicates argument can be used to remove feature groups from a component that are not abundant. For instance, when this value is 0.5 (the default), and all the features of a component were detected in four different replicate groups in total, then only those feature groups are kept for which its features were detected in at least two different replicate groups (i.e. half of four). Another approach to reduce unlikely adduct annotations is to use algorithms that operate on a ‘feature level’ (cliqueMS and OpenMS). These algorithms generate components for each sample analysis individually. The ‘feature components’ are then merged by a consensus approach where unlikely annotations are removed (the algorithm is described further in the reference manual, ?generateComponents). Each algorithm supports many different parameters that may significantly influence the (quality of the) output. For instance, care has to be taken to avoid ‘over-clustering’ of feature groups which do not belong in the same component. This is often easily visible since the chromatographic peaks poorly overlap or are shaped differently. The checkComponents function (discussed here) can be used to quickly verify componentization results. For a complete listing all arguments see the reference manual (e.g. ?generateComponents). Once the components with adduct and isotopes annotations are generated this data can be used to prioritize and improve the workflow. Some example usage is shown below. # Use CAMERA with defaults componCAM <- generateComponents(fGroups, "camera", ionization = "positive") # CAMERA with customized settings componCAM2 <- generateComponents(fGroups, "camera", ionization = "positive", extraOpts = list(mzabs = 0.001, sigma = 5)) # Use RAMClustR with customized parameters componRC <- generateComponents(fGroups, "ramclustr", ionization = "positive", hmax = 0.4, extraOptsRC = list(cor.method = "spearman"), extraOptsFM = list(ppm.error = 5)) # OpenMS with customized parameters componOpenMS <- generateComponents(fGroups, "openms", ionization = "positive", chargeMax = 2, absMzDev = 0.002) # cliqueMS with default parameters componCliqueMS <- generateComponents(fGroups, "cliquems", ionization = "negative") 4.4.2 Homologues series Homologues series can be automatically detected by interfacing with the nontarget R package. Components are made from feature groups that show increasing m/z and retention time values. Series are first detected within each replicate group. Afterwards, series from all replicates are linked in case (partial) overlap occurs and this overlap consists of the same feature groups (see figure below). Linked series are then finally merged if this will not cause any conflicts with other series: such a conflict typically occurs when two series are not only linked to each other. Figure 4.2: Linking of homologues series top: partial overlap and will be linked; bottom: no linkage due to different feature in overlapping series. The series that are linked can be interactively explored with the plotGraph() function (discussed here). Common function arguments to generateComponents() are listed below. Argument Remarks ionization Ionization mode: \"positive\" or \"negative\". Not needed if adduct annotations are available. rtRange, mzRange Retention and m/z increment range. Retention times can be negative to allow series with increasing m/z values and decreasing retention times. elements Vector with elements to consider. rtDev, absMzDev Maximum retention time and m/z deviation. ... Further arguments passed to the homol.search() function. # default settings componNT <- generateComponents(fGroups, "nontarget", ionization = "positive") # customized settings componNT2 <- generateComponents(fGroups, "nontarget", ionization = "positive", elements = c("C", "H"), rtRange = c(-60, 60)) 4.4.3 Intensity and MS/MS similarity The previous componentization methods utilized chemical properties to relate features. The two componentization algorithms described in this section use a statistical approach based on hierarchical clustering. The first algorithm normalizes all feature intensities and then clusters features with similar intensity profiles across sample analyses together. The second algorithm compares all MS/MS spectra from all feature groups, and then uses hierarchical clustering to generate components from feature groups that have a high MS/MS spectrum similarity. Some common arguments to generateComponents() are listed below. It is recommended to test various settings (especially for method) to optimize the clustering results. Argument Algorithm Default Remarks method All \"complete\" Clustering method. See ?hclust metric intclust \"euclidean\" Metric used to calculate the distance matrix. See ?daisy. normFunc intclust max Function used to normalize data. Feature intensities within a feature group are divided by the result of when this function is called with their intensity values. average intclust TRUE Whether intensities of replicates should first be averaged. MSPeakLists specclust - The MS peak lists object used for spectral similarity calculations specSimParams specclust getDefSpecSimParams() Parameters used for spectral similarity calculation. maxTreeHeight, deepSplit, minModuleSize All 1, TRUE, 1 Used for dynamic cluster assignment. See ?cutreeDynamicTree. The components are generated by automatically assigning clusters using the dynamicTreeCut R package. However, the cluster assignment can be performed manually or with different parameters, as is demonstrated below. The resulting components are stored in an object from the componentsIntClust or componentsSpecClust S4 class, which are both derived from the componentsClust class (which in turn is derived from the components class). Several methods are defined that can be used on these objects to re-assign clusters, perform plotting operations and so on. Below are some examples. For plotting see the relevant visualization section. More info can be found in the reference manual (e.g. ?componentsIntClust, ?componentsSpecClust and ?componentsClust). # generate intensity profile components with default settings componInt <- generateComponents(fGroups, "intclust") # manually re-assign clusters componInt <- treeCut(componInt, k = 10) # automatic re-assignment of clusters (adjusted max tree height) componInt <- treeCutDynamic(componInt, maxTreeHeight = 0.7) # MS/MS similarity components componMSMS <- generateComponents(fGroups, "specclust", MSPeakLists = mslists) "],["incorpAdductIso.html", "4.5 Incorporating adduct and isotopic data", " 4.5 Incorporating adduct and isotopic data With mass spectrometry it is common that multiple m/z values are detected for a single compound. These may be different adducts (e.g. [M+H]+, [M+Na]+, [M-H]-), the different isotopes of the molecule or a combination thereof. When multiple m/z values are measured for the same compound, the feature finding algorithm may yield a distinct feature for each, which adds complexity to the data. In the previous section it was discussed how componentization can help to find feature groups that belong to the same adduct and/or isotope clusters. This section explains how this data can be used to simplify the feature dataset. Furthermore, this section also covers adduct annotations for feature groups which may improve and simplify the general workflow. 4.5.1 Selecting features with preferential adducts/isotopes The selectIons function forms the bridge between feature group and componentization data. This function uses the adduct and isotope annotations to select preferential feature groups. For adduct clusters this means that only the feature group that has a preferential adduct (e.g. [M+H]+) is kept while others (e.g. [M+Na]+) are removed. If none of the adduct annotations are considered preferential, the most intense feature group is kept instead. For isotopic clusters typically only the feature group with the monoisotopic mass (i.e. M0) is kept. The behavior of selectIons is configurable with the following parameters: Argument Remarks prefAdduct The preferential adduct. Usually \"[M+H]+\" or \"[M-H]-\". onlyMonoIso If TRUE and a feature group is with isotopic annotations then it is only kept if it is monoisotopic. chargeMismatch How charge mismatches between adduct and isotope annotations are dealt with. Valid options are \"isotope\", \"adduct\", \"none\" or \"ignore\". See the reference manual for selectIons for more details. In case componentization did not lead to an adduct annotation for a feature group it will never be removed and simply be annotated with the preferential adduct. Similarly, when no isotope annotations are available and onlyMonoIso=TRUE, the feature group will not be removed. Although selectIons operates fairly conservative, it is still recommended to verify the componentization results in advance, for instance with the checkComponents function discussed here. Furthermore, the next subsection explains how adduct annotations can be corrected manually if needed. An example usage is shown below. fGroupsSel <- selectIons(fGroups, componCAM, "[M+H]+") #> No isotope annotations available! #> Removed 21 feature groups detected as unwanted adducts/isotopes #> Annotated 13 feature groups with adducts #> Remaining 111 feature groups set as default adduct [M+H]+ 4.5.2 Setting adduct annotations for feature groups The adducts() function can be used to obtain a character vector with adduct annotations for each feature group. When no adduct annotations are available it will simply return an empty character vector. When the selectIons function is used it will automatically add adduct annotations based on the componentization data. In addition, the adducts()<- function can be used to manually add or change adduct annotations. adducts(fGroups) # no adduct annotations #> character(0) adducts(fGroupsSel)[1:5] # adduct annotations set by selectIons() #> M109_R192_20 M111_R330_23 M114_R269_25 M116_R317_29 M120_R268_30 #> "[M+H]+" "[M+H]+" "[M+H]+" "[M+H]+" "[M+K]+" adducts(fGroupsSel)[3] <- "[M+Na]+" # modify annotation adducts(fGroupsSel)[1:5] # verify #> M109_R192_20 M111_R330_23 M114_R269_25 M116_R317_29 M120_R268_30 #> "[M+H]+" "[M+H]+" "[M+Na]+" "[M+H]+" "[M+K]+" NOTE Adduct annotations are always available with sets workflows. 4.5.3 Using adduct annotations in the workflow When feature groups have adduct annotations available this may simplify and improve the workflow. The adduct and ionization arguments used for suspect screening, formula/compound annotation and some componentization algorithms do not have to be set anymore, since this data can be obtained from the adduct annotations. Furthermore, these algorithms may improve their results, since the algorithms are now able to use adduct information for each feature group individually, instead of assuming that all feature groups have the same adduct. "],["annotation.html", "4.6 Annotation", " 4.6 Annotation The annotation consists of collecting MS peak lists and then formula and/or compound annotation: Note that compound annotation is normally not dependent upon formula annotation. However, formula data can be used to improve ranking of candidates afterwards by the addFormulaScoring() function, which will be discussed later in this section. Furthermore, suspect annotation is not mandatory, and may use data from peak lists, formulae and/or comounds. 4.6.1 MS peak lists Algorithm Usage Remarks mzR generateMSPeakLists(algorithm = \"mzr\", ...) Uses mzR for spectra retrieval. Recommended default. DataAnalysis generateMSPeakLists(algorithm = \"bruker\", ...) Loads data after automatically generating MS and MS/MS spectra in DataAnalysis DataAnalysis FMF generateMSPeakLists(algorithm = \"brukerfmf\", ...) Uses spectra from the find molecular features algorithm. The recommended default algorithm is mzr: this algorithm is generally faster and is not limited to a vendor data format as it will read the open mzML and mzXML file formats. On the other hand, when DataAnalysis is used with Bruker data the spectra can be automatically background subtracted and there is no need for file conversion. Note that the brukerfmf algorithm only works when findFeatures() was called with the bruker algorithm. When generateMSPeakists() is called it will Find all MS and MS/MS spectra that ‘belong’ to a feature. For MS spectra this means that all spectra close to the retention time of a feature will be collected. In addition, for MS/MS normally only spectra will be considered that have a precursor mass close to that of the feature (however, this can be disabled for data that was recorded with data independent acquisition (DIA, MS^E, bbCID, …)). Average all MS and MS/MS spectra to produce peak lists for each feature. Average all peak lists for features within the same group. Data from either (2) or (3) is used for subsequent annotation steps. Formula calculation can use either (as a trade-off between possibly more accurate results by outlier removal vs speed), whereas compound annotation will always use data from (3) since annotating single features (as opposed to their groups) would take a very long time. There are several common function arguments to generateMSPeakLists() that can be used to optimize its behaviour: Argument Algorithm(s) Remarks maxMSRtWindow mzr, bruker Maximum time window +/- the feature retention time (in seconds) to collect spectra for averaging. Higher values may significantly increase processing times. precursorMzWindow mzr Maximum precursor m/z search window to find MS/MS spectra. Set to NULL to disable (i.e. for DIA experiments). topMost mzr Only retain feature data for no more than this amount analyses with highest intensity. For instance, a value of 1 will only keep peak lists for the feature with highest intensity in a feature group. bgsubtr bruker Perform background subtraction (if the spectra type supports this, e.g. MS and bbCID) minMSIntensity, minMSMSIntensity bruker, brukerfmf Minimum MS and MS/MS intensity. Note that DataAnalysis reports many zero intensity peaks so a value of at least 1 is recommended. MSMSType bruker The type of spectra that should be used for MSMS: \"BBCID\" for bbCID experiments, otherwise \"MSMS\" (the default). In addition, several parameters can be set that affect spectral averaging. These parameters are passed as a list to the avgFeatParams (mzr algorithm only) and avgFGroupParams arguments, which affect averaging of feature and feature group data, respectively. Some typical parameters include: clusterMzWindow: Maximum m/z window used to cluster mass peaks when averaging. The better the MS resolution, the lower this value should be. topMost: Retain no more than this amount of most intense mass peaks. Useful to filter out ‘noisy’ peaks. minIntensityPre / minIntensityPost: Mass peaks below this intensity will be removed before/after averaging. See ?generateMSPeakLists for all possible parameters. A suitable list object to set averaging parameters can be obtained with the getDefAvgPListParams() function. # lower default clustering window, other settings remain default avgPListParams <- getDefAvgPListParams(clusterMzWindow = 0.001) # Apply to both feature and feature group averaging plists <- generateMSPeakLists(fGroups, "mzr", avgFeatParams = avgPListParams, avgFGroupParams = avgPListParams) 4.6.2 Formulae Formulae can be automatically calculated for all features using the generateFormulas() function. The following algorithms are currently supported: Algorithm Usage Remarks GenForm generateFormulas(algorithm = \"genform\", ...) Bundled with patRoon. Reasonable default. SIRIUS generateFormulas(algorithm = \"sirius\", ...) Requires MS/MS data. DataAnalysis generateFormulas(algorithm = \"bruker\", ...) Requires FMF features (i.e. findFeatures(algorithm = \"bruker\", ...)). Uses SmartFormula algorithms. Calculation with GenForm is often a good default. It is fast and basic rules can be applied to filter out obvious non-existing formulae. A possible drawback of GenForm, however, is that may become slow when many candidates are calculated, for instance, due to a relative high feature m/z (e.g. >600) or loose elemental restricitions. More thorough calculation is performed with SIRIUS: this algorithm often yields fewer and often more plausible results. However, SIRIUS requires MS/MS data (hence features without will not have results) and formula prediction may not work well for compounds that structurally deviate from the training sets used by SIRIUS. Calculation with DataAnalysis is only possible when features are obtained with DataAnalysis as well. An advantage is that analysis files do not have to be converted, however, compared to other algorithms calculation is often relative slow. There are two methods for formula assignment: Formulae are first calculated for each individual feature within a feature group. These results are then pooled, outliers are removed and remaining formulae are assigned to the feature group (i.e. calculateFeatures = TRUE). Formulae are directly calculated for each feature group by using group averaged peak lists (see previous section) (i.e. calculateFeatures = FALSE). The first method is more thorough and the possibility to remove outliers may sometimes result in better formula assignment. However, the second method is much faster and generally recommended for large number of analyses. By default, formulae are either calculated by only MS/MS data (SIRIUS) or with both MS and MS/MS data (GenForm/Bruker). The latter also allows formula calculation when no MS/MS data is present. Furthermore, with Bruker algorithms, data from both MS and MS/MS formula data can be combined to allow inclusion of candidates that would otherwise be excluded by e.g. poor MS/MS data. However, a disadvantage is that formulae needs to be calculated twice. The MSMode argument (listed below) can be used to customize this behaviour. An overview of common parameters that are typically set to customize formula calculation is listed below. Argument Algorithm(s) Remarks relMzDev genform, sirius The maximum relative m/z deviation for a formula to be considered (in ppm). elements genform, sirius Which elements to consider. By default \"CHNOP\". Try to limit possible elements as much as possible. calculateFeatures genform, sirius Whether formulae should be calculated first for all features (see discussion above) (always TRUE with DataAnalysis). featThresholdAnn All Minimum relative amount (0-1) that a candidate formula for a feature group should be found among all annotated features (e.g. 1 means that a candidate is only considered if it was assigned to all annotated features). adduct All The adduct to consider for calculation (e.g. \"[M+H]+\", \"[M-H]-\", more details in the adduct section). Don’t set this when adduct annotations are available. MSMode genform, bruker Whether formulae should be generated only from MS data (\"ms\"), MS/MS data (\"msms\") or both (\"both\"). The latter is default, see discussion above. profile sirius Instrument profile, e.g. \"qtof\", \"orbitrap\", \"fticr\". Some typical examples: formulasGF <- generateFormulas(fGroups, mslists, "genform") # GenForm, default settings formulasGF2 <- generateFormulas(fGroups, mslists, "genform", calculateFeatures = FALSE) # direct feature group assignment (faster) formulasSIR <- generateFormulas(fGroups, mslists, "sirius", elements = "CHNOPSClBr") # SIRIUS, common elements for pollutant formulasSIR2 <- generateFormulas(fGroups, mslists, "sirius", adduct = "[M-H]-") # SIRIUS, negative ionization formulasBr <- generateFormulas(fGroups, mslists, "bruker", MSMode = "MSMS") # Only consider MSMS data (SmartFormula3D) 4.6.3 Compounds An important step in a typical non-target workflow is structural identification for features of interest. Afterall, this information may finally reveal what a feature is. The first step is to find all possible structures in a database that may be assigned to the feature (based on e.g. monoisotopic mass or formula). These candidates are then scored to rank likely candidates, for instance, on correspondence with in-silico or library MS/MS spectra and environmental relevance. Structure assignment in patRoon is performed automatically for all feature groups with the generateCompounds() function. Currently, this function supports two algorithms: Algorithm Usage Remarks MetFrag generateCompounds(algorithm = \"metfrag\", ...) Supports many databases (including custom) and scorings for candidate ranking. SIRIUS with CSI:FingerID generateCompounds(algorithm = \"sirius\", ...) Incorporates prior comprohensive formula calculations. Compound annotation is often a relative time and resource intensive procedure. For this reason, features are not annotated individually, but instead a feature group as a whole is annotated, which generally saves significant amounts of computational requirements. Nevertheless, it is not uncommon that this is the most time consuming step in the workflow. For this reason, prioritization of features is highly important, even more so to avoid ‘abusing’ servers when an online database is used for compound retrieval. Selecting the right database is important for proper candidate assignment. Afterall, if the ‘right’ chemical compound is not present in the used database, it is impossible to assign the correct structure. Luckily, however, several large databases such as PubChem and ChemSpider are openly available which contain tens of millions of compounds. On the other hand, these databases may also lead to many unlikely candidates and therefore more specialized (or custom databases) may be preferred. Which database will be used is dictated by the database argument to generateCompounds(), currently the following options exist: Database Algorithm(s) Remarks pubchem \"metfrag\", \"sirius\" PubChem is currently the largest compound database and is used by default. chemspider \"metfrag\" ChemSpider is another large database. Requires security token from here (see next section). comptox \"metfrag\" The EPA CompTox contains many compounds and scorings relevant to environmental studies. Needs manual download (see next section). pubchemlite \"metfrag\" A specialized subset of the PubChem database. Needs manual download (see next section). for-ident \"metfrag\" The FOR-IDENT (STOFF-IDENT) database for water related substances. kegg \"metfrag\", \"sirius\" The KEGG database for biological compounds hmdb \"metfrag\", \"sirius\" The HMDB contains many human metabolites. bio \"sirius\" Selects all supports biological databases. csv, psv, sdf \"metfrag\" Custom database (see next section). CSV example. 4.6.3.1 Configuring MetFrag databases and scoring Some extra configuration may be necessary when using certain databases with MetFrag. In order to use the ChemSpider database a security token should be requested and set with the chemSpiderToken argument to generateCompounds(). The CompTox and PubChemLite databases need to be manually downloaded from CompTox (or variations with smoking or wastewater metadata) and PubChemLite. The file location of this and other local databases (csv, psv, sdf) needs to be manually configured, see the examples below and/or ?generateCompounds for more information on how to do this. # PubChem: the default compsMF <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+") # ChemSpider: needs security token compsMF2 <- generateCompounds(fGroups, mslists, "metfrag", database = "chemspider", chemSpiderToken = "MY_TOKEN_HERE", adduct = "[M+H]+") # CompTox: set global option to database path options(patRoon.path.MetFragCompTox = "~/CompTox_17March2019_SelectMetaData.csv") compsMF3 <- generateCompounds(fGroups, mslists, "metfrag", database = "comptox", adduct = "[M+H]+") # CompTox: set database location without global option compsMF4 <- generateCompounds(fGroups, mslists, "metfrag", database = "comptox", adduct = "[M+H]+", extraOpts = list(LocalDatabasePath = "~/CompTox_17March2019_SelectMetaData.csv")) # Same, but for custom database compsMF5 <- generateCompounds(fGroups, mslists, "metfrag", database = "csv", adduct = "[M+H]+", extraOpts = list(LocalDatabasePath = "~/mydb.csv")) An example of a custom .csv database can be found here. With MetFrag compound databases are not only used to retrieve candidate structures but are also used to obtain metadata for further ranking. Each database has its own scorings, a table with currently supported scorings can be obtained with the compoundScorings() function (some columns omitted): name metfrag database default score Score TRUE fragScore FragmenterScore TRUE metFusionScore OfflineMetFusionScore TRUE individualMoNAScore OfflineIndividualMoNAScore TRUE numberPatents PubChemNumberPatents pubchem TRUE numberPatents Patent_Count pubchemlite TRUE pubMedReferences PubChemNumberPubMedReferences pubchem TRUE pubMedReferences ChemSpiderNumberPubMedReferences chemspider TRUE pubMedReferences NUMBER_OF_PUBMED_ARTICLES comptox TRUE pubMedReferences PubMed_Count pubchemlite TRUE extReferenceCount ChemSpiderNumberExternalReferences chemspider TRUE dataSourceCount ChemSpiderDataSourceCount chemspider TRUE referenceCount ChemSpiderReferenceCount chemspider TRUE RSCCount ChemSpiderRSCCount chemspider TRUE formulaScore FALSE smartsInclusionScore SmartsSubstructureInclusionScore FALSE smartsExclusionScore SmartsSubstructureExclusionScore FALSE suspectListScore SuspectListScore FALSE retentionTimeScore RetentionTimeScore FALSE CPDATCount CPDAT_COUNT comptox TRUE TOXCASTActive TOXCAST_PERCENT_ACTIVE comptox TRUE dataSources DATA_SOURCES comptox TRUE pubChemDataSources PUBCHEM_DATA_SOURCES comptox TRUE EXPOCASTPredExpo EXPOCAST_MEDIAN_EXPOSURE_PREDICTION_MG/KG-BW/DAY comptox TRUE ECOTOX ECOTOX comptox TRUE NORMANSUSDAT NORMANSUSDAT comptox TRUE MASSBANKEU MASSBANKEU comptox TRUE TOX21SL TOX21SL comptox TRUE TOXCAST TOXCAST comptox TRUE KEMIMARKET KEMIMARKET comptox TRUE MZCLOUD MZCLOUD comptox TRUE pubMedNeuro PubMedNeuro comptox TRUE CIGARETTES CIGARETTES comptox TRUE INDOORCT16 INDOORCT16 comptox TRUE SRM2585DUST SRM2585DUST comptox TRUE SLTCHEMDB SLTCHEMDB comptox TRUE THSMOKE THSMOKE comptox TRUE ITNANTIBIOTIC ITNANTIBIOTIC comptox TRUE STOFFIDENT STOFFIDENT comptox TRUE KEMIMARKET_EXPO KEMIMARKET_EXPO comptox TRUE KEMIMARKET_HAZ KEMIMARKET_HAZ comptox TRUE REACH2017 REACH2017 comptox TRUE KEMIWW_WDUIndex KEMIWW_WDUIndex comptox TRUE KEMIWW_StpSE KEMIWW_StpSE comptox TRUE KEMIWW_SEHitsOverDL KEMIWW_SEHitsOverDL comptox TRUE ZINC15PHARMA ZINC15PHARMA comptox TRUE PFASMASTER PFASMASTER comptox TRUE peakFingerprintScore AutomatedPeakFingerprintAnnotationScore FALSE lossFingerprintScore AutomatedLossFingerprintAnnotationScore FALSE agroChemInfo AgroChemInfo pubchemlite FALSE bioPathway BioPathway pubchemlite FALSE drugMedicInfo DrugMedicInfo pubchemlite FALSE foodRelated FoodRelated pubchemlite FALSE pharmacoInfo PharmacoInfo pubchemlite FALSE safetyInfo SafetyInfo pubchemlite FALSE toxicityInfo ToxicityInfo pubchemlite FALSE knownUse KnownUse pubchemlite FALSE disorderDisease DisorderDisease pubchemlite FALSE identification Identification pubchemlite FALSE annoTypeCount FPSum pubchemlite TRUE annoTypeCount AnnoTypeCount pubchemlite TRUE The first two columns contain the generic and original MetFrag naming schemes for each scoring type. While both naming schemes can be used, the generic is often shorter and harmonized with other algorithms (e.g. SIRIUS). The database column specifies for which databases a particular scoring is available (empty if not database specific). Most scorings are selected by default (as specified by the default column), however, this behaviour can be customized by using the scoreTypes argument: # Only in-silico and PubChem number of patents scorings compsMF1 <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+", scoreTypes = c("fragScore" "numberPatents")) # Custom scoring in custom database compsMF2 <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+", database = "csv", extraOpts = list(LocalDatabasePath = "~/mydb.csv"), scoreTypes = c("fragScore", "myScore", "myScore2")) By default ranking is performed with equal weight (i.e. 1) for all scorings. This can be changed by the scoreWeights argument, which should be a vector containing the weights for all scorings following the order of scoreTypes, for instance: compsMF <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+", scoreTypes = c("fragScore" "numberPatents"), scoreWeights = c(1, 2)) Sometimes thousands or more structural candidates are found when annotating a feature group. In this situation processing all these candidates will too involving (especially when external databases are used). To avoid this a default cut-off is set: when the number of candidates exceed a certain amount the search will be aborted and no results will be reported for that feature group. The maximum number of candidates can be set with the maxCandidatesToStop argument. The default value is relative conservative, especially for local databases it may be useful to increase this number. 4.6.3.2 Timeout and error handling The use of online databases has the drawback that an error may occur, for instance, as a result of a connection error. Furthermore, MetFrag typically returns an error when too many candidates are found (as set by the maxCandidatesToStop argument). By default processing is restarted if an error has occurred (configured by the errorRetries argument). Similarly, the timeoutRetries and timeout arguments can be used to avoid being ‘stuck’ on obtaining results, for instance, due to an unstable internet connection. If no compounds could be assigned due to an error a warning will be issued. In this case it is best to see what went wrong by manually checking the log files, which by default are stored in the log/metfrag folder. 4.6.3.3 Formula scoring Ranking of candidate structures may further be improved by incorporating formula information by using the addFormulaScoring() function: comps <- addFormulaScoring(coms, formulas, updateScore = TRUE) Here, corresponding formula and explained fragments will be used to calculate a formulaScore for each candidate. Note that SIRIUS candidates are already based on calculated formulae, hence, running this function on SIRIUS results is less sensable unless scoring from another formula calculation algorithm is desired. 4.6.3.4 Further options and parameters There are many more options and parameters that affect compound annotation. For a full overview please have a look at the reference manual (e.g. by running ?generateCompounds). 4.6.4 Suspect annotation The data obtained during the previously described annotation steps can be used to improve a suspect screening workflow. The annotateSuspects() method uses the annotation data to calculate various annotation properties for each suspect, such as their rank in formula/compound candidates, which fragments from the suspect list were matched, and a rough indication of the identification level according to Schymanski et al. (2014) fGroupsSusp <- annotateSuspects(fGroupsSusp, MSPeakLists = mslists, formulas = formulas, compounds = compounds) #> Annotating 5 suspects... #> ================================================================================ The calculation of identification levels is performed by a set of pre-defined rules. The genIDLevelRulesFile() can be used to inspect the default rules or to create your own rules file, which can subsequently passed to annotateSuspects() with the IDFile argument. See ?annotateSuspects for more details on the file format and options. The default identification levels can be summarized as follows: Level Description Rules 1 Target match Retention time deviates <12 seconds from suspect list. At least 3 (or all if the suspect list contains less) fragments from the suspect list must match. 2a Good MS/MS library match Suspect is top ranked in the compounds results. The individualMoNAScore is at least 0.9 and all other candidates have no MoNA library score. 3a Fair library match The individualMoNAScore is at least 0.4. 3b Known MS/MS match At least 3 (or all if the suspect list contains less) fragments from the suspect list must match. 3c Good in-silico MS/MS match The annotation MS/MS similarity (annSimComp column) is at least 0.7. 4a Good formula MS/MS match Suspect is top ranked formula candidate, annotation MS/MS similarity (annSimForm column) is at least 0.7 and isotopic match (isoScore) of at least 0.5. The latter two scores are at least 0.2 higher than next best ranked candidate. 4b Good formula isotopic pattern match Suspect is top ranked formula candidate and isotopic match (isoScore) of at least 0.9 and at least 0.2 higher than next best ranked candidate. 5 Unknown All else. In general, the more data provided by the suspect list and to annotateSuspects(), the better identification level estimation works. For instance, when considering the default rules, either the fragments_mz or fragments_formula column is necessary to be able assign a level 3b. Similarly, the suspect list needs retention times (as well as fragment data) to be able to assign level 1. As you can imagine, providing the annotation workflow objects (i.e. MSPeakLists, formulas, compounds) to annotateSuspects() is necessary for calculation of most levels. The annotateSuspects() function will log decisions for identification level assignments to the log/ sub-directory in the current working directory. This is useful to inspect level assignments and especially useful when you customized any rules. NOTE: The current identification level rules are only optimized for GenForm and MetFrag annotation algorithms. References "],["processing.html", "5 Processing workflow data", " 5 Processing workflow data The previous chapter mainly discussed how to create workflow data. This chapter will discuss how to use the data. "],["inspecting-results.html", "5.1 Inspecting results", " 5.1 Inspecting results Several generic functions exist that can be used to inspect data that is stored in a particular object (e.g. features, compounds etc): Generic Classes Remarks length() All Returns the length of the object (e.g. number of features, compounds etc) algorithm() All Returns the name of the algorithm used to generate the object. groupNames() All Returns all the unique identitifiers (or names) of the feature groups for which this object contains results. names() featureGroups, components Returns names of the feature groups (similar to groupNames()) or components show() All Prints general information. \"[[\" / \"$\" operators All Extract general information, see below. as.data.table() / as.data.frame() All Convert data to a data.table or data.frame, see below. analysisInfo(), analyses(), replicateGroups() features, featureGroups Returns the analysis information, analyses or replicate groups for which this object contains data. groupInfo() featureGroups Returns feature group information (m/z and retention time values). screenInfo() featureGroupsScreening Returns information on hits from suspect screening. componentInfo() components Returns information for all components. annotatedPeakList() formulas, compounds Returns a table with annotated mass peaks (see below). The common R extraction operators \"[[\", \"$\" can be used to obtain data for a particular feature groups, analysis etc: # Feature table (only first columns for readability) fList[["standard-1"]][, 1:6] #> NULL # Feature group intensities fGroups$M120_R268_30 #> [1] 264836 245372 216560 fGroups[[1, "M120_R268_30"]] # only first analysis #> [1] 264836 # obtains MS/MS peak list (feature group averaged data) mslists[["M120_R268_30"]]$MSMS #> ID mz intensity precursor #> 1: 5 105.0698 6183.111 FALSE #> 2: 6 106.0653 7643.556 FALSE #> 3: 8 107.0728 7760.667 FALSE #> 4: 15 120.0556 168522.667 TRUE #> 5: 17 121.0587 13894.667 FALSE #> 6: 18 121.0884 10032.889 FALSE #> 7: 19 122.0964 147667.778 FALSE #> 8: 20 123.0803 36631.111 FALSE #> 9: 21 123.0996 15482.444 FALSE #> 10: 22 124.0805 35580.667 FALSE # get all formula candidates for a feature group formulas[["M120_R268_30"]][, 1:7] #> neutral_formula ion_formula neutralMass ion_formula_mz error dbe isoScore #> 1: C6H5N3 C6H6N3 119.0483 120.0556 1.8 6 0.92461 # get all compound candidates for a feature group compounds[["M120_R268_30"]][, 1:4] #> explainedPeaks score neutralMass SMILES #> 1: 0 2.8673850 119.0483 C1=CC2=NNN=C2C=C1 #> 2: 0 1.4569407 119.0483 C1=CC=C(C=C1)N=[N+]=[N-] #> 3: 0 1.1555020 119.0483 C1=CC2=C(N=C1)N=CN2 #> 4: 0 1.0911519 119.0483 C1=CC2=C(C=NN2)N=C1 #> 5: 0 1.0910125 119.0483 C1=CNC2=NC=NC=C21 #> --- #> 26: 0 0.8722331 119.0483 C1=CN=C(C=N1)CC#N #> 27: 0 0.8617554 119.0483 C1=CC2=NC=NN2C=C1 #> 28: 0 0.8580143 119.0483 C1=CC2=CN=NN2C=C1 #> 29: 0 0.7249048 119.0483 C1=CC(=[N+]=[N-])C=CC1=N #> 30: 0 0.6442352 119.0483 C(C#N)C(CC#N)C#N # get a table with information of a component components[["CMP7"]][, 1:6] #> group ret mz isogroup isonr charge #> 1: M143_R206_64 205.787 143.0700 NA NA NA #> 2: M159_R208_103 208.280 159.0650 NA NA NA #> 3: M161_R208_104 207.582 161.0806 NA NA NA #> 4: M181_R209_159 208.580 181.0469 NA NA NA A more sophisticated way to obtain data from a workflow object is to use as.data.table() or as.data.frame(). These functions will convert all information within the object to a table (data.table or data.frame) and allow various options to add extra information. An advantage is that this common data format can be used with many other functions within R. The output is in a tidy format. NOTE If you are not familiar with data.table and want to know more see data.table. Briefly, this is a more efficient and largely compatible alternative to the regular data.frame. NOTE The as.data.frame() methods defined in patRoon simply convert the results from as.data.table(), hence, both functions are equal in their usage and are defined for the same object classes. Some typical examples are shown below. # obtain table with all features (only first columns for readability) as.data.table(fList)[, 1:6] #> analysis ID ret mz area intensity #> 1: solvent-pos-1 f_18251015669602421518 13.176 98.97537 4345232.0 391476 #> 2: solvent-pos-1 f_11564647952231462913 7.181 100.11197 797112.1 426956 #> 3: solvent-pos-1 f_16113807400422414888 192.178 100.11211 9609998.0 750532 #> 4: solvent-pos-1 f_16618588240594263584 19.171 100.11217 5784411.0 370376 #> 5: solvent-pos-1 f_18381313828824973023 4.786 100.11220 551723.6 567312 #> --- #> 2920: standard-pos-3 f_13197285925347709436 318.892 425.18866 666531.5 232636 #> 2921: standard-pos-3 f_6615663783219273103 9.114 427.03242 362024.1 114744 #> 2922: standard-pos-3 f_7682755621657089473 318.892 427.18678 200193.5 77768 #> 2923: standard-pos-3 f_16397861522540151945 382.682 432.23984 217612.9 97648 #> 2924: standard-pos-3 f_4700490907711567021 9.114 433.00457 3086864.0 912920 # Returns group info and intensity values for each feature group as.data.table(fGroups, average = TRUE) # average intensities for replicates #> group ret mz standard-pos #> 1: M109_R192_20 191.8729 109.0759 183482.67 #> 2: M111_R330_23 330.4093 111.0439 84598.67 #> 3: M114_R269_25 268.6919 114.0912 85796.00 #> 4: M116_R317_29 316.7348 116.0527 766888.00 #> 5: M120_R268_30 268.4092 120.0554 242256.00 #> --- #> 138: M316_R363_635 363.4894 316.1741 89904.00 #> 139: M318_R349_638 349.1087 318.1450 83320.00 #> 140: M352_R335_664 334.9418 352.2019 74986.67 #> 141: M407_R239_672 239.3580 407.2227 186568.00 #> 142: M425_R319_676 319.4959 425.1885 214990.67 # As above, but with extra suspect screening information # (select some columns to simplify the output below) as.data.table(fGroupsSusp, average = TRUE, collapseSuspects = NULL, onlyHits = TRUE)[1:3, c("group", "susp_name", "susp_compRank", "susp_annSimBoth", "susp_estIDLevel")] #> group susp_name susp_compRank susp_annSimBoth susp_estIDLevel #> 1: M120_R268_30 1H-benzotriazole 1 0.0000000 4b #> 2: M137_R249_53 N-Phenyl urea 1 0.6443557 5 #> 3: M146_R309_68 2-Hydroxyquinoline 2 0.9896892 3c # Returns all peak lists for each feature group as.data.table(mslists) #> group type ID mz intensity precursor #> 1: M120_R268_30 MS 1 100.1120 178952.381 FALSE #> 2: M120_R268_30 MS 2 102.1277 202359.667 FALSE #> 3: M120_R268_30 MS 3 114.0912 37647.548 FALSE #> 4: M120_R268_30 MS 4 115.0752 66685.238 FALSE #> 5: M120_R268_30 MS 5 120.0554 113335.857 TRUE #> --- #> 235: M192_R355_191 MS 51 299.1274 44083.126 FALSE #> 236: M192_R355_191 MS 52 299.1471 7390.267 FALSE #> 237: M192_R355_191 MSMS 14 119.0496 588372.444 FALSE #> 238: M192_R355_191 MSMS 18 120.0524 70273.333 FALSE #> 239: M192_R355_191 MSMS 31 192.1384 71978.667 TRUE # Returns all formula candidates for each feature group with scoring # information, neutral loss etc as.data.table(formulas)[, 1:6] #> group neutral_formula ion_formula neutralMass ion_formula_mz error #> 1: M120_R268_30 C6H5N3 C6H6N3 119.0483 120.0556 1.80000000 #> 2: M137_R249_53 C7H8N2O C7H9N2O 136.0637 137.0709 2.90000000 #> 3: M146_R309_68 C9H7NO C9H8NO 145.0528 146.0600 1.66666667 #> 4: M192_R355_191 C12H17NO C12H18NO 191.1310 192.1383 0.03333333 # Returns all compound candidates for each feature group with scoring and other metadata as.data.table(compounds)[, 1:4] #> group explainedPeaks score neutralMass #> 1: M120_R268_30 0 2.8673850 119.0483 #> 2: M120_R268_30 0 1.4569407 119.0483 #> 3: M120_R268_30 0 1.1555020 119.0483 #> 4: M120_R268_30 0 1.0911519 119.0483 #> 5: M120_R268_30 0 1.0910125 119.0483 #> --- #> 248: M192_R355_191 0 0.6851763 191.1310 #> 249: M192_R355_191 0 0.6764365 191.1310 #> 250: M192_R355_191 0 0.6713679 191.1310 #> 251: M192_R355_191 0 0.6519220 191.1310 #> 252: M192_R355_191 0 0.6497224 191.1310 # Returns table with all components (including feature group info, annotations etc) as.data.table(components)[, 1:6] #> name cmp_ret cmp_retsd neutral_mass analysis size #> 1: CMP1 347.2929 0.0000000 <NA> standard-pos-2 2 #> 2: CMP1 347.2929 0.0000000 <NA> standard-pos-2 2 #> 3: CMP2 349.6343 4.6805095 225.1589/188.20157 standard-pos-3 6 #> 4: CMP2 349.6343 4.6805095 225.1589/188.20157 standard-pos-3 6 #> 5: CMP2 349.6343 4.6805095 225.1589/188.20157 standard-pos-3 6 #> --- #> 86: CMP28 313.3489 0.3104371 <NA> standard-pos-2 3 #> 87: CMP28 313.3489 0.3104371 <NA> standard-pos-2 3 #> 88: CMP29 268.3442 0.3843289 81.08705 standard-pos-1 3 #> 89: CMP29 268.3442 0.3843289 81.08705 standard-pos-1 3 #> 90: CMP29 268.3442 0.3843289 81.08705 standard-pos-1 3 Finally, the annotatedPeakList() function is useful to inspect annotation results for a formula or compound candidate: # formula annotations for the first formula candidate of feature group M137_R249_53 annotatedPeakList(formulas, index = 1, groupName = "M137_R249_53", MSPeakLists = mslists) #> ID mz intensity precursor ion_formula dbe ion_formula_mz error neutral_loss #> 1: 2 94.06500 9406.111 FALSE C6H8N 3.5 94.06513 1.30 CHNO #> 2: 6 98.97522 2212.000 FALSE <NA> NA NA NA <NA> #> 3: 7 105.06971 1662.111 FALSE <NA> NA NA NA <NA> #> 4: 14 120.04434 7176.222 FALSE C7H6NO 5.5 120.04439 0.40 H3N #> 5: 19 122.07222 2246.000 FALSE <NA> NA NA NA <NA> #> 6: 21 135.08004 1565.556 FALSE <NA> NA NA NA <NA> #> 7: 23 137.07039 5348.667 TRUE C7H9N2O 4.5 137.07094 3.35 #> 8: 24 137.09572 2026.889 FALSE <NA> NA NA NA <NA> #> 9: 26 138.09116 12356.667 FALSE <NA> NA NA NA <NA> #> 10: 27 139.07503 5020.667 FALSE <NA> NA NA NA <NA> # compound annotation for first candidate of feature group M137_R249_53 annotatedPeakList(compounds, index = 1, groupName = "M137_R249_53", MSPeakLists = mslists) #> ID mz intensity precursor ion_formula ion_formula_MF neutral_loss score #> 1: 2 94.06500 9406.111 FALSE C6H8N [C6H6N+H]+H+ CHNO 405 #> 2: 6 98.97522 2212.000 FALSE <NA> <NA> <NA> NA #> 3: 7 105.06971 1662.111 FALSE <NA> <NA> <NA> NA #> 4: 14 120.04434 7176.222 FALSE C7H6NO [C7H6NO]+ H3N 305 #> 5: 19 122.07222 2246.000 FALSE <NA> <NA> <NA> NA #> 6: 21 135.08004 1565.556 FALSE <NA> <NA> <NA> NA #> 7: 23 137.07039 5348.667 TRUE <NA> <NA> <NA> NA #> 8: 24 137.09572 2026.889 FALSE <NA> <NA> <NA> NA #> 9: 26 138.09116 12356.667 FALSE <NA> <NA> <NA> NA #> 10: 27 139.07503 5020.667 FALSE <NA> <NA> <NA> NA More advanced examples for these functions are shown below. # Feature table, can also be accessed by numeric index fList[[1]] mslists[["standard-1", "M120_R268_30"]] # feature data (instead of feature group averaged) formulas[[1, "M120_R268_30"]] # feature data (if available, i.e. calculateFeatures=TRUE) components[["CMP1", 1]] # only for first feature group in component as.data.frame(fList) # classic data.frame format, works for all objects as.data.table(fGroups) # return non-averaged intensities (default) as.data.table(fGroups, features = TRUE) # include feature information as.data.table(mslists, averaged = FALSE) # peak lists for each feature as.data.table(mslists, fGroups = fGroups) # add feature group information as.data.table(formulas, countElements = c("C", "H")) # include C/H counts (e.g. for van Krevelen plots) # add various information for organic matter characterization (common elemental # counts/ratios, classifications etc) as.data.table(formulas, OM = TRUE) as.data.table(compounds, fGroups = fGroups) # add feature group information as.data.table(compounds, fragments = TRUE) # include information of all annotated fragments annotatedPeakList(formulas, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, onlyAnnotated = TRUE) # only include annotated peaks annotatedPeakList(compounds, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, formulas = formulas) # include formula annotations "],["filtering.html", "5.2 Filtering", " 5.2 Filtering During a non-target workflow it is not uncommon that some kind of data-cleanup is necessary. Datasets are often highly complex, which makes separating data of interest from the rest highly important. Furthermore, general cleanup typically improves the quality of the dataset, for instance by removing low scoring annotation results or features that are unlikely to be ‘correct’ (e.g. noise or present in blanks). For this reason patRoon supports many different filters that easily clean data produced during the workflow in a highly customizable way. All major workflow objects (e.g. featureGroups, compounds, components etc.) support filtering operations by the filter() generic. This function takes the object to be filtered as first argument and any remaining arguments describe the desired filter options. The filter() generic function then returns the modified object back. Some examples are shown below. # remove low intensity (<500) features features <- filter(features, absMinIntensity = 500) # remove features with intensities lower than 5 times the blank fGroups <- filter(fGroups, blankThreshold = 5) # only retain compounds with >1 explained MS/MS peaks compounds <- filter(compounds, minExplainedPeaks = 1) The following sections will provide a more detailed overview of available data filters. NOTE Some other R packages (notably dplyr) also provide a filter() generic function. To use the filter() function from different packages you may need to explicitly specify which one to use in your script. This can be done by prefixing it with the package name, e.g. patRoon::filter(...), dplyr::filter(...) etc. 5.2.1 Features There are many filters available for feature data: Filter Classes Remarks absMinIntensity, relMinIntensity features, featureGroups Minimum intensity preAbsMinIntensity, preRelMinIntensity featureGroups Minimum intensity prior to other filtering (see below) retentionRange, mzRange, mzDefectRange, chromWidthRange features, featureGroups Filter by feature properties absMinAnalyses, relMinAnalyses featureGroups Minimum feature abundance in all analyses absMinReplicates, relMinReplicates featureGroups Minimum feature abundance in different replicates absMinFeatures, relMinFeatures featureGroups Only keep analyses with at least this amount of features absMinReplicateAbundance, relMinReplicateAbundance featureGroups Minimum feature abundance in a replicate group maxReplicateIntRSD featureGroups Maximum relative standard deviation of feature intensities in a replicate group. blankThreshold featureGroups Minimum intensity factor above blank intensity rGroups featureGroups Only keep (features of) these replicate groups results featureGroups Only keep feature groups with formula/compound annotations or componentization results Application of filters to feature data is important for (environmental) non-target analysis. Especially blank and replicate filters (i.e. blankThreshold and absMinReplicateAbundance/relMinReplicateAbundance) are important filters and are highly recommended to always apply for cleaning up your dataset. All filters are available for feature group data, whereas only a subset is available for feature objects. The main reason is that other filters need grouping of features between analyses. Regardless, in patRoon filtering feature data is less important, and typically only needed when the number of features are extremely large and direct grouping is undesired. From the table above you can notice that many filters concern both absolute and relative data (i.e. as prefixed with abs and rel). When a relative filter is used the value is scaled between 0 and 1. For instance: # remove features not present in at least half of the analyses within a replicate group fGroups <- filter(fGroups, relMinReplicateAbundance = 0.5) An advantage of relative filters is that you will not have to worry about the data size involved. For instance, in the above example the filter always takes half of the number of analyses within a replicate group, even when replicate groups have different number of analyses. Note that multiple filters can be specified at once. Especially for feature group data the order of filtering may impact the final results, this is explained further in the reference manual (i.e. ?`feature-filtering`). Some examples are shown below. # filter features prior to grouping: remove any features eluting before first 2 minutes fList <- filter(fList, retentionRange = c(120, Inf)) # common filters for feature groups fGroups <- filter(fGroups, absMinIntensity = 500, # remove features <500 intensity relMinReplicateAbundance = 1, # features should be in all analysis of replicate groups maxReplicateIntRSD = 0.75, # remove features with intensity RSD in replicates >75% blankThreshold = 5, # remove features <5x intensity of (average) blank intensity removeBlanks = TRUE) # remove blank analyses from object afterwards # filter by feature properties fGroups <- filter(mzDefectRange = c(0.8, 0.9), chromWidthRange = c(6, 120)) # remove features not present in at least 3 analyses fGroups <- filter(fGroups, absMinAnalyses = 3) # remove features not present in at least 20% of all replicate groups fGroups <- filter(fGroups, relMinReplicates = 0.2) # only keep data present in replicate groups "repl1" and "repl2" # all other features and analyses will be removed fGroups <- filter(fGroups, rGroups = c("repl1", "repl2")) # only keep feature groups with compound annotations fGroups <- filter(fGroups, results = compounds) # only keep feature groups with formula or compound annotations fGroups <- filter(fGroups, results = list(formulas, compounds)) 5.2.2 Suspect screening Several additional filters are available for feature groups obtained with screenSuspects(): Filter Classes Remarks onlyHits featureGroupsScreening Only retain feature groups assigned to one or more suspects. selectHitsBy featureGroupsScreening Select the feature group that matches best with a suspect (in case there are multiple). selectBestFGroups featureGroupsScreening Select the suspect that matches best with a feature group (in case there are multiple). maxLevel, maxFormRank, maxCompRank featureGroupsScreening Only retain suspect hits with identification/annotation ranks below a threshold. minAnnSimForm, minAnnSimComp, minAnnSimBoth featureGroupsScreening Remove suspect hits with annotation similarity scores below this value. absMinFragMatches, relMinFragMatches featureGroupsScreening Only keep suspect hits with a minimum (relative) number of fragment matches from the suspect list. NOTE: most filters only remove suspect hit results. Set onlyHits=TRUE to also remove any feature groups that end up without suspect hits. The selectHitsBy and selectBestFGroups filters are useful to remove duplicate hits (one suspect assigned to multiple feature groups or multiple feature groups assigned to the same suspect, respectively). The former selects based on either best identification level (selectHitsBy=\"level\") or highest mean intensity (selectHitsBy=\"intensity\"). The selectBestFGroups can only be TRUE/FALSE and always selects by best identification level. Some examples are shown below. # only keep feature groups assigned to at least one suspect fGroupsSusp <- filter(fGroupsSusp, onlyHits = TRUE) # remove duplicate suspect to feature group matches and keep the best fGroupsSusp <- filter(fGroupsSusp, selectHitsBy = "level") # remove suspect hits with ID levels >3 and make sure no feature groups # are present without suspect hits afterwards fGroupsSusp <- filter(fGroupsSusp, maxLevel = 3, onlyHits = TRUE) 5.2.3 Annotation There are various filters available for handling annotation data: Filter Classes Remarks absMSIntThr, absMSMSIntThr, relMSIntThr, relMSMSIntThr MSPeakLists Minimum intensity of mass peaks topMSPeaks, topMSMSPeaks MSPeakLists Only keep most intense mass peaks withMSMS MSPeakLists Only keep results with MS/MS data minMSMSPeaks MSPeakLists Only keep an MS/MS peak list if it contains a minimum number of peaks (excluding the precursor peak) annotatedBy MSPeakLists Only keep MS/MS peaks that have formula or compound annotations minExplainedPeaks formulas, compounds Minimum number of annotated mass peaks elements, fragElements, lossElements formulas, compounds Restrain elemental composition topMost formulas, compounds Only keep highest ranked candidates minScore, minFragScore, minFormulaScore compounds Minimum compound scorings scoreLimits formulas, compounds Minimum/Maximum scorings OM formulas, compounds Only keep candidates with likely elemental composition found in organic matter Several intensity related filters are available to clean-up MS peak list data. For instance, the topMSPeaks/topMSMSPeaks filters provide a simple way to remove noisy data by only retaining a defined number of most intense mass peaks. Note that none of these filters will remove the precursor mass peak of the feature itself. The filters applicable to formula and compound annotation generally concern minimal scoring or chemical properties. The former is useful to remove unlikely candidates, whereas the second is useful to focus on certain study specific chemical properties (e.g. known neutral losses). Common examples are shown below. # intensity filtering mslists <- filter(mslists, absMSIntThr = 500, # minimum MS mass peak intensity of 500 relMSMSIntThr = 0.1) # minimum MS/MS mass peak intensity of 10% # only retain 10 most intens mass peaks # (feature mass is always retained) mslists <- filter(mslists, topMSPeaks = 10) # remove MS/MS peaks without compound annotations mslists <- filter(mslists, annotatedBy = compounds) # remove MS/MS peaks not annotated by either a formula or compound candidate mslists <- filter(mslists, annotatedBy = list(formulas, compounds)) # only keep formulae with 1-10 sulphur or phosphorus elements formulas <- filter(formulas, elements = c("S1-10", "P1-10")) # only keep candidates with MS/MS fragments that contain 1-10 carbons and 0-2 oxygens formulas <- filter(formulas, fragElements = "C1-10O0-2") # only keep candidates with CO2 neutral loss formulas <- filter(formulas, lossElements = "CO2") # only keep the 15 highest ranked candidates with at least 1 annotated MS/MS peak compounds <- filter(compounds, minExplainedPeaks = 1, topMost = 15) # minimum in-silico score compounds <- filter(compounds, minFragScore = 10) # candidate should be referenced in at least 1 patent # (only works if database lists number of patents, e.g. PubChem) compounds <- filter(compounds, scoreLimits = list(numberPatents = c(1, Inf)) NOTE As of patRoon 2.0 MS peak lists are not re-generated after a filtering operation (unless the reAverage parameter is explicity set to TRUE). The reason for this change is that re-averaging invalidates any formula/compound annotation data (e.g. used for plotting and reporting) that were generated prior to the filter operation. 5.2.4 Components Finally several filters are available for components: Filter Remarks size Minimum component size adducts, isotopes Filter features by adduct/istopes annotation rtIncrement, mzIncrement Filter homologs by retention/mz increment range Note that these filters are only applied if the components contain the data the filter works on. For instance, filtering by adducts will not affect components obtained from homologous series. As before, some typical examples are shown below. # only keep components with at least 4 features componInt <- filter(componInt, minSize = 4) # remove all features from components are not annotated as an adduct componRC <- filter(componRC, adducts = TRUE) # only keep protonated and sodium adducts componRC <- filter(componRC, adducts = c("[M+H]+", "[M+Na]+")) # remove all features not recognized as isotopes componRC <- filter(componRC, isotopes = FALSE) # only keep monoisotopic mass componRC <- filter(componRC, isotopes = 0) # min/max rt/mz increments for homologs componNT <- filter(componNT, rtIncrement = c(10, 30), mzIncrement = c(16, 50)) NOTE As mentioned before, components are still in a relative young development phase and results should always be verified! 5.2.5 Negation All filters support negation: if enabled all specified filters will be executed in an opposite manner. Negation may not be so commonly used, but allows greater flexibility which is sometimes needed for advanced filtering steps. Furthermore, it is also useful to specifically isolate the data that otherwise would have been removed. Some examples are shown below. # keep all features/analyses _not_ present from replicate groups "repl1" and "repl2" fGroups <- filter(fGroups, rGroups = c("repl1", "repl2"), negate = TRUE) # only retain features with a mass defect outside 0.8-0.9 fGroups <- filter(mzDefectRange = c(0.8, 0.9), negate = TRUE) # remove duplicate suspect hits and only keep the _worst_ hit fGroupsSusp <- filter(fGroupsSusp, selectHitsBy = "level", negate = TRUE) # remove candidates with CO2 neutral loss formulas <- filter(formulas, lossElements = "CO2", negate = TRUE) # select 15 worst ranked candidates compounds <- filter(compounds, topMost = 15, negate = TRUE) # only keep components with <5 features componInt <- filter(componInt, minSize = 5, negate = TRUE) "],["subset.html", "5.3 Subsetting", " 5.3 Subsetting The previous section discussed the filter() generic function to perform various data cleaning operations. A more generic way to select data is by subsetting: here you can manually specify which parts of an object should be retained. Subsetting is supported for all workflow objects and is performed by the R subset operator (\"[\"). This operator either subsets by one or two arguments, which are referred to as the i and j arguments. Class Argument i Argument j Remarks features analyses featureGroups analyses feature groups MSPeakLists analyses feature groups peak lists for feature groups will be re-averaged when subset on analyses (by default) formulas feature groups compounds feature groups components components feature groups For objects that support two-dimensional subsetting (e.g. featureGroups, MSPeakLists), either the i or j argument is optional. Furthermore, unlike subsetting a data.frame, the position of i and j does not change when only one argument is specified: df[1, 1] # subset data.frame by first row/column df[1] # subset by first column df[1, ] # subset by first row fGroups[1, 1] # subset by first analysis/feature group fGroups[, 1] # subset by first feature group (i.e. column) fGroups[1] # subset by first analysis (i.e. row) The subset operator allows three types of input: A logical vector: elements are selected if corresponding values are TRUE. A numeric vector: select elements by numeric index. A character vector: select elements by their name. When a logical vector is used as input it will be re-cycled if necessary. For instance, the following will select by the first, third, fifth, etc. analysis. fGroups[c(TRUE, FALSE)] In order to select by a character you will need to know the names for each element. These can, for instance, be obtained by the groupNames() (feature group names), analyses() (analysis names) and names() (names for components or feature groups for featureGroups objects) generic functions. Some more examples of common subsetting operations are shown below. # select first three analyses fList[1:3] # select first three analyses and first 500 feature groups fGroups[1:3, 1:500] # select all feature groups from first component fGroupsNT <- fGroups[, componNT[[1]]$group] # only keep feature groups with formula annotation results fGroupsForms <- fGroups[, groupNames(formulas)] # only keep feature groups with either formula or compound annotation results fGroupsAnn <- fGroups[, union(groupNames(formulas), groupNames(compounds))] # select first 15 components components[1:15] # select by name components[c("CMP1", "CMP5")] # only retain feature groups in components for which compound annotations are # available components[, groupNames(compounds)] In addition, feature groups can also be subset by given replicate groups or annotation/componentization results (similar to filter()). Similarly, suspect screening results can also be subset by given suspect names. # equal as filter(fGroups, rGroups = ...) fGroups[rGroups = c("repl1", "repl2")] # equal as filter(fGroups, results = ...) fGroups[results = compounds] # only keep feature groups assigned to given suspects fGroupsSusp[suspects = c("1H-benzotriazole", "2-Hydroxyquinoline")] NOTE As of patRoon 2.0 MS peak lists are not re-generated after a subsetting operation (unless the reAverage parameter is explicity set to TRUE). The reason for this change is that re-averaging invalidates any formula/compound annotation data (e.g. used for plotting and reporting) that were generated prior to the subset operation. 5.3.1 Prioritization workflow An important use case of subsetting is prioritization of data. For instance, after statistical analysis only certain feature groups are deemed relevant for the rest of the workflow. A common prioritization workflow is illustrated below: During the first step the workflow object is converted to a suitable format, most often using the as.data.frame() function. The converted data is then used as input for the prioritization strategy. Finally, these results are then used to select the data of interest in the original object. A very simplified example of such a process is shown below. featTab <- as.data.frame(fGroups, average = TRUE) # prioritization: sort by (averaged) intensity of the "sample" replicate group # (from high to low) and then obtain the feature group identifiers of the top 5. featTab <- featTab[order(featTab$standard, decreasing = TRUE), ] groupsOfInterest <- featTab$group[1:5] # subset the original data fGroups <- fGroups[, groupsOfInterest] # fGroups now only contains the feature groups for which intensity values in the # "sample" replicate group were in the top 5 "],["deleting-data.html", "5.4 Deleting data", " 5.4 Deleting data The delete() generic function can be used to manually delete workflow data. This function is used internally within patRoon to implement filtering and subsetting operations, but may also be useful for advanced data processing. Like the subset operator this function accepts a i and j parameter to specify which data should be operated on: Class Argument i Argument j features analysis feature index featureGroups analysis feature group formulas, compounds feature group candidate index components component feature group If i or j is not specified (NULL) then data is removed for the complete selection. Some examples are shown below: # delete 2nd feature in analysis-1 fList <- delete(fList, i = "analysis-1", j = 2) # delete first ten features in all analyses fList <- delete(fList, i = NULL, j = 1:10) # completely remove third/fourth analyses from feature groups fGroups <- delete(fGroups, i = 3:4) # delete specific feature group fGroups <- delete(fGroups, j = "M120_R268_30") # delete range of feature groups fGroups <- delete(fGroups, j = 500:750) # remove all results for a feature group formulas <- delete(formulas, i = "M120_R268_30") # remove top candidate for all feature groups compounds <- delete(compounds, j = 1) # remove a component components <- delete(components, i = "CMP1") # remove specific feature group from a component components <- delete(components, i = "CMP1", j = "M120_R268_30") # remove specific feature group from all components components <- delete(components, j = "M120_R268_30") The j parameter can also be a function: in this case it is called repeatedly on parts of the data to select what should be deleted. How the function is called and what it should return depends on the workflow data class: Class Called on every First argument Second argument Return value features analysis data.table with features analysis name Features indices (as integer or logical) featureGroups feature group vector with group intensities feature group name The analyses of the features to remove (as character, integer, logical) formulas, compounds feature group data.table with annotations feature group name Candidate indices (rows) components component data.table with the component component name The feature groups (as character, integer) Some examples for this: # remove features with intensities below 5000 fList <- delete(fList, j = function(f, ...) f$intensity <= 5E3) # same, but for features in all feature groups from specific analyses fGroups <- delete(i = 1:3, j = function(g, ...) g <= 5E3) # remove formula candidates with high relative mass deviation formulas <- delete(formulas, j = function(ft, ...) ft$error > 5) "],["unOv.html", "5.5 Unique and overlapping features", " 5.5 Unique and overlapping features Often an analysis batch is composed of different sample groups, such as different treatments, influent/effluent etc. In such scenarios it may be highly interesting to evaluate uniqueness or overlap between these samples. Furthermore, extracting overlapping or unique features is a simple but effective prioritization strategy. The overlap() and unique() functions can be used to extract overlapping and unique features between replicate groups, respectively. Both functions return a subset of the given featureGroups object. An overview of their arguments is given below. Argument Function(s) Remarks which unique(), overlap() The replicate groups to compare. relativeTo unique() Only return unique features compared to these replicate groups (NULL for all). Replicate groups in which are ignored. outer unique() If TRUE then only return features which are also unique among the compared replicates groups. exclusive overlap Only keep features that only overlap between the compared replicate groups. Some examples: # only keep features uniquely present in replicate group "repl1" fGroupsUn1 <- unique(fGroups, which = "repl1") # only keep features in repl1/repl2 which are not in repl3 fGroupsUn2 <- unique(fGroups, which = c("repl1", "repl2"), relativeTo = "repl3") # only keep features that are only present in repl1 OR repl2 fGroupsUn3 <- unique(fGroups, which = c("repl1", "repl2"), outer = TRUE) # only keep features overlapping in repl1/repl2 fGroupsOv1 <- overlap(fGroups, which = c("repl1", "repl2")) # only keep features overlapping in repl1/repl2 AND are not present in any other # replicate group fGroupsOv2 <- overlap(fGroups, which = c("repl1", "repl2"), exclusive = TRUE) In addition, several plotting functions are discussed in the visualization section that visualize overlap and uniqueness of features. "],["specSim.html", "5.6 MS similarity", " 5.6 MS similarity The spectral similarity is used to compare spectra from different features. For this purpose the spectrumSimilarity function can be used. This function operates on MS peak lists, and accepts the following function arguments: Argument Remarks MSPeakLists The MS peak lists object from which peak lists data should be taken. groupName1, groupName2 The name(s) of the first and second feature group(s) to compare analysis1, analysis2 The analysis names of the data to be compared. Set this when feature data (instead of feature group data) should be compared. MSLevel The MS level: 1 or 2 for MS and MS/MS, respectively. specSimParams Parameters that define how similarities are calculated. NAToZero If TRUE then NA values are converted to zeros. NA values are reported if a comparison cannot be made because of missing peak list data. The specSimParams argument defines the parameters for similarity calculations. It is a list, and the default values are obtained with the getDefSpecSimParams() function: getDefSpecSimParams() #> $method #> [1] "cosine" #> #> $removePrecursor #> [1] FALSE #> #> $mzWeight #> [1] 0 #> #> $intWeight #> [1] 1 #> #> $absMzDev #> [1] 0.005 #> #> $relMinIntensity #> [1] 0.05 #> #> $minPeaks #> [1] 1 #> #> $shift #> [1] "none" #> #> $setCombineMethod #> [1] "mean" The method field describes the calculation measure: this is either \"cosine\" or \"jaccard\". The shift field is primarily useful when comparing MS/MS data and defines if and how a spectral shift should be performed prior to similarity calculation: \"none\": The default, no shifting is performed. \"precursor\" The mass difference between the precursor mass of both spectra (i.e. the feature mass) is first calculated. This difference is then subtracted from each of the mass peaks of the second spectrum. This shifting increases similarity if the MS fragmentation process itself occurs similarly (i.e. if both features show similar neutral losses). \"both” This combines both shifting methods: first peaks are aligned that have the same mass, then the precursor strategy is applied for the remaining mass peaks. This shifting method yields higher similarities if either fragment masses or neutral losses are similar. To override a default setting, simply pass it as an argument to getDefSpecSimParams: getDefSpecSimParams(shift = "both") For more details on the various similarity calculation parameters see the reference manual (?getDefSpecSimParams). Some examples are shown below: # similarity between MS spectra with default parameters spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M137_R249_53") #> [1] 0.4088499 # similarity between MS/MS spectra with default parameters spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M192_R355_191", MSLevel = 2) #> [1] 0.08589848 # As above, with jaccard calculation spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M192_R355_191", MSLevel = 2, specSimParams = getDefSpecSimParams(method = "jaccard")) #> [1] 0.1111111 # With shifting spectrumSimilarity(mslists, groupName1 = "M120_R268_30", groupName2 = "M192_R355_191", MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) #> [1] 0.08589848 The spectrumSimilarity function can also be used to calculate multiple similarities. Simply specify multiple feature group names for the groupNameX parameters. Alternatively, if you want to compare the same set of feature groups with each other pass their names only as the groupName1 parameter: # compare two pairs spectrumSimilarity(mslists, groupName1 = c("M120_R268_30", "M137_R249_53"), groupName2 = c("M146_R309_68", "M192_R355_191"), MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) #> M146_R309_68 M192_R355_191 #> M120_R268_30 0.520052 0.08589848 #> M137_R249_53 0.197720 0.03372542 # compare all spectrumSimilarity(mslists, groupName1 = groupNames(mslists), MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) #> M120_R268_30 M137_R249_53 M146_R309_68 M192_R355_191 #> M120_R268_30 1.00000000 0.20406381 0.52005204 0.08589848 #> M137_R249_53 0.20406381 1.00000000 0.19772004 0.03372542 #> M146_R309_68 0.52005204 0.19772004 1.00000000 0.08524785 #> M192_R355_191 0.08589848 0.03372542 0.08524785 1.00000000 "],["visualization.html", "5.7 Visualization", " 5.7 Visualization 5.7.1 Features and annatation data Several generic functions are available to visualize feature and annotation data: Generic Classes Remarks plot() featureGroups, featureGroupsComparison Scatter plot for retention and m/z values plotInt() featureGroups Intensity profiles across analyses plotChroms() featureGroups, components Plot extracted ion chromatograms (EICs) plotSpectrum() MSPeakLists, formulas, compounds, components Plots (annotated) spectra plotStructure() compounds Draws candidate structures plotScores() formulas, compounds Barplot for candidate scoring plotGraph() componentsNT Draws interactive graphs of linked homologous series The most common plotting functions are plotChroms(), which plots chromatographic data for features, and plotSpectrum(), which will plot (annotated) spectra. An overview of their most important function arguments are shown below. Argument Generic Remarks rtWindow plotChroms() Extra time (in s) +/- retention limits of plotted features (useful to zoom out) retMin plotChroms() If TRUE plot retention times in minutes topMost plotChroms() Only draw this amount of highest intensity features in each group. topMostByRGroup plotChroms() If TRUE then the topMost parameter specifies the top most intense features in each replicate group to draw (e.g. topMost=1 would draw the most intense feature for each replicate group). showPeakArea, showFGroupRect plotChroms() Fill peak areas / draw rectangles around feature groups? title plotChroms(), plotSpectrum() Override plot title colourBy plotChroms() Colour individual feature groups (\"fGroups\") or replicate groups (\"rGroups\"). By default nothing is coloured (\"none\") showLegend plotChroms() Display a legend? (only if colourBy!=\"none\") onlyPresent plotChroms() Only plot EICs for analyses where a feature was detected? Setting to FALSE is useful to inspect if a feature was ‘missed’. xlim, ylim plotChroms(), plotSpectrum() Override x/y axis ranges, i.e. to manually set plotting range. groupName, analysis, precursor, index plotSpectrum() What to plot. See examples below. MSLevel plotSpectrum() Whether to plot an MS or MS/MS spectrum (only MSPeakLists) formulas plotSpectrum() Whether formula annotation should be added (only compounds) plotStruct plotSpectrum() Whether the structure should be added to the plot (only compounds) mincex plotSpectrum() Minimum annotation font size (only formulas/compounds) Note that we can use subsetting to select which feature data we want to plot, e.g. plotChroms(fGroups[1:2]) # only plot EICs from first and second analyses. #> Verifying if your data is centroided... plotChroms(fGroups[, 1]) # only plot all features of first group #> Verifying if your data is centroided... The plotStructure() function will draw a chemical structure for a compound candidate. In addition, this function can draw the maximum common substructure (MCS) of multiple candidates in order to assess common structural features. # structure for first candidate plotStructure(compounds, index = 1, groupName = "M120_R268_30") # MCS for first three candidates plotStructure(compounds, index = 1:3, groupName = "M120_R268_30") Some other common and less common plotting operations are shown below. plot(fGroups) # simple scatter plot of retention and m/z values plotChroms(fGroups) # plot EICs for all features #> Verifying if your data is centroided... # get overview of all feature groups plotChroms(fGroups, colourBy = "fGroup", # unique colour for each group topMost = 1, # only most intense feature in each group showPeakArea = TRUE, # show integrated areas showFGroupRect = FALSE, showLegend = FALSE) # no legend (too busy for many feature groups) #> Verifying if your data is centroided... plotChroms(fGroups[, 1], # only plot all features of first group colourBy = "rGroup") # and mark them individually per replicate group #> Verifying if your data is centroided... plotChroms(components, index = 7, fGroups = fGroups) # EICs from a component #> Verifying if your data is centroided... plotSpectrum(mslists, "M120_R268_30") # non-annotated MS spectrum plotSpectrum(mslists, "M120_R268_30", MSLevel = 2) # non-annotated MS/MS spectrum # formula annotated spectrum plotSpectrum(formulas, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists) # compound annotated spectrum, with added formula annotations plotSpectrum(compounds, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, formulas = formulas, plotStruct = TRUE) # custom intensity range (e.g. to zoom in) plotSpectrum(compounds, index = 1, groupName = "M120_R268_30", MSPeakLists = mslists, ylim = c(0, 5000), plotStruct = FALSE) plotSpectrum(components, index = 7) # component spectrum # Inspect homologous series plotGraph(componNT) 5.7.2 Overlapping and unique data There are three functions that can be used to visualize overlap and uniqueness between data: Generic Classes plotVenn featureGroups, featureGroupsComparison, formulas, compounds plotUpSet featureGroups, featureGroupsComparison, formulas, compounds plotChord featureGroups, featureGroupsComparison The most simple comparison plot is a Venn diagram (i.e. plotVenn()). This function is especially useful for two or three-way comparisons. More complex comparisons are better visualized with UpSet diagrams (i.e. plotUpSet()). Finally, chord diagrams (i.e. plotChord()) provide visually pleasing diagrams to assess overlap between data. These functions can either be used to compare feature data or different objects of the same type. The former is typically used to compare overlap or uniqueness between features in different replicate groups, whereas comparison between objects is useful to visualize differences in algorithmic output. Besides visualization, note that both operations can also be performed to modify or combine objects (see unique and overlapping features and algorithm consensus). As usual, some examples are shown below. plotUpSet(fGroups) # compare replicate groups plotVenn(fGroups, which = c("repl1", "repl2")) # compare some replicate groups plotChord(fGroups, average = TRUE) # overlap between replicate groups # compare with custom made groups plotChord(fGroups, average = TRUE, outer = c(repl1 = "grp1", repl2 = "grp1", repl3 = "grp2", repl4 = "grp3")) # compare GenForm and SIRIUS results plotVenn(formsGF, formsSIR, labels = c("GF", "SIR")) # manual labeling 5.7.3 MS similarity The plotSpectrum function is also useful to visually compare (annotated) spectra. This works for MSPeakLists, formulas and compounds object data. plotSpectrum(mslists, groupName = c("M120_R268_30", "M137_R249_53"), MSLevel = 2) plotSpectrum(compounds, groupName = c("M120_R268_30", "M146_R309_68"), index = c(1, 1), MSPeakLists = mslists) The specSimParams argument, which was discussed in MS similarity, can be used to configure the similarity calculation: plotSpectrum(mslists, groupName = c("M120_R268_30", "M137_R249_53"), MSLevel = 2, specSimParams = getDefSpecSimParams(shift = "both")) 5.7.4 Hierarchical clustering results In patRoon hierarchical clustering is used for some componentization algorithms and to cluster candidate compounds with similar chemical structure (see compound clustering). The functions below can be used to visualize their results. Generic Classes Remarks plot() All Plots a dendrogram plotInt() componentsIntClust Plots normalized intensity profiles in a cluster plotHeatMap() componentsIntClust Plots an heatmap plotSilhouettes() componentsClust Plot silhouette information to determine the cluster amount plotStructure() compoundsCluster Plots the maximum common substructure (MCS) of a cluster plot(componInt) # dendrogram plot(compsClust, groupName = "M120_R268_30") # dendrogram for clustered compounds plotInt(componInt, index = 4) # intensities of 4th cluster plotHeatMap(componInt) # plot heatmap plotHeatMap(componInt, interactive = TRUE) # interactive heatmap (with zoom-in!) plotSilhouettes(componInt, 5:20) # plot silhouettes (e.g. to obtain ideal cluster amount) 5.7.5 Generating EICs in DataAnalysis If you have Bruker data and the DataAnalysis software installed, you can automatically add EIC data in a DataAnalysis session. The addDAEIC() will do this for a single m/z in one analysis, whereas the addAllDAEICs() function adds EICs for all features in a featureGroups object. # add a single EIC with background subtraction addDAEIC("mysample", "~/path/to/sample", mz = 120.1234, bgsubtr = TRUE) # add TIC for MS/MS signal of precursor 120.1234 (value of mz is ignored for TICs) addDAEIC("mysample", "~/path/to/sample", mz = 100, ctype = "TIC", mtype = "MSMS", fragpath = "120.1234", name = "MSMS 120") addAllDAEICs(fGroups) # add EICs for all features addAllDAEICs(fGroups[, 1:50]) # as usual, subsetting can be used for partial data "],["intReview.html", "5.8 Interactively explore and review data", " 5.8 Interactively explore and review data The checkFeatures and checkComponents functions start a graphical user interface (GUI) which allows you to interactively explore and review feature and components data, respectively. checkFeatures(fGroups) # inspect features and feature groups checkComponents(componCAM, fGroups) # inspect components Both functions allow you to easily explore the data in an interactive way. Furthermore, these functions allow you to remove unwanted data. This is useful to remove for example features that are actually noise and feature groups that shouldn’t be in the same component. To remove an unwanted feature, feature group or components, simply uncheck its ‘keep’ checkbox. The next step is to save the selections you made. A check session is a file that stores which data should be removed. Once the session file is saved the filter function can be used to actually remove the data: fGroupsF <- filter(fGroups, checkFeaturesSession = TRUE) componCAMF <- filter(componCAM, checkComponentsSession = TRUE) If you saved the session and you re-launch the GUI it will restore the selections made earlier. The clearSession argument can be used to fully clear a session before starting the GUI, hence, all the data will be restored to their ‘keep state’. checkFeatures(fGroups, clearSession = TRUE) # start GUI with fresh session It is also possible to use multiple different sessions. This is especially useful if you do not want to overwrite previous session data or want to inspect different objects. In this case the session file name should be specified: checkFeatures(fGroups, "mysession.yml") fGroupsF <- filter(fGroups, checkFeaturesSession = "mysession.yml") The default session names are \"checked-features.yml\" and \"checked-components.yml\" for feature and component data, respectively. The extension of session file names is .yml since the YAML file format is used. An advantage of this format is that it is easily readable and editable with a text editor. Note that the session data is tied to the feature group names of your data. This means that, for instance, when you re-group your feature data after changing some parameters, the session data you prepared earlier cannot be used anymore. Since probably quite some manual work went into creating the session file, a special function is available to import a session that was made for previous data. This function tries its best to guess the new feature group name based on similarity of their retention times and m/z values. checkFeatures(fGroups) # do manual inspection fGroups <- groupFeatures(fList, ...) # re-group with different parameters importCheckFeaturesSession("checked-features.yml", "checked-features-new.yml", fGroups) checkFeatures(fGroups, session = "checked-features-new.yml") # inspect new data Take care to monitor the messages that importCheckFeaturesSession may output, as it may be possible that some ‘old’ feature groups are not found or are matched by multiple candidates of the new dataset. Some additional parameters exist to the functions described in this section. As usualy check the reference manual for more details (e.g. ?checkFeatures). NOTE Although the GUI tools described here allow you to easily filter out results, it is highly recommended to first prioritize your data to avoid doing a lot of unneeded manual work. "],["report.html", "5.9 Reporting", " 5.9 Reporting The previous sections showed various functionalies to inspect and visualize results. An easy and automated way to do this automatically is by using the reporting functionality of patRoon. The following three reporting functions are available: reportCSV(): exports workflow data to comma-separated value (csv) files reportPDF(): generates simple reports by plotting workflow data in portable document files (PDFs) reportHTML(): generates interactive and easily explorable reports There are many different arguments available to configure the reporting process. Some common arguments are listed below; for a complete listing see the reference manual (e.g. ?reporting). Argument Functions Remarks fGroups, formulas, compounds, formulas, components, compsCluster All Objects to plot. Only fGroups is mandatory. MSPeakLists reportPDF(), reportHTML() The MSPeakLists object that was used to generate annotation data. Only needs to be specified if formulas or compounds are reported. path All Directory path where report files will be stored (\"report\" by default). formulasTopMost, compoundsTopMost reportPDF(), reportHTML() Report no more than this amount of highest ranked candidates. EICOnlyPresent reportPDF(), reportHTML() Only plot an EIC for an analysis if a feature was detected. selfContained reportHTML() Outputs to a single and self contained .html file. Handy to share reports, but not recommended for large amounts of data. Which data will be reported is fully configurable. The only workflow object that must be specified are the feature groups (i.e. with the fGroups argument), all other data (e.g. compounds, components) are optional. This means that reporting can be performed at every stage during the workflow, which, for instance, can be useful to quickly inspect results when testing out various settings to generate workflow data. When formula or compound results are reported with reportPDF() or reportHTML() then only the top ranked candidates are considered. This limtation is often necessary as reporting many candidates will take considerable time. By default the top 5 for each feature group are reported, however, this number can be changed with the formulasTopMost and compoundsTopMost arguments. Some typical examples: reportHTML(fGroups) # simple interactive report with feature data # generate PDFs with feature and compound annotation data reportPDF(fGroups, compounds = compounds, MSPeakLists = mslists) reportCSV(fGroups, path = "myReport") # change destination path # generate report with all workflow types and increase maximum number of # compound candidates to top 10 reportHTML(fGroups, formulas = formulas, compounds = compounds, components = components, MSPeakLists = mslists, compsCluster = compsClust, compoundsTopMost = 10) "],["setsWorkflow.html", "6 Sets workflows", " 6 Sets workflows In LC-HRMS screening workflows it is typically desired to be able to detect a broad range of chemicals. For this reason, the samples are often measured twice: with positive and negative ionization. Most data processing steps are only suitable for data with the same polarity, for instance, due to the fact that the m/z values in mass spectra are inherently different (e.g. [M+H]+ vs [M-H]-) and MS/MS fragmentation occurs differently. As a result, the screening workflow has to be done twice, which generally requires more time and complicates comparing and interpretation of the complete (positive and negative) dataset. In patRoon version 2.0 the sets workflow is introduced. This allows you to perform a single non-target screening workflow from different sets of analyses files. Most commonly, each set represents a polarity, hence, there is a positive and negative set. However, more than two sets are supported, and other distinctions between sets are also possible, for instance, samples that were measured with different MS/MS techniques. Another important advantage of the sets workflow is that MS/MS data from different sets can be combined to provide more comprehensive annotations of features. The most important limitation is that (currently) the chromatographic method that was used when analyzing the samples from each set needs to be equal, since retention times are used to group features among the sets. Performing a sets workflow usually only requires small modifications compared to a ‘regular’ patRoon workflow. This chapter outlines how to perform such workflows and how to use its unique functionality for data processing. It is assumed that the reader is already familiar with performing ‘regular’ workflows, which were discussed in the previous chapters. "],["initiating-a-sets-workflow.html", "6.1 Initiating a sets workflow", " 6.1 Initiating a sets workflow A sets workflow is not much different than a ‘regular’ (or non-sets) workflow. For instance, consider the following workflow: anaInfo <- patRoonData::exampleAnalysisInfo("positive") fList <- findFeatures(anaInfo, "openms") fGroups <- groupFeatures(fList, "openms") fGroups <- filter(fGroups, absMinIntensity = 10000, relMinReplicateAbundance = 1, maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE) mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform", adduct = "[M+H]+") compounds <- generateCompounds(fGroups, mslists, "metfrag", adduct = "[M+H]+") reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, compounds = compounds) This example uses the example data from patRoonData to obtain a feature group dataset, which is cleaned-up afterwards. Then, feature groups are annotated and all the results are reported. Converting this to a sets workflow: anaInfoPos <- patRoonData::exampleAnalysisInfo("positive") anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative") fListPos <- findFeatures(anaInfoPos, "openms") fListNeg <- findFeatures(anaInfoNeg, "openms") fList <- makeSet(fListPos, fListNeg, adducts = c("[M+H]+", "[M-H]-")) fGroups <- groupFeatures(fList, "openms") fGroups <- filter(fGroups, absMinIntensity = 10000, relMinReplicateAbundance = 1, maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE) mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform") compounds <- generateCompounds(fGroups, mslists, "metfrag") reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, compounds = compounds) This workflow will do all the steps for positive and negative data. Only a few modifications were necessary: The analysis information is obtained for positive and negative data (i.e. per set) Features are found for each set separately. makeSet is used to combine the feature data There is no need to specify the adduct anymore in the annotation steps. NOTE The analysis names for the analysis information must be unique for each row, even among sets. Furthermore, replicate groups should not contain analyses from different sets. The key principle to make sets workflows work is performed by makeSet. This method function takes different features objects (or featureGroups, discussed later) to combine the feature data across sets. During this step features are neutralized: the feature m/z data is converted to neutral feature masses. This step ensures that when features are grouped with groupFeatures, its algorithms are able to find the same feature among different sets, even when different MS ionization modes were used during acquisition. However, please note that (currently) no additional chromatographic alignment steps between sets are performed. For this reason, the chromatographic methodology that is used to acquire the data must be the same for all sets. The feature neutralization step relies on adduct data. In the example above, it is simply assumed that all features measured with positive mode are protonated (M+H) species, and all negative features are deprotonated (M-H). It is also possible to use adduct annotations for neutralization; this is discussed later. NOTE The newProject tool can be used to easily generate a sets workflow. Simply select “both” for the Ionization option. "],["generating-sets-workflow-data.html", "6.2 Generating sets workflow data", " 6.2 Generating sets workflow data As was shown in the previous section, the generation of workflow data with a sets workflow largely follows that as what was discussed in the previous chapters. The same generator functions are used: Workflow step Function Output S4 class Grouping features groupFeatures() featureGroupsSet Suspect screening screenSuspects() featureGroupsScreeningSet MS peak lists generateMSPeakLists() MSPeakListsSet Formula annotation generateFormulas() formulasSet Compound annotation generateCompounds() compoundsSet Componentization generateComponents() algorithm dependent (the data pre-treatment and feature finding steps have been omitted as they are not specific to sets workflows). While the same function generics are used to generate data, the class of the output objects differ (e.g. formulasSet instead of formulas). However, since all these classes inherit from their non-sets workflow counterparts, using the workflow data in a sets workflow is nearly identical to what was discussed in the previous chapters (further discussed in the next section). As discussed before, an important step is the neutralization of features. Other workflow steps also have internal mechanics to deal with data from different sets: Workflow step Handling of set data Finding/Grouping features Neutralization of m/z values Suspect screening Merging results from screening performed for each set Componentization Algorithm dependent (discussed below) MS peak lists MS data is obtained and stored per set. The final peak lists are combined (not averaged) Formula/Compound annotation Annotation is performed for each set separately and used to generate a final consensus In most cases the algorithms of the workflow steps are first performed for each set, and this data is then merged. To illustrate the importance of this, consider these examples A suspect screening with a suspect list that contains known MS/MS fragments Annotation where MS/MS fragments are used to predict the chemical formula Componentization in order to establish adduct assignments for the features In all cases data is used that is highly dependent on the MS method (eg polarity) that was used to acquire the sample data. Nevertheless, all the steps needed to obtain and combine set data are performed automatically in the background, and are therefore largely invisible. NOTE Because feature groups in sets workflows always have adduct annotations, it is never required to specify the adduct or ionization mode when generating annotations, components or do suspect screening (i.e. the adduct/ionization arguments should not be specified). 6.2.1 Componentization When the componentization algorithms related to adduct/isotope annotations (e.g. CAMERA, RAMClustR and cliqueMS) and nontarget are used, then componentization occurs per set and the final object (a componentsSet or componentsNTSet) contains all the components together. Since these algorithms are highly dependent upon MS data polarity, no attempt is made to merge components from different sets. The other componentization algorithms work on the complete data. For more details, see the reference manual (?generateComponents). 6.2.2 Formula and compound annotation For formula and compound annotation, the data generated for each set is combined to generate a set consensus. The annotation tables are merged, scores are averaged and candidates are re-ranked. More details can be found in the reference manual (e.g. ?generateCompounds). In addition, it possible to only keep candidates that exist in a minimum number of sets. For this, the setThreshold and setThresholdAnn argument can be used: # candidate must be present in all sets formulas <- generateFormulas(fGroups, mslists, "genform", setThreshold = 1) # candidate must be present in all sets with annotation data compounds <- generateCompounds(fGroups, mslists, "metfrag", setThresholdAnn = 1) In the first example, a formula candidate for a feature group is only kept if it was found for all of the sets. In the second example, a compound candidate is only kept if it was present in all of the sets with annotation data available. The following examples of a common positive/negative sets workflow illustrate the differences: Candidate annotations candidate present setThreshold=1 setThresholdAnn=1 #1 +, - +, - Keep Keep #2 +, - + Remove Remove #3 + + Remove Keep For more information refer to the reference manual (e.g. ?generateCompounds). "],["setsAdducts.html", "6.3 Selecting adducts to improve grouping", " 6.3 Selecting adducts to improve grouping The selectIons() and adduct() functions discussed before can also improve sets workflows. This is because the adduct annotations can be used to improve feature neutralization, which in turn will improve grouping features between positive and negative ionization data. Once adduct annotations are set the features will be re-neutralized and re-grouped. A typical workflow with selectIons looks like this: # as before ... anaInfoPos <- patRoonData::exampleAnalysisInfo("positive") anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative") fListPos <- findFeatures(anaInfoPos, "openms") fListNeg <- findFeatures(anaInfoNeg, "openms") fGroupsPos <- groupFeatures(fListPos, "openms") fGroupsNeg <- groupFeatures(fListNeg, "openms") fList <- makeSet(fListPos, fListNeg, adducts = c("[M+H]+", "[M-H]-")) fGroups <- groupFeatures(fList, "openms") fGroups <- filter(fGroups, absMinIntensity = 10000, relMinReplicateAbundance = 1, maxReplicateIntRSD = 0.75, blankThreshold = 5, removeBlanks = TRUE) components <- generateComponents(fGroups, "openms") fGroups <- selectIons(fGroups, components, c("[M+H]+", "[M-H]-")) # do rest of the workflow... The first part of the workflow is exactly the same as was introduced in the beginning of this chapter. Furthermore, note that for sets workflows, selectIons needs a preferential adduct for each set. The adducts function can also be used to obtain and modify adduct annotations. For sets workflows, these functions operate per set: adducts(fGroups, set = "positive")[1:5] adducts(fGroups, set = "positive")[4] <- "[M+K]+" If you want to modify annotations for multiple sets, it is best to delay the re-gouping step: adducts(fGroups, set = "positive", reGroup = FALSE)[4] <- "[M+K]+" adducts(fGroups, set = "negative", reGroup = TRUE)[10] <- "[M-H2O]-" Setting reGroup=FALSE will not perform any re-neutralization and re-grouping, which preserves feature group names and safes processing time. However, it is crucial that the re-grouping step is eventually performed at the end. "],["processing-data.html", "6.4 Processing data", " 6.4 Processing data All data objects that are generated during a sets workflow inherit from the classes from a ‘regular’ workflow. This means that, with some minor exceptions, all of the data processing functionality discussed in the previous chapter (e.g. subsetting, inspection, filtering, plotting, reporting) is also applicable to a sets workflow. For instance, the as.data.table() method can be used for general inspection: as.data.table(compounds)[1:5, c("group", "score", "compoundName", "set")] #> group score compoundName set #> 1: M198_R317_272 4.025217 3-(4-chlorophenyl)-1,1-dimethylurea positive,negative #> 2: M198_R317_272 1.946688 3-(3-chlorophenyl)-1,1-dimethylurea positive,negative #> 3: M198_R317_272 1.745251 1-(4-chlorophenyl)-3-ethylurea positive,negative #> 4: M198_R317_272 1.838637 3-amino-5-chloro-N,N-dimethylbenzamide positive,negative #> 5: M198_R317_272 2.366149 5-[[(2R)-azetidin-2-yl]methoxy]-2-chloropyridine positive,negative In addition, some the data processing functionality contains additional functionality for a sets workflow: # only keep feature groups that have positive data fGroupsPos <- fGroups[, sets = "positive"] # only keep feature groups that have feature data for all sets fGroupsF <- filter(fGroups, relMinSets = 1) # only keep feature groups with features present in both polarities fGroupsPosNeg <- overlap(fGroups, which = c("positive", "negative"), sets = TRUE) # only keep feature groups with features that are present only in positive mode fGroupsOnlyPos <- unique(fGroups, which = "positive", sets = TRUE) And plotting: plotVenn(fGroups, sets = TRUE) # compare positive/negative features plotSpectrum(compounds, index = 1, groupName = "M198_R317_272", MSPeakLists = mslists, plotStruct = TRUE) The reference manual for the workflow objects contains specific notes applicable to sets workflows (?featureGroups, ?compounds etc). "],["advanced.html", "6.5 Advanced", " 6.5 Advanced 6.5.1 Initiating a sets workflow from feature groups The makeSet function can also be used to initiate a sets workflow from feature groups: # as before ... anaInfoPos <- patRoonData::exampleAnalysisInfo("positive") anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative") fListPos <- findFeatures(anaInfoPos, "openms") fListNeg <- findFeatures(anaInfoNeg, "openms") fGroupsPos <- groupFeatures(fListPos, "openms") fGroupsNeg <- groupFeatures(fListNeg, "openms") fGroups <- makeSet(fGroupsPos, fGroupsNeg, groupAlgo = "openms", adducts = c("[M+H]+", "[M-H]-")) # do rest of the workflow... In this case makeSet combines the positive and negative (un-grouped) features, neutralizes them and re-groups them all together (with the algorithm specified by groupAlgo). While this option involves some extra steps, an advantage is that allows processing the feature data before they are combined, e.g.: fGroupsPos <- groupFeatures(fListPos, "openms") fGroupsNeg <- groupFeatures(fListNeg, "openms") # apply intensity theshold filters. Lower threshold for negative. fGroupsPos <- filter(fGroupsPos, absMinIntensity = 1E4) fGroupsNeg <- filter(fGroupsNeg, absMinIntensity = 1E3) fGroups <- makeSet(fGroupsPos, fGroupsNeg, groupAlgo = "openms", adducts = c("[M+H]+", "[M-H]-")) Visually, this workflow looks like this: Of course, any other processing steps on the feature groups data such as subsetting and visually checking features are also possible before the sets workflow is initiated. Furthermore, it is also possible to perform adduct annotations prior to grouping, which is an alternative way to improve neutralization to what was discussed before. 6.5.2 Inspecting and converting set objects The following generic functions may be used to inspect or convert data from sets workflows: Generic Purpose Notes sets Return the names of the sets in this object. setObjects Obtain the raw data objects that were used to construct this object. Not available for features and feature groups. unset Converts this object to a regular workflow object. The set argument must be given to specify which of the set data is to be converted. This function will restore the original m/z values of features. These methods are heavily used internally, but rarely needed otherwise. More details can be found in the reference manual. "],["TPs.html", "7 Transformation product screening", " 7 Transformation product screening This chapter describes the various functionality for screening of transformation products (TPs), which are introduced since patRoon 2.0. Screening for TPs, i.e. chemicals that are formed from a parent chemical by e.g. chemical or biological processes, has broad applications. For this reason, the TP screening related functionality is designed to be flexible, thus allowing one to use a workflow that is best suited for a particular study. Regardless, the TP screening workflow in patRoon can be roughly summarized as follows: Parent screening During this step a common patRoon workflow is used to screen for the parent chemicals of interest. This could be a full non-target analysis with compound annotation or a relative simple suspect or target screening. Obtaining TPs Data is obtained of potential TPs for the parents of interest. The TPs may originate from a library or predicted in-silico. Note that in some workflows this step is omitted (discussed later). TP screening A suspect screening is performed to find the TPs in the analysis data. Linking parents and TPs In the step the parent features are linked with the TP features. Several post-processing functionality exists to improve and prioritize the data. The next sections will outline more details on these steps are performed and configured. The last section in this chapter outlines several example workflows. NOTE The newProject tool can be used to easily generate a workflow with transformation product screening. "],["genTPs.html", "7.1 Obtaining transformation product data", " 7.1 Obtaining transformation product data The generateTPs function is used to obtain TPs for a particular set of parents. Like other workflow generator functions (findFeatures, generateCompounds), several algorithms are available that do the actual work. Algorithm Usage Remarks BioTransformer generateTPs(algorithm = \"biotransformer\", ...) Predicts TPs with full structural information Library generateTPs(algorithm = \"library\", ...) Obtains transformation products from a library (PubChem transformations or custom) Metabolic logic generateTPs(algorithm = \"logic\", ...) Uses pre-defined logic to predict TPs based on common elemental differences (e.g. hydroxylation, demethylation). Based on Schollee et al. (2015). The biotransformer and library algorithms provide full structural information of the TPs (e.g. formula, SMILES, predicted Log P). However, these algorithms also depend on the full chemical structure of the parent compound. Hence, these algorithms are typically suitable when parents are known in advance or were found by a suspect screening. On the other hand, metabolic logic only requires the feature mass, and this simplicity allows it to predict TPs for all features. This algorithm is most suitable for full non-target analysis, however, extra care must be taken to rule out false positives. An overview of common arguments for TP generation is listed below. Argument Algorithm(s) Remarks parents biotransformer, library The input parents. See section below. fGroups logic The input feature groups to calculate TPs for. type biotransformer The prediction type: \"env\", \"ecbased\", \"cyp450\", \"phaseII\", \"hgut\", \"superbio\", \"allHuman\". See BioTransformer for more details. TPLibrary/transformations library/logic Custom TP library/transformation rules. adduct logic The assumed adduct of the parents (e.g. \"[M+H]+\"). Not needed when adduct annotations are available. 7.1.1 Parent input The input parent structures for the biotransformer and library algorithms must be one the following: A suspect list (follows the same format as suspect screening) A feature groups object with screening results (e.g. obtained with screenSuspects, see suspect screening) A compounds object obtained with compound annotation In the former two cases the parent information is taken from the suspect list or from the hits in a suspect screening worklow, respectively. The last case is more suitable for when the parents are not completely known. In this case, the candidate structures from a compound annotation are used as input to obtain TPs. Since all the candidates are used, it is highly recommend to filter the object in advance, for instance, with the topMost filter. For library, the parent input is optional: if no parents are specified then TP data for all parents in the database is used. For the logic algorithm TPs are predicted directly for feature groups. Since this algorithm can only perform very basic validity checks, it is strongly recommended to first prioritize the feature group data. Some typical examples: # predict environmental TPs with BioTransformer for all parents in a suspect list TPsBT <- generateTPs("biotransformer", parents = patRoonData::suspectsPos, type = "env") # obtain all TPs from the default library TPsLib <- generateTPs("library") # get TPs for the parents from a suspect screening TPsLib <- generateTPs("library", parents = fGroupsScr) # calculate TPs for all feature groups TPsLogic <- generateTPs("logic", fGroups, adduct = "[M+H]+") 7.1.2 Processing data Similar to other workflow data, several generic functions are available to inspect the data: Generic Classes Remarks length() All Returns the total number of transformation products names() All Returns the names of the parents parents() All Returns a table with information about the parents products() All Returns a list with for each parent a table with TPs as.data.table(), as.data.frame All Convert all the object information into a data.table/data.frame \"[[\" / \"$\" operators All Extract TP information for a specified parent Some examples: # just show a few columns in this example, there are many more! # note: the double dot syntax (..cols) is necessary since the data is stored as data.tables cols <- c("name", "formula", "InChIKey") parents(TPs)[1:5, ..cols] #> name formula InChIKey #> 1: (-)-bisoprolol C18H31NO4 VHYCDWMUTMEGQY-KRWDZBQOSA-N #> 2: (-)-Epigallocatechin C15H14O7 XMOCLSLCDHWDHP-IUODEOHRSA-N #> 3: (-)-Epigallocatechin gallate C22H18O11 WMBWREPUVVBILR-WIYYLYMNSA-N #> 4: (-)-ethosuximide C7H11NO2 HAPOVYFOVVWLRS-SSDOTTSWSA-N #> 5: (-)-etodolac C17H21NO3 NNYBQONXHNTVIJ-QGZVFWFLSA-N TPs[["DEET"]][, ..cols] #> name formula InChIKey #> 1: DEET-TP-N,N-diethyl-m-hydroxymethylbenzamide C12H17NO2 FRZJZRVZZNTMAW-UHFFFAOYSA-N #> 2: DEET-TP-N-Ethyl-N-(2-hydroxyethyl)-3-methylbenzamide C12H17NO2 KVTUZBGZTRABBQ-UHFFFAOYSA-N #> 3: DEET-TP-acetaldehyde C2H4O IKHGUXGNUITLKF-UHFFFAOYSA-N #> 4: DEET-TP-N-ethyl-m-toluamide C10H13NO FPINATACRXASTP-UHFFFAOYSA-N TPs[[2]][, ..cols] #> name formula InChIKey #> 1: (-)-Epigallocatechin-TP-(-)-Epigallocatechin, 3p-hydroxy-glucuronide C21H22O13 CQDATFYRGVZXLF-ZVHNUXTDSA-N as.data.table(TPs)[1:5, 1:3] #> parent transformation name #> 1: (-)-bisoprolol O-deisopropylation / Human Phase I (-)-bisoprolol-TP-(-)-bisoprolol, O-deisopropyl #> 2: (-)-Epigallocatechin Aromatic-OH glucuronidation / Human Phase II (-)-Epigallocatechin-TP-(-)-Epigallocatechin, 3p-hydroxy-glucuronide #> 3: (-)-Epigallocatechin gallate Aromatic-OH glucuronidation / Human Phase II (-)-Epigallocatechin gallate-TP-(-)-Epigallocatechin gallate, 3p-hydroxy-glucuronide #> 4: (-)-Epigallocatechin gallate Aromatic-OH glucuronidation / Human Phase II (-)-Epigallocatechin gallate-TP-(-)-Epigallocatechin gallate, 4p-hydroxy-glucuronide #> 5: (-)-ethosuximide Aliphatic Hydroxylation / Human Phase I (-)-ethosuximide-TP-3-(1-Hydroxyethyl)-3-methylpyrrolidine-2,5-dione In addition, the following generic functions are available to modify or convert the object data: Generic Classes Remarks \"[\" operator All Subset this object on given parents filter transformationProductsBT Filters this object convertToSuspects All Generates a suspect list of all TPs (and optionally parents) that is suitable for screenSuspects convertToMFDB transformationProductsBT, transformationProductsLibrary Generates a MetFrag database for all TPs (and optionally parents) TPs2 <- TPs[1:10] # only keep results for first ten parents # remove transformation products that are isomers to their parent or sibling TPs # may simplify data as these are often difficult to identify TPsF <- filter(TPs, removeParentIsomers = TRUE, removeTPIsomers = TRUE) # remove duplicate transformation products from each parent # these can occur if different pathways yield the same TPs TPsF <- filter(TPs, removeDuplicates = TRUE) # only keep TPs that have a structural similarity to their parent of >= 0.5 TPsF <- filter(TPs, minSimilarity = 0.5) # do a suspect screening for all TPs and their parents suspects <- convertToSuspects(TPs, includeParents = TRUE) fGroupsScr <- screenSuspects(fGroups, suspects, onlyHits = TRUE) # use the TP data for a specialized MetFrag database convertToMFDB(TPs, "TP-database.csv", includeParents = FALSE) compoundsTPs <- generateCompounds(fGroups, mslists, "metfrag", database = "csv", extraOpts = list(LocalDatabasePath = "TP-database.csv")) The convertToSuspects function is always part of a workflow with biotransformer or library TPs. This is discussed further in the next section. The convertToMFDB function is especially handy with biotransformer workflows, as it allows generating a compound database for TPs that may not be available in other databases. This is further demonstrated in the first example. 7.1.3 Custom libraries and transformations By default the library and logic algorithms use data that is installed with patRoon (based on PubChem transformations and Schollee et al. (2015), respectively). However, it is also possible to use custom data. To use a custom TP library a simple data.frame is needed with the names, SMILES and optionally log P values for the parents and TPs. The log P values are used for prediction of the retention time direction of a TP compared to its parent, as is discussed further in the next section. The following small library has two TPs for benzotriazole and one for DEET: myTPLib <- data.frame(parent_name = c("1H-Benzotriazole", "1H-Benzotriazole", "DEET"), parent_SMILES = c("C1=CC2=NNN=C2C=C1", "C1=CC2=NNN=C2C=C1", "CCN(CC)C(=O)C1=CC=CC(=C1)C"), TP_name = c("1-Methylbenzotriazole", "1-Hydroxybenzotriazole", "N-ethyl-m-toluamide"), TP_SMILES = c("CN1C2=CC=CC=C2N=N1", "C1=CC=C2C(=C1)N=NN2O", "CCNC(=O)C1=CC=CC(=C1)C")) myTPLib #> parent_name parent_SMILES TP_name TP_SMILES #> 1 1H-Benzotriazole C1=CC2=NNN=C2C=C1 1-Methylbenzotriazole CN1C2=CC=CC=C2N=N1 #> 2 1H-Benzotriazole C1=CC2=NNN=C2C=C1 1-Hydroxybenzotriazole C1=CC=C2C(=C1)N=NN2O #> 3 DEET CCN(CC)C(=O)C1=CC=CC(=C1)C N-ethyl-m-toluamide CCNC(=O)C1=CC=CC(=C1)C To use this library, simply pass it to the TPLibrary argument: TPs <- generateTPs("library", TPLibrary = myTPLib) Similarly, for logic a table with custom transformation rules can be specified for TP calculations: myTrans <- data.frame(transformation = c("hydroxylation", "demethylation"), add = c("O", ""), sub = c("", "CH2"), retDir = c(-1, -1)) myTrans #> transformation add sub retDir #> 1 hydroxylation O -1 #> 2 demethylation CH2 -1 The add and sub columns are used to denote the elements that are added or subtracted by the reaction. These are used to calculate mass differences between parents and TPs. The retDir column is used to indicate the retention time direction of the parent compared to the TP: -1 (elutes before parent), 1 (elutes after parent) or 0 (similar or unknown). The next section describes how this data can be used to filter TPs. The custom rules can be used by passing them to the transformations argument: TPs <- generateTPs("logic", fGroups, adduct = "[M+H]+", transformations = myTrans) References "],["linking-parent-and-transformation-product-features.html", "7.2 Linking parent and transformation product features", " 7.2 Linking parent and transformation product features This section discusses one of the most important steps in a TP screening workflow, which is to link feature groups of parents with those of candidate transformation products. During this step, components are made, where each component consist of one or more feature groups of detected TPs for a particular parent. Note that componentization was already introduced before, but for very different algorithms. However, the data format for TP componentization is highly similar. After componentization, several filters are available to clean and prioritize the data. These can even allow workflows without obtaining potential TPs in advance, which is discussed in the last subsection. 7.2.1 Componentization Like other algorithms, the generateComponents generic function is used to generate TP components, by setting the algorithm parameter to \"tp\". The following arguments are of importance: Argument Remarks fGroups The input feature groups for the parents fGroupsTPs The input feature groups for the TPs ignoreParents Set to TRUE to ignore feature groups in fGroupsTPs that also occur in fGroups TPs The input transformation products, ie as generated by generateTPs() MSPeakLists, formulas, compounds Annotation objects used for similarity calculation between the parent and its TPs minRTDiff The minimum retention time difference (seconds) of a TP for it to be considered to elute differently than its parent. 7.2.1.1 Feature group input The fGroups, fGroupsTPs and ignoreParents arguments are used by the componentization algorithm to identify which feature groups can be considered as parents and which as TPs. Three scenarios are possible: fGroups=fGroupsTPs and ignoreParents=FALSE: in this case no distinction is made, and all feature groups are considered a parent or TP (default if fGroupsTPs is not specified). fGroups and fGroupsTPs contain different subsets of the same featureGroups object and ignoreParents=FALSE: only the feature groups in fGroups/fGroupsTPs are considered as parents/TPs. As above, but with ignoreParents=TRUE: the same distinction is made as above, but any feature groups in fGroupsTPs are ignored if also present in fGroups. The first scenario is often used if it is unknown which feature groups may be parents or which are TPs. Furthermore, this scenario may also be used if the dataset is sufficiently simple, for instance, because a suspect screening with the results from convertToSuspects (discussed in the previous section) would reliably discriminate between parents and TPs. A workflow with the first scenario is demonstrated in the second example. In all other cases it is recommended to use either the second or third scenario, since making a prior distinction between parent and TP feature groups greatly simplifies the dataset and reduces false positives. A relative simple example where this can be used is when there are two sample groups: before and after treatment. componTP <- generateComponents(algorithm = "tp", fGroups = fGroups[rGroups = "before"], fGroupsTPs = fGroups[rGroups = "after"]) In this example, only those feature groups present in the “before” replicate group are considered as parents, and those in “after” may be considered as a TP. Since it is likely that there will be some overlap in feature groups between both sample groups, the ignoreParents flag can be used to not consider any of the overlap for TP assignments: componTP <- generateComponents(algorithm = "tp", fGroups = fGroups[rGroups = "before"], fGroupsTPs = fGroups[rGroups = "after"], ignoreParents = TRUE) More sophisticates ways are of course possible to provide an upfront distinction between parent/TP feature groups. In the fourth example a workflow is demonstrated where fold changes are used. NOTE The feature groups specified for fGroups/fGroupsTPs must always originate from the same featureGroups object. For the library and biotransformer algorithms it is mandatory that a suspect screening of parents and TPs is performed prior to componentization. This is necessary for the componentization algorithm to map the feature groups that belong to a particular parent or TP. To do so, the convertToSuspects function is used to prepare the suspect list: # set includeParents to TRUE since both the parents and TPs are needed suspects <- convertToSuspects(TPs, includeParents = TRUE) fGroupsScr <- screenSuspects(fGroups, suspects, onlyHits = TRUE) # do the componentization # a similar distinction between fGroups/fGroupsScr as discussed above can of course also be done componTP <- generateComponents(fGroups = fGroupsScr, ...) If a parent screening was already performed in advance, for instance when the input parents to generateTPs are screening results, the screening results for parents and TPs can also be combined. The second example demonstrates this. Note that in the case a parent suspect is matched to multiple feature groups, a component is made for each match. Similarly, if multiple feature groups match to a TP suspect, all of them will be incorporated in the component. When TPs were generated with the logic algorithm a suspect screening must also be carried out in advance. However, in this case it is not necessary to include the parents (since each parent equals a feature group no mapping is necessary). The onlyHits variable to screenSuspects must not be set in order to keep the parents. # only screen for TPs suspects <- convertToSuspects(TPs, includeParents = FALSE) # but keep all other feature groups as these may be parents fGroupsScr <- screenSuspects(fGroups, suspects, onlyHits = FALSE) # do the componentization... 7.2.1.2 Annotation similarity calculation If additional annotation data for parents and TPs is given to the componentization algorithm, it will be used to calculate various similarity properties. Often, the chemical structure for a transformation product is similar to that of its parent. Hence, there is a good chance that a parent and its TPs also share similar MS/MS data. Firstly, if MS peak lists are provided, then the spectrum similarity is calculated between each parent and its potential TP candidates. This is performed with all the three different alignment shifts (see the spectrum similarity section for more details). In case formulas and/or compounds objects are specified, then a parent/TP comparison is made by counting the number of fragments and neutral losses that they share (by using the formula annotations). This property is mainly used for non-target workflows where the identity for a parent and TP is not yet well established. For this reason, fragments and neutral losses reported for all candidates for the parent/TP feature group are considered. Hence, it is highly recommend to pre-treat the annotation objects, for instance, with the topMost filter. If both formulas and compounds are given the results are pooled. Note that each unique fragment/neutral loss is only counted once, thus multiple formula/compound candidates with the same annotations will not skew the results. 7.2.2 Processing data The output of TP componentization is an object of the componentsTPs class. This derives from the ‘regular’ components class, therefore, all the data processing functionality described before (extraction, subsetting, filtering etc) are also valid for TP components. Several additional filters are available to prioritize the data: Filter Remarks retDirMatch If TRUE only keep TPs with an expected chromatographic retention direction compared to the parent. minSpecSim, minSpecPrec, minSpecSimBoth The minimum spectrum similarity between the parent and TP. Calculated with no, \"precursor\" and \"both\" alignment shifting (see spectrum similarity). minFragMatches, minNLMatches Minimum number of formula fragment/neutral loss matches between parent and TP (discussed in previous section). formulas A formulas object used to further verify candidate TPs that were generated by the logic algorithm. The retDirMatch filter compares the expected and observed retention time direction of a TP in order to decide if it should be kept. The direction is a value of either -1 (TP elutes before parent), +1 (TP elutes after parent) or 0 (TP elutes very close to the parent or its direction is unknown). The directions are taken from the generated transformation products. For the library and biotransformer algorithms the log P values are compared of a TP and its parent. Here, it is assumed that lower log P values result in earlier elution (i.e. typical with reversed phase LC). For the logic algorithm the retention time direction is taken from the transformation rules table. Note that specifying a large enough value for the minRTDiff argument to generateComponents is important to ensure that some tolerance exists while comparing retention time directions of parent and TPs. This filter does nothing if either the observed or expected direction is zero. When TPs data was generated with the logic algorithm it is recommended to use the formulas filter. This filter uses formula annotations to verify that (1) a parent feature group contains the elements that are subtracted during the transformation and (2) the TP feature group contains the elements that were added during the transformation. Since the ‘right’ candidate formula is most likely not yet known, this filter looks at all candidates. Therefore, it is recommended to filter the formulas object, for instance, with the topMost filter. 7.2.3 Omitting transformation product input The TPs argument to generateComponents can also be omitted. In this case every feature group of fGroupTPs is considered to be a potential TP for the potential parents specified for fGroups. An advantage is that the screening workflow is not limited to any known TPs or transformations. However, such a workflow has high demands on prioritiation steps before and after the componentization to rule out the many false positives that may occur. When no transformation data is supplied it is crucial to make a prior distinction between parent and TP feature groups. Afterwards, the MS/MS spectral and other annotation similarity filters mentioned in the previous section may be a powerful way to further prioritize data. The fourth example demonstrates such a workflow. 7.2.4 Reporting TP components The TP components can be reported with the reportHTML function. This is done by setting the components function argument (i.e. equally to all other component types). The results will be displayed with a customized format that allows easy exploring of each parent with its TPs. reportHTML(fGroups, components = componTP) "],["TPsExamples.html", "7.3 Example workflows", " 7.3 Example workflows The next subsections demonstrate several approaches to perform a TP screening workflow with patRoon. In all examples it is assumed that feature groups were already obtained (with the findFeatures and groupFeatures functions) and stored in the fGroups variable. The workflows with patRoon are designed to be flexible, and the examples here are primarily meant to implement your own workflow. Furthermore, some of the techniques used in the examples can also be combined. For instance, the Fold change classification and MS/MS similarity filters applied in the fourth example could also be applied to any of the other examples. 7.3.1 Screen predicted TPs for targets The first example is a simple workflow where TPs are predicted for a set of given parents with BioTransformer and subsequently screened. A MetFrag compound database is generated and used for annotation. # predict TPs for a fixed list of parents TPs <- generateTPs("biotransformer", parents = patRoonData::suspectsPos) # screen for the TPs suspectsTPs <- convertToSuspects(TPs, includeParents = FALSE) fGroupsTPs <- screenSuspects(fGroups, suspectsTPs, adduct = "[M+H]+", onlyHits = TRUE) # perform annotation of TPs mslistsTPs <- generateMSPeakLists(fGroupsTPs, "mzr") convertToMFDB(TPs, "TP-database.csv", includeParents = FALSE) # generate MetFrag database compoundsTPs <- generateCompounds(fGroupsTPs, mslistsTPs, "metfrag", adduct = "[M+H]+", database = "csv", extraOpts = list(LocalDatabasePath = "TP-database.csv")) 7.3.2 Screening TPs from a library for suspects In this example TPs of interest are obtained for the parents that surfaced from of a suspect screening. The steps of this workflow are: Suspect screening parents. Obtain TPs for the suspect hits from a library. A second suspect screening is performed for TPs and the original parent screening results are amended. Note that the parent data is needed for componentization. Both parents and TPs are annotated using a database generated from their chemical structures. Some prioritization is performed by Only keeping candidate structures for which in-silico fragmentation resulted in at least one annotated MS/MS peak. Only keeping suspect hits with an estimated identification level of 3 or better. The TP components are made and only feature groups with parent/TP assignments are kept. All results are reported. # step 1 fGroupsScr <- screenSuspects(fGroups, patRoonData::suspectsPos, adduct = "[M+H]+") # step 2 TPs <- generateTPs("library", parents = fGroupsScr) # step 3 suspects <- convertToSuspects(TPs) fGroupsScr <- screenSuspects(fGroupsScr, suspects, adduct = "[M+H]+", onlyHits = TRUE, amend = TRUE) # step 4 mslistsScr <- generateMSPeakLists(fGroupsScr, "mzr") convertToMFDB(TPs, "TP-database.csv", includeParents = TRUE) compoundsScr <- generateCompounds(fGroupsScr, mslistsScr, "metfrag", adduct = "[M+H]+", database = "csv", extraOpts = list(LocalDatabasePath = "TP-database.csv")) # step 5a compoundsScr <- filter(compoundsScr, minExplainedPeaks = 1) # step 5b fGroupsScrAnn <- annotateSuspects(fGroupsScr, MSPeakLists = mslistsScr, compounds = compoundsScr) fGroupsScrAnn <- filter(fGroupsScrAnn, maxLevel = 3, onlyHits = TRUE) # step 6 componTP <- generateComponents(fGroupsScrAnn, "tp", TPs = TPs, MSPeakLists = mslistsScr, compounds = compoundsScr) fGroupsScrAnn <- fGroupsScrAnn[results = componTP] # step 7 reportHTML(fGroupsScrAnn, MSPeakLists = mslistsScr, compounds = compoundsScr, components = componTP) 7.3.3 Non-target screening of predicted TPs This example uses metabolic logic to calculate possible TPs for all feature groups from a complete non-target screening. This example demonstrates how a workflow can be performed when little is known about the identity of the parents. The steps of this workflow are: Formula annotations are performed for all feature groups. These results are then limited to the top 5 candidates, and only feature groups with annotations are kept. The TPs are calculated for all remaining feature groups. A suspect screening is performed to find the TPs. Unlike the previous example feature groups without hits are kept (discussed here). The components are generated The components are filtered: The TPs must follow an expected retention time direction The parent/TPs should have at least one candidate formula that fits with the transformation. Only feature groups are kept with parent/TP assignments and all results are reported. # steps 1-2 mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform", adduct = "[M+H]+") formulas <- filter(formulas, topMost = 5) fGroups <- fGroups[results = formulas] # step 3 TPs <- generateTPs("logic", fGroups = fGroups, adduct = "[M+H]+") # step 4 suspects <- convertToSuspects(TPs) fGroupsScr <- screenSuspects(fGroups, suspects, adduct = "[M+H]+", onlyHits = FALSE) # step 5 componTP <- generateComponents(fGroupsScr, "tp", TPs = TPs, MSPeakLists = mslists, formulas = formulas) # step 6 componTP <- filter(componTP, retDirMatch = TRUE, formulas = formulas) # step 7 fGroupsScr <- fGroupsScr[results = componTP] reportHTML(fGroupsScr, MSPeakLists = mslists, formulas = formulas, components = componTP) 7.3.4 Non-target screening of TPs by annotation similarities This example shows a workflow where no TP data from a prediction or library is used. Instead, this workflow relies on statistics and MS/MS data to find feature groups which may potentially have a parent - TP relationship. The workflow is similar to that of the previous example. The steps of this workflow are: Fold changes (FC) between two sample groups are calculated to classify which feature groups are decreasing (i.e. parents) or increasing (i.e. TPs). Feature groups without classification are removed. Formula annotations are performed like the previous example. The componentization is performed and the FC classifications are used to specify which feature groups are to be considered parents or TPs. Only TPs are kept that show a high MS/MS spectral similarity and share at least one fragment with their parent. Only feature groups are kept with parent/TP assignments and all results are reported. # step 1 tab <- as.data.table(fGroups, FCParams = getFCParams(c("before", "after"))) groupsParents <- tab[classification == "decrease"]$group groupsTPs <- tab[classification == "increase"]$group # step 2 fGroups <- fGroups[, union(groupsParents, groupsTPs)] # step 3 mslists <- generateMSPeakLists(fGroups, "mzr") formulas <- generateFormulas(fGroups, mslists, "genform", adduct = "[M+H]+") formulas <- filter(formulas, topMost = 5) fGroups <- fGroups[results = formulas] # step 4 componTP <- generateComponents(algorithm = "tp", fGroups = fGroups[, groupsParents], fGroupsTPs = fGroups[, groupsTPs], MSPeakLists = mslists, formulas = formulas) # step 5 componTP <- filter(componTP, minSpecSimBoth = 0.75, minFragMatches = 1) # step 6 fGroups <- fGroups[results = componTP] reportHTML(fGroups, MSPeakLists = mslists, formulas = formulas, components = componTP) "],["advanced_usage.html", "8 Advanced usage ", " 8 Advanced usage "],["adducts.html", "8.1 Adducts", " 8.1 Adducts When generating formulae and compound annotations and some other functionalities it is required to specify the adduct species. Behind the scenes, different algorithms typically use different formats. For instance, in order to specify a protonated species… GenForm either accepts \"M+H\" and \"+H\" MetFrag either accepts the numeric code 1 or \"[M+H]+\" SIRIUS accepts \"[M+H]+\" In addition, most algorithms only accept a limited set of possible adducts, which do not necessarily all overlap with each other. The GenFormAdducts() and MetFragAdducts() functions list the possible adducts for GenForm and MetFrag, respectively. In order to simplify the situation patRoon internally uses its own format and converts it automatically to the algorithm specific format when necessary. Furthermore, during conversion it checks if the specified adduct format is actually allowed by the algorithm. Adducts in patRoon are stored in the adduct S4 class. Objects from this class specify which elements are added and/or subtracted, the final charge and the number of molecules present in the adduct (e.g. 2 for a dimer). adduct(add = "H") # [M+H]+ adduct(sub = "H", charge = -1) # [M-H]- adduct(add = "K", sub = "H2", charge = -1) # [M+K-H2]- adduct(add = "H3", charge = 3) # [M+H3]3+ adduct(add = "H", molMult = 2) # [2M+H]+ A more easy way to generate adduct objects is by using the as.adduct() function: as.adduct("[M+H]+") as.adduct("[M+H2]2+") as.adduct("[2M+H]+") as.adduct("[M-H]-") as.adduct("+H", format = "genform") as.adduct(1, isPositive = TRUE, format = "metfrag") In fact, the adduct argument to workflow functions such as generateFormulas() and generateCompounds() is automatically converted to an adduct class with the as.adduct() function if necessary: formulas <- generateFormulas(..., adduct = adduct(sub = "H", charge = -1)) formulas <- generateFormulas(..., adduct = "[M-H]-") # same as above More details can be found in the reference manual (?adduct and ?`adduct-utils`). "],["fOpt.html", "8.2 Feature parameter optimization", " 8.2 Feature parameter optimization Many different parameters exist that may affect the output quality of feature finding and grouping. To avoid time consuming manual experimentation, functionality is provided to largely automate the optimization process. The methodology, which uses design of experiments (DoE), is based on the excellent Isotopologue Parameter Optimization (IPO) R package. The functionality of this package is directly integrated in patRoon. Some functionality was added or changed, the most important being support for other feature finding and grouping algorithms besides XCMS and basic optimization support for qualitative parameters. Nevertheless, the core optimization algorithms are largely untouched. This section will introduce the most important concepts and functionality. Please see the reference manual for more information (e.g. ?`feature-optimization`). NOTE The SIRIUS and SAFD algorithms are currently not (yet) supported. 8.2.1 Parameter sets Before starting an optimization experiment we have to define parameter sets. These sets contain the parameters and (initial) numeric ranges that should be tested. A parameter set is defined as a regular list, and can be easily constructed with the generateFeatureOptPSet() and generateFGroupsOptPSet() functions (for feature finding and feature grouping, respectively). pSet <- generateFeatureOptPSet("openms") # default test set for OpenMS pSet <- generateFeatureOptPSet("openms", chromSNR = c(5, 10)) # add parameter # of course manually making a list is also possible (e.g. if you don't want to test the default parameters) pSet <- list(noiseThrInt = c(1000, 5000)) When optimizing with XCMS or KPIC2 a few things have to be considered. First of all, when using the XCMS3 interface (i.e. algorithm=\"xcms3\") the underlying method that should be used for finding and grouping features and retention alignment should be set. In case these are not set default methods will be used. pSet <- list(method = "centWave", ppm = c(2, 8)) pSet <- list(ppm = c(2, 8)) # same: centWave is default # get defaults, but for different grouping/alignment methods pSetFG <- generateFGroupsOptPSet("xcms3", groupMethod = "nearest", retAlignMethod = "peakgroups") In addition, when optimizing feature grouping (both XCMS interfaces and KPIC2) we need to set the grouping and retention alignment parameters in two different nested lists: these are groupArgs/retcorArgs (algorithm=\"xcms\"), groupParams/retAlignParams (algorithm=\"xcms3\") or groupArgs/alignArgs (algorithm=\"kpic2\"). pSetFG <- list(groupParams = list(bw = c(20, 30))) # xcms3 pSetFG <- list(retcorArgs = list(gapInit = c(0, 7))) # xcms pSetFG <- list(groupArgs = list(mz_weight = c(0.3, 0.9))) # kpic2 When a parameter set has been defined it should be used as input for the optimizeFeatureFinding() or optimizeFeatureGrouping() functions. ftOpt <- optimizeFeatureFinding(anaInfo, "openms", pSet) fgOpt <- optimizeFeatureGrouping(fList, "openms", pSetFG) # fList is an existing features object Similar to findFeatures(), the first argument to optimizeFeatureFinding() should be the analysis information. Note that it is not uncommon to perform the optimization with only a subset of (representative) analyses (i.e. to reduce processing time). ftOpt <- optimizeFeatureFinding(anaInfo[1:2, ], "openms", pSet) # only use first two analyses From the parameter set a design of experiment will be automatically created. Obviously, the more parameters are specified, the longer such an experiment will take. After an experiment has finished, the optimization algorithm will start a new experiment where numeric ranges for each parameter are increased or decreased in order to more accurately find optimum values. Hence, the numeric ranges specified in the parameter set are only initial ranges, and will be changed in subsequent experiments. After each experiment iteration the results will be evaluated and a new experiment will be started as long as better results were obtained during the last experiment (although there is a hard limit defined by the maxIterations argument). For some parameters it is recommended or even necessary to set hard limits on the numeric ranges that are allowed to be tested. For instance, setting a minimum feature intensity threshold is highly recommended to avoid excessive processing time and potentially suboptimal results due to excessive amounts of resulting features. Configuring absolute parameter ranges is done by setting the paramRanges argument. # set minimum intensity threshold (but no max) ftOpt <- optimizeFeatureFinding(anaInfo, "openms", list(noiseThrInt = c(1000, 5000), # initial testing range paramRanges = list(noiseThrInt = c(500, Inf))) # never test below 500 Depending on the used algorithm, several default absolute limits are imposed. These may be obtained with the getDefFeaturesOptParamRanges() and getDefFGroupsOptParamRanges() functions. The common operation is to optimize numeric parameters. However, parameters that are not numeric (i.e. qualitative) need a different approach. In this case you will need to define multiple parameter sets, where each set defines a different qualitative value. ftOpt <- optimizeFeatureFinding(anaInfo, "openms", list(chromFWHM = c(4, 8), isotopeFilteringModel = "metabolites (5% RMS)"), list(chromFWHM = c(4, 8), isotopeFilteringModel = "metabolites (2% RMS)")) In the above example there are two parameter sets: both define the numeric chromFWHM parameter, whereas the qualitative isotopeFilteringModel parameter has a different value for each. Note that we had to specify the chromFWHM twice, this can be remediated by using the templateParams argument: ftOpt <- optimizeFeatureFinding(anaInfo, "openms", list(isotopeFilteringModel = "metabolites (5% RMS)"), list(isotopeFilteringModel = "metabolites (2% RMS)"), templateParams = list(chromFWHM = c(4, 8))) As its name suggests, the templateParams argument serves as a template parameter set, and its values are essentially combined with each given parameter set. Note that current support for optimizing qualitative parameters is relatively basic and time consuming. This is because tests are essentially repeated for each parameter set (e.g. in the above example the chromFWHM parameter is optimized twice, each time with a different value for isotopeFilteringModel). 8.2.2 Processing optmization results The results of an optimization process are stored in objects from the S4 optimizationResult class. Several methods are defined to inspect and visualize these results. The optimizedParameters() function is used to inspect the best parameter settings. Similarly, the optimizedObject() function can be used to obtain the object that was created with these settings (i.e. a features or featureGroups object). optimizedParameters(ftOpt) # best settings for whole experiment #> $chromFWHM #> [1] 3.75 #> #> $mzPPM #> [1] 13.5 #> #> $minFWHM #> [1] 1.4 #> #> $maxFWHM #> [1] 24 optimizedObject(ftOpt) # features object with best settings for whole experiment #> A featuresOpenMS object #> Hierarchy: #> features #> |-- featuresOpenMS #> --- #> Object size (indication): 595 kB #> Algorithm: openms #> Total feature count: 3681 #> Average feature count/analysis: 3681 #> Analyses: solvent-pos-1 (1 total) #> Replicate groups: solvent-pos (1 total) #> Replicate groups used as blank: solvent-pos (1 total) Results can also be obtained for specific parameter sets/iterations. optimizedParameters(ftOpt, 1) # best settings for first parameter set #> $chromFWHM #> [1] 3.75 #> #> $mzPPM #> [1] 13.5 #> #> $minFWHM #> [1] 1.4 #> #> $maxFWHM #> [1] 24 optimizedParameters(ftOpt, 1, 1) # best settings for first parameter set and experiment iteration #> $chromFWHM #> [1] 5 #> #> $mzPPM #> [1] 10 #> #> $minFWHM #> [1] 1 #> #> $maxFWHM #> [1] 34 optimizedObject(ftOpt, 1) # features object with best settings for first parameter set #> A featuresOpenMS object #> Hierarchy: #> features #> |-- featuresOpenMS #> --- #> Object size (indication): 595 kB #> Algorithm: openms #> Total feature count: 3681 #> Average feature count/analysis: 3681 #> Analyses: solvent-pos-1 (1 total) #> Replicate groups: solvent-pos (1 total) #> Replicate groups used as blank: solvent-pos (1 total) The plot() function can be used to visualize optimization results. This function will plot graphs for results of all tested parameter pairs. The graphs can be contour, image or perspective plots (as specified by the type argument). plot(ftOpt, paramSet = 1, DoEIteration = 1) # contour plots for first param set/experiment plot(ftOpt, paramSet = 1, DoEIteration = 1, type = "persp") # pretty perspective plots Please refer to the reference manual for more methods to inspect optimization results (e.g. ?optimizationResult). "],["peakQual.html", "8.3 Chromatographic peak qualities", " 8.3 Chromatographic peak qualities The algorithms used by findFeatures detect chromatographic peaks automatically to find the features. However, it is common that not all detected features have ‘proper’ chromatographic peaks, and some features could be just noise. The MetaClean R package supports various quality measures for chromatographic peaks. The quality measures include Gaussian fit, symmetry, sharpness and others. In addition, MetaClean averages all feature data for each feature group and adds a few additional group specific quality measures (e.g. retention time consistency). Please see Chetnik, Petrick, and Pandey (2020) for more details. The calculations are integrated into patRoon, and are easily performed with the calculatePeakQualities() generic function. fList <- calculatePeakQualities(fList) # calculate for all features #> Verifying if your data is centroided... #> Calculating feature peak qualities and scores... fGroups <- calculatePeakQualities(fGroups) # calculate for all features and groups #> Verifying if your data is centroided... #> Calculating feature peak qualities and scores... #> Verifying if your data is centroided... #> Calculating group peak qualities and scores... #> ================================================================================ Most often the featureGroups method is only used, unless you want to filter features (discussed below) prior to grouping. An extension in patRoon is that the qualities are used to calculate peak scores. The score for each quality measure is calculated by normalizing and scaling the values into a 0-1 range, where zero is the worst and one the best. Note that most scores are relative, hence, the values should only be used to compare features among each other. Finally, a totalScore is calculated which sums all individual scores and serves as a rough overall score indicator for a feature (group). The qualities and scores are easily obtained with the as.data.table() function. # (limit rows/columns for clarity) as.data.table(fList)[1:5, 26:30] #> GaussianSimilarityScore SharpnessScore TPASRScore ZigZagScore totalScore #> 1: 0.6314046 3.443351e-02 0.9956949 0.9103221 6.302180 #> 2: 0.9633994 9.900530e-10 0.9944988 0.3565674 6.513205 #> 3: 0.3613087 7.565147e-10 0.8006569 0.9999449 5.651379 #> 4: 0.9151027 8.600747e-03 0.9405262 0.9637153 5.892201 #> 5: 0.3676623 1.000000e+00 0.9907657 0.8435805 5.825267 # the qualities argument is necessary to include the scores. # valid values are: "quality", "score" or "both" as.data.table(fGroups, qualities = "both")[1:5, 25:29] #> TPASRScore ZigZagScore ElutionShiftScore RetentionTimeCorrelationScore totalScore #> 1: 0.7305554 0.9962254 0.8421657 0.9937370 7.930701 #> 2: 0.0000000 0.9744541 0.9960804 0.6808412 5.962788 #> 3: 0.6140008 0.9171568 0.9015949 0.9683740 7.471384 #> 4: 0.8227904 0.8907734 0.9403958 0.9948720 8.450124 #> 5: 0.9848653 0.8667116 0.5754979 0.9978621 8.739507 The feature quality values can also be reviewed interactively with reports generated with reportHTML (see Reporting) and with checkFeatures (see here). The filter function can be used filter out low scoring features and feature groups: # only keep features with at least 0.3 Modality score and 0.5 symmetry score fList <- filter(fList, qualityRange = list(ModalityScore = c(0.3, Inf), SymmetryScore = c(0.5, Inf))) # same as above fGroups <- filter(fGroups, featQualityRange = list(ModalityScore = c(0.3, Inf), SymmetryScore = c(0.5, Inf))) # filter group averaged data fGroups <- filter(fGroups, groupQualityRange = list(totalScore = c(0.5, Inf))) 8.3.1 Applying machine learning with MetaClean An important feature of MetaClean is to use the quality measures to train a machine learning model to automatically recognize ‘good’ and ‘bad’ features. patRoon provides a few extensions to simplify training and using a model. Furthermore, while MetaClean was primarily designed to work with XCMS, the extensions of patRoon allow the usage of data from all the algorithms supported by patRoon. The getMCTrainData function can be used to convert data from a feature check session to training data that can be used by MetaClean. This allows you to use interactively select good/bad peaks. The workflow looks like this: # untick the 'keep' checkbox for all 'bad' feature groups checkFeatures(fGroupsTrain, "train_session.yml") # get train data. This gives comparable data as MetaClean::getPeakQualityMetrics() trainData <- getMCTrainData(fGroupsTrain, "train_session.yml") # use train data with MetaClean with MetaClean::runCrossValidation(), # MetaClean::getEvaluationMeasures(), MetaClean::trainClassifier() etc # --> see the MetaClean vignette for details Once you have created a model with MetaClean it can be used with the predictCheckFeaturesSession() function: predictCheckFeaturesSession(fGroups, "model_session.yml", model) This will generate another check session file: all the feature groups that are considered good will be with a ‘keep’ state, the others without. As described elsewhere, the checkFeatures function is used to review the results from a session and the filter function can be used to remove unwanted feature groups. Note that calculatePeakQualitites() must be called before getMCTrainData/predictCheckFeaturesSession can be used. NOTE MetaClean only predicts at the feature group level. Thus, only the kept feature groups from a feature check session will be used for training, and any indivual features that were marked as removed will be ignored. References "],["exporting-and-converting-feature-data.html", "8.4 Exporting and converting feature data", " 8.4 Exporting and converting feature data The feature group data obtained during the workflow can be exported to various formats with the export() generic function. There are currently three formats supported: \"brukerpa\" (Bruker ProfileAnalysis), \"brukertasq\" (Bruker TASQ) and \"mzmine\" (mzMine). The former exports a ‘bucket table’ which can be loaded in ProfileAnalysis, the second and third export a target list that can be processed with TASQ and mzMine, respectively. The getXCMSSet() function converts a features or featureGroups object to an xcmsSet object which can be used for further processing with xcms. Similarly, the getXCMSnExp() function can be used for conversion to an XCMS3 style XCMSnExp object, and the getPICSet() function can be used to convert features to KPIC2 data. Some examples for these functions are shown below. export(fGroups, "brukertasq", out = "my_targets.csv") # convert features to xcmsSet. # NOTE: loadRawData should only be FALSE when the analysis data files cannot be # loaded by the algorithm (e.g. when features were obtained with DataAnalysis and data was not exported to mz(X)ML) xset <- getXCMSSet(fList, loadRawData = TRUE) xsetg <- getXCMSSet(fGroups, loadRawData = TRUE) # get grouped xcmsSet # using the new XCMS3 interface xdata <- getXCMSnExp(fList) xdata <- getXCMSnExp(fGroups) # KPIC2 conversion. Like XCMS it optionally loads the raw data. picSet <- getPICSet(fList, loadRawData = TRUE) "],["consensus.html", "8.5 Algorithm consensus", " 8.5 Algorithm consensus With patRoon you have the option to choose between several algorithms for most workflow steps. Each algorithm is typically characterized by its efficiency, robustness, and may be optimized towards certain data properties. Comparing their output is therefore advantegeuous in order to design an optimum workflow. The consensus() generic function will compare different results from different algorithms and returns a consensus, which may be based on minimal overlap, uniqueness or simply a combination of all results from involved objects. The output from the consensus() function is of similar type as the input types and is therefore compatible to any ‘regular’ further data processing operations (e.g. input for other workflow steps or plotting). Note that a consensus can also be made from objects generated by the same algorithm, for instance, to compare or combine results obtained with different parameters (e.g. different databases used for compound annotation). The consensus() generic is defined for most workflow objects. Some of its common function arguments are listed below. Argument Classes Remarks obj, ... All Two or more objects (of the same type) that should be compared to generate the consensus. compThreshold, relAbundance, absAbundance, formThreshold compounds, formulas, featureGroupsComparison The minimum overlap (relative/absolute) for a result (feature, candidate) to be kept. uniqueFrom compounds, formulas, featureGroupsComparison Only keep unique results from specified objects. uniqueOuter compounds, formulas, featureGroupsComparison Should be combined with uniqueFrom. If TRUE then only results are kept which are also unique between the objects specified with uniqueFrom. Note that current support for generating a consensus between components objects is very simplistic; here results are not compared, but the consensus simply consists a combination of all the components from each object. Generating a consensus for feature groups involves first generating a featureGroupsComparison object. This step is necessary since (small) deviations between retention times and/or mass values reported by different feature finding/grouping algorithms complicates a direct comparison. The comparison objects are made by the comparison() function, and its results can be visualized by the plotting functions discussed in the previous chapter. Some examples are shown below compoundsCons <- consensus(compoundsMF, compoundsSIR) # combine MetFrag/SIRIUS results compoundsCons <- consensus(compoundsMF, compoundsSIR, compThreshold = 1) # only keep results that overlap fGroupComp <- comparison(fGroupsXCMS, fGroupsOpenMS, fGroupsEnviPick, groupAlgo = "openms") plotVenn(fGroupComp) # visualize overlap/uniqueness fGroupsCons <- consensus(fGroupComp, uniqueFrom = 1:2) # only keep results unique in OpenMS+XCMS fGroupsCons <- consensus(fGroupComp, uniqueFrom = 1:2, uniqueOuter = TRUE) # as above, but also exclude any overlap between OpenMS/XCMS "],["compclust.html", "8.6 Compound clustering", " 8.6 Compound clustering When large databases such as PubChem or ChemSpider are used for compound annotation, it is common to find many candidate structures for even a single feature. While choosing the right scoring settings can significantly improve their ranking, it is still very much possible that many candidates of potential interest remain. In this situation it might help to perform compound clustering. During this process, all candidates for a feature are clustered hierarchically on basis of similar chemical structure. From the resulting cluster the maximum common substructure (MCS) can be derived, which represents the largest possible substructure that ‘fit’ in all candidates. By visual inspection of the MCS it may be possible to identify likely common structural properties of a feature. In order to perform compound clustering the makeHCluster() generic function should be used. This function heavily relies on chemical fingerprinting functionality provided by rcdk. compounds <- generateCompounds(...) # get our compounds compsClust <- makeHCluster(compounds) This function accepts several arguments to fine tune the clustering process: method: the clustering method (e.g. \"complete\" (default), \"ward.D2\"), see ?hclust for options fpType: finger printing type (\"extended\" by default), see ?get.fingerprint fpSimMethod: similarity method for generating the distance method (\"tanimoto\" by default), see ?fp.sim.matrix For all arguments see the reference manual (?makeHClust). The resulting object is of type compoundsCluster. Several methods are defined to modify and inspect these results: # plot MCS of first cluster from candidates of M109_R116_61 plotStructure(compsClust, groupName = "M109_R116_61", 1) # plot dendrogram plot(compsClust, groupName = "M109_R116_61") # re-assign clusters for a feature group compsClust <- treeCut(compsClust, k = 5, groupName = "M109_R116_61") # ditto, but automatic cluster determination compsClust <- treeCutDynamic(compsClust, minModuleSize = 3, groupName = "M109_R116_61") For a complete overview see the reference manual (?compoundsCluster). "],["basic-quantitative-and-regression-analysis.html", "8.7 Basic quantitative and regression analysis", " 8.7 Basic quantitative and regression analysis While patRoon is currently primarily focused on qualitative analyses, some basic quantitative analysis can also be performed, for instance, to estimate concentrations of features. In fact, other types of data that may be useful for regression analysis can be set such as sample dilution factor or sampling time. The latter may, for instance, be used to isolate features with increasing or decreasing intensity. Regardless of what kind of regression analysis is performed, here we simply refer the values to be calculated as concentrations. In order to use this functionality, an extra column (conc) should be added to the analysis information, for instance: # obtain analysis information as usual, but add some concentrations. # The blanks are set to NA, whereas the standards are set to increasing levels. anaInfo <- generateAnalysisInfo(paths = patRoonData::exampleDataPath(), groups = c(rep("solvent", 3), rep("standard", 3)), blanks = "solvent", concs = c(NA, NA, NA, 1, 2, 3)) For analyses with known concentrations (e.g. standards) the conc column should be set; for all others the value should be set to NA. The as.data.table() function (or as.data.frame()) can then be used to calculate regression data and estimate concentrations: # use areas for quantitation and make sure that feature data is reported # (otherwise no concentrations are calculated) # (only relevant columns are shown for clarity) as.data.table(fGroups, areas = TRUE, features = TRUE, regression = TRUE) #> group conc RSQ intercept slope conc_reg #> 1: M109_R192_20 1 0.71446367 193338.67 -4928 1.3649892 #> 2: M109_R192_20 2 0.71446367 193338.67 -4928 1.2700216 #> 3: M109_R192_20 3 0.71446367 193338.67 -4928 3.3649892 #> 4: M111_R330_23 1 0.08902714 85338.67 -370 -0.8468468 #> 5: M111_R330_23 2 0.08902714 85338.67 -370 5.6936937 #> --- #> 422: M407_R239_672 2 0.99560719 210036.00 -11734 2.0767002 #> 423: M407_R239_672 3 0.99560719 210036.00 -11734 2.9616499 #> 424: M425_R319_676 1 0.46488086 193198.67 10896 1.6194322 #> 425: M425_R319_676 2 0.46488086 193198.67 10896 0.7611356 #> 426: M425_R319_676 3 0.46488086 193198.67 10896 3.6194322 Calculated concentrations are stored in the conc_reg column, alongside while other regression data (i.e. RSQ, intercept, slope columns). To perform basic trend analysis the RSQ (i.e. R squared) can be used: fGroupsTab <- as.data.table(fGroups, areas = TRUE, features = FALSE, regression = TRUE) # subset fGroups with reasonable correlation increasingFGroups <- fGroups[, fGroupsTab[RSQ >= 0.8, group]] "],["FCCalc.html", "8.8 Fold changes", " 8.8 Fold changes A specific statistical way to prioritize feature data is by Fold changes (FC). This is a relative simple method to quickly identify (significant) changes between two sample groups. A typical use case is to compare the feature intensities before and after an experiment. To perform FC calculations we first need to specify its parameters. This is best achieved with the getFCParams() function: getFCParams(c("before", "after")) #> $rGroups #> [1] "before" "after" #> #> $thresholdFC #> [1] 0.25 #> #> $thresholdPV #> [1] 0.05 #> #> $zeroMethod #> [1] "add" #> #> $zeroValue #> [1] 0.01 #> #> $PVTestFunc #> function (x, y) #> t.test(x, y, paired = TRUE)$p.value #> <bytecode: 0x5563b86b7210> #> <environment: 0x5563b86b7948> #> #> $PVAdjFunc #> function (pv) #> p.adjust(pv, "BH") #> <bytecode: 0x5563b86b7590> #> <environment: 0x5563b86b7948> In this example we generate a list with parameters in order to make a comparison between two replicate groups: before and after. Several advanced parameters are available to tweak the calculation process. These are explained in the reference manual (?featureGroups). The as.data.table function for feature groups is used to perform the FC calculations. myFCParams <- getFCParams(c("solvent-pos", "standard-pos")) # compare solvent/standard as.data.table(fGroups, FCParams = myFCParams)[, c("group", "FC", "FC_log", "PV", "PV_log", "classification")] #> group FC FC_log PV PV_log classification #> 1: M99_R14_1 8.837494e-01 -0.17829070 0.22523941 0.64735561 insignificant #> 2: M99_R4_2 8.500464e-01 -0.23438649 0.77848844 0.10874783 insignificant #> 3: M100_R7_3 8.009186e-01 -0.32027248 0.80475149 0.09433821 FC #> 4: M100_R5_4 4.140000e+06 21.98119934 0.53420412 0.27229277 FC #> 5: M100_R28_5 9.594972e-01 -0.05964952 0.97571237 0.01067819 insignificant #> --- #> 676: M425_R319_676 2.149907e+07 24.35777069 0.00983421 2.00726053 increase #> 677: M427_R10_677 1.059937e+00 0.08397893 0.37317466 0.42808786 insignificant #> 678: M427_R319_678 7.776800e+06 22.89074521 0.53420412 0.27229277 FC #> 679: M432_R383_679 9.816400e+06 23.22676261 0.34750809 0.45903508 FC #> 680: M433_R10_680 1.132909e+00 0.18003240 0.29525423 0.52980387 insignificant The classification column allows you to easily identify if and how a feature changes between the two sample groups. This can also be used to prioritize feature groups: tab <- as.data.table(fGroups, FCParams = myFCParams) # only keep feature groups that significantly increase or decrease fGroupsChanged <- fGroups[, tab[classification %in% c("increase", "decrease")]$group] The plotVolcano function can be used to visually the FC data: plotVolcano(fGroups, myFCParams) "],["caching.html", "8.9 Caching", " 8.9 Caching In patRoon lengthy processing operations such as finding features and generating annotation data is cached. This means that when you run such a calculation again (without changing any parameters), the data is simply loaded from the cache data instead of re-generating it. This in turn is very useful, for instance, if you have closed your R session and want to continue with data processing at a later stage. The cache data is stored in a sqlite database file. This file is stored by default under the name cache.sqlite in the current working directory (for this reason it is very important to always restore your working directory!). However, the name and location can be changed by setting a global package option: options(patRoon.cache.fileName = "~/myCacheFile.sqlite") For instance, this might be useful if you want to use a shared cache file between projects. After a while you may see that your cache file can get quite large. This is especially true when testing different parameters to optimize your workflow. Furthermore, you may want to clear the cache after you have updated patRoon and want to make sure that the latest code is used to generate the data. At any point you can simply remove the cache file. A more fine tuned approach which doesn’t wipe all your cached data is by using the clearCache() function. With this function you can selectively remove parts of the cache file. The function has two arguments: what, which specifies what should be removed, and file which specifies the path to the cache file. The latter only needs to be specified if you want to manage a different cache file. In order to figure what is in the cache you can run clearCache() without any arguments: clearCache() #> Please specify which cache you want to remove. Available are: #> - EICData (3 rows) #> - MSPeakListsAvg (4 rows) #> - MSPeakListsMzR (97 rows) #> - MSPeakListsSetAvg (2 rows) #> - annPeakListSet (1 rows) #> - annotateSuspects (1 rows) #> - calculatePeakQualities (3 rows) #> - componentsCAMERA (1 rows) #> - componentsNontarget (1 rows) #> - compoundsCluster (1 rows) #> - compoundsMetFrag (30 rows) #> - dataCentroided (12 rows) #> - featAnnUnset (2 rows) #> - featureGroupsOpenMS (5 rows) #> - featuresOpenMS (69 rows) #> - filterFGroups_blank (3 rows) #> - filterFGroups_intensity (9 rows) #> - filterFGroups_minReplicates (85 rows) #> - filterFGroups_replicateAbundance (6 rows) #> - filterFGroups_replicate_group (18 rows) #> - filterFGroups_retention (2 rows) #> - filterMSPeakLists (4 rows) #> - formulasFGroupConsensus (2 rows) #> - formulasGenForm (89 rows) #> - formulasSIRIUS (5 rows) #> - loadIntensities (69 rows) #> - mzREIC (3403 rows) #> - reportPlots (334 rows) #> - screenSuspects (4 rows) #> - screenSuspectsPrepList (3 rows) #> - specData (12 rows) #> - all (removes complete cache database) Using this output you can re-run the function again, for instance: clearCache("featuresOpenMS") clearCache(c("featureGroupsOpenMS", "formulasGenForm")) # clear multiple clearCache("OpenMS") # clear all with OpenMS in name (ie partial matched) clearCache("all") # same as simply removing the file "],["parallelization.html", "8.10 Parallelization", " 8.10 Parallelization Some steps in the non-target screening workflow are inherently computationally intensive. To reduce computational times patRoon is able to perform parallelization for most of the important functionality. This is especially useful if you have a modern system with multiple CPU cores and sufficient RAM. For various technical reasons several parallelization techniques are used, these can be categorized as parallelization of R functions and multiprocessing. The next sections describe both parallelization approaches in order to let you optimize the workflow. 8.10.1 Parellization of R functions Several functions of patRoon support parallelization. Function Purpose Remarks findFeatures Obtain feature data Only envipick and kpic2 algorithms generateComponents Generate components Only cliquems algorithm. optimizeFeatureFinding, optimizeFeatureGrouping Optimize feature finding/grouping parameters Discussed here. calculatePeakQualities Calculate feature (group) qualities Discussed here. The parallelization is achieved with the future and future.apply R packages. To enable parallelization of these functions the parallel argument must be set to TRUE and the future framework must be properly configured in advance. For example: # setup three workers to run in parallel future::plan("multisession", workers = 3) # find features with enviPick in parallel fList <- findFeatures(anaInfo, "envipick", parallel = TRUE) It is important to properly configure the right future plan. Please see the documentation of the future package for more details. 8.10.2 Multiprocessing patRoon relies on several external (command-line) tools to generate workflow data. These commands may be executed in parallel to reduce computational times (‘multiprocessing’). The table below outlines the tools that are executed in parallel. Tool Used by Notes msConvert convertMSFiles(algorithm=\"pwiz\", ...) FileConverter convertMSFiles(algorithm=\"openms\", ...) FeatureFinderMetabo findFeatures(algorithm=\"openms\", ...) julia findFeatures(algorithm=\"safd\", ...) SIRIUS findFeatures(algorithm=\"sirius\", ...) MetaboliteAdductDecharger generateComponents(algorithm=\"openms\", ...) GenForm generateFormulas(agorithm=\"genform\", ...) SIRIUS generateFormulas(agorithm=\"sirius\", ...), generateCompounds(agorithm=\"sirius\", ...) Only if splitBatches=TRUE MetFrag generateCompounds(agorithm=\"metfrag\", ...) pngquant reportHTML(...) Only if optimizePng=TRUE BioTransformer generateTPs(algorithm = \"biotransformer\") Disabled by default (see ?generateTPs for details). Multiprocessing is either performed by executing processes in the background with the processx R package (classic interface) or by futures, which were introduced in the previous section. An overview of the characteristics of both parallelization techniques is shown below. classic future requires little or no configuration configuration needed to setup works with all tools doesn’t work with pngquant and slower with GenForm only supports parallelization on the local computer allows both local and cluster computing Which method is used is controlled by the patRoon.MP.method package option. Note that reportHTML() will always use the classic method for pngquant. 8.10.2.1 Classic multiprocessing interface The classic interface is the ‘original’ method implemented in patRoon, and is therefore well tested and optimized. It is easier to setup, works well with all tools, and is therefore the default method. It is enabled as follows: options(patRoon.MP.method = "classic") The number of parallel processes is configured through the patRoon.MP.maxProcs option. By default it is set to the number of available CPU cores, which results usually in the best performance. However, you may want to lower this, for instance, to keep your computer more responsive while processing or limit the RAM used by the data processing workflow. options(patRoon.MP.maxProcs = 2) # do not execute more than two tools in parallel. This will change the parallelization for the complete workflow. However, it may be desirable to change this for only a part the workflow. This is easily achieved with the withOpt() function. # do not execute more than two tools in parallel. options(patRoon.MP.maxProcs = 2) # ... but execute up to four GenForm processes withOpt(MP.maxProcs = 4, { formulas <- generateFormulas(fGroups, "genform", ...) }) The withOpt function will temporarily change the given option(s) while executing a given code block and restore it afterwards (it is very similar to the with_options() function from the withr R package). Furthermore, notice how withOpt() does not require you to prefix the option names with patRoon.. 8.10.2.2 Multiprocessing with futures The primary goal of the “future” method is to allow parallel processing on one or more external computers. Since it uses the future R package, many approaches are supported, such as local parallelization (similar to the classic method), cluster computing via multiple networked computers and more advanced HPC approaches such as slurm via the future.batchtools R package. This parallelization method can be activated as follows: options(patRoon.MP.method = "future") # set a future plan # example 1: start a local cluster with four nodes future::plan("cluster", workers = 4) # example 2: start a networked cluster with four nodes on PC with hostname "otherpc" future::plan("cluster", workers = rep("otherpc", 4)) Please see the documentation of the respective packages (e.g. future and future.batchtools) for more details on how to configure the workers. The withOpt() function introduced in the previous subsection can also be used to temporarily switch between parallelization approaches, for instance: # default to future parallelization options(patRoon.MP.method = "future") future::plan("cluster", workers = 4) # ... do workflow # do classic parallelization for GenForm withOpt(MP.method = "classic", { formulas <- generateFormulas(fGroups, "genform", ...) }) # .. do more workflow 8.10.2.3 Logging Most tools that are executed in parallel will log their output to text files. These files may contain valuable information, for instance, when an error occurred. By default, the logfiles are stored in the log directory placed in the current working directory. However, you can change this location by setting the patRoon.MP.logPath option. If you set this option to FALSE then no logging occurs. 8.10.3 Notes when using parallelization with futures Some important notes when using the future parallelization method: GenForm currently performs less optimal with future multiprocessing to the classic approach. Nevertheless, it may still be interesting to use the future method to move the computations to another system to free up resources on your local system. Behind the scenes the future.apply package is used to schedule the tools to be executed. The patRoon.MP.futureSched option sets the value for the future.scheduling argument to the future_lapply() function, and therefore allows you to tweak the scheduling. Make sure that patRoon and in case of multiprocessing that the tool to be executed (MetFrag, SIRIUS etc.) are exactly the same version on all computing hosts. Make sure that patRoon is properly configured on all hosts, e.g. set the patRoon.path.XXX options to ensure all tools can be found. For MetFrag annotation: if a local database such as PubChemLite is used, it must be present on each computing node as well. Furthermore, the local computer (even if not used for the computations) also must have this file present. Like the previous point, make sure that the patRoon.path.XXX options are set properly. If you encounter errors then it may be handy to switch to future::plan(\"sequential\") and see if it works or you get more descriptive error messages. In order to restart the nodes, for instance after re-configuring patRoon, updating R packages etc, simply re-execute future::plan(...). Setting the future.debug package option to TRUE may give you more insight what is happening to find problems. "],["references.html", "9 References", " 9 References "],["404.html", "Page not found", " Page not found The page you requested cannot be found (perhaps it was moved or renamed). You may want to try searching to find the page's new location, or use the table of contents to find the page you are looking for. "]] diff --git a/docs/handbook_bd/setsAdducts.html b/docs/handbook_bd/setsAdducts.html index 4d50fd31a..c023e4c09 100644 --- a/docs/handbook_bd/setsAdducts.html +++ b/docs/handbook_bd/setsAdducts.html @@ -339,8 +339,8 @@

6.3 Selecting adducts to improve grouping

The selectIons() and adduct() functions discussed before can also improve sets workflows. This is because the adduct annotations can be used to improve feature neutralization, which in turn will improve grouping features between positive and negative ionization data. Once adduct annotations are set the features will be re-neutralized and re-grouped.

A typical workflow with selectIons looks like this:

-
- +
+
# as before ...
 anaInfoPos <- patRoonData::exampleAnalysisInfo("positive")
 anaInfoNeg <- patRoonData::exampleAnalysisInfo("negative")
diff --git a/docs/handbook_bd/subset.html b/docs/handbook_bd/subset.html
index 282154feb..7515644bd 100644
--- a/docs/handbook_bd/subset.html
+++ b/docs/handbook_bd/subset.html
@@ -447,8 +447,8 @@ 

5.3 Subsetting

5.3.1 Prioritization workflow

An important use case of subsetting is prioritization of data. For instance, after statistical analysis only certain feature groups are deemed relevant for the rest of the workflow. A common prioritization workflow is illustrated below:

-
- +
+

During the first step the workflow object is converted to a suitable format, most often using the as.data.frame() function. The converted data is then used as input for the prioritization strategy. Finally, these results are then used to select the data of interest in the original object.

A very simplified example of such a process is shown below.

featTab <- as.data.frame(fGroups, average = TRUE)
diff --git a/docs/handbook_bd/visualization.html b/docs/handbook_bd/visualization.html
index a4f5fdbca..fd40b7584 100644
--- a/docs/handbook_bd/visualization.html
+++ b/docs/handbook_bd/visualization.html
@@ -538,8 +538,8 @@ 

5.7.1 Features and annatation dat

# Inspect homologous series
 plotGraph(componNT)
-
- +
+

5.7.2 Overlapping and unique data

@@ -654,8 +654,8 @@

5.7.4 Hierarchical clustering res
plotHeatMap(componInt) # plot heatmap

plotHeatMap(componInt, interactive = TRUE) # interactive heatmap (with zoom-in!)
-
- +
+
plotSilhouettes(componInt, 5:20) # plot silhouettes (e.g. to obtain ideal cluster amount)

diff --git a/docs/handbook_bd/workflow-concepts.html b/docs/handbook_bd/workflow-concepts.html index a9eddbe7b..60a7b52c9 100644 --- a/docs/handbook_bd/workflow-concepts.html +++ b/docs/handbook_bd/workflow-concepts.html @@ -343,8 +343,8 @@

3 Workflow concepts

- +
+

Note that patRoon supports flexible composition of workflows. In the scheme above you can recognize optional steps by a dashed line. The inclusion of each step is only necessary if a further steps depends on its data. For instance, annotation and componentization do not depend on each other and can therefore be executed in any order or simply be omitted. A brief description of all steps is given below.

During data pre-treatment raw MS data is prepared for further analysis. A common need for this step is to convert the data to an open format so that other tools are able to process it. Other pre-treatment steps may involve re-calibration of m/z data or performing advanced filtering operations.

The next step is to extract features from the data. While different terminologies are used, a feature in patRoon refers to a single chromatographic peak in an extracted ion chromatogram for a single m/z value (within a defined tolerance). Hence, a feature contains both chromatographic data (e.g. retention time and peak height) and mass spectral data (e.g. the accurate m/z). Note that with mass spectrometry multiple m/z values may be detected for a single compound as a result of adduct formation, natural isotopes and/or in-source fragments. Some algorithms may try to combine these different masses in a single feature. However, in patRoon we generally assume this is not the case (and may optionally be done afterwards during the componentization step described below). Features are sometimes simply referred to as ‘peaks’.

diff --git a/docs/pkgdown.yml b/docs/pkgdown.yml index e9a4b202b..fa75f1604 100644 --- a/docs/pkgdown.yml +++ b/docs/pkgdown.yml @@ -3,7 +3,7 @@ pkgdown: 2.0.2 pkgdown_sha: ~ articles: tutorial: tutorial.html -last_built: 2022-03-08T11:17Z +last_built: 2022-03-08T12:49Z urls: reference: https://rickhelmus.github.io/patRoon/reference article: https://rickhelmus.github.io/patRoon/articles diff --git a/docs/reference/patRoon.pdf b/docs/reference/patRoon.pdf index 7dd6586829d0787e32a59cd23ff23af58b84e37c..48a034919fa8a81759addabb54c60e1a0e80f96b 100644 GIT binary patch delta 126 zcmaDmS@-Q^-G&y%7N!>F7M2#)7Pc1l7LFFqEnItku^Jl~8yinQ_=`&d!rXrE7uO9w xXJH#-FzLQ1y(F7M2#)7Pc1l7LFFqEnItku^Jj#8W~PM_=`&d!rXrE7uO9w xXA=`=GbcB5V