From 1d866c412c5803fed1c8e68a9e763577d3cd83f1 Mon Sep 17 00:00:00 2001 From: Aric Gardner Date: Tue, 18 Sep 2018 12:43:39 -0400 Subject: [PATCH] Conform with LFN doc rules It hugely hacks docs to move away from submodules. https://docs.opnfv.org/en/latest/how-to-use-docs/local-build-transition.html It removes intern reports which can't be integrated in this new model. All wrong links now deteted are updated. Change-Id: I9dbebeed041d2e104e3b8e73483f656ba0ef5bb9 Signed-off-by: Aric Gardner (cherry picked from commit 1a22e73c850c450305764c784c86dbc067e65dae) --- .gitignore | 2 +- docs/_static/favicon.ico | 0 docs/_static/logo.png | Bin 0 -> 58389 bytes docs/conf.py | 6 + docs/conf.yaml | 3 + docs/index.rst | 15 ++ docs/release/release-notes/functest-release.rst | 2 +- docs/release/release-notes/index.rst | 1 - docs/testing/developer/devguide/index.rst | 3 +- .../developer/internship/security_group/conf.py | 177 ---------------- .../developer/internship/security_group/index.rst | 62 ------ .../developer/internship/testapi_evolution/conf.py | 178 ---------------- .../internship/testapi_evolution/index.rst | 230 --------------------- .../developer/internship/unit_tests/conf.py | 177 ---------------- .../developer/internship/unit_tests/index.rst | 123 ----------- .../developer/internship/vnf_catalog/conf.py | 177 ---------------- .../developer/internship/vnf_catalog/index.rst | 160 -------------- docs/testing/user/configguide/ci.rst | 2 +- docs/testing/user/configguide/index.rst | 5 +- docs/testing/user/userguide/index.rst | 2 +- docs/testing/user/userguide/test_overview.rst | 2 +- setup.cfg | 2 +- test-requirements.txt | 2 + tox.ini | 18 +- 24 files changed, 41 insertions(+), 1308 deletions(-) create mode 100644 docs/_static/favicon.ico create mode 100644 docs/_static/logo.png create mode 100644 docs/conf.py create mode 100644 docs/conf.yaml create mode 100644 docs/index.rst delete mode 100644 docs/testing/developer/internship/security_group/conf.py delete mode 100644 docs/testing/developer/internship/security_group/index.rst delete mode 100644 docs/testing/developer/internship/testapi_evolution/conf.py delete mode 100644 docs/testing/developer/internship/testapi_evolution/index.rst delete mode 100644 docs/testing/developer/internship/unit_tests/conf.py delete mode 100644 docs/testing/developer/internship/unit_tests/index.rst delete mode 100644 docs/testing/developer/internship/vnf_catalog/conf.py delete mode 100644 docs/testing/developer/internship/vnf_catalog/index.rst diff --git a/.gitignore b/.gitignore index b5f5b3a2c..12d86f825 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,6 @@ .project .pydevproject rally_conf.json -/docs_build/ /docs/**/build/ _build /docs_output/ @@ -19,3 +18,4 @@ functest.egg-info .tox *.out *.pdf +docs/_build/* diff --git a/docs/_static/favicon.ico b/docs/_static/favicon.ico new file mode 100644 index 000000000..e69de29bb diff --git a/docs/_static/logo.png b/docs/_static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..cc9d17cfa2fb62ad464a5e6c97ae39d64191026d GIT binary patch literal 58389 zcmdSAWmJ{jyFQ92N(d?`tw<}NNVjx%r-XD#cPNd3ba%7pltxmzyOHkhICCxDcc1h7 zvd2E>zrP&EU?|J=%xA_O*L_|0^p}Wq!Dq*(yd&F}T-G?oqD_g>A!u=h@%(J_@rH5QX zeU6D+HFHWTzlLfi4a1RTgwTaQ}SxT<*dD<3qn(=r3^p zeAp@v`|Y0(b*N##{dXUJz=D0{{+s{24(|TL|M?vL4=48D%mMEIY-0c2=KK$K?7x}V zf44dRtEcuKbAbEjDF5Tb|F5U^pPTcKjs53`|0|aB|Jt1X=X3byoBwI&|0|pG{}YoY z>*hxS4qU8gOpYN+Q*eEhR>Ki3UZFx`yBcs)n&(9)B0Tb+75rzS6L- z%}mgJ@c`znq7#XX^=tayMX5C=p1p~epx~H2e()G}RFpKvI40#x9no zs5>)peGWfzX%@4yIb?;fUw2y$;r{!)Z%v%&9<9-NMSLsT=$)Hey^Nk_{(5mANCSR@ z7r7@Q8GrQ>cdHv6pVWn{8pFd}ExUgdJQU{a$`m0bRQ2avODz}s7Jq`YLsP$TutpTeO# zL({<_)lYE^c@iz(=FGAzX0e1+r+(Mc!)KBBOf1wf%J49kz{^0hAhnxvhcJvE>u=CW zokVZ%e0U)>qwJR)kIJ==hHKfydAivyYF$*{F5BR#h5+;a{I{Mi>&djiA0;bJf1ehR zRqQgS(z@HR?-v_hz9;hCF~Hv`kO ze2eQ{0S6BWY3|Z*g~SWfC_lslJ9`xq*XhE>7_Wv%^#u%cViq5G8**_WzCSV%ku!K& z!E}?B85*kqJNbQSPrXgly_dbt)<=!*OH@m(kFNht7m_wP6n*hXnbpD+Eh7VWB$}dV`bwIB^=Y$G8sN9 zkeI<|#kcIDtFl;niVyq3tBb$>-{&>x61j_jC5HGApG-jba>+a&^q5s7tnZPh7jo~E zX=C}c2Vw&YI6aR?DN_<4<9;_HH6x45UEcwEAFMgi4n= zf9=N6&wbpp+*3Wd@VnQHU5{N$>fXW!Q&YF5c39uNn>3wLpy1Xt*{T@lc+VLX9qC9= z8Tm%m>leBTWt=5gJ&LUbW$v-b+z0TstEAvCwjgZSfeEjzMJ#paJd||IHr*>xG6=U! z%C|=RksH01E`T9-=e+CNJcr-lu#{<0gvzp_#8hR~O#RfW9ttC>QRp(YemP{a+`a?e zk}c7v>D)VO;#BrRI7{>LG%hFPb-ct~MS2zDW^PrK>Jv8AB%^%Y7V4*-lK^&j%+zx( zF(0pKsSMY4t4y00bU9W^Y{$uxMWT_)32J4>Nk^ZIonDMgj8MpZG*w1`+GI+Mck~cE zPVMS&SKQpKYJ5((*eTO^a$*w3$w6JHGGBd(?q)4Bh3$FnL@_cn%JYP>Gh;9eWcNBs zSTGS4RUrMybw{}_uGM7P4Fa=#{5`;&n+RX=6BIsC&c(1n&SI$JCHk4zI4deo@;7<~ z4T2OF4EYvw;yPd2W zEa{Ei+!|Fa7s1bt8e`-wvslLD)`zQJC0u1;qQrzmCoHB(~Xv0!KSFkV$0`}*Uu znS_NRYxS6&zO1tN4L!r13*B<>_^}(Lw!wbgD@7M!D zti#0YLVY+sh&FXv&h>zwSA$7WQ#7YLyFKfvs}k5)c6LttU&9sMD&0Q!p7nz?m3GZ> z$n=ZEp5$cV^q1I`FTfim7LYhWgl=bBluPy7zIv4!ewPwoy28FkuU(OkBukYswe&4c|DC$d(Gi5rNGz%jI&Suipt;B1ZSWRMa za64c>jykenU%*U?uNZ3Z?h+iZavAWfi3cZ*SoG;}`MN}^u&ql^%w5O=1 zArdQQihmN_Z}#c&X1iiYLQAh|2inH0Bp9An{uQ=jt!t#?csCytV#fxKY7RxOr6-J*B%PD1P?%gJsLo)ld!OBl3 zAmeeWjBH-|7S^r~R0R;7!h~YBg$OO1e^1Fn=TyOP?u!|9Ft=FtfUePDJC4*$z47?p zVzV+O1M61>g1!TP^oQNf+7C-haWr}@96D?&(j3SZ_e{(#FWMh7<@3IQt@}?K9i7Gt zM&H#+Rmo#}Ib7GU-YgBU|4=_##SI8G}m$v z)5LL$)mG$T(#Fyy4UnXxv8*Uu8nIG~3)QGoT-DC9ZB;YAln23Osw4a(l5K3!M_3g1 zE|FVbUi1Db%Me)-VX@C*I`g{PvD$U`%^hL%s8w3ym1VXV(-wpnnqMA97bPak$zz+s ztm&t_&Nwr5uFb1h>bNBim9+)5&fg7VSy#0ToISfv7ssb&SE?tYZ&XDxLqaayIgjhL zq-Oo^!v&Ue{1!s+YEWxH7JdCGo_RZeK=@p+ zAD<^W@Qof)SAj+D!?gp|P%$++>d>^@A7TdV6sX#bCUWK!wd;;8ntZiv0A1*Xb3pRW`N z&6PPBY;I&<(3n4g23?*I4&JKlTU&Bvy^TP2Qv68*-ZDkh$kjI*g;keqwiVh6BAHr8 z!8ePW5_S;Srlv&NnM5`Xxbkb+BqtDL5b*+67+GW&th z1T!?lX4!_{f1k6avJq*$%UU9snQ50O4In^ERe=EWo;^9t?Wo!`ZrPM(aWeEP$h&{$ zZzr2?(;)4mwZL2!kQBw-l|qkRGqBdt4@~IL=0QL(10 z35!h4vDg>Y8OGefvNz0H^1?*#^c}oh?}tTPMZat<$`}%;L?4oESOh@hnSISKh27Vi z&*LhFMqwlG)b{qmV57%p9UNIVW@4HK^qsF+J*36VV_+kQ1p81}riw~DA!7FD>3Ubcd zQ6{H`+3~64x}?ip(Xi#9_PJ{}brCGn-xrILN=f#cuyc}Lc5~baXcD>(znP_VWvCwf z$QX{48MT`+8A-tYLhE?L86nr)0Bux!mDlq2JSVv{Wr4*K7g&Uc0e+$ZxdDHW9a$-l zxN8PDAs^8)QjxcJXXZ$@tYMNxt>b~B{7RE23#&}7J|!S3NL~Lq7;HVB+^FWbvmuLY zc%ERui}e^(}mpvU{D@rGiI~oeF*4%90 z-r*~9Pc)43oIHTpv;AwK;fhd;6Wh~?yj<%!ujrw4l!NZ0!9`2?bgbqMCpNo3cDj*d z{rHMO$|Q!KFsNf<=O)Rz)0nyOPVQAGN!Dt3dUH8nWszQnR}BY|R^9W2#^U7 zO7cGL ziPNDe#rQ-=6&lV=QLZK`{mu6=EDrocap(BDJr%@p=Ck6c(SO#WlzJhwsu0p*m(jhF zLs{u+XH0(7X1WfLGxm4)^0KOP>c>#HFrT9<9stkv9HVpqwA1QWm>S{q?mqk*{)E`jOFvnrG@$fRv78mmpEX#4@pN>s)VkA zl_Q7Akcn*O6fRNo+~HC8($z4@KJjZSwE(Yk#kkIblKX*9pmTUVBSXz2s4~u)`6JF2ueR4LerUG6*S% z+k)ql{un!atJdu6S~)0U274bKGN~NccfHp{nwM)%Q~u{V@fCR;nzJ$*3I>HaAC)kT zR|klt2x{&4C{SF_K;`42`*2o5`&IL^)C&V~Gm0@9%w7B&hQ&KJ)m-xjz!1 zz}kcg4aPB-)zKsCt^*nF2UveDObXj%9jiv0Ret|Ue;3{<4WLr7B&eVG?ri$ZxS!dS zZ|6ZqFJCM4>doOMKA($cc=Ay4V&znVBcjD`j_APTfQ)T&zPDW-Y7ZVSL1?=ATjj-3 z31XjnYJp1nWE;r!J1^XSGegrk04ksm-6eP#%8bX(#zF0(Tm{Y0@rSS}Kl+uyuXz;g zPk6*5)crBYRww$wld#V-FGg1tFG+v@8WCR|=bJ~d*nj&WGT^Fs1Qe3X zB&oEG&epPl7487Ma>d56{;D?fHN~M%5j^6a4DZdlDU<+fCt!NWSNl9+911PI&{G3L z2WJ0=ES>0=i^Nu^$bD^OTNrZVV3k!&k#1ZQhD-U);s(Uy$!t`pi@fI%tk-R#YAmg0 z^o_~Zr_Xk+>X+=t%9G~RVM@Wkt3O~J7%cU*HiWSTTdDf=MVk2C?r+js5(^n=;%G+J z>aHF_3w>>A0{G4mv3X4lu6$T@4{FpTICHG8B zhD+QR)K%4!2PYhj@T>*4V9}(ijKW=QSAXOfnOJ@SnW5e1anC9(zN|43`9O=apQGuU zcWUd_LVI?0PP^O3Go1K}D7O1g!*eKgrU-fY1ly=#p*!UCzWzqzo=8N6cz5N9r=|HB zRrxH1Q@Hh1J%+%z430|~g=AcX8j}{|TjpMR|A4f!!PatY+!G!l6kJ$AQcSxymoRcc z(c>-%3LJp-f{}?brOV+vBd|Nr038G@Ap!?lxfB-)DbU2Z;7xf3M;YL4v24F++gV1H zn3Ey|c)|V&>?^bY2var_g8iEsqoIX(%clHtO#eWGP31tqG}Z}o!LgO=gfxM0sqcp@ zrj1+X22zBgzvJgaOg?P?rYRVK)x|&A8N)%q7a&w5xDVNAlnA#Dyn%fp0QRwZJ-&Yx z2+o^pDI@ST)~l$QJpRylq%(mt6_-l`jZv@cfiuK*;%+Wfs%p+xdIvX95*m}Ix5?hM zB+_E{{4qa#p^Asv>c10l=lK1a;Yu|=$--<&pC|V~P^Y=W z6q1)#tc;;Q_W-V`o?$9h{}sq*VKOptg4j#V9R$ciTJ=m>`t@78psOL>`n6V=v5$Q~#b9BNoUKFl=DHXS!y zPPIH9&Q+m)3iScy_-Pux>ehd{DD0TKEWQ+}9?=M{J_Ct7?KH?K(MGgOW213Kta3#kBk zR)B42qN*)LN#?BFwC4y}acrUXO^1JGozb0n5+W^Y6r2M?9UL)sz5@UWGhVq@*X6%U z##fx*+*-DjU(hDN%4$iBqfq$wixWZ^!(gARQ-Gl~tWpHA<0~?1SPKgx5EeJ6st7H-_M9K7K&p4+Y*tk!~8 z;gV9P_O&*S3G~R`P!|`S>co$;kz@m5@@B2}cp^{AVxHV?8B{Nej-Cx9Tl zYQ!sGrx(VIhmS1e{cNjJ6~Lp{e9&TH*`IjNtdJrdzAa8ZQvMR8(P2p>sAGsG#&yQQt~s1j{LHjQ@e0-vLo$FPF@_H;YUkeiSnB4mn;8x7~Pm!w-iPQr9fLj~h+W z^y#&Fd?bS;zTn1dP0r+<2*Hbbf|)p(i3cXa+g}+P6s0%wSNP|`=GX_)6hP)k#HY{_ zxIUpO<7VEP+l8L-sF+n7B!V=P^c;;+xWjPyS;cPlq>i!q@2JoRKa)Cfd68GufkK5K zkjClF2azzlu2Ujs+r;W`9qK&k7BimRG=- zX_98K4L-hcMv1&@E~>BF!@vZ~K}`UnbVy74M>1&=U=-Y^wnmq40B%nRm-mMnDJd}0 z&Ug&fA1;<+Z&wgRg}`PNG)V5WYq5$%vSEPi%X4t0!<5m+Ru2+A9wF~To+>BPQD1hA zsUU95;G|@^oR3hC!YuQuNmzMJYjVP?_7RLTuAVyWOYhJgHoxXpuTLF1ii8%M0kW@R@ty`~ajgN9U^StllP>M*?$Vr{ z0<0fi&|V-#Lky~n0W@Av@`8|D{_<2QUX3*g^HpxrzKsd`2Agsh3k=n=8DvFj;y#(k1Hi>0l zO{m;JPdSjrL+)q}$%hkok(Swa08Y7W*GVN^B2Se1X0Vk3iyTTO@qtu}7d^`B_#j`h zRwB)^t5>yuAnS5`X zF)v87Q0I#LLXVpV%D4|m{}DKt>@wm1B*k@JJFPp@FuelY5~#UXu?btmHU_=V=hq?_ z8Do!FOu46(=S_-U7omgoHpKx#Y&`Av-lAmm&uSDnGJ$j)gD_GMo1GdesJh)*Q)xpw zaPF&>Ep^k}%3`j1)eL}| z#|Ma2wVHM~d#pVGHluISD?yE%N94*yHJtej@Fba)a163DfsDZN7SM~rp=S759m&@5 zJ!M1H@}eY;?*Pv)9(pnnS;`7bF-S>y&7qd2JjvNzd@!<{QjqORGXA?&K)aHP*sdbu zIbj9)h#t+YI?-H)Z~X>jT(X7fLKP)gmj}8nS?MbmaUf%?vkx*evF1hr(Q>5*8>psN;NX%2&P^FdGK-xiPK#Yq?Se|#u^Ajy=_{)67il23OEd@ z1kM4fD)ptA{V*grxb&JtVPy9ll60L&n@a`5+wOt7zTpkR1_zxlpK?u^ILC)ZpkBB+ zfHt{Xsrti8uAtNVC$BgeFl%Y6cAY?-CoZW4v3W~GVEx_$*FZ#R*NDx{7y`$d z5zP>M!-Wz$s%u02F^V70%Ri`ctG*BT5WOr)n!Dh z758L!8gNf{?rx072g~BT8mo^fQ-Be9lp+3|`7AACq#TdIb^{OhS)N#`FCjMJ1^cRp zoZA=cw-9$R2?wg1+w%gBWc$3gZz(3PL6ywxp86;(H!VS$b8=o{uaID$^ATKAP8>}n z0L@RS`(2Mhj;wp&A_BZ>uECQyw3<{aKd42*!bFo}6C45BaCvt*`m8hqsIH)FO-UEn z?f?SY!qTb-6jJ@zyiO>!n)AWdE8D0FsTkJH^2?3w$(AcK5dQMa3Z&Ac(d)N=yz)$$ zcJjjQSxu%36y92I0Id3X4FC>k6&xrAl5dLqIZQ|#KNfNzsQj*`$|_!Q4iaQQtw`9< z<3mu@yc_SiOU#{}uBrv6kyu*aIA(X}`2p-Z*tOUD2Cj##Au8gM(4oApxwYJ)eUqV) z7eor8vH-qUu}&@QiV?oGIFsc#!NK#Ia6 zsh~&ekTm?L`&Ce|LIW%N*l-D7rJV0IB24}h7%@Bpl6d>t$KP_ga%o&GP}rju|Em;+ zvb?c--IUxHbX)R10eMt++`PDp*#I!uXPkuZJea$7YJigWj@zS&1`8ByTI^2M`LM^< zwI#Q9a?ikHB>?pp&F_>ATSw^JpaC+%$V%4tdZudchh%>41KU%eH@>zLYXcR!3fujX z2`+b?KAqy0YL7k#C3Yu%xT6}bCh|lmq z7AHCk8ZeQlM!cv)ww=iBXc5oY2L=y8|HGbP01H0K_A=11KxE0zo77E3gM;%qgY*_4 zTyMaN_Ty(t7LUWI3cV$XirgJHkZ~1EfPZS%Get>9Qwhje$;arG{mE73&gOXm!Zsxp zs4;*n?tSwVNaTP!aCX1OmfG=N32H|JRY|(VocR@yH@u^B?7jju7=>U*RL?UE8t^G; z`WeQm3!=Wc{{R~aHFGghueY+#f%co;lCC%6A}hNAjQv1RHzEyDH?K@_!4UKYL_|QB zW<*8z_R3YtSCXs8WUd6zXSv6Xe~LmV3=CuBDTRE6`uj_|Y9`9nAdiBXFoO@(J~)?4 z!^5RGU{-GJaRN^O2#TO6?g?wcdlk!veeSf`Hu5oGC(o|k>2BwdE*6DHc*0u}@>E?~ znR1+gy_s7>EkHQWTPiQR$|4;rZw&Wj)I`^b3)i-Zs!CpgNsZchd( zG0BfYKb*>fG;3|Url?}$VvO9pJM92QOkh^QB#eBeSFxA9`+ky1f6ti48)q8)17&4# zN6jjZSxrO6r`SyL@d!;~rK3Ck2J#&Z((xT}B{E8{B+-%I!h{`Yb9mnZIlyBeObO<^P?n@TF{HP|2oJO}I$e4}Aq;xjl1`^vMs{2bM9$Du@9fx4)mc+~J`=S(~;-c!wu4x(<^Y#$AX_=etBSLRx7-zoqE6 zOqUkWO#wc0TC3}F!3*ZEe#8rC+jqh0er!OYD!`-V`VR@w>xN>Ifg)tT+N-?j4n9kxZU6`~cpXDbDU;~9R6yRIkq z-O+!pG{B!CBRh<<7auVMCj?5)T)og#+>TdYSBB8cK&#fm8N@VlY@I|>mkvvgo0rt%G zw5#7|l*pNJv@aIau$)W%(<8~Cuf)*6V$fcnmhSEJ@bWbvbL<<&me9P@K{&MJ#vhTh zt$-K0qGpg1fkMI0jQ^$6RXA%FQPE}hv9j;fCRY75K(ns_lvK6NSQe9f-24GYRF%=_ z?-VN_B}Or&B_jsqYN5+Phj@j5&ub9w+H~q4ylB(V5b(CP7V%%st|*!|rt%gUxhfEc z08w{rsjqSVK*s%5>{2^ZLR6lpXZppGKj04(V8cMxPJjxeGY;3SkHINvjiD)uvQ1YL z01DMT2cowtkGW|fE5HFb(bS0C#w>hhyaEYG@@nJ;o91Qt;HZRi>Ic_JqCgiRYeI<4RBcEn45pFL9J0w zXgfGJTSdCYZfy-yizC%Y&=vH)f#-se!^cEy-{%w`k1G=uVND8bq@kx~Ko|KFtAsrZ z#Ipz+2|zLYO?NB!NG&(RCX%-|n~qMFaf!yd}|l5K!0-B#PdM1Y6g^n zDW(*XnMU6Rj9A$>WcF&84;gS(7XX^h+;Dz&uqji0gBc1g<66dLM+5Cndw>6f>Vd_g zipIW2R8-KFax_P$I(nv8s6i-=P64aNxS3FHb@~*gcsxCI=vq-LTk!j{$5@R~5@jjV zS|$w+->m(i4BTf%WAZoe$w4V3#wvwpLV0V{s3>RL=$fDSqsHw%SK^_%xwHy-qyGNC z<>ib#=<4^Sb>bcUW`8Rjb0x-MP1J3gg9ar)m&hyoaY{&*P#DaC7A%&8c1mbF6u}O! zWfCltHnk8(=#pq{mVID!27qfOpImJO0D&ZOJQe@)`Fa`CqH*><@g8YSzV(W6zaP1; zz3(66^XD{iOV11o)88nYen68Y3j+RlqFIDeKBxu9tIP&<0L2=Cq`+s1FBrgW}EzMzQE85lar?nD>c2k`}WNmri&wE5@`bie7VQ&>e2xxdz)d!uI1; zS!YDkpk0@pXdEhI_=TS6wLFy0g;uP_n~}W*r7G89p3hkLMiGI10gHZmA0QS!wVq0C zmJF*hy#*~}s@tNRLn}JfMPu()@X^e%8&B*h2~ZJT4Ia_3P>btm$-WPSf;6~i?@4T| zsbq#Z8F)XbOV3AGJIK^#!o^0Ep zPD||OUMvIF+6I94^WvU@4XxS=(QS**a}rQaqN(wPv$0n6z$!@_HP~;^SjL{!p}kd7 z@|I;DG_PUIiHQV`Ep*=qd3`PmD*Em4ybNbDR=0H<}fW&m6oCR5W#tLxF|*$ZC|J`w9rE0fcga4{cv7 ziYa6^4MxbTZr`FnpLy?MjLsN=y=IM>yvJX(t4m$6KvY!WKbxADF_e&*YYiUOasL~H z?5ZmaJ(G428Te7j?3_}SZ#KsACmzI#j`HceXy7}63~+dlRwtHfEEq;lCc*O4+YxcW z1;bu!oy|9hS_fNSCt^fLzk|-xl82=#GIy8WNlDaoSIjVwqd-|fYRNEl%@wwf)p#`( zmy<^n5goZ>g5^jvk)PuZg4smdT*CdZVWc8~yvYI7%=*q zNjKoP+-xnB694SvhBDBRLn8psu@OTsvShkSP+TYC4AMK1A!{1(%uPQaOMLZHN7xK% z&B^QIq_vsdd*oUMd*EG3;C#T)h>q;G2WVx^%`3b%)va$D1g(G*vwxpUZg1p*e&TzZ z^HcvmWl$y4KkC0Ty9rj^{P-oqC?;#~Hi2B^?vC zDd#}tD&h~)JoiV|H4FPmpW<~*39<$P;kpeW1fJsA%iuG1#AquC8k{LzGJLd-)iLyK`6gFs!BD(tLnWkMb-@r| z*x3_$h2HO=UmH;VIJ^PaCQiiu<5JKKd_|Mj4KJj7HM1Gg2%kOPdK%_!siQ^mG_cm% zl3Sx-1MBJ=Oe=dTvTZJsPZEaB`f*r6H#38cc_Bi81{*bdBF%`L1-6c zi2%+Mt^yeVjSY32SO^%qsOW*ARU5-rDnWxBm`kG&Ibw~a)JAh@R;DN;byF4*IHN~t z$JBrc$RKDFp5>Rlmg1#oD0kRuQu$m?=}mDjosi;7?*BJ zg{h4N4&O%&iXVVb@cTj*`Z^DIzfA8$@};j6IoUD{@};e>+<}VOe%S;Vfy+u7J$YFC zV|L3rf9l6++Vl`LaJu(Uau)$BJ5`g` zG!pq6umtCv8~ekPK95wy)ec|D3@Z|!|MAljYny>!x^_XGzW@ROZ6=pb`#|(D92}?q zh*D7yuF1zu$;m!%HShFh(s*x)XAW;Zh#Dgf`)A~&a-hvUDp*ZJe{pV>nFO7TWs$ug z#Z!CoO$=@;%f&VZtWDPw8l>D+}DMkIn>@AV!VvhCb@^L3+wPaJ==-a>K36I|kNDPU&TD zA&Ix^GV(@)mR6nVQ6Z_k?1q;p4q1J?MAoBV^8NMMG`(K}l+Y%Q&rjzJdz7VA?*&X6 zYZc?-7+ZYL6aBR&FX?(sTL|X_h>F`Z_Ag(1q5aOPA94 z942Uz0^)**djn^7ixe5?K-gRc-QfU*3~gMVu$rdnfYSu!>DbL?)CAvmmQHKiKwkEM zgIbs^ikLIQS*#6}ubUPY0Fj^kOSu^EugRwq0A5QXQi!{PQ-4=i#{#34*e? zAQ;mH$p0FaI_>o$$-j39B*YZR#6%cLDg%eWeTSohR(Vd)k`AxM(WxIk!TtmS`g<`w zp|O!vH5 za&i6j{=P#|#Q{&0`$I{U&krZ8KZ@sU4$iOf+wHjJ6-I@vLgyg>Yey3a%h29o&MM7P zq5xSW^h2a=%c%iQGWa>N3kf5+3b!eZ137wXN&^*(ra?81s zQs#>a5xLa^F6u{tV>AusNvy!gHMmw?iJ~MVcddPQeLlc$q!nKtq~29F4RWC2cM~h( zh|(Yt6a+d0K*4b{R0E>p!3){^XO zpr-UbTLfc!kACN#Pr`7iD*kX1TJ#v5$}|1oTL{?jW>R#2i-rq*Jv}`Khl#Z#&ck{8 z+F3I*GfqxUMn*>Ss@lA~ywp@r`ZSM6yPQXDP+2rF$7xJK7mIzt=#EAwkM@>cHoC3B z<7Y3q?C=|;?FicVT&U&oBR+z6zdcIsPvWetTyse7UpqoYL%W^Uk}RDWA0HnY8k(7@ z3)9%z-0bQ$%JguVAYrHi#tpj5w=daT~QRN)#@HBJ5x zhjOH^ko>D{rcDuX1do%)BhR?6_mgs}3)eUV92X29K75Ggn+}0MQd3h43xl_jY5dHl zzB+P=ijP(&o8=RuJ0TAOQb`IBfD`b*4nY$_YjAZqofY;Yw@AZ0kQh8{t8F%hI>RZj z1Ug&#oj%*0IB=l(>aO)Ag6#&oV^=$?lgj+c%7EGb8vlYL2UK9o)jq={kX3!>|&ZD!hg3N)j6E8zx-Z@ckJ_Fyw5_q{`$>#ZTHWq9YKu>QRysMjSB27k>u|kuYWdeY(Sj;YbcaGO~2bH8ErIV!B zma}Ofry&#yO|-W|JvhIUeXmXq8TUk6(P+HfdQDO!%y3+uAt?`X(&p_Q1*j;UygqOn zp&6e_B}0o^s;X$t zLMOn4t$v;GX>Mlw_M-#G*|g```s}?*h;`j2m3en`c@AyV)(ip^9B5aj5xkvjcj}5K z^SlY4QA9y00B8F%lAq+amDb{J(pSQlFDJ?j`nwK4ueXNVqIrHe0Ypkno;#jI4j?T- zdhR0|`U3zcP1F@=4)qb0|2-L5L*Akt+BkDRY`*$0 zOHY#J*fdI^5F)Z%?3rO+W{iLxFQlFPZRt@cMFi`@d)EpXZ!ez+qb_-C8-%`D+Jv(B zb>g29W*S`MNibUn(}lS2uB|tvc@lZ6gi#-3=@0!_vW!+s5A7H41N3@E^A^xkd!&^i zD@ah8zj?A2UFA8;6q6#XLpq>01e={{}>prQ#+CPBELgnY~buS=!V-@{Qek_34f~%KD^WHlV2_ z*?HtZt{XDn2igpjq0n)DQ~V>)5e~CbA$&r@Ohg3x?THUgch~_F zN>@--YJ?JWM*$g(RH6RMNO}w2ZGnxYH9r2EasF-p+|o(Vk0=9`YB*HiwadvbQUx6L zvF}Oyelx66L?SSwBv=tfe+YW;F>5#DGxFAcfWqDmk&~tx)6eX414J?lN~8YiY74}n z`bP8=4Q=SW>J_M$Ta(gQiL^5E9z*5VxL_&SQ4zsN(hd9Boe{?Z=v`braoaH%Q=>;l zfL$pl6Sd;$`9L(T>}<|C1RMv{_R~?nI_0JQ%8#n=ogzwgv~f5__r)sM{M(6J@NpBg zQY40tiT3KXo~r5V=5dvv;d>CFqN4ia8Q?%!(iHrd6xv{a4o1441 zs4XCqbGqrml{~(+v$2ti={ROm^nzsyhMOehM|m_2O^DEh7}?US+kklI3T~~weAb;a zbt0|`EXHoUY{sS+;2}_a>p~MwDOshNlyzW=c<8N3{lHJ&sjm!S<5L~`unOWfi*Zd^hyFhz~q3SH?fk#Pp zzafl(wc*ts$?UNVt)xw{{(7DOnC^+nO#rYc^;4yV7YsqFgxsNkHHVQ_tKXgedXDBB z-kCAJrJ=06?^I8gq!BAk;|JJMSh8bUzX(3WWX-S;(9LJ{V9V|oxPuS&8=!KrZsCIO9 zxcq+`&sP==I`xN(*r$J0Ssy6~F9&Fav0mdv0VtEP*+6pW}GqG2UPnQje!zqq__b0NWnc}A5rTK zd6u8z^^1hvExhws?%P{B6qbE`y^j%s$tzRY0IUc|Xc{&os{Wwx#=gp==Hnjq?08|P z@+9MP#Qcn}%fp3iDhp5hBmcmE81)0#46y8=Llev!s6){W^>!)gE3xf0X;N~qD=C!R z-Wp%?TQwi}k-4<(X&HP2^@rPA5Ro3LsZ2PoaUT{JQh5gIpHwCe4eZ3#Y0}xdJ$)(>t z6R9Q7=QVW>Nwt*k)l;@KlrA#gnYh~-t!v9;m)Zv*m8SH@8T8%&nd;FgMYm6f_VnJ| zAG10l5J72t2%l1a|CFi6tPeCIU13u6WY^QlYU?$kYD{ZG!*xkh%i3AGhI1VYi=wvX zn$Q#UY3|Nny+&fy8W_9!RP&&p{LyY4zKY+l&PWP?zo1hav?ceiJz7YlI0w2b<+oyR zeVQ9I3ts+6z5=@cyloYR=a>;o+M@9{K$U~LLsuH{cH`XL^(!{uxwMH8UUrJ{jA#5bicx8mbI6VkoxRrvL^ zm5N}|3b}42^Vm|dO)Wynf|^cU?Bf?%BOmtmH@6WfmET2cLjB5rW;xE*nO@!wS`!Gp za8xmAbmMmKW&NAKt6A?{mQBv!VlflCoEb>p8;`Ms ziDx2$l|uit#b;xSIltY%H1O`Rz50b@f&ucTq`goKatf(rc3DkLT#we9C>lCC_pI~h zq!+X=eJ+*)=@{6n8z?(^A&Hlp8WtYT$Q7%X9F}5~ z=k>0H6sH!f=-|H}-@&rXKsy z9-oR3MUx0-nk9Z{r;*9`LxUj7Jy=hRTfa(6fs~h*H#88{8@E1#umlgEy99@Xn|{C{ zCJqskr_S1c&m=BoiM30Z{NCGFTW9n|E;)WPWY0x!v^SZq4`FA@gV28@6io2iL3L>6&FC|(^Mw%i z>o+6{p)GlSeuzQ+6u+D0y>i2*3Hq5%ILH~N6y`r`%EId_5L#iVgufPVE_2sf?!?{- z&l&y2-{>Fo<)u$xfZu>O{ZkC$O1<`#26roC7pFMwm_ivhJ<*rgkH!~-uNHoC{FQCZ zA(?%Qv4qFLE$oK+2t^S^DI@(4u{Jf_1EP@Z@^X1E{(0Q$+1)on!SeF*3xP3--76$4 zcwzEFf`W*_KH-qeir2J0pJOh~8i}>@;)I<~_h!-+eY7(;?W3ug#I+in$oft)g>cYi z8=NxbUB4%<#>Y_G+p^Ki&MRYwm??-_dZ8OOUmUHWprB+1$lRT-RTu1BUmTs&>N9h2 z{1ADyzBvlX@F|@%jgc}c2nr&{e~)OGP*@{;a-3CR`qJ(dX`qZr!Fq^jBJ0r4j@IBu< z{(fa4Si(u~ODiwO3~hObI3}B>OVjfH5#6msJd-vTSu_T*kY#!I&BGX31;ISVvE&K# zfxj{wz_-6ZKK{I*!qX5IzVR6?t@-n;eBSH?bqVq*2KhaOmGH4^QvVtxFAx3E1FeA{ zh)fqfU0p-xdWRgHa#!hTmLz`1Zl4&$Z%~@$PiU6{%X)&JG6ZAu$z(b9A1Xah59moj zq3NTKR;6D)it5rxTq8bNgpRx)Hd^h1?wUM4HfFaw!|EbY-a?&_%)lai*lF(M#6~OA z`EN)%YG%+^C^!s5mo!rkl2ve;cz=@{1hK{_`AQRO%5*x?K6=<`RkXK#Dm*fVrA_St z|L6VSnPX5;kX}f+fbt24jnwPuAaW+`j$JV+9CRJV_U8oqtFO>#N)f!{)WsK zQEtRp@+iQuR8|D3qeoxLnP_3b#^@V6sGrEawwVIw~37@p`llOiC`jPJ_m}R{Ad43IY_783) zs?84#?^R_?t3kxNZycqVKhx)Q^o-BNZ_GvEZ4D*IN~rOUOGv7Alg~&&pmg}O_jc+n z(`bERI1Fadsj$b?X)4M&*x7+15D(ar#r50V+|<{mOYR+v6N-{AF|crP;X)}f&`w>V zz(VaVtZ8o}!lg!kCvf!pxVLGRne2dZvG%>zko-bOY;?{fq~v)?CGbqbH>RI}jM z{{DVuCXE}j{pr4W&R?XW(KUzaLf!h@FmZ&Q$BuuSHv_GF5|vYd1BsfJR`6MPepP@N zcG)yF2QiU(e0@L=QKl_6wjSBN1Y5bSI#}(1P|FDYCktd_JGU8cB+`&&7{q^XfAKxbe-$o>A@N!BO@KxTXchwU|f%V@bu1C_mmJDp&i~m z@p5EP7hWJuw!;e3-o1P*+46CbPfynYIk%b$M-@Pgv6|biTDUjw#Dzp_7Sij;fa!*k z^^puQ)NEoZxu#tASC|HL&B`ws8>jUY6)9Bw(?={`I4(ytZ69fc4445CHuDbU*5i7L z3<{N^QTKz@5$48o#joX=XnBkNR-6gT%VvK*yjot`5%YlB_y!@Op%{(r)I#cXhvyZf= z4|!eeVnEBaaG}7xBe4+CKpRiDH> zSIOHDd1Eh;j9c?mjY3|$Fn4{0nyTb-N9so2rQ~`)gcPSp-hs-hs^g5rPw%lw9k@t# zpD1F9WhHxGa@WsjJi%3syx2&25Nb7sr>^p_Yc(;x=J!N$T=d%_^?(rR{U#Rz^j}{ro|PVn>Uv)|$q2pSEM84;TKi?dXG|YurbS%MJvmZp zdP093yKsHGhq1>~VpRuP*~fBMb-UTRl(}2gSvrPT*su_pON58~{?Vpsm}Yq3#yk2} z^soQQYVAWG6iq{W8*bRAe4LPF3*5=Fqy6{y}(n<4()*T(> zoJsz?N=#~W&qQ~Y{z0Z5(F1(#eP#?C>2P)yOkYcs56>q@gq^>KWTW+5AD3rw-6|Ry zPgMSJ90Al-U{pLf@qm!g+SokW1ckGY}Hl9Mb_~9eLslP z#i)W@Z#K1!jMAuz8s5S)FK;R_DO%guY_6^fIr0!;zen-U(JhLbF(YZ8t@&8Wn3+L` ztpq7lp6zyL14%XxorECY>gEe_K9e%t_klVrR6D-WP=3(R_@vC5J7Q5#P(VFcN2Q)F zWnU0*&&dX9-vjor>Rkqk5iG}(v9|`?Mw}*8etM! zK9ad%JatFA5TKEi6Q8x0mzRdd{iZLKb#=Uny#YlkLho_NbnO-^5+XdaS?6x+lG8s| zj8Z;d@xWKY+I)W;i}d#4Biw9=89&~8(o^4g9n3-y?fe|q4@d_RE<1r-!(piLy>LIo z#W6qJn0UWQs`!MFQB;6{otIa};<0vL&^HeIoEm<8r9PvrW7GyS5MvnH@`si#|7sI6 zvH^VYQ6h1<+y2kWP*!PasX1oh&`KET^ME4t^R4~i9Hr<6C2EIi?eqX4PGV7(WuXmo z$<@mcSfd?L6a-csi_Y|ztcSW5axk_eEQJAvnK{0vrG-WI!(t=0PeDOJ+oHj3vv$M7 z!}??g<~lk$=>ZnDwr{GneaQ7yjW;=;&|TfG5_erPDw{z@?1oKy3mE;bn@8>0pzuev zV?+8NG>-3iKLFl{z`CUXYNXZG_w{(FN!kmvDs5T43Z+$=F(i#x#>bC; z*SS8G@?Ka!PvawgfL!9>299t{3SickkYnP;t#OW9a6SWS=ZEABwuVibDA`H#c{Op|^SKXbZ|mgKDML6BX0v zi<~!ok@gtmsVg_}`EwLizwM$RN+1QFd$eDv#&Q5m-nTIr)Rx#5t9kvw9j&;PEO^qjTbY&%q%P{930r% z?eE;V^FdVQ^~fXjk>Olv)reCJL@+HX@{LiO0hhuz7IPL#F856C!2sjR0vi~*fBpI; zrCXJqLouTN(xO;BmQgDQX7xX0p|W%9hujSW?(u8Mtfc9r*fOOJ z@ghnXPt>!4QIpb*iAs5F){o?9XNMcFYbSHhV|~T%L+sUHAVkezvtR7Fzk@?3{4Gf0 zU@XxN`K(){;*E#TV2+%`#f`VEGyW^2Y7LZp3=cAkroRz;ngJZ}kW5_GQdW*mOr%d9 zOL>zXdhBzSk@(D7NSjUz&t`^FJ%#{Cq^XMMhQD$&Ls|L5ISWHWpNU^y5T`iu-u4~V zL#X#mcVWxFCOav(%PR=!&@Q!W>Q=E)`z!T}-vFm|bqo8qqUWkUenQkBrXL*H}leDpE4e@5D@ImHu1w#`tQ7JE*VH*}|-(x+OIqZz=Dl4Y|CMr}t zc0>ySy@?hblK}*Ty8naq*a0WHK(Lwc7|zR zBWA)UfB*1B$wV%Iu?K$*+0rPNN|If7&&VG8cZG!v*QKL+v?5rT&4hee2+D2*Hk3wr zM_PQNr*W1gAd7P0_4oH@t4_s!$a|bV%P8S`bsLrG@GyD9t1MohBYvnhF!amT?O5fB z`QZY+1II8{#P{{j;hrOJUi^4pPW`P_!{quTMCc$?m6Rw|lD(Xrt+?VUqRnBVi_3VZHx%tCyp)6X=z@ejY<*Gk(kK}sU?j==EJw$@jo;!HGA zp@TIMP4B1?EJf7x3H{`dNI(q&YJ1|TTO^(75(k}a=BlcMgKQ&9lW(SDR%yAr<()vi z;BuEDP3!3RM?A~M!~3dAR11)T2u>lj*krwXrE<}x9oO#e zt};s~Q{3A3cPP;}DEU~j#V)ylIWZYm*x}pFMl_)AFM)_sK+s^^pGJ(~)7l00ST; z#;h2;&JegFMNWGwvX-IJ`|$<iO@7pc<85 zRFphgrhj&q&@RKt(UE~IGgVeloIY|g^Ot_!!`z%kD-b2upx2Th1ab%n|LxQ2d>agO z^dHmj6^v82Fl^Iwx5UXj_Xm&P%~e6!4re6mTSxH5T2Uj77Llx~g2Di73}g35=9z&( zZ95V*W##lQ2`X;13FjNkXkkjoi2r8J`SRTLFGfjR$;8I8Gig+Rm*#v?roo}$*{HMfwXbSxvaA89aK3^ zq<*f^{*HHtwewd(UvFc<;q6S2nLm7L!E^GO^^v8w_to#;ze|j}BgQb4i`cnMk-G~t zRXzi)dl0dCp4I@=a8Oj>Usgo#<-4@ll6R|b29|+VV8Pg?AoDt&{r>%}8MA4*COsXU zqLLB^-v(%V6ciNf?d{!OSmeFkjERkpuY$|(^XJczk$1w|Df24doa`=4RNC79sZ!W| z&*4LUKGAqF;eFoj{b5^kV`Jmdqeqsbg(J-b@dTu zB!9%j#+sO#N*}DkE=*4sna47vPI9mNzVhYs_=NL&U2oz517P~geu&K8!cHOGPw2m< zn{MhnHc=<}E$dHox?bAH!^0!u@+j8W`|51^YE`Wf9jld@On?pEnwy)u@$#UEl7a$2 z^TJ-+XStwwd3WoYyWHBzngme}kYtQtYxw{ct_Axd&Cyd z;;oi5BUnu^UmHE+fUC&^sBi$vS!1m*FOumx1YYfIj{kNo;te5Y4fKFvMEpuaDTqZ z%fhm~l9fF8coH*d*?o6j@gn+|~) zA=|4f=d;W2^TX@>Ww2aD=gUi}6nL%He<)Cq&nBL`7$h8bsPOj&4bFwg7aMRAnCRvW z(987xLvr6?6jD@qLvK5$WT?0Y-h{nOmx=&>vw{cZh6!S?R#;9B3N)P4&(bSU4@qB_ znCXapxxRcm`K5d1<^BNiqm2TQi-~?_X3aoUq2EG9!1k{{}pPI z`)K=an`%^i{VGT)eNbyF5N=QxoXAgJHL0d(cGD}rg1Gn~=Ewhji8g@m& zLFS&6^6~@NnXlUCxe5ylnJ6hyhA>hb0|NsgEK5sDLe&(zZx62_YHDigTAVnNs{((9 z@jwvQ4}?d*hKD821a(W!|DGfzB>^~M)YjqNv5$LrG$b)`c4qvP&)(GR?pPy&;zu@S zOBoKfp4*>B$Ig#s5-9a#la1~VoiW4l$SNKW)v@v5#UVkQ!U%5{es(=`SKBQ(_NmNo z6YNNi787mTT3dB$on^;yHwQDM{|gsij&{4Zu3E@0?N$biwD^d`ffGGIc+xz9Lpl!i{l*dsbsWtm4Ai&*U1zKsT!_(S) zK(>$(2_JA#i{v7h^{~Qr$^NX9yIdZ^cA?%1=MM=j3JIffrx#e?BYA4FN4%TV@(0fz}W)BZ#0nI$z4%JwdB+C*bI< zzfPmq1w%$Iy43!c9TaCrN2{?CQ4Ft^P8Yxq+N(2BJ-^^~AIKhq5C`!wl@~(Q}}7 zerx(fMMXPx3)4Ww*4E0(N>w$MurOOKj(7_*^e{~Rr6)n(!^gKTE} zmC`AgD6zM~cDjL9R{Q@s0iMjt!or_c&n#z!D4cw{*MGBkLeXTI8_DicLC@2)67|hG zsxy>&LiR9K2mHh)za^qS?O!_p2tlQVl#xRU+HM&ckG)<_adGkIJUmpcC=bIyp!ysx z2eNIZW+2Ru~lj|>Q!66K;;%rZw|lm|p*n?1hbSF^5WH{RoTn)%y!?(wSOv8dGG2$hRA(H%`6D4kXW> zjo*5IHNT-(^XfLy!7gFI)J|Z{8P12sTTFx7(@z!c=>aJ2a&U7?&XL@`n}cj7tE>#Y zQR-<_+*Oj6zQ|=MXU*}DV7n!2Dm|eKoHfWZOf{>_KC$ioYj22d_Ee0qcJd^duaRU* z=9~V3!_{|b4AmzbUr+2t9N51`-hQRi(!)TA5o+McHyueS&Qgy^NF7=MXbaK+YU_4l zR(p~+r~4~)b#;S-if%=UdV0*(wVDc7bOW{ubHpS~MFeGS{M;&b8>)%k5~^EWFS>}P zs+2}%cN)oYGlu=zV!x-}4hIgJ{yiFMYGW6dc-?n}nTpE4h|`4cWqR7h4<6s1HFz+ley%L|oHyR8NlWk_Of%y5Mb22w)MDCK;HicmrS7f!}&oYs=B&P{Xh?9Bl(0m%FM z)mvUw6OL94z1m}yC5v1Mj(a)S^0$HIWxtsmpEMO4{dW3^nFw%CGrhIS(hZ#q#L4vP zFD544M>r+U{nyPUijkqA6H*z=gIz%{FC~^U+`+}tuHMyEy6;68)^pWJoFK@yuoYu~3;^xt^b@ndr^w`*^#Kg1xBou_1$TsfG!P=-EL}t>7 z+-HdeB_(V$G$w6Vzw}vNnV9f=k&`Ma%()xW9})3KBvvfFW~9uqfR&hE{w1ewe4(AE z{Fwk7@lBd6Cf?Pw;iT0!_sz|OC~Iq9WFkxqiq);2J;-R97$1j&^j`92|1N1}L&KCs zIo*ZtU0`B}h}IlSRoIP9O_!FIhTL&tVq&}+^(fWCn5cg6b4z-tGbjok@TS$xomy9u z#121CF?m#Sq`sX zFYSf{++Y6Uw7z!&%o3_#f3vahN<`nj#PHX*3EX67P%w(zcqfTR*Y(%YEIJ5yx2g|+ zij8j7?{Ji(AP`TxdV60ut=_GtHH`jkRS^(yGpdul-MeUL1;iuE^<<&x*=X+sCNG$X zDbqA4vX9kZ>*h49H7WPl(aP)hx`_C*5Zql2<(x{1i^;lx`fO0=>d#{%w_yrw z=zB^W3S!obqr$R?REOfqhT(b*Im*cMyj>lQv2h_kBEo}5SmEY%1nzjr7ym-ddEX`8-8_?Q)X$wC^m?-hFSZCc7j% zA|oGoyC z7cadC55%#Q)(0Z}M<3R3)6=f2?l<1ndpN;YgNJ45Hc4tPt+b0xjQ`-hD7+6p`|#h- zW~8UX`glMN5SVr{>j621YOjk^h{KsacL^ThaybTfv9gdAXawdezkD}Cv)VYd z_L1r(Zw=F)TA=i_j9dtYmP0S+b?1pr1`=57ni*GG?_Zf%6eE-Q0K|M#>eWM=w906HiM>9UK^lgcRuG$J9Tz)BM~{ z*ASt5?aFDy;qzzIpf-%5E4QMx=|B7uC4pT5E0zU$ij2TM|)&=0-I`|ypD@k*6NaTNS90HB5D7EkTaN{mP*3ikC-j!zc z6T0>-{*>aUzQTNhD?o0+w38}sXgNd%7_F6rFhAZ38CR0Ld1@*J2Zzczj{n^lq9^rE;bK$durU5m z;PF1<&0pP?h?lpNmp+{gVxRo;jLKN$+i7h`S1r*TU#@BmrxPuI=e$5W56tWRro$;!0xVt+Z-ncM|njB-CD3S-(mHWd`s)w z`P_Io0)hs90^d)5FI9Qf1`3&GR>N9s%196PJ~jXKPXm)YUX>8FnPtk+HcwMh6>*n} z3KvbEP@mN$=?&OglEVj&PfkwU57(Pu08gQQA}JX-v7tN9#n27q#D2r#j#=R^{N4=> z4M|hSS@OxTEMTrrt(zHVoJKuiOdCr4MO++%9`qM9diGcEv{olOY7X)UuRdgraH_v) z3~rNmKfG5CR4X=hPLNN!o;m{nmbX-xH(TJKRCIilyA4W#=$II%vqS5Ch36od89J%mzI*@R;V0w_re^NTqjcE`}CUx$k0-`FTi`#~v21^kIP7WdI z7Z9+xxX8q%2$VzP+2j@l#k|uW`XJ@|0Xy|yuq89Df2#fXMEREW#hZ;q}4sbTOg+QbSDOXyJfpW?L_!3tJ?aMW&9!{x< zNGSZ5p#IbYw)Ac6PV@fNp72)W^J!_XMcft^h#d9wL*~4H?tE>r@NzI5TP66QK!9GJ zBd}R0RV^_xYd62JV335QFZPdz%PlCdX5x$jQmKnq&=+cfaM#JuMDg<1nnp9%*}p&j zrk(!P`GW3TQQ)Vaz>M}ATPV7*x$=vT8fzM+0uS={MjkL@cA`9N=XWxZ&qv3b=bkVy zq_cB%mmC}%T(k5VTwi|5^PS9#F42uyRlJ#U6|a~bdkVILMLZ|wvDtE05mTY2!F){?imo?sc! zedkZ9LD4TA3knWq?L=&UTnHoIKRT+_F4Xt26cZDZk_u9ktMc@54hrJk%8ss3w7w1H z();{a5i5-JxK+O=^rpucqmH7IKdXPwkZ@Rxz(oTM(CP0zJA>Jp7mO>MPiTCxH5x$5 zW+LQtYX(#$zoBt^Xi7qAGm8wM1RI;ed_J~}0%h1a+_;cBc1?i2bm)kII%N4i zj>k#%Rt6{PGnq!FXD0X$&Q=vEkzxBFO25{iyi`*&eKr@!g)s9UTFEag%;apy4^pn5 z!-u?$hA;mGqq(UjULkcvmg+Ql=<5O^fpd}RYTW-5Gfr)r9sTBNVQHg2&0m%XFi736 zDK8#ClZB<|L8&K2+~+&Hg-8Lk0)?kO`yM3(; zKaRh#sP=95<`|E|l6$9-G8~RduaTc+ROgBakmEFi-ohMnVrnX^`UXOFV8s#eL>i~p z>(`}2E79jhZep%~*PNIJBN99Q;vu{4hRK(myifPUsX(ppYOx^k!2+a7?~*iK`-V9* za%gCXwH}eeK@%0I7$o%)s#l|HF^5leH_6EP77e6tGCho79G&^#SM)PrMVj$Glq!au zq0ZiqE{GdO!Y#Cdmce29OFsZfz!$)r^|J@{J4aj7eS3<}tS}#j2}Llzd1cakZEbC|P>0^jeYNSy zM^?HAnchYkbz)4nw~l|POs81drC0YI^-$#phf0Q`U5R>-V0R$FdQ?%6B3+M*arf*Z zBO^mu&u8^E1z21o5)(m#qT=>NSz1~eej4lMja$$B=?BaEHHFcxi$bGsocoTaPiZoJ z-dVz_w~F_gC_%NV#LgdnqIxb0w4=SXp?Kw*77nC&%yD@W+J%PG>rv&-|{^og2?RE zy(kC(?`@{ey3Xc4Hz*m@c-kF*JZitHtvx!N`2Y{b(()M;>2wMY9pV%1vy3Mmi^7cZrmD4GuyeVtQ-3+>)q%hZI{}S2rnMaCFnMvNOya z02nK6-tITOf91KKhF9PI$!h+qtc6NP=+d^1uQa8#-3m8j{M@_`+r6LjUNlB+j(~ur z<=W0%drrfT+O39Kw*w0q4tPwHe#bx17u^PQs-~QroVNC7E;3U(+~fU6vuy=Q3YWo2 z?T;`^*?1Jma+3m;BkqOr@=BSwe>GF%f{`Vl(~$(|c_;m0N$RK>~o-4vC_bAAGK@GtVB& zdF9~y>(=cdqIkWr&$wAW&FuKCDB{RpP--Dt28MQh2$Ep+GfImwjHi>?s@f$T zV=ZWlZ;mlvzK02iZw*!Occm@a$VcVGUR7=Fker(c+$$QZe|-Os69y<`R}NTFc8U^D zX+@d@1}g4zZhEZeHLTq^5rrsgA#&Wc+_5hq?C~4#^AF+c2#=POI^QADD=qasAI>JC z24~loJ{>Z}FW9#wAVo_1GDxAxhcUuapG8^tqFYa48T(OaZ)GcLVP}9H6CH&RQBeK! zPuhnNsX*BtuW~KJ9Q{|5m9zDTH3k(6ZW=N|!kv@PZ9lu!@ayFh58s7CIeU{HC_KM# z`t;ZNhP>Am%7)`~>o;PfYmLx0h}5Omr=Jzx`SG)vgWVzJf+=U9N8HOy_KvwCVf#vyB%8(Gv_ZHn;u9 z^*bPW)nOtU3IE3ZC=4q~zdgUYuX1g*_bJZ9+a)rr_{i^S&UC7-<@i88$DN?~-}o)! zxL2An{a*S8031S)sA_6T*?Q!S1Q9~301TsI^>ydx^*cblTzK)Ier1P3iWp&pJM zdg0{9+1Sa}DX-}tcbRMh493reVZ{4k^4TlGkp+zhvNAbVUNGSApFuWq>``{<_nJga zRW(5JCPMui6oIq~RHb~+JQ|?DAc(tM@164u8uRSH*g$$gne5NUECZ2luGwo`yiiV1 zM?4Q?x_BhL99%xZs4&)wGFT~2P9@^c#$&+Ul_et~)G@!vscCEXl$2qA%g{;B#kkE~ z!6ZG-?HIlbw|3#`_I7jGyx#K88IGL_|J4nh^$oQl+H0+?U0Gg(pf(k30(QTplbRYH zw>hx=;BJ^A5QKeZ>;QWsrj9`|$1A_XMW*Bu4>!fGxz*<0M%C`*iMS`8%^#4ZB%Hmp z;PQpK97jflNkbKDUo(>qQYi2BinRl6ww!SW6x3Eg`wXgP$jW{(2W!?C?&*u+8lfdt(z5 zgJEl>1nEZR_ARX~FQ;5w!hUVlSgbiYvW{fO1ZGyzljJ;}3H2{1@-dx+1VE{dPvT0MWEz>(Z4Q$`zVYuLpf zxN8CvpG%1*WNb{G(L{=UOG*(5A)FpGNUp z5Doj@$Re4dk`{4^@o!FL#~*hAZyYBA#U-`Uu>27nK^_S5HDb|R&_Ppp%NwV|ZxZV(B?saEm|QN&L;pZ}4z#s(5Jl7Y{P zCslunl1hC*FVm?TRJHQXVdcL%b_ke#^!4@M4t9XmH{Jk&kX$}EO}H( zi&mSn&5$)DxiV1IYtju-7ZU{`@j)>%x2$CBH)yd*?&p-asWk-Vtkx!ZT6=$yZd&c! z@=n=#h~87QoP_=ntLCM&%<#{$bZ~Y2Y&ac)lo{-d9XJo_(*6FE*OTXIiyuAqPPr&#eCOHz z*$N#eac9~^%$0cSQ!x8{L)EW=6bue=;-1I=&>jU`GjKX-=k>D#TE3LlUjC%@uV347 zC5EcB$5@31n}hyl*i4vfoe0*I=QE#Y!eDboT^$Lj88n#z(Kt{KU53M1!bN`>_MR`! zhiiW+;bE(+?i>BHRGLL?Ew7X5&UCA)rbTvciV2hU|Fi(2!6jAIS4I#qpYX0rep^cZ z?A8(Pei9fqJK%g3(bGrPz{irFz~Te~kq1LWko`uaE%d#{(hb88P& zM{1TKr;a~VYQ0oIJh$mZ6e=7@n7`AMhEeYcH&W8nJlvE6Xvo&L*9}kY;Iao%N^E>K ztt}K3S!rZy#oOGDcQ%W64x1jG^jJ$b+Crsh*#3an@vCG{rMwfw4I;NFy^(b-?X}TTopBaMPBJM z(){3!)om-59~68IU|Ref-wSKK+$=L|5F7tEz#!>~Kf%9TbjI5YuZwS|6Q>>=mbRFf z3p6FG$4#KDYtzAiaCdHfLrFtJ(&$zC8Njn(=hUKB!^jiNdvVKPpqfyMQ+ZRhp!!Y9 zNF8!yfN3%h@p-v9RwW;wiA3wFZLU%sXsUVo=H6C{^EcYVM_`%1HMkdGZf^dy*hjGD zzj<5QoUF|uOlxbSn_DJ+ea%_qrpi2hkhyER-v`B|0j*qk~aBwLkOALPFrEwU(BO&}yQ)vu7bhS#8~ohsMWT#m$xf zfkg!k73?YC$nZYNmS6nhg@98NE&T}!6~vT{SC?mymm_u*ctE$6$Z4y(%+Oh(@5D+t z<|pRytLmPQ!D?LiDHzG-YyT4epQ&M&wPQtU!r&(C0?ZZ`GVgQNP=ny0py-&JaHS#t zr8>QQ(e_Q#cp}s!3>-c`+Z%57;gqa?t6>RRBdy_O^O-T*R7fJqG#;TG2G;hC3-pD; zt^Yg~$2KcK1HTzGci?88Z^9MU-P_x`kBs=>Ax%U(a1>ZM?1Exx|EHY2JQK_#^4yNg9~;gcgT1{ySsMIISa1>_a(4KKgCp>~1~}N&L>X|* zfwG>Ndlr0OU3BUyQuql=*Ct3VP4JNR^epMiZGpd_#IvlJ`w=#$BuoIh@Z4LhSmQSv zYJUN1uZ!EYKSh1 zKzs$d_^XD~GWB}_w{dXPcF-S`2?JL|o;Q;F2gPeif(S1)#b=}?7E`pZg7F=7)dSZz zF6@b+)aSP(J~6%ms~15{JN8=^m0FO^33|wc%_%q9A=$&t3tE}ViAi8zCMPGSrsP(X z<7c=t2!oBsN{r#cEG{l~`H37vu9C{!!UF!Am>5Vv7<=}hBwyo>^Ge0;SSBQEKTX^F zlLVX0#bR-|ay*?1#(l+z9Sk@c29K>X8bB;ZtWkx~;O)b~#;(yW{HJzvW*s7edf&YO z*Tp(Z09^?QHNYI~?>pYr^u?5nS$+_r0E(b;XZQrkdzE~RSz_WG(7dzB?0P_a9W>>N zGBdPzom|A#UAH|QhpE|t+ayX%#lL?Kc2f^dXaVH2gfdyE@pC+95I9DQ^oY2bz6{|l zk)^3Zsb(+vikFho2#D9;mNz=#X=hYoBUa6I)HJyUa|y8x@4!cKQkMtV!gz$n(E##D ztN0{+ndSQnODel`d4z1~k6#dwAPjOBUye(8E`52!Qpxf>X~}k~&h_H-06aLXTF;pj zwY0SCh9Lb6n*)I1wG*tDo|#GU1|dRYkZQaAm*3;~TU&5V^43F(6LN*aDHpQ4EbZp#z%tt~A7|#A0&Ad=yStFsEcTi9{)z#DU!(4_O8AxznHFtY^R;Gh2$Su+t)s0*B4<4xI>Ce--wOQGCv5{BQ z5QL{nE($tYkc>)8gC}7}wC9lY2J-*96FmlCnMU65{Jdr#e)-30vf)9)ol&8iqc;)F z%8cMuxP?tZ{+y<}1k|H0UD*F`I#JLt*=hz?YVBm0aI1b~y6pbKwH6JT8~JtpE%YI% zA>q=7D;L;zKxRfEezvM)(Mdk_lu&?9;&dbeBJ^J)!n=3L#YVWo+xN2gFC?2MAKph_ zL@8we#Y+YJYw#5ZW5%HxdIV&2Np4R|B-_|R4>WaGlP294z3OHWXy|-F-s?)3C7jyy|#KZ6*M8r!RoJ6 ztk2MWJ!|Uz_a6Lyzyf{rfoFY&`32D_d z*^|bAkitjhW&JfhdyI(|*su>(-Gg^u`^fl`Y@<|UZ)AIGammVU)VSe~Vj?Re{BrIR z?FXB8G}&vrxz)5928M-!Z3_Z%uw+weS&SxFDz`K#N1r;s%(RyvtTmed5oEqkcx4hx_iff>8OxsO%;<%(TvQm}hASL3 z8!|gWycET8dqWN9$r>kUMbz2ZNzyJVA`&l?S$&T4<=V%=F~;dzpd8BZg;}@m146}5 zzx>-b+y@$(&Y)?`F;u2HmFnQ<=HPoldfu0SC6)ZXg1v8!0;`CYIzKd2E)-213;1Dw z*R(rWKUtkQh(k3rG-#rp@bO)qGPm83h%9Pm|IEY8q3=}|*1WaED9 zq8!Y3>ZX7J(a`A|Hz*yO^1kvUzOhO!|IbnL;fnWz@fck4RHr_?=GMVhh9vu{hboT!Y`Ve9v`&UZvILpI%hC^ZmAng2Ej+wLvt=LC^pCf7rcyXJx)o zrneLS=}j98$@??C$X0kjbKM|N*bVG~TmsU!`w zh!Q*eoy)hswq!r%yb*tg4W01kf`d7un6ZZQ9=L>8Rm1``)@GdHC{BgWSr0S*7Srl^ za13UV?RAv-YlEJ=G*}KKtb?;zE*4#!g|&O&Bu6JAlgnhZ&h1H6`|M7>^~@tP9yD^Ux^+LF>)NSpGxoQ5KQDZp3~q zE^ps+5^StY@uU~-gzsy!SJfF8zIfTg6;fN!j>*6=0sfY5e)s3L&t_j>7PVCj1lROnp++QP2` z)IFrIM^^4eo(98Xqsdp^c(EsLTK+5B*&}7oAghX}GIy6i^AwEBCH>%;`&VPz+uynu z&@W9Jr;EZcO+V+Q6D!lVzz9~sUoK9ZXog%RUa!A@oe*OA8p;iXb z16pU&Q!q`|xxNOqBE*HzP=W%I@vWolTfDS%Xu;tLb>0=|@(F`)j8-`8@HQH?W0x3F z3=k=If@IBMEy+Ea=uCdlyF5Zrjv4MHjlF*di}-v-;-M0|ATC(6=1JV_N#dfSjLJ3R znDv;VjB4t1i@FzT+zxVkgjL_S?3_EZK1SOSPj+&0GSfp{J=Y>c(_Y_zP7#E&<^4iH z>E!rKugjAqhdkqQ%>r=q3N=2aPK`VYz7?FZdvLGXTBR%k zNgzJ=Bf%8_GLGXW`DDJ(D9z{&P};&NQT-Y{X`^Q7$YW$?zt9x}^<)vgvpn!;zNGet z>Lx{^R#>WWKeBH8CHR#wFjNPw-4Ht8o|9IAN@qBHqWjdeFNqN}@%kY^Y_=Na6cm8YEV|bu zYTFtj%=ZO{*`*Y6FhEj2pIJ)w4%2{U$bLDiqtnwxP4e}|-Gm+o9~71dQZ}K0loLP` zl~YxvKCVv?nOkxX^Ja;fw3b%l^j7;1_y|(7atsjvL*wGkTqNUvaD_v7^qwVdfa??O zr75Or_`?@n_9PT4E;&HXUupdAk392d)Epuw8gHVotC? z!tiL0h;?!-rPu%S_9MbwlBig{VNKnM>;tT9OSpv=p9^%_SAG=sFAL#QIT2^WlW za`0g=G$oZV{WGV3B`w~g4C{X$nD~i}O@IoUn>Mz#S@pEOqKt;aV+*kD$ICIEG+@je zxWPps@-s<*UnPTlN&tiuxP8>nB^vkrLnRg>(0Qf@NXg26IphDe;@E^dV7g0JuWQTV zO#1MlbG0@YSw-CR)eC<8{cFfz8q>Vu7(|j*!T`?vFox+HPd~|ki1Af0nr_$9UQBfK zb)%mw#@8mLpXRuHutFOy4z)lnfJk}yTlNdSkE{~p>yI;}Ao1JT*_rwJ1mm%5#!=hb zn|~iLGsh$+>%DyWHpp19@fXxPSSwXDVy(^0zK_zr{_!CD`hEz+xt>FnFJOv+gC-fO z3Uj?^a<^~K*Vk7*%+l~)CP)R0$MhG!^_onSnd7(HcgHfeDBfgUWw?X=Ou-!2Rf|A8 ztuy(*a%vM26psOO|L@8?YLfoU_D!<@W*{CqFTW(&m-XZ>p_llP{q3F)d31F22f{Q$0s<9f zWpc5M_E&5p!^6L=p4sab=H#qEpQ3nYZug6W(c58Quc1LhHX(o&$;|EF-ev)per&5p zvmt1F0!#PWO00BrNV{T0Q-)SRC<0UX!?haPBZRm6n#UCYu8ku7mX?N63eB!zdpve| zeCN);K3>f}Adk1lo`hlu+;NY^2$XDWY(SaMC0_z9#-LcWsGSrdM%iwUddte(yea?R zDIr*0U8ShH{O-}*T&2xqA2!hm_78gcmU242(lKo#Msz?&j1PJP{zg?Xw0uFC!lSjZ;O70Avr^T zP3v>Q7dWqj0V^M$oLw0lPnjn@|I&xJ^b!X5{bhyVR-duhK&T}K;pV_rNs~~yey$hj z591Z#qag9Qbf|suAdI^{AP^hO+p}SsJ}8vm&q;;<^;e;ewB2<9Eoq50@88)q3HZn# zPn5I-+6!i(kRX((R}XR?zHp0Pm9CoH1k7NNyU=F!Eb7JK$=Oz8`+w7UK(0P$R653z z%);CrPL`$lG3cJkB`C!=B+846?|e}l!U-lflz|6-uv_HFi>f$x8Ic=goO-rplg63K-+$JFt%Jf-lf zt5;Q%HqlxCR`kFR9aS7QO>=ZJ2{aHiRUYyT2iN;O6%EkRWhZ4r7UMUprvVC=SDeZU zN&oF4Lp!^O8MEuEf?_;IT({_f<20;Ds(%sQ0N)u=PNTz~{MEiZs<^N#d{crPKHmkV z8=o}L{uxTmX22rm=cf~=r5=SiSWh>6S;w9jf~IfKE|s-&SMV?^XcwwHF#mYa+7ea# z={?MNMVFjlBIZHqYwH_mzGSn8KnFb#tPI+Y+er^@1w#!Cts+D4e;;<+XVPq$kzP=? zPS@7c^F>Az@L-^a4U|+BOxM)bmZ`{D9Fj}o4U~)xhtq*ig0=8(lM-Aah2_1gK0clc ze-a8p0En|JExFanfLN7?>#D2A790#d{!e@F85QN$tcwy96vYU*B$>%!i6RODMpS4d zH9>+Xh)9!Fl0*Yy0z_y8S%8Ry21zQClL;k=2u&7H1SCk#sn7Gm_wBvM8T*`l@BMxG z;aFpJ_Z#M{S>dUtsw~VHC3Ga3$-)^*# z5)*s2ck1p&VTaI1Bv8dS@c%(U&A-IU#vtzcCjyeP`UNgxh)S{s&Yzc;l7A4+0fOF( z25WHqN|p^m$mXoT557e!t7~i1aM=5g5$mff@{x8~5g$LT@q1^p&-}J7?demWj{Uql z5XqdoW^u#DO{`Jb7BT}rMj-ySpP#wvkK@Y@Kjq?vs)iA(NH^@cnhVsi=C8)?(Z~Z= z*!D=UUntkna>aBH{08yt27b;HA|(>3rbVY?SE{G)J?GvmeekbfPldB+s{I%?7dr89Dzpi4?^QLtw%}A5iN!oo+V@}?Cj@ok`S6BWo4PG zg8q3v>BjngM~#Uy`x8lc<3;c)G&0h^hrU9!xvN2wx-z0tg(4DNcC*w+dk z%T24(RGt5DJBj~c3V+Pi#QlqBs`pb=^sVpYu=OCip$~=H=?G|1tJSlh^qjYgLw^ue ztoXBKi_1c>u~{9=^crQfUmH}vL(g~VMLbZ6efMLl64-N=%MTZish&)zS>K}hK~!~7 z^U*$a9Sc%SSWoUiv)lKjSNHS(_Ihq%pFhl2{_;ZU*t7>Kv%-w5KvN88-*m4VHXQ0Q z=-RbwCpnLMd|uJpKJ0o&|4xR)>_$I-7~@Z4+8NoI7vC zDO?CFWO8bED};sY4}syd@8|E$Y;t+g#Jt(O02s zW7Of;O}paWgg-qd6pVu9Ac0qCOA%?c^VkH}t{a<=F3R8WpOdpI161C$2_(Kl|CLW` zF1>23xVT4%C(0H0;hn&{U-o`e)zA=@qE?I{R0Cx@=I>t&Z5JiaV5w2{p{DT zcTOFuzGSm#=QoPSpb;K=@3?m?u9lk?a$lc#xUO@o8~lTa`|H?>s1tKPd@%sP^F-CT#dhyMyym(ecum#ja1Ov9EBbJCHuJ-qJkj7NX-`Y${2?tIbWlbp}Z&Ha^= z#Kb){H(K?1%@kT3pV#|woFueySTG6a0}r!qZl7a=^y0ezmDQ|Hfhv@!5I$Hk>S1KW zSAxzRAN0g3zSw023p{jnl&ugbdFQqA4Lew~hr+~EwjOra%WuP~u_J0Y4`EgXzG;^6 zQ1KeOThWH?Q@?|!+^`}zzM|XRr?v%5`zEZfngX;Uev$iZFCaxm<1FKAcAC4!oVQ%r z2bl@O$mEn8{`yZs$?lfsdrnygf3#M4{QUJWN6-<+6)cvA8}1yjsryt?_?$<@F7(0< z)0-wDZ>LxA-u(MZXqU=gZMR>ObAJk*Iq>|5Rd=f4w;%`WgXd~LXV!Q4ZfjG1ZJJh} zA<(EaI6dt;N0sjh8hcXh8g=Dtw^QL3=fj>w)D07{Rj~2TneNasx3!m$cT@S64^9C{ zv9hz%GbsGp5vVNaTtb9Hy5eu!MDaDw-ZH8mK+Roh9;68lk^N zr_-;t7{Q{)<%; zsi50eQ0eBAoO0%s%BeFOoa>J$AD9%fX-fcH!r0dhC) z9($IOqOP06etyT+U%x^ z3KEU1O_v!J}u5Cu3+d(f(24{=+NFr2DVRF|E@vUq6KK zld7!|N>W!}ZYK4gu3Y$9C)|uxBi?pLTfzK=V@gatadf0z*JEv+PVX0 z8Z^F28D~Fz-nnT=Ni1+HZkV~Mx!|H4b=P_6KT~yCg>lbY0@H>07}L>=GpDSZpnSNQ zamgf;f@`wv6mh*5n%d7q3=IrcWH;UBOz4f%ZGh$OYVlcXh9`|j)60$j#P|tnYY!;@T6WOS8>JPmEUoKt z?7O2^-#up5@zEcPgL*GpnQ-Hr%NEww$sKGEK(@qd=!I8}{}Q{E+o`I)_h{$+ zsxtV|{3&zFHgNIJH1GwY?(u3qCbQm6E8O`iaWbhPBKM?B3;7*nO|IM;$xQQcz@6X?1$c9X2?vQ2!dm`t-@QQ)S|5VTsEiL%HeEP4{Srj;?fl6K#<+yKMzxIpu}n zK*g_2W@06^B_H}+2Ty-rwLe6y#{T%cX+WiL(^eE}#fW)Y4X!se51%FNyR$~cJ z=G-5G`JMb_nc3NiQJq$PW!Vt=hpbkMJ*~fySX*lz~(-B^yv8f9w{lQ z)9UJOFPPugvT>)ISK97n3ITL@;(OKtl9o-H%h&1fk&E}-BC=o_Ol9WiX$0YMnq$Qe zy~e6f2ww708GX9pm{x6Tt6;AU9i2BC8Vt4vHDo(>fGH1E)Qm6|QA<-3<@E-p^8kY( zmwgIt(_hfRr9g0lSBJmcKHH{W8Em-I>7kq6czbMFG-H$`RD-@=jg6vtEbCNHoG3-< z7XA>>&Cg#&QvkBqbl-+Uq+L>36{&D(eb*@~w;(H`U<(2im2yPv$+U-{;RD1F%_49?71qF&!)s(XZ@>EsH z0)gQnW(PH_vl>m7stN$}xYkw0JfM)WkIPYN^#g%EPP(pFsuR5bo>_JnrmaLx30801 zI~qa7ZE^44o#4VW^|qh)xE7Ye-y02m?JH98QdkMq!fv0*kIaO* zBG!7o%bvGBgd~I#>M1n$plo0}H*FVgvdZ@@gz;r#e`opQSB*AtFZ)n+2d3UZ6=)rE zD+)zbD40H)F+6Y3kZm;ESW@U~>}nC54`(sU|5QktlrLO?&;$yt9mhuMH%;W_l9vxHy+V zCO8@IT)V<8dk1rKU?h<>`{$sWwswk>)5K;DdOLJVOsHx?P46iz_LVE6{*AKHRp5f_ zSTJR?uN5hIgz5v5kj`V}Ccx>XSww3R?&~V;H~+T#9H5AoVX9JQc$h30@7c3w#08g24vIY*%VfygxUhqpvqiIgqT>6^^TuVK<|#ytcuVtmkv8|OjXm-_=X;A5N&QI1{dI~p`jrgJA2>AiHOL^ z@u^VL?LjLtYrlP8yY8Ooi`uVODo$*}Q^f*$(lL3n&~^EMAK&#|=S?~P;oCXTZBRU0 z0P|{1UnQNt&SB$=Yx`RayaWiw~H*1*Rlb@k33-nRCsWx5K z(2KcBXY-BYhtAt`oOyN8|Ir3(l1YY{?<1Bwv||V_Vq;^SoGs^DTK+llrb1pp;izQi z&TY)g^F?>w!(}e+>J*yxQ0g}=Q{~ti51WmE|0<>`T~keZ(*djRmXvNkd+7qR`=`Ef zLFoaV;m}YslX&{HdDq-J!@*$)!i|-Y-fC{R!x;8-lRcsWu;ry z#0Lch$v5myk1+H)U!~KizUz)zMp$|0k(5x?xR8*lh=2YW<7b5{qmNC7BnE6zZmp@& z$y4@y=g;ldwamCO-SkGb>#$idUGUoPZFt`E_OWLO4+AgQqK9*U%{d*dq_}^-fn^Q# zjz+QPluzEqy)S)?XhFA0cDwplF3+PeasEEME8D2DvJx%RaGrIzj{6?@F6LU$3i|f30 z0fs-i3axhyvO>XWjC za3-{s2GPhSCiF5Nr%#xwM5q$mS=DrqS=78St3!EytOjNdU6e=~8k;zLM=IptIbjnn zo=*^gLW2HP)6KDLwAt5AL2g;KtQ$3nO10W+lv(f4LS%FI%E?LZ`iOQZRhIP#;g7_u z^SJN@r9xaqbKiQdCI)VUl@`$G^tz=OMtQ@T#g(3Muz%Q#={=d{LOm=FRW(4HFlOAUqnlI_48q=O*!|0dLm^LO(d9cIDtJ0Cq~XLlO@ z@{<2wUpOJVt8?`2=~r?SYhe*or`2-T+$zX2he|w^V+0V1S!1=z$GOXV%=WRTc5dih zxiwxp?(G`UmF|=~7U+LqT}=O2S~@;|IqR+SoP1c>pJfMG{+OL*+D+}vH2ZMRC)rm~ z_Pva+Via%BZ0CUQpDCxmsm*8L%w~o(U&6X2={Km!yo=&B3nv1aFSE$%KS+A%QKH}l zmdlHz_w!i~mcD0LJbHjxgVRy}?SK+qo9F&ry*KsH*7U$h@h)r$fR+QtCb3wBb$n*e3M@CqxqLs!}6QnT}Qruy7&r%VW7rVxGD+vPwyQlL)^rY8d~1j z)!nU2l^z35am(bZ?%tL!FfgpC7oY5fXzHp71tW43R*yS4{C?y4O+*(FU8+Jvbo5$< z{gT0-SFCM0UHrY4BorHkjncJ+u4C5EyV~>Uk=`+QAq|CX;0C0#swFCyD3|{p7|_$T z6K=QNdp@Cs6*}u|!{`BL9dQwxHhZoa8B#AP!vI~mR_9$DQuCn+GiMEqheD*uc}Ri! zH5LO;JJEjYpv7gT974dxvd_XX3w^QPM(qvQ zaZgh&{Jf2gME{eEbC=oSt6CM)A50U%$V?-P)oL$#BcfJu9+P=(oOw?ioj8MhQUEq71UWjrul?4na?!b90qa1^1D2 zQZ+@EwW$Iom0Iy*RkUkN=*R_DT#oa+-~7TvR*~*E4%ImA^U|9B&o0^6R0t$V9B}-3 zY)IDK-JLsBAtF3{Wo9j5**4-7>|4e^!8cU7Y%)GAElud{N?GCPD)u6A`q0io&4w%N zaJ00EH)>ipQPW9;^LT_0f^gg#ZS-vUT2KmbGi@5)hnR#5&&0kb>4;g^>D<+7$orzM zmGlA|vOibEdn7nI+cq&sokV(HExx|gmC{RUU>>oHg?~WXOr*`TpNOh*PZkV%N>4q> zF-9<{YRjjSVZbjSz*%U6UJ1#Er;eOgxO%V?r--7`@Yye3MAsNDgNBC2kOdl>nuThc z%e#&ILXK+4qGRfy@5~+|Bo@u8CW3)5pGn&<6&1hNq-0x0xd{bW`1$$K-&9vrRUy`4 zH+_?kP+G`S{$n36LZpw}&J6@6Mt%Jfx}C*q%;9?l2xsqajqD51rtRIo|F6=r-JXw* z%&**U+GJpbU+|7Dg+e*Tr%#CwOm{~Inx9E2;o|5UK zXxI`MwvTLi@#4bp7KWBvpHYUv1KRg2JpB5@VjFbyUl_y?N>KJ9yfqwncVDK-_>>gM z00nZa2=C_2;nC6hKjbICr7Nu-;5%N8WOB&kdvm%!N7v&enqIk$cKIY*ygIWhg>Crz z^lq412_D^SDImvioP`3Y->GFLD_!~27kw)HVB^HsfDW4Ov&E4|$^q0(n>LwxOaaXSsiQ|vv(+bQ4F#v9-gkRI0@(|V2WQ(I2e`oVgA zaOoLFAHWpyfNH}g9!nhvq%|GD154_}K;EF3)%cyB%TIO@LzaqnTp+*4W18_sa2?lz z+yQXfenlVs>3JP8VKl`=p)=Ld4ac*Xjs;VVdz6Gyr8jTFE{Y!4dYzq(4(f;3y8My9 z(p3S^pLAb%!^+2B9oD`b_>+~HDZ2P$4ll&+CM+#Qn6oHf_$JF($^|7Or!sjgUNwfP z%t{?_X!lXOl+BJ1ZAB)TWc~{$O*A;YRHvhF+b=qpLexJ2aQSsop;r-1{mSI9DAp()@AwrLj6HJ zIBI2*{cW9y(}eoS5n#f6XkzSxuPra1^hE}8i=n7+K2<9f8Jrs^G{hW9!dL^&RbB_3 zaDa7_E5Cl#e9?y^7QNr`Z4~9ECDeZnogP=)5|O^eG1s3B+u8+dIfEuP;#QeGzklDc z?;RX}o-~^kw1?QsAHJJHp17m4AMlNwrLO}>InYkQLttcuZnC3X zmVx+-GMmQ%H*)LP?>lh7N;yRy$pb|1ALn)9KOqCUM_D?4I1nC7at*%Hq4YdAgba3;Cx)&pmo7RI^R>QSZqFW_ z+iB>Wvvb3`V^WV-Ws)r|6Rr`O;wC)(`fq#hK;;sG?Rj$i+U*12QlyMuF1z>&9mH0+ zGJXkwhOO{Ob=~>Em0{7#a98ER`9JpT#O3>Xfks=Fs9H>p_G|?^=H7v?#2dFr) z{~rYxJ2cAeJn#T<@b)0rp18*k)Spq@E)!Rv4th=IG3z6$kl?wWWLTM-mxmrLWfPrn z&d`K5qN-b0DMXug_2>J$Xz4k^uVNx2BLjc%#ndvWU4egFg$T^LxMec5BpDz<>3?x? zg6%<81qIj{Dc2bAcV=g1aMAMVKkq4a-IU94wZWT_ ze8(*-2R+-E=aP0`ckm3Xm!Ke~IJg{;(|RmJ0ix=CV^zb;LbuV2O3Y!#!@QCv}bc!3zK!1zng@XTJfJi|24Uhkoo> z9{7cWgD%#`)iEOy9ZW>Mr{L;(dU^uxlO6xHs&jOD%lz*X@O0)(o1`yGJ_!rkkFZ~c z(Q!ehv9&cyHBK+>Y{8h@u|~TsmEEIg^tw8;37ujGTFHb|i~-N_UK6If;qH44?-?Ck zD!FJ#a%8R75NiY~F19e>Jd#eI*87z_IWeI$*>XkDw`s;iP*AXtak}Z)_6*04kHC`B zO!D@HlTwXyWCE7Cf(3wG)J%?4@-)23h9fN?@6=0fXxJ;xcNeX-K*f#~2nr&P6q`eE!_J+1nw(soc9c_;stRdI`P9>?@av;A ze?8aV&>-Q6r`&`HUnK#@;=zLl%ZwfH2Np1gk`l{{WIvCTyNflEQV^!^Q(rupqcD2 zsPL?`oETMAM@L6_wy`Sd!WNQB%5iR+$rQmw-#@bXm8C|5O9h+gsiaBiaFP;ZZj^7I zO=5)L2=0tND3%ydq*@q#Z2K@2Mov{MPvm~bXV;=mQhzR5UHMJUV`di~YD=zCnmh2R z#tJSTmS47M^*>eJ-s8!pk&5nbUb6crM{9wJpqFM;H=bf3fl{May$+!LYMg`VvA;GD za9A}nnNpPxvk$ke3k{I2jTgyDQdPUFqP+(TCX*y1r9NMfkd+z23-cH=! zZsh5P+Hk-pgzFVj&c4N?y;jq|cVM73{ro%l4atA_-~pfMJ#|_r*yxSTse~G$_ffK# zHAEk0N>R~-^Jb781}`PRAwJwirpHxRYaRcMU}_nYota$bn&m}1l!8vqjU_1SHZQbQ%tE(}GH&D-QrmXX_+!`jegc>+YSg+3)P&Pt6e-nc_=g{$P6AzEn+5E6d zGy%3uR{m)E_~cH2;}!doouIF@Zi(C@;4x;Ohz9i(jS|c5=QTaZ{)^iPv5ftZ|uZe>Q!N2kU2RRZB( z(uNcn9{#y|RBCmiliCSgxZK*iCOul4buxmslq@VPz-4K2pOGI*Hl0^pkAw8*&$tI$ z`>3Gija=B!N8n4OPOoJQt>rLchw@x#_MWv5C#i^1)V2qK!RzYck~KNz^wdB?uh~M2 zI`V#_h6oFeI&06LKZvtd{q9p)LXKeHH{88NsVz$z{q*V1yF{ms$3=5-+mC4>TXHZN z-W%UZrD*R?s{T&{J=;DNFl2E6ZVcvbobyB@@%AfKirs%x2!|0(ne_Zb?%ik`A%K-} zXt@TY1o)4d@$m43WJMv*!>{C#T~yTehT>FqK?eTpKyTt6oEKTe_u?Utdu&KDD^u2m zZ}uiQ(HUpuzcn|{wp^*AU6~i<;($xfsT7&m)LOCyEJjI9r)kVPtrtcf0i(1X1&Wwj z0!|f;?})A{n)-P^qi}ZmkG*&D7bhz#BPZmwu3oL>`+ctu=wx5t9x<8}V#8@}qic`K z6LGf3?aj=7ehS)Qv0{&^Nh$Ktg5Gn(=$pa&SXcD(g%LmHxtNIP-Ubb?k&VYOGZcnj zlO3Ar8jnltp#STwbp<#X@Z}UoEB1h-pyC!qHuml)bf2^<)$B6@8ueZLKC2QP=knst zznEOQY$&$kNAb(EFo35rV_LNtzl4>CQ*&1%c|!!qCWTJ+u+*Fjt1?5hWV@J#eEZ|; z(nt2rv|d7Dx~z3Suy$h1^vv&Al=Ca7Z!$gPiHNvgLYBpdhE&|8OD9#9pF4mbJx6#2 z6Su&6%f4v-%}=?mQCkY7>}p&(xDwE2+n(+V*#AbGosA7Iz~TEA1&LI~HF+1#Vv~#r zLwEciFd@nrv^ki9pK|bm;(=^|b-|Gw!_vE_>R`wGwWD{<#btv(gP4v#6GpIyk~aV& zxYc*2}>e zGdDMf2dg^lyW#FJQ`0thAW~2F^-Gsyn9aLXx9BYbJRH6N%;5Hm+>1|0Smk?UsIBvY z%=FDIbH%la#AfQzRN8jI|CXDemN-p&ED#7;LqnK$ih26zi^bwCYn8$QY288agOSEO<=4uw0h{;<63HJCf*$ZdvQE%V1--(Ya;3_i7)+b7pj zE>rcx?#t%W*WBGvLNLH7H))UGVv!dXGKQ;H)(OBuupsMayjs1wQAg$_GmnYQpoDg*Tbyqmb^>>V)vDiBq(+bQj zU+;0oh{m)R1@yW*BPt6=%EYPH>Qk#9zqEpDZEbCIEz3lNYXN=By+=L^Lt(et72P>1 z6W)T* z9btz?-Totww&W7wU%?dvrE_z0u#Y#Tt;M;4_`EDc1x4p$ar$pK9>f`_eoWC5;Q|!z zj8hYLfP^>{gIVUry`8$-BA1-EKE|HK%-FS_Ezd+=>Zm%zX6RMbdljT_zgMlRSv4EzH5R*HPw=n5G|$54Fq;H*fT|oz8C!lwgA^Pr z6aL`yc|6GbR09b?Wv~1S)4jo;`@iSuMb+tog%PFTF z2M@JK_d7~71Bk4vi_a&nU=8Q{^5vH{rcyyC^Cz0DTY+SCBMZH|AbqeQ=qY7|hpslNMLKX{+6EWXJEpL3^-fki#ec)D@%t%ua3(-8;h)a+tI!4rzB-U&EzK zw6qv+F1)8=>N64+9Ua*7t`yzY`+UKdiR1tH@#D{h4ZNPrWwB&2&NXX3W}w@bbBQc4 zBa01_CN$!cF4TGK_P1@raE=j#TH0$qnC&k7faMR-@u=}MIl{`M#ijUkS*PRh&ktdG zrxR*m7+dR*Nyeue@7_|o#IzOKb04yr0T#2fvpBcZO;2sS<~p{N)($k+*LQE=1!z%j z31(qG=q%9wiLtRqZJEn1nwf2ncW%2XZ(GQO^^%o{JY6*QO-<=4yGX*37>8en$Gr?oXNkQz;PQi4#mycLNYEY!Gxu(GE z?y;X}mXGBFyweQ0DSVG*E%VcZ$dN8$F>5(Ffi8*4;KrSAkkw3I74YBz&_QvDLoKi? z;%WICYJP^3KK^|W7ZC3t9MK_Jc6N5q5}H`v6Ehj(`7R;iL1ypiTR8E0Dqxlm$pR4* z&|ZFrPM}8ek9dz)<8W2JV+HE*NG6;#Bujj#@#2K`p74rz^$4!bQ0%I35FI7@9*P~} zH&c9+gi`+ZwMpqfB*OFr`S~TdIK)=3Q>BsRU5CyAD%lW&ykbSbeMQVE zMOD4Gdfj`BFP&~obBY}ww(m?BHCTQYU=CcWS4>Ub8>NEjzT zyFtv0>Hta8pGFK!W@+*yI9F1`wuvfQV_-Dwf6n1hg|$I$-=lAGZ0!Bs(`zA|116{p z_V)HB-B%#K@KZ1Xj@iu2OfB(pl-lp#BTw!$Gi=$W>*Ia}2XX47&~dFXgb-MM+8!*w zZZGaNEIIH{toS>^yjqZ#Jo?tIUi~^VbMbS!I8}8V*h*I6(IlpFaDH=u$4u2}B-Efx zp?5U|AQL@#-Q^<#tQ`Hw%%P%a{=&)mA5;&ZCSkBqQ#5Kq|s!E>I(bv&HZ zMF`j8ry4K(fVN_Lp5poBENZjUq7hva5enZWBFsGHxJA3N^D+{)y{jF**Vd9>)K?t~ zc+P_R_We|PF0Z8I1+d47?anhi8UKOHJL{x>oD{>tjBmw@PfnI*Eqwj@5ZBh?;#|A7 zG}lWg7=%zgOFUWMVK~wFBtsqp;$HkIg#Cu*U0joS0zbh!-KpBLFyuGIqp@=Xs_*yh zTZv7{1u$}O?_RF9nKd*PPNFW^*5f{$)~9iC$AgGHmxCe1NAF|EVjt>u=RpSQz&^jv%I4w5vhW=@GHNa^KIGBY zj98a!UYiTEM%gy-N%8cw0b~$y#B^3De z&k^y5CwDqSBG4RKL$F=QF)J~DVWtn3A0pxs*Ms&=Nt#B2uI<+uQ(G7v&GtnCH8YqD zU<`^40#15i!dzYv6uP{pp#+bxkWk@RoOGNvja|?|kZ-E!(dS=;b;qKF)iDyhXA%%I zDo(ZEROQ4DM;c{P=;$5~vTOl9My?#)VMjWpy>pVhdbMd|lirL;41LMXV$AmU_ZQ8T z7hzjYB^CPs+ou7e)RbQ>Atj-R3Tam=#B)RCXxDE za`t?3Y%!L~vaAx+=Vg&Y$=3aGAv%Z+Q#1Dn`-%E<*$?u4mo8rHg8iV*Z&q8hJq^sl zKrR7;A)b#qQtSjhgu^hLqP&0qZ&gbs1G{h4V@5UDKZ2B`fdtrVFN?J_Hmk9MNYp1! zs+rDwL%!kQeV<)Kcmc3t2odeBfDe#ALO{X7OO;wnivk{c?%dY8NHJD1}vDt=fX@zv2JFquF{2ldNh$`G*z@IBunC9hUMuYf=0;P7|h z_|gruLVi5#RWxP2k_BZBvB#jTa=ijDCBW6$pTr^2_}VHMN=5UBPi#+?(tFR7PR`B* z!E(M#zi>mJh9fjEW5jepjl}+Lph8QxT^^4CC+tD?S{gOKMSI0^$7>KdT>}191?e6k^CN-Hw_OtkQRTj}AU6 zuia|$U6~3k>7&?8qK^L{7F?K;5~?Si zLwS7|UG@tq`ht63$na}(wmt(cAqE#rb-o;uipT3Pm?OTNQa!mwxd-ehceLI>xKQiN zzBe9`D*p4e(4rEFOHv#vW+g@`CJ#NN$jZ&MeraiGA$A;;-75fVqYS_LP@WxM4m(OY z#4V^T$;H7KFIuQaX8ehGm+8XDV`9P)qH2(jbyo3ewn&PB&D4ZGq)TT$iNd}W;RDQOCl%iQMGOTJ?dDZcKq~-v5IdbzbNlgC>7Jfk%1J)0*7K$H7kcU`3;>nYN zImLX;NP;imq(i@c{W_|9s-!OMZM1PlR_WhL$%BK9Dd>A`?xx8##l+JsKCE2PbY=5A zyPALD@VKDML-T=zc|%_JAejBjFkCL)vndI8K#)OT(z9EZSx1L{)lO$A(w z+(Fw}yX9y--`|j7Zf5p&<7(bAq(VS^CEXA7_x~^!w4JGzCy&OtZQy7UJQzlg@_Yhc z77xxMhI*ok)3D7x$0qqm?A^TMooS4jGzA3(`eq*$#wz`lyvJTBz;2?tBAqNIIe#Ta zbN|)fnu-D{1vlet>40608N=6Sc&zW2;Zg-*Og`UhRfdaM*J4;q=XaMj|JjEW0n%6j zJ25+q*tIPS@4Wv`+{k;_LsIO6*>D?U*1O2=yZmuBD2r_eq5RsWKFWQGQsk?dL8cmb zB^m_`G77Z)3sJ7jiT1pXjaS-HcHA3(NC`)h5fFnCL|N|m`-G@#sHy0Q7Mt25HO|E70p|Zv zt}urEuU=h}q!_UPg(K875ospQ^5<xlj2x+%aG#dAYfE)AneU0}E#+V3*Gi zi&v#I`{F>cW+{?7H;Zb2jk@_Re;U-NZmS7*z~4wH*bU&`LS@mkoXeCw)~iG~+C!#p zmHFeIcWaeBP;RpDy=c}Y-sOl1N9!|;hU4jOMr>wv3~*`@`kRZ%ZkqIJd5MD!!qpHm zScHp&QF7D>EjV?TPgv zSf2VRhMjIJWK+mu^Yd+tdBg`Ssnhn1KSfSXVod%OzI(|Z#wAUWGHADx)3V>R9-#(e ziR5411ZtCEegc%&?rpWtJd_we?@P0JpISM7kDWFulHNNayra|mFwp>`%?_S!PNvPiJa5JVF03j$(|Xux4RfKEO!(Xa zXo)C!Y&Nzy02c|V4ruksA%^83$*m*HoABm+=26@lPT>B zL#$t%Fv`7^R>0}k%m$=%HLW15#N5YBujZ=s$*99 z+BJP(OsjD(&{vb#|OZHus6c9O|*DdU%0 z7x(f{Wa~hE&cehzP+0L;#7e4D`PUZarj4bL-9>uWy+a}Ys{HqF-(G^D0}vR*GJ5Bm zv*T6FKm=Ogo(WUF1M4BSSe$y=J_LBRfIL|)K?K0v;`KN(km(gZ{ZH6G|GaoRsNQEU zfRF@G)s_STB#%#`OcrKkP3Ck*C6ABjy{VSFJii*=)jBjJnci_Cfc)dSE?-jS?1LHH zpv{{xPbpkUtIJ{*cdrl8vV`~_IY9mqCp(_eN#6>vZC^xWR8;Dh%IT`)o})>?DyjNs zX|?v&2)Ymo=2;@L^SzAx3o*bepa}0lKizx%DE|3pCXDo~t?Ty+^R1z|Z(} zcg&f1ia$-dwr$kKr@Y?Fkql{rJ45ke$4LVlvtH*C*KswYSS_y4&s>s|42_oV+~Q;~ zPgr`)2{X8g|eQp1Wx+(cj&;G z`Nk?Q9vy?El=35GIzvb)4i7uV-8m%_j;7a_ESinQn}0`qzJQhm$(RiAo}B20y%AQP zJ~fms|M%Zt!OF>31K$CbW_cpoV&LUJk+C-)RQ}F_uP91<=d@QF8#RNKOg`U954cq z77};*OBT2*;@vgG3FB}=fmbia1JUmwV7Lb#CO>XJn{KCw0O2fU?=tHUmWT zX@FwlGEGHf1&>H}HhmPiy3t7hsbJ(zti`Cg3p;xT2LtWpE?>GN5+6ZUA0wVeB-qF0 z8>+;Ty2r*|6RFA17ZxV$850?$g0pk$%LWDpCfmG~3l%>@b3F(MU^|#=^^6eJL({he z0(v8_g4+tJ!Y|}A&>ojDi@b#^lAi(#uLu)YRHPigF&_~p6!rHkd(($>G52X(2n$#z zR;P&L$eIIgc`+R{JHGrVB131sMg#Z>5j1Ameb241YerN8`vYTBIyMh7hFxp^^g`YR z2nfKPw(sBnSa4v&FG(=3jlW0J>JT6y8`B0>DWUD%_pfR~6=UBvI#dJ9p?m8OX{st% zD@oXQ(7iy4s~5r9jQN4Gx?SxQ!;P%113HzVUn1=q(tmu3EHD*;<4)ia1p?ZjkKn(| z;`V)nRacWPxEh^F#6F3-%-!?PYplj!bbPNxS^-c3^j~A+=AqF$U^Zbii!OZ|9S{tm zoszy_lOQ!Jn;dREYQFUBt9mWH-K*)^<5=|A$gDrxjI1uHjbS374c-9OED}nvmYsR= zN6Vl2%!d+1pH)6tv*fSe4nBuiwxZ1x3xCqi~!?x$7Mjs|E9po}`p8L%Dz%q1i z*6->6qtqFAD)8XQN%_bHOwu)6NUx>SWkD}$+t;;8P@DdH6}D898x4zUe3DTPFXyWG z4oks?@_4E$)wX_&Xdi;;#AxAY5}pQflk^Go1T3j<;Q6zqS&nZZsW0*q+?I$1gVXV$ zVdP(n4}EMf+}<;L`jxo|43;` zZDRh85TM&QFGhxjC@(>jh{_%7-65^o_!UT>ozSKn`(_53v#S266Us4*$3YHRaT;+q zyL++K3`SveoP53d_JTM710RR~mej%QLIifn`QsqnlAoS_ake10M10+ZbMz9KAou(z z3BVn4_K>RYbH{+-0~uDTWcHy<_-r`z!8bDc*Srf}exH47OS`)rNp0L5FiR06$9r=?n`?^q#~#GR#3Kp#R=O-QLRYS(1Imc8GW zvm_^Zn1ely!YKb|whkyH$bgnMJop^s459&e;10yEmO3#bU~wFk%=DVSHon@m^7FUv zdyMsu`Vkt$r^!N&Tg)DPEo-%r1hySAyItT<46KccmP?{83dS zwA~BFNYpbq+LAC4pO?eVK$yTFVM|MBzEt+~$y(Z)HEW(gF3rRoOkXzI6hl~=uqt-3 zqJfxHMQP5}5Q2XcMfemaKp7yn7aA9OoLSET@CwQO=1T+TdLB~7jeTlsYOVm{U9yAB z%UaYcFUa)v?0fPO>=JNP56OB6Bf>>B9+GUh**cZtS0QG)T*ndJfz2!Id|(&oAt~*0 zPa&MWkKA=)-m;uM3|y8e4hT;15}rLG+Y%0QwhIi zf_s5*l<%8D4v)~e4~$1P>nTOA&3^K#&?SOg{x@IaF~YgH?ux2Wv382o^lEUPGfg-Q zH=Y^?Mw$^2v2W3UZgpmMVc^Hh3;g2?3QQCSx6vT~_5kUo2s9jiYaQO6^X-aVi5rn6 zM|An0C5z?*FLM3kd4X~&f)=sl6;Bo!BB}?&*AF~0^3w?kDJhKV`Snp5{3Ni~KoAdD_ejSglGRetEOa3dX-jCww5!PNJjk=bZSefM^41ZS?CxVk?QU715 zdCsDF1be83C$#xek`95WpD4xgK#Ut*-ig|~p=MZ%c*#244s^anwWNE$N)evlauy?F z|6?aQ3bpnA$*^}oRNB7~tGzzHoSEO)N|T1R$#oKAMefFOo`+%_y55?pj7>j4cI zrztndl*;;+rIv5mIqTb^!b&K(j;8eUM~}|u@AkLmP*DEdh_*CvJW-`~1?mZ@!JG9z zoEv5DJ?ng6jb3$>V*875Vxq#4XcXI7eBzuU-jMY`&4(CD!Rc6HyrUG8t#eJXQ%g$4_8c_U#oCeYeQ zEgJ+cL30_CPua{8G^m-01SyiAFHvO7Wr6g8*Gx@x5-Zaoi$-xfa4ELDHXq+gZ1DAf0^YRuv_9rb72&v`eo4}Sve;DWz?IkXpv`KDARd@Fy5$M;i=Px~C z^i4fceoJE|mM7#Wjf~RYZ~l!ytLw(v`#{@(Hivj&0mLN!w`xBBaFZq6GZPKoA!bxD zE)JA4mtQ1cxg{!()4@d1#R#{8Xgj}~JMnXWZhE?=Wyh12Lxdo)jGJ2-*JwMZJO}8o51C|BFIhrA6|Xx18dbq(k-$Dg4p=o-0c@F1nX;?oAW?A zjY!0+{;GS3H)g#;^aT(rHnFTv?|8CoQ9idm=PQ*(Irs^!G2f0S$RvwVQJa>028nYs zu|o$W{H^aj6N#vlnm;8*z4z=A_`uIZiB&=45axqV(dGs(iGT3a|N3X~v!yS9{YhNq z-{1M~zPR-9|NT4v!^QsJ-SEG?*#Fn3|1TF?e7XPb4gbq`{_n5(|1Sk0L;sJL>woy- z;>Z8PcNVvuQ8dwa2qKD!Wkus#A0PK2p5iGX(~JLHBElqvxWZl2(&Sm_L>D2Ml$5M}+yYasODI+jD literal 0 HcmV?d00001 diff --git a/docs/conf.py b/docs/conf.py new file mode 100644 index 000000000..b76d57db0 --- /dev/null +++ b/docs/conf.py @@ -0,0 +1,6 @@ +#!/bin/env python + +# pylint: disable=unused-wildcard-import,wildcard-import,redefined-builtin +# pylint: disable=missing-docstring + +from docs_conf.conf import * # noqa diff --git a/docs/conf.yaml b/docs/conf.yaml new file mode 100644 index 000000000..7379d0765 --- /dev/null +++ b/docs/conf.yaml @@ -0,0 +1,3 @@ +--- +project_cfg: opnfv +project: FUNCTEST diff --git a/docs/index.rst b/docs/index.rst new file mode 100644 index 000000000..4d0fcd8ba --- /dev/null +++ b/docs/index.rst @@ -0,0 +1,15 @@ +.. SPDX-License-Identifier: CC-BY-4.0 + +.. _functest: + +************** +OPNFV Functest +************** + +.. toctree:: + :maxdepth: 1 + + testing/user/configguide/index + testing/user/userguide/index + testing/developer/devguide/index + release/release-notes/index diff --git a/docs/release/release-notes/functest-release.rst b/docs/release/release-notes/functest-release.rst index b0a3483c1..f669d98e7 100644 --- a/docs/release/release-notes/functest-release.rst +++ b/docs/release/release-notes/functest-release.rst @@ -178,7 +178,7 @@ Code quality Useful links ============ - * wiki project page: https://wiki.opnfv.org/opnfv_functional_testing + * wiki project page: https://wiki.opnfv.org/display/functest/Opnfv+Functional+Testing * Functest git repository: https://git.opnfv.org/cgit/functest * Functest CI dashboard: https://build.opnfv.org/ci/view/functest/ * JIRA dashboard: https://jira.opnfv.org/secure/Dashboard.jspa?selectPageId=10611 diff --git a/docs/release/release-notes/index.rst b/docs/release/release-notes/index.rst index 5ded938da..986707a8e 100644 --- a/docs/release/release-notes/index.rst +++ b/docs/release/release-notes/index.rst @@ -7,7 +7,6 @@ Functest Release Notes ********************** .. toctree:: - :numbered: :maxdepth: 4 functest-release.rst diff --git a/docs/testing/developer/devguide/index.rst b/docs/testing/developer/devguide/index.rst index d26a537a2..101236f27 100644 --- a/docs/testing/developer/devguide/index.rst +++ b/docs/testing/developer/devguide/index.rst @@ -5,7 +5,6 @@ Functest Developer Guide ************************ .. toctree:: - :numbered: :maxdepth: 2 ============ @@ -268,7 +267,7 @@ _`[1]`: http://artifacts.opnfv.org/functest/docs/configguide/index.html Functest _`[2]`: http://artifacts.opnfv.org/functest/docs/userguide/index.html functest user guide -_`[3]`: https://git.opnfv.org/cgit/releng/tree/utils/test/reporting +_`[3]`: https://git.opnfv.org/releng-testresults/tree/reporting _`[4]`: https://git.opnfv.org/snaps/ diff --git a/docs/testing/developer/internship/security_group/conf.py b/docs/testing/developer/internship/security_group/conf.py deleted file mode 100644 index 7b146baec..000000000 --- a/docs/testing/developer/internship/security_group/conf.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Functest Security group test cases documentation build configuration file, -# created by sphinx-quickstart on Wed Apr 4 05:56:19 2018. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Functest Security group test cases' -copyright = u'2018, Functest ' -author = u'Functest ' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'master' -# The full version, including alpha/beta/rc tags. -release = u'master' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = [] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - '**': [ - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'FunctestSecuritygrouptestcasesdoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, - 'FunctestSecuritygrouptestcases.tex', - u'Functest Security group test cases Documentation', - u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}', - 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, - 'functestsecuritygrouptestcases', - u'Functest Security group test cases Documentation', - [author], - 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, - 'FunctestSecuritygrouptestcases', - u'Functest Security group test cases Documentation', - author, - 'FunctestSecuritygrouptestcases', - 'One line description of project.', - 'Miscellaneous'), -] diff --git a/docs/testing/developer/internship/security_group/index.rst b/docs/testing/developer/internship/security_group/index.rst deleted file mode 100644 index 87bcd90e5..000000000 --- a/docs/testing/developer/internship/security_group/index.rst +++ /dev/null @@ -1,62 +0,0 @@ -.. SPDX-License-Identifier: CC-BY-4.0 - -================================== -Functest Security group test cases -================================== - -Author: Girish Sukhatankar -mentors: D.Blaisonneau, J.Lausuch, M.Richomme - -Abstract -======== - - -Version history -=============== - -+------------+----------+------------------+------------------------+ -| **Date** | **Ver.** | **Author** | **Comment** | -| | | | | -+------------+----------+------------------+------------------------+ -| 2016-??-?? | 0.0.1 | Morgan Richomme | Beginning of the | -| | | (Orange) | Internship | -+------------+----------+------------------+------------------------+ - - -Overview: -========= - - - - -Problem Statement: ------------------- - - - -Curation Phase --------------- - - - - - -Schedule: -========= - - - -+--------------------------+------------------------------------------+ -| **Date** | **Comment** | -| | | -+--------------------------+------------------------------------------+ -| December - January | '........' | -+--------------------------+------------------------------------------+ -| January - february | '........' | -+--------------------------+------------------------------------------+ - - -References: -=========== - -.. _`[1]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+Security+groups+test+case+in+Functest diff --git a/docs/testing/developer/internship/testapi_evolution/conf.py b/docs/testing/developer/internship/testapi_evolution/conf.py deleted file mode 100644 index 8e039fedf..000000000 --- a/docs/testing/developer/internship/testapi_evolution/conf.py +++ /dev/null @@ -1,178 +0,0 @@ -# -*- coding: utf-8 -*- -# -# TestAPI evolution documentation build configuration file, created by -# sphinx-quickstart on Wed Apr 4 06:00:42 2018. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'TestAPI evolution' -copyright = u'2018, Functest ' -author = u'Functest ' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'master' -# The full version, including alpha/beta/rc tags. -release = u'master' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = [] - - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - '**': [ - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'TestAPIevolutiondoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, - 'TestAPIevolution.tex', - u'TestAPI evolution Documentation', - u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}', - 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, - 'testapievolution', - u'TestAPI evolution Documentation', - [author], - 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, - 'TestAPIevolution', - u'TestAPI evolution Documentation', - author, - 'TestAPIevolution', - 'One line description of project.', - 'Miscellaneous'), -] diff --git a/docs/testing/developer/internship/testapi_evolution/index.rst b/docs/testing/developer/internship/testapi_evolution/index.rst deleted file mode 100644 index d2704de53..000000000 --- a/docs/testing/developer/internship/testapi_evolution/index.rst +++ /dev/null @@ -1,230 +0,0 @@ -.. SPDX-License-Identifier: CC-BY-4.0 - -================= -TestAPI evolution -================= - -Author: Sakala Venkata Krishna Rohit -Mentors: S. Feng, J.Lausuch, M.Richomme - -Abstract -======== - -The TestAPI is used by all the test opnfv projects to report results. -It is also used to declare projects, test cases and labs. A major refactoring -has been done in Colorado with the introduction of swagger. The TestAPI is defined in Functest -developer guide. The purpose of this project is to add more features to the TestAPI that automate -the tasks that are done manually now, though there are tasks other than automation. - -Version history -=============== - -+------------+----------+------------------+------------------------+ -| **Date** | **Ver.** | **Author** | **Comment** | -| | | | | -+------------+----------+------------------+------------------------+ -| 2016-11-14 | 0.0.1 | Morgan Richomme | Beginning of the | -| | | (Orange) | Internship | -+------------+----------+------------------+------------------------+ -| 2017-02-17 | 0.0.2 | S.V.K Rohit | End of the Internship | -| | | (IIIT Hyderabad) | | -+------------+----------+------------------+------------------------+ - -Overview: -========= - -The internhip time period was from Nov 14th to Feb 17th. The project prosposal page is here `[1]`_. -The intern project was assigned to Svk Rohit and was mentored by S. Feng, J.Lausuch, M.Richomme. -The link to the patches submitted is `[2]`_. The internship was successfully completed and the -documentation is as follows. - -Problem Statement: ------------------- - -The problem statement could be divided into pending features that needed to be added into TestAPI -repo. The following were to be accomplished within the internship time frame. - -* **Add verification jenkins job for the TestAPI code** - The purpose of this job is to verify whehter the unit tests are successful or not with the - inclusion of the patchset submitted. - -* **Automatic update of opnfv/testapi docker image** - The docker image of TestAPI is hosted in the opnfv docker hub. To ensure that the TestAPI image - is always updated with the repository, automatic updation of the image is necessary and a job - is triggered whenever a new patch gets merged. - -* **Automation deployment of testresults.opnfv.org/test/ website** - In the same manner as the docker image of TestAPI is updated, the TestAPI website needs to be - in sync with the repository code. So, a job has been added to the opnfv jenkins ci for the - updation of the testresults website. - -* **Generate static documentation of TestAPI calls** - The purpose of this is to give an static/offline view of TestAPI. If someone wants to have a - look at the Restful APIs of TestAPI, he/she does't need to go to the website, he can download - a html page and view it anytime. - -* **Backup MongoDB of TestAPI** - The mongoDB needs to be backed up every week. Till now it was done manually, but due to this - internship, it is now automated using a jenkins job. - -* **Add token based authorization to the TestAPI calls** - The token based authorization was implemented to ensure that only ci_pods could access the - database. Authentication has been added to only delete/put/post requests. - -Curation Phase: ---------------- - -The curation phase was the first 3 to 4 weeks of the internship. This phase was to get familiar -with the TestAPI code and functionality and propose the solutions/tools for the tasks mentioned -above. Swagger codegen was choosen out of the four tools proposed `[3]`_ for generating static -documentaion. - -Also, specific amount of time was spent on the script flow of the jenkins jobs. The automatic -deployment task involves accessing a remote server from inside the jenkins build. The deployment -had to be done only after the docker image update is done. For these constraints to satisfy, a -multijob jenkins job was choosen instead of a freestyle job. - -Important Links: ----------------- - -* MongoDB Backup Link - `[4]`_ -* Static Documentation - `[5]`_ -* TestAPI Token addition to ci_pods - `[6]`_ - -Schedule: -========= - -The progress and completion of the tasks is described in the below table. - -+--------------------------+------------------------------------------+ -| **Date** | **Comment** | -| | | -+--------------------------+------------------------------------------+ -| Nov 14th - Dec 31st | Understand TestAPI code and the | -| | requirements. | -+--------------------------+------------------------------------------+ -| Jan 1st - Jan 7th | Add jenkins job to create static | -| | documentation and write build scripts. | -+--------------------------+------------------------------------------+ -| Jan 8th - Jan 21st | Add verification jenkins job for unit | -| | tests. | -+--------------------------+------------------------------------------+ -| Jan 22nd - Jan 28th | Add jenkins job for mongodb backup | -| | | -+--------------------------+------------------------------------------+ -| Jan 29th - Feb 11th | Enable automatic deployment of | -| | testresults.opnfv.org/test/ | -+--------------------------+------------------------------------------+ -| Feb 12th - Feb 17th | Add token based authentication | -| | | -+--------------------------+------------------------------------------+ - -FAQ's -===== - -This section lists the problems that I have faced and the understanding that I have acquired during -the internship. This section may help other developers in solving any errors casused because of the -code written as a part of this internship. - - -TestAPI -------- - -What is the difference between defining data_file as "/etc/.." and "etc/.." in setup.cfg ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -If in the setup.cfg, it is defined as - -[files] -data_files = -etc/a.conf = etc/a.conf.sample - -then it ends up installed in the /usr/etc/. With this configuration, it would be installed -correctly within a venv. but when it is defined as - -[files] -data_files = -/etc/a.conf = etc/a.conf.sample - -then it ends up installed on the root of the filesystem instead of properly be installed within the -venv. - -Which attribute does swagger-codegen uses as the title in the generation of document generation ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It uses the nickname of the api call in swagger as the title in the generation of the document -generation. - -Does swagger-codegen take more than one yaml file as input ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -No, swagger-codegen only takes one yaml file as input to its jar file. If there more than one yaml -file, one needs to merge them and give it as an input keeping mind the swagger specs. - - -Jenkins & JJB -------------- - -Which scm macro is used for verification jenkins jobs ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There are two macros for scm one is git-scm and other git-scm-gerrit. git-scm-gerrit is used for -verification jenkins job. - -Does the virtualenv created in one build script exists in other build scripts too ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -No, the virtualenv created in one build script only exists in that build script/shell. - -What parameters are needed for the scm macros ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Project and Branch are the two parameters needed for scm macros. - -What is the directory inside the jenkins build ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The directory of the jenkins build is the directory of the repo. `ls $WORKSPACE` command will give -you all the contents of the directory. - -How to include a bash script in jenkins job yaml file ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -An example might be apt here as an answer. - -builders: - - shell: - !include-raw: include-raw001-hello-world.sh - - -How do you make a build server run on a specific machine ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -It can be done by defining a label parameter 'SLAVE_LABEL' or in OPNFV , there are macros for each -server, one can use those parameter macros. -Ex: opnfv-build-defaults. Note, if we use macro, then no need to define GIT_BASE, but if one uses -SLAVE_LABEL, one needs to define a parameter GIT_BASE. This is because macro already has GIT_BASE -defined. - -What job style should be used when there is a situation like one build should trigger other builds -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -or when different build scripts need to be run on different machines ? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -MultiJob style should be used as it has phases where each phase can be taken as a build scipt and -can have its own parameters by which one can define the SLAVE_LABEL parameter. - -References: -=========== - -_`[1]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+testapi+evolution - -_`[2]` : https://gerrit.opnfv.org/gerrit/#/q/status:merged+owner:%22Rohit+Sakala+%253Crohitsakala%2540gmail.com%253E%22 - -_`[3]` : https://docs.google.com/document/d/1jWwVZ1ZpKgKcOS_zSz2KzX1nwg4BXxzBxcwkesl7krw/edit?usp=sharing - -_`[4]` : http://artifacts.opnfv.org/testapibackup.html - -_`[5]` : http://artifacts.opnfv.org/releng/docs/testapi.html - -_`[6]` : http://artifacts.opnfv.org/functest/docs/devguide/index.html#test-api-authorization diff --git a/docs/testing/developer/internship/unit_tests/conf.py b/docs/testing/developer/internship/unit_tests/conf.py deleted file mode 100644 index 4d72fca39..000000000 --- a/docs/testing/developer/internship/unit_tests/conf.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Functest Unit tests documentation build configuration file, created by -# sphinx-quickstart on Wed Apr 4 06:04:23 2018. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Functest Unit tests' -copyright = u'2018, Functest ' -author = u'Functest ' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'master' -# The full version, including alpha/beta/rc tags. -release = u'master' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = [] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - '**': [ - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'FunctestUnittestsdoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, - 'FunctestUnittests.tex', - u'Functest Unit tests Documentation', - u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}', - 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, - 'functestunittests', - u'Functest Unit tests Documentation', - [author], - 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, - 'FunctestUnittests', - u'Functest Unit tests Documentation', - author, - 'FunctestUnittests', - 'One line description of project.', - 'Miscellaneous'), -] diff --git a/docs/testing/developer/internship/unit_tests/index.rst b/docs/testing/developer/internship/unit_tests/index.rst deleted file mode 100644 index f79e9e296..000000000 --- a/docs/testing/developer/internship/unit_tests/index.rst +++ /dev/null @@ -1,123 +0,0 @@ -.. SPDX-License-Identifier: CC-BY-4.0 - -=================== -Functest Unit tests -=================== - -Author: Ashish Kumar -Mentors: H.Yao, J.Lausuch, M.Richomme - -Abstract -======== - - -Version history -=============== - -+------------+----------+------------------+------------------------+ -| **Date** | **Ver.** | **Author** | **Comment** | -| | | | | -+------------+----------+------------------+------------------------+ -| 2016-11-14 | 0.0.1 | Morgan Richomme | Beginning of the | -| | | (Orange) | Internship | -+------------+----------+------------------+------------------------+ -| 2017-03-31 | 0.0.2 | Ashish Kumar | During the | -| | | (IIIT Hyderabad) | Internship | -+------------+----------+------------------+------------------------+ - - -Overview: -========= -Functest project is developing and integrating functional test cases for OPNFV -and it is part of OPNFV since the beginning. Functest develops its own -testcases and framework. This framework includes several utility libraries. The -Project is growing rapidly with more features, tests added as per requirement. -It becomes the responsibility of every developer to maintain the integrity of -code i.e. new patch should not break the previous functionality of the project. -To automate this process of software development, we should write unit tests -and add them to CI so that when a new patch is ready to merge, we shouldn't -allow those which are breaking previous unit tests or decreasing the coverage. - - - -Problem Statement: ------------------- -The goal of the intership consists in creating unit test suites on Functest -code with good code coverage (>80%) and integrate it in continuous integration -in order to consolidate existing code. - - -Curation Phase --------------- -The curation phase was the first 3 to 4 weeks of the internship. This phase was -to get familiar with the functest code and functionality and explore the -solutions for unit testing in other projects and come up with the strategy for -writing unit tests in functest. - -In this phase we decided, - - - Coverage should be 80%. There are some functions like __init__, getter, - setter and other private methods for which writing unit test is a tedious - job, so we are leaving these methods for now. - - Do method wise testing for every module. - - Use mock for external or third party services, system calls and other - external library calls which could impact the behaviour of system during the - run of unit test. - - Add it in jenkins as passing criteria for patches. - - Write tests in modular way so that it can help to serve as a form of - documentation. - - - -Schedule: -========= -+--------------------------+------------------------------------------+ -| **Date** | **Comment** | -| | | -+--------------------------+------------------------------------------+ -| Nov 14th - Nov 28th | 1. Learn Functest Project Business | -| | 2. Set up the development environment | -| | 3. Run Functest code | -+--------------------------+------------------------------------------+ -| Nov 28th - Dec.9th | 1. Explore Unit Testing Strategy, | -| | 2. Learn about Mock in python | -+--------------------------+------------------------------------------+ -| Dec 12th - Dec 23rd | Implement Unit Tests for CLI | -| | | -+--------------------------+------------------------------------------+ -| Dec 26th - Jan 6th | Implement Unit Tests for Utils | -| | | -+--------------------------+------------------------------------------+ -| Jan 9th - Jan 20th | Implement Unit Tests for CI | -| | | -+--------------------------+------------------------------------------+ -| Jan 23rd - Feb 3rd | Implement Unit Tests for Core | -| | | -+--------------------------+------------------------------------------+ -| Feb 6th - Feb 17th | Implement Unit Tests for | -| | opnfv_tests/openstack/tempest | -+--------------------------+------------------------------------------+ -| Feb 20th - Mar 3rd | Implement Unit Tests for | -| | opnfv_tests/openstack/rally | -+--------------------------+------------------------------------------+ -| Mar 6th - Mar 17th | Implement Unit Tests for | -| | opnfv_tests/vnf/ims | -+--------------------------+------------------------------------------+ -| Mar 20th - Mar 31st | Recheck and Increase Coverage for all | -| | modules > 80% | -+--------------------------+------------------------------------------+ -| Apr 3rd - Apr 14th | Add CI Gating for unit tests | -| | | -+--------------------------+------------------------------------------+ -| Apr 17th - Apr 28th | Use Tox Utility, Documentation | -| | | -+--------------------------+------------------------------------------+ -| Apr 28th - End | Bug Fixing | -| | | -+--------------------------+------------------------------------------+ - - -References: -=========== - -.. _`[1]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+Functest+unit+tests diff --git a/docs/testing/developer/internship/vnf_catalog/conf.py b/docs/testing/developer/internship/vnf_catalog/conf.py deleted file mode 100644 index fe3cdb722..000000000 --- a/docs/testing/developer/internship/vnf_catalog/conf.py +++ /dev/null @@ -1,177 +0,0 @@ -# -*- coding: utf-8 -*- -# -# Open Source VNF Catalog documentation build configuration file, created by -# sphinx-quickstart on Wed Apr 4 06:07:56 2018. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -# import os -# import sys -# sys.path.insert(0, os.path.abspath('.')) - -# -- General configuration ------------------------------------------------ - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'Open Source VNF Catalog' -copyright = u'2018, Functest ' -author = u'Functest ' - -# The version info for the project you're documenting, acts as replacement for -# |version| and |release|, also used in various other places throughout the -# built documents. -# -# The short X.Y version. -version = u'master' -# The full version, including alpha/beta/rc tags. -release = u'master' - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = [] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- Options for HTML output ---------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -# -html_theme = 'sphinx_rtd_theme' - -# Theme options are theme-specific and customize the look and feel of a theme -# further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# Add any paths that contain custom themes here, relative to this directory. -# html_theme_path = [] - -# Add any paths that contain custom static files (such as style sheets) here, -# relative to this directory. They are copied after the builtin static files, -# so a file named "default.css" will overwrite the builtin "default.css". -# html_static_path = [] - -# Custom sidebar templates, must be a dictionary that maps document names -# to template names. -# -# This is required for the alabaster theme -# refs: http://alabaster.readthedocs.io/en/latest/installation.html#sidebars -html_sidebars = { - '**': [ - 'relations.html', # needs 'show_related': True theme option to display - 'searchbox.html', - ] -} - - -# -- Options for HTMLHelp output ------------------------------------------ - -# Output file base name for HTML help builder. -htmlhelp_basename = 'OpenSourceVNFCatalogdoc' - - -# -- Options for LaTeX output --------------------------------------------- - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, -# author, documentclass [howto, manual, or own class]). -latex_documents = [ - (master_doc, - 'OpenSourceVNFCatalog.tex', - u'Open Source VNF Catalog Documentation', - u'Functest \\textless{}opnfv-tech-discuss@lists.opnfv.org\\textgreater{}', - 'manual'), -] - - -# -- Options for manual page output --------------------------------------- - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [ - (master_doc, - 'opensourcevnfcatalog', - u'Open Source VNF Catalog Documentation', - [author], - 1) -] - - -# -- Options for Texinfo output ------------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - (master_doc, - 'OpenSourceVNFCatalog', - u'Open Source VNF Catalog Documentation', - author, - 'OpenSourceVNFCatalog', - 'One line description of project.', - 'Miscellaneous'), -] diff --git a/docs/testing/developer/internship/vnf_catalog/index.rst b/docs/testing/developer/internship/vnf_catalog/index.rst deleted file mode 100644 index 634b728bd..000000000 --- a/docs/testing/developer/internship/vnf_catalog/index.rst +++ /dev/null @@ -1,160 +0,0 @@ -.. SPDX-License-Identifier: CC-BY-4.0 - -======================= -Open Source VNF Catalog -======================= - -Author: Kumar Rishabh -Mentors: B.Souville, M.Richomme, J.Lausuch - -Abstract -======== - - - -Version hissory -=============== - -+------------+----------+------------------+------------------------+ -| **Date** | **Ver.** | **Author** | **Comment** | -| | | | | -+------------+----------+------------------+------------------------+ -| 2016-12-12 | 0.0.1 | Morgan Richomme | Beginning of the | -| | | (Orange) | Internship | -+------------+----------+------------------+------------------------+ - - -Overview: -========= - - -This project aims to create an Open Source catalog for reference and -classification of Virtual Network Functions (VNFs)s available on -Internet. The classification method proposed will be in sync with the -requirements of Telcos active in NFV landscape. The project aims to have -running web platform similar to [1] by the mid of internship (2nd week -of March). By the penultimate month of internship I aim to have fully -functional implementation of an Open Source VNF in functest. - - -Problem Statement: ------------------- - -OPNFV aims to be the reference platform for development, -standardization and integration of Open Source NFV components across -various Open Source Platforms. It mainly deals with the infrastructure -through the Network Function Virtualization Infrastructure (NFVI) and -Virtual Infrastructure manager (VIM). The MANO (Management and -orchestration) stacks have been introduced recently. VNFs are not -directly in OPNFV scope, however VNFs are needed to test and qualify the -infrastructure. In this regard having a common curated Open Source -Reference VNF catalog would be of immense importance to community. - -Since major focus of OPNFV is Telcos, a curated platform targeted from -industry point of view would be very useful. We plan to divide the -entire project into three major phases(with some iterative improvements -and overlaps) - - -Curation Phase --------------- -This phase pertains to studying various Open Source VNFs available and -classification of them based on certain parameters. The parameters that -I currently have in mind are: - - * Developer Metrics: These pertain to repo characteristics of VNF under - study - * Usage Statistics - Activity, Number of Commits, stars - * Maturity Statistics - For instance if an NFV community decides code - coverage is important for them, it shows the NFV community is serious - about taking the project forward - * Technical Tagging: These are the tags that pertain to technical - characteristics of a VNF - * Broad Use Cases - Whether the VNF fits strictly in IaaS, PaaS or - SaaS layer or is an hybrid of two/all. - * Generic Use Cases - This in my opinion is the broadest - classification category. For instance a VNF could be built with a - broad idea of powering IOT devices at home or from usage perspective - of Telco Operators (vFW, vEPC, vIMS, vCDN, vAAA, vCPE,...).`[2]`_ - * Fields of Application - * Library Status - Whether APIs are standardized, support RESTful - services. - * Dependency Forwarding Graph - This is pretty complex tagging - mechanism. It essentially tries to establish a graph relationship - between the VNFs (elementary VNFs are used in Service Function - Chaining chains such as Firewall, DPI, content enrichment,..). In my - opinion this is useful immensely. This will allow users to go to - platform and ask a question like - “I have this X tech stack to - support, Y and Z are my use cases, which NFVs should I use to support - this. - * Visitor Score - Based on `[1]`_ I plan to evolve a visitor score for - the platform. This will allow users to score an NFV on certain - parameters, may be post comments. - -**I plan to use the above three scores and evolve cumulative score which -will be displayed next to each of the NFV on the platform.** - - * Platform building phase - This will involve erecting a Web Platform - which will be similar to this `[1]`_. I am decently familiar with - Django and hence I will write the platform in Django. There are two - action plans that I have in mind right now. Either I can start writing - the platform simultaneously which will help keep track of my progress - or I can write the platform after 1.5 - 2 months into the internship. - Either way I aim to have the Web Platform ready by March 12. - * Functest VNF implementation phase - This is the last phase that will - involve writing a fully functional implementation of an Open Source VNF - into Functest. I will undertake this after I am 3 months into the - internship. I have a decent familiarity with python and hence I think - it shouldn’t be too difficult. I need to decide how complex the VNFI - should undertake this exercise for (e.g. AAA such as free radius sounds - relatively easy, vCDN is much more challenging). - This will be decided in consent with my mentors. - -Schedule: -========= -I plan to take this project in 6 months time frame as I want to use it -as a chance to read more about NFVs in particular and SDN in general - - -+--------------------------+------------------------------------------+ -| **Date** | **Comment** | -| | | -+--------------------------+------------------------------------------+ -| December 12 - January 12 | Study the above mentioned metrics | -| | Decide which of them are important for | -| | community (and which are not). | -+--------------------------+------------------------------------------+ -| January 12 - January 27 | Make a database for the above studied | -| | metrics and evolve it further based on | -| | Mentors’ input. + associated API | -+--------------------------+------------------------------------------+ -| January 27 - February 5 | Compile the data collected above and make| -| | it public. Although I can keep everything| -| | public from the beginning too. My | -| | rationale of not making the entire data | -| | public in initial stage as the errors | -| | caused by me could be misleading for | -| | developers. | -+--------------------------+------------------------------------------+ -| February 5 - March 5 | Erect the Web Platform and release it | -| | for restricted group for alpha testing. | -+--------------------------+------------------------------------------+ -| March 5 - March 12 | Make it public. Release it to public for | -| | beta testing. Fix Bugs. | -+--------------------------+------------------------------------------+ -| March 12 - April 12 | Start working on implementation of an | -| | Open Source VNF in Functest. | -+--------------------------+------------------------------------------+ -| April 12 - May 12 | I will decided what to do here based on | -| | discussion with mentors. | -+--------------------------+------------------------------------------+ - - -References: -=========== - -.. _`[1]` : Openhub: https://www.openhub.net/explore/projects - -.. _`[2]` : ETSI NFV White Paper: https://portal.etsi.org/Portals/0/TBpages/NFV/Docs/NFV_White_Paper3.pdf - -.. _`[3]` : https://wiki.opnfv.org/display/DEV/Intern+Project%3A+Open+Source+VNF+catalog diff --git a/docs/testing/user/configguide/ci.rst b/docs/testing/user/configguide/ci.rst index e4fec51dc..f0ed5218a 100644 --- a/docs/testing/user/configguide/ci.rst +++ b/docs/testing/user/configguide/ci.rst @@ -13,4 +13,4 @@ container from Jenkins. See `[3]`_ for details. -.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yml +.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yaml diff --git a/docs/testing/user/configguide/index.rst b/docs/testing/user/configguide/index.rst index 5d7eeb6e4..aeb9e2ba6 100644 --- a/docs/testing/user/configguide/index.rst +++ b/docs/testing/user/configguide/index.rst @@ -5,7 +5,6 @@ Functest Installation Guide *************************** .. toctree:: - :numbered: :maxdepth: 2 intro.rst @@ -32,7 +31,7 @@ IRC support channel: #opnfv-functest .. _`[1]`: https://ask.openstack.org/en/question/68144/keystone-unable-to-use-the-public-endpoint/ .. _`[2]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/userguide/index.html -.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yml +.. _`[3]`: https://git.opnfv.org/releng/tree/jjb/functest/functest-daily-jobs.yaml .. _`[4]`: http://docs.opnfv.org/en/latest/submodules/functest/docs/testing/user/configguide/index.html .. _`[5]`: http://www.opnfv.org -.. _`[6]`: https://wiki.opnfv.org/functest +.. _`[6]`: https://wiki.opnfv.org/display/functest/Opnfv+Functional+Testing diff --git a/docs/testing/user/userguide/index.rst b/docs/testing/user/userguide/index.rst index 8a40ccf4c..d59d53d64 100644 --- a/docs/testing/user/userguide/index.rst +++ b/docs/testing/user/userguide/index.rst @@ -76,7 +76,7 @@ IRC support chan: #opnfv-functest .. _`[15]`: https://aptira.com/testing-openstack-tempest-part-1/ .. _`[16]`: http://docs.opnfv.org/en/latest/testing/testing-dev.html .. _`OPNFV main site`: http://www.opnfv.org -.. _`Functest page`: https://wiki.opnfv.org/functest +.. _`Functest page`: https://wiki.opnfv.org/display/functest/Opnfv+Functional+Testing .. _`OpenRC`: http://docs.openstack.org/user-guide/common/cli_set_environment_variables_using_openstack_rc.html .. _`Rally installation procedure`: https://rally.readthedocs.org/en/latest/tutorial/step_0_installation.html .. _`config_functest.yaml` : https://git.opnfv.org/cgit/functest/tree/functest/ci/config_functest.yaml diff --git a/docs/testing/user/userguide/test_overview.rst b/docs/testing/user/userguide/test_overview.rst index 2ff14f732..4240bf3cd 100644 --- a/docs/testing/user/userguide/test_overview.rst +++ b/docs/testing/user/userguide/test_overview.rst @@ -247,5 +247,5 @@ section. .. _`Doctor User Guide`: http://artifacts.opnfv.org/doctor/colorado/userguide/index.html .. _`SDNVPN User Guide`: http://artifacts.opnfv.org/sdnvpn/colorado/docs/userguide/index.html .. _`Parser User Guide`: http://artifacts.opnfv.org/parser/colorado/docs/userguide/index.html -.. _`Functest Dashboard`: http://testresults.opnfv.org/kibana_dashboards/ +.. _`Functest Dashboard`: http://testresults.opnfv.org/ .. _`SFC User Guide`: http://artifacts.opnfv.org/sfc/colorado/userguide/index.html diff --git a/setup.cfg b/setup.cfg index 954dcaa9a..b311ce895 100644 --- a/setup.cfg +++ b/setup.cfg @@ -47,7 +47,7 @@ xtesting.testcase = [build_sphinx] all_files = 1 -build-dir = api/build/ +build-dir = api/_build/ source-dir = api [wheel] diff --git a/test-requirements.txt b/test-requirements.txt index b855f2f06..b071f41e0 100644 --- a/test-requirements.txt +++ b/test-requirements.txt @@ -12,3 +12,5 @@ yamllint doc8 # Apache-2.0 bashate # Apache-2.0 nosehtmloutput # Apache-2.0 +lfdocs-conf +sphinx-opnfv-theme diff --git a/tox.ini b/tox.ini index e9bc4e152..9b3784cda 100644 --- a/tox.ini +++ b/tox.ini @@ -25,10 +25,6 @@ commands = --ignore-path api/build \ --ignore-path docs/release/release-notes/build \ --ignore-path docs/testing/developer/devguide/build \ - --ignore-path docs/testing/developer/internship/security_group/build \ - --ignore-path docs/testing/developer/internship/testapi_evolution/build \ - --ignore-path docs/testing/developer/internship/unit_tests/build \ - --ignore-path docs/testing/developer/internship/vnf_catalog/build \ --ignore-path docs/testing/user/configguide/build \ --ignore-path docs/testing/user/userguide/build \ api \ @@ -36,14 +32,12 @@ commands = docs/testing/user/configguide \ docs/testing/user/userguide sphinx-build -W -b html api/ api/build - sphinx-build -W -b html docs/release/release-notes docs/release/release-notes/build/html - sphinx-build -W -b html docs/testing/developer/devguide docs/testing/developer/devguide/build/html - sphinx-build -W -b html docs/testing/developer/internship/security_group docs/testing/developer/internship/security_group/build/html - sphinx-build -W -b html docs/testing/developer/internship/testapi_evolution docs/testing/developer/internship/testapi_evolution/build/html - sphinx-build -W -b html docs/testing/developer/internship/unit_tests docs/testing/developer/internship/unit_tests/build/html - sphinx-build -W -b html docs/testing/developer/internship/vnf_catalog docs/testing/developer/internship/vnf_catalog/build/html - sphinx-build -W -b html docs/testing/user/configguide docs/testing/user/configguide/build/html - sphinx-build -W -b html docs/testing/user/userguide docs/testing/user/userguide/build/html + sphinx-build -W -n -b html docs/release/release-notes docs/release/release-notes/build/html + sphinx-build -W -n -b html docs/testing/developer/devguide docs/testing/developer/devguide/build/html + sphinx-build -W -n -b html docs/testing/user/configguide docs/testing/user/configguide/build/html + sphinx-build -W -n -b html docs/testing/user/userguide docs/testing/user/userguide/build/html + sphinx-build -W -n -b linkcheck docs docs/_build/linkcheck + sphinx-build -W -n -b html docs docs/_build/html [testenv:pep8] basepython = python2.7 -- 2.16.6