From 3b758555c0b536777a577e2b0fdef0d378c11635 Mon Sep 17 00:00:00 2001 From: kmato Date: Sat, 3 Feb 2024 20:03:20 +0100 Subject: [PATCH] MVP finished --- .pre-commit-config.yaml | 2 +- .../__init__.py => CMakeLists.txt | 0 src/2dqed.png | Bin 0 -> 183475 bytes src/MQT Qudits Tutorial.ipynb | 621 ++++++++++++++++++ src/MQT Qudits in Short.ipynb | 391 +++++++++++ src/example.py | 160 +++++ src/foot.png | Bin 0 -> 19695 bytes src/main.py | 82 ++- src/mqt/qudits/compiler/compiler_pass.py | 10 + src/mqt/qudits/compiler/dit_manager.py | 17 + .../compiler/onedit/local_adaptive_decomp.py | 283 ++++++++ .../onedit/local_operation_swap}/__init__.py | 0 .../local_operation_swap/swap_routine.py | 154 +++++ .../qudits/compiler/onedit/local_qr_decomp.py | 140 ++++ .../onedit/local_rotation_tools/__init__.py} | 0 .../local_compilation_minitools.py | 61 ++ .../compiler/onedit/propagate_virtrz.py | 162 +++++ .../compiler/onedit/remove_phase_rotations.py | 51 ++ .../energy_level_graph/__init__.py} | 0 .../energy_level_graph/level_graph.py | 219 ++++++ .../qudits/core/structures/trees/dfs_tree.py | 159 +++++ .../qudits/exceptions/compilerexception.py | 22 + src/mqt/qudits/qudit_circuits/__init__.py | 2 + src/mqt/qudits/qudit_circuits/circuit.py | 177 +++-- .../components/instructions/gate.py | 93 ++- .../gate_extensions/matrix_factory.py | 128 ++-- .../instructions/gate_set/abstract_custom.py | 19 +- .../components/instructions/gate_set/csum.py | 36 +- .../instructions/gate_set/custom_multi.py | 5 +- .../instructions/gate_set/custom_one.py | 33 +- .../instructions/gate_set/custom_two.py | 19 +- .../components/instructions/gate_set/cx.py | 92 +-- .../instructions/gate_set/gellman.py | 41 +- .../components/instructions/gate_set/h.py | 5 +- .../components/instructions/gate_set/ls.py | 42 +- .../components/instructions/gate_set/ms.py | 90 ++- .../components/instructions/gate_set/perm.py | 6 +- .../components/instructions/gate_set/r.py | 71 +- .../components/instructions/gate_set/randu.py | 17 +- .../components/instructions/gate_set/rz.py | 60 +- .../components/instructions/gate_set/s.py | 5 +- .../instructions/gate_set/virt_rz.py | 60 ++ .../components/instructions/gate_set/x.py | 7 +- .../components/instructions/gate_set/z.py | 18 +- .../components/registers/quantum_register.py | 5 +- .../qudit_circuits/qasm_interface/qasm.py | 143 ++-- .../__init__.py} | 0 .../qudits/simulation/data_log/save_info.py | 58 ++ .../simulation/provider/backends/backendv2.py | 33 +- .../provider/backends/engines/tnsim.py | 39 +- .../backends/fake_backends/__init__.py | 0 .../backends/fake_backends/fake_traps2.py | 208 ++++++ .../backends/stocastic_components/__init__.py | 0 .../stocastic_components/stocastic_sim.py | 48 ++ .../qudits/simulation/provider/jobs/job.py | 23 +- .../provider/jobs/job_result/__init__.py | 0 .../provider/jobs/job_result/job_result.py | 14 + .../provider/noise_tools/__init__.py | 0 .../simulation/provider/noise_tools/noise.py | 60 ++ .../noise_tools/noisy_circuit_factory.py | 79 +++ .../simulation/provider/qudit_provider.py | 5 +- .../qudits/visualisation/drawing_routines.py | 27 + .../visualisation/mini_quantum_information.py | 56 ++ .../{run_info.py => plot_information.py} | 38 +- tests/mqt_test/__init__.py | 0 tests/mqt_test/test_qudits/__init__.py | 0 .../mqt_test/test_qudits/compiler/__init__.py | 0 .../test_qudits/compiler/onedit/__init__.py | 0 .../test_qudits/qudits_circuits/__init__.py | 0 .../qudits_circuits/components/__init__.py | 0 .../components/instructions/__init__.py | 0 .../instructions/gate_set/__init__.py | 0 .../instructions/gate_set/test_csum.py | 60 ++ .../instructions/gate_set/test_cx.py | 43 ++ .../instructions/gate_set/test_x.py | 26 + 75 files changed, 3976 insertions(+), 549 deletions(-) rename src/mqt/qudits/simulation/provider/backends/stochastic_backend/__init__.py => CMakeLists.txt (100%) create mode 100644 src/2dqed.png create mode 100644 src/MQT Qudits Tutorial.ipynb create mode 100644 src/MQT Qudits in Short.ipynb create mode 100644 src/example.py create mode 100644 src/foot.png create mode 100644 src/mqt/qudits/compiler/compiler_pass.py create mode 100644 src/mqt/qudits/compiler/dit_manager.py create mode 100644 src/mqt/qudits/compiler/onedit/local_adaptive_decomp.py rename src/mqt/qudits/{simulation/provider/noise => compiler/onedit/local_operation_swap}/__init__.py (100%) create mode 100644 src/mqt/qudits/compiler/onedit/local_operation_swap/swap_routine.py create mode 100644 src/mqt/qudits/compiler/onedit/local_qr_decomp.py rename src/mqt/qudits/{simulation/provider/backends/stochastic_backend/agent.py => compiler/onedit/local_rotation_tools/__init__.py} (100%) create mode 100644 src/mqt/qudits/compiler/onedit/local_rotation_tools/local_compilation_minitools.py create mode 100644 src/mqt/qudits/compiler/onedit/propagate_virtrz.py create mode 100644 src/mqt/qudits/compiler/onedit/remove_phase_rotations.py rename src/mqt/qudits/{simulation/provider/noise/noise.py => core/structures/energy_level_graph/__init__.py} (100%) create mode 100644 src/mqt/qudits/core/structures/energy_level_graph/level_graph.py create mode 100644 src/mqt/qudits/core/structures/trees/dfs_tree.py create mode 100644 src/mqt/qudits/exceptions/compilerexception.py create mode 100644 src/mqt/qudits/qudit_circuits/components/instructions/gate_set/virt_rz.py rename src/mqt/qudits/simulation/{provider/noise/noisy_circuit_factory.py => data_log/__init__.py} (100%) create mode 100644 src/mqt/qudits/simulation/data_log/save_info.py create mode 100644 src/mqt/qudits/simulation/provider/backends/fake_backends/__init__.py create mode 100644 src/mqt/qudits/simulation/provider/backends/fake_backends/fake_traps2.py create mode 100644 src/mqt/qudits/simulation/provider/backends/stocastic_components/__init__.py create mode 100644 src/mqt/qudits/simulation/provider/backends/stocastic_components/stocastic_sim.py create mode 100644 src/mqt/qudits/simulation/provider/jobs/job_result/__init__.py create mode 100644 src/mqt/qudits/simulation/provider/jobs/job_result/job_result.py create mode 100644 src/mqt/qudits/simulation/provider/noise_tools/__init__.py create mode 100644 src/mqt/qudits/simulation/provider/noise_tools/noise.py create mode 100644 src/mqt/qudits/simulation/provider/noise_tools/noisy_circuit_factory.py create mode 100644 src/mqt/qudits/visualisation/drawing_routines.py create mode 100644 src/mqt/qudits/visualisation/mini_quantum_information.py rename src/mqt/qudits/visualisation/{run_info.py => plot_information.py} (71%) create mode 100644 tests/mqt_test/__init__.py create mode 100644 tests/mqt_test/test_qudits/__init__.py create mode 100644 tests/mqt_test/test_qudits/compiler/__init__.py create mode 100644 tests/mqt_test/test_qudits/compiler/onedit/__init__.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/__init__.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/components/__init__.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/components/instructions/__init__.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/__init__.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_csum.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_cx.py create mode 100644 tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_x.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 0fe42a7..f09d421 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -66,7 +66,7 @@ repos: hooks: - id: blacken-docs additional_dependencies: - - black==23.3.0 # keep in sync with black hook + - black==23.3.0 # qudits2keep in sync with black hook # Format configuration files with prettier - repo: https://github.com/pre-commit/mirrors-prettier diff --git a/src/mqt/qudits/simulation/provider/backends/stochastic_backend/__init__.py b/CMakeLists.txt similarity index 100% rename from src/mqt/qudits/simulation/provider/backends/stochastic_backend/__init__.py rename to CMakeLists.txt diff --git a/src/2dqed.png b/src/2dqed.png new file mode 100644 index 0000000000000000000000000000000000000000..4ac0c27ba5947c0a0298f70842a297eb3d0f3dc4 GIT binary patch literal 183475 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 z z{kLyCuR8AAvp!{i7aDIhk}Ls-;%@X+I$tuM*BCqg>sH}~MwoP8EtfJXlz>^=^TIMC z;WdSf4=eJ6hb*@m#yNkgI(iaFPIi?wp3uBFh~}SIF~WF-djD99-%RqOR*^u}qD>Nq z6nJD#!9>x2b5m!R!66HeEV;8e@x^lXW?0bjtwQvf^W)OvXRnUi__F_b&UMD;6Po9t zixK6EX?vg9wXnRH0G|tgfTQp%_^JMXMas7p8Kn9BAAS z<=*6fi)(#{)7fBjOXLF_N`xs>#idb0{K_X9(})gBBE)yx7X&wmUsfKGkbq^s*{+d! z6m$%SMOZnRgis-0P&G@1NvUDi7b3;Dkht_zI`UXx5mWKpk||CYP+_jYaWcpkwt9+( zg&DV?Oju*Zl?Ow^)fbQOeP<1=k5COQNCiGLllr?cllkO^@x4U;8V@@pRK8z2Yk`U! zb(SQTa`J1O;i3i^#L|yKrygXA_^*Ow#mb8WVQLQX1jfa z)c?HZIpOM!+45Y?@bl&BHv01g&GYiEXS%rtWq1g^oi zM)}nhqiqqJnf-mUG#t(%4eBKB(X_I*1Y7spi|=GrogzM>QF1q?^&FV<`vi^_@} z?J{!{Tgj6Q^(P{2Awxdb|AI{p#VVbgMN%rM+)n`YkF6^S*6oj#>RVK_0)mIZ#`#DF zHin&>CzUg1?M^glUiqdOh z#j~5{=@e330&G(s;Qu^t=yf+oxd7MfKM8FX=o{9=EMKBzF&kuE?DG;M0>m`PWxiI# zeAoCmyV^R?bLj5#JNEhj@A6##eCjzYTJD}iw<#|t4^f#IjDt)OP$~E`riB5V1nVDu z52uB0ZRCJ$C4WkrUl$5g=Ju2|Yz@8saeo}01V_F;dc9t@JkS32A3W~4_9`!KcTNmy z8E`vp?YS{bwEyh*vhkRQ=YV87OA z`h~eNuelxho`XXA61VEFgyK9~vS`uCP#0x8)}8!6Vt?RAp!Z*{x2ytribypuzNbPk zzv5+480I=F^Pbp5+iQ+mKxLq`+c^Fs)T*j2ZswN$1M=Ngn7K-^y<)Cmb89>%lX_^O zPZ)i2b`{v{r<+ozM}p3WKuDgQOQp;0J8M8pMGS%{my)Df{AIl$p%lfAJ`hWFVp;}~ zkSklxtQIX3w4{C3>#R^o6TG)4g~M*CU()m)!B~nQApImbkiT!gLANWFH(lQ^rI(Dc z(7v=BNA&es>G{axGa{!EuhQrR$A7=)1xn6FW@DDIezTP~uH*xoNEubol&ZvB#;E|7}t+@WIJoeV_mwZu^HP^rBtt&?M3? z$__$bDTu!G#FWDBYDVOS%&uPBf^e6KL2%4<>>e_?|LRo2#>QlT4INhP!x{8gtz2TV zFqhyK68^|y3ack;qkq8+cJ|FJtawEpf$5nxd)xML=7)u~1-ltgg;`U-b`6$K0b2Ve zYO~%(wWJ6A`r;$o}x@R}2!$6ne+d*=_1SC>yLmc?Q7wJfqQxcoiUta9^Vj;9D* zb;M|4(x|}H2F4q!N46LY%TSnwWI_St7jA zjiw+paXH70d}By27FVxocw)}dOHpRIGle&9r#_$T{NJVt^4f=L{4ZOc`tf?EZQP`` z(L8^)2Go)GKBz=-3tFgGP}nXJDLQNqYjNknMG60ZEdV)?U(iR)W7WBHT+F50T_LDS z04jN3EaI81=wq7GHaR;XRK6IJSA@VRWBOiH>alv6icQ^c%`%Xwc?HWDX~$dl0v03h zv9SCeLgcQlv2d_x41(ai6`%8mPcvFGmyATC$tAvN_=%;L2^-v9T@O_5w>SmgGg8X7 z5lvXVMY^^wE^b5MHcdEsz`;t4V#9FQFv%BKu0^|3_fVkTid$rTxvS{G4)h@j zAJfA1{YvAQGpqso;~VD1;|*077W189^%R5ad}@HUEQqd)RMnl4SBGWYa%ixd>$jFh zBk8zrIbASl!k7ty9i=YJX~lhZkP?3+6v3kqh=(iR$$?u_T2I)d_m<9rxcxe&^gMs% z`#ZGmXnLZjU+d@HBcFg@2s*_ye`W#~kLcF^NW53GBGa3$H;p)`tW1`n}^RosR@6{^izRh96eJMWgzXjoaw%XEqj z!%q|x0#2CPuQIXCd7N~}D9h@er6`#U-2_sK%5F^Lv*OilQ?vHbXS*qj)0wTA8-|9Y zRcS8d*(lR7v#2aRk4nEFeh%=#niiJZg7*a*VDD$Ts4JLG^HFY&*BgwH%X6{ehz}JZ zCv$Tzd8<<;s(1XVkx6?(sCux5)?4=5X3vNd19r>IWBZI931Wd{Q7YXeUgza0C)bB% zqv-F_h`2^#6HydGL>`whHBMkNp5yuAhSf!R@;q(J3D#@M7G1L;O>rwTy){RC2b&yG z$Qe|t_)tub4l)tv~pD{IBRjz@|MB8@-0M~kMFEhx=flSHH<}ihhJDYfhx|_ z;;nrJ%FS`6yZJgFX%gceIy^WIGmFoDQAl8mm#<;N8zgZU5SUTJaXm7p2Uh7cI{Et4 zmHbhC|BeAl12Km{5C~W`K3GU&RZTYS9l429 zApBv=3*lGKD*Iw0UXt2SpsS;h9FL8FlTfN<0xw(c)8xfDHc@g+xL9vYP)RKV@nh04 z4}Z$79)*y$Q4&cbDchKu4;S+!-S2c&EomXPRbX$c1MTS{!@-#ZyUlI9=51|xl~@$X zW}h~wifE7&ZEeMpY35XhdZxyp<$h{eHm!<(xhjQ14!(I4-1q!Axe;-0x6!thVqqa~ zK6uS179Yvb9tAN5Fb>vhd4WTv7*TSl&AYhlv;v9thA%X96K)C9G~6#`t|oX?WB5N% zOrpEZXSS7xm+h@c;d)H#hU%F?wso`i_3gfMw3T0f4a@oUEh=ofrC2ymITt9f8T#d6 z{$(xX(Abhgl7k(jC{vs$4W@Cj6Pr-bKyI=%u8* zz3mcI_0G;Bc-V_79ctzhnECOUS{1GvrJ(w6pkns=4yKyVpPsTz%*@+(K@TRDP36Nw zT*8?wQ&w?vCL2Uv=$_XtHqoGvuH~Cq&CRRD1=_|O3cuTrtiHb%EiYL#{OB^=CX+1~ zT1~kCd8K#*xs_{TEq*P))^ijoV|8hE5oI+Gk=XfUI;MdtZr6Z!Zxg9!g=1YAvA@lk zzC3}fk{0y72ISSH{IJPHrqmwqWtx`etS6JnmP{&(C;zo25HmJldWXKFY9z^fy>!TL z`5x2PcQb}iGD5q+@XBAW6aq7Z)%v)k)XL`rM=JQ2cyo7Xy+r*I_Y%AO29qT9Hwyt#~HmAx|;*fc9#L^EQqAZQeR; zSM-!bc-skk6<(Tjl?>fH?@&+6@n6%l?N|uPLe}JYMwwso!)CT~^cB*CsYZkf1t_$R z6wW=ke^ecQ9`o}+aWt9@6^mCpt;-938EKHJet1mx+Iv2DFia?%(}r^=B!GsD8%Kx+ z{f=mTm#b9*SsVL2$C7qELp9@}@s$zhcpXY-_qai?BT<1+;r{mc`XP?W9hrUjrUy7f zai)_M!tSdsI4}NU_tZY?F~j!6tiy#)%csNNtW`d+`>Fe5wQ-eS5rS~(!1uNZ)tpB3 z!GFX=DG3Y+%j&*5pKi_jSIc16$Y7P!L_6-7ay%>KSCyOAROw&EuYCCAtojUkK9@f? zaKK*7^|M7^PcyU1uq*-txGyFX#g*=9AZn&*$&Tm~k&4fc7i}4qyBk*Ke{jTfY%F-5 zR2kYX@3{*eIEUKn**bUH<`KmjpE(P3!KtH}P*a=tWTHzR?7d}%qE&4tKV~o5fHzEY z*zCHM=nw@%f&0GQpu~Se5wk81ka?SM`N*&?ZFrK z#oHoNdN4W)>U>f#DV77o>WJ*&HHAQ&gqf3rrd9sITi5i>bbpIv7wE5Vb$^Y{xXZTfM&6-Y&WV5 zeTxU&me(=u+kNQvNQo@-yEJAO({Xgvnzk(A6a27=mqrI9;Tf|fKWHlvuNfK7Ou3As+Zu*@g&*X09@ z2R=0GG$-7S@c(KAwb6Q!*Sp`KH@4vquRQ)aOgY7!J+W*4Gw_qnPU2@B82t3^_jH|8 z$Hrn5%i!aO72w{UU3ic-0ujO^u5~WgKnoQ-JQ=HsqiXr_AahyN>1YWe!C)?8KOY zfDi_w=_S^LV~i$NSW^8*%cirxzv6l`$h=8WNeK-9nhjzMXM}Q`SZaGz7lO%YD4h+yD>wbWc8U4@$5sLbXC6{3x zV}&xVO-W#lli{~8_h!ZgV*PBJU$g9ciQ6;RJq2=s+z^AVyZ4G=mg_|V$0Dk z-fZE5fN$_mi$Yyu3f&y&g=iO;&5LrGEi_#ErLJ zPk9d^v33rQoznlUYH8~fI-tpDg}(?1y6ckm3Mdx9m!RX4xb)UvC(rt~k#8Gr5b6FUT`VOS0?$Qlohr(a4ylWmq@(%p z*D=6`mhJF{WpJ)jJ>(biH`ljls32$VH{1#pzw2?HL2DL7SyQRpp=6rRs`ROUHbGN31>RAW zy`HKvOumycP6FPRRPn02EUhdFa8JqkLj@td^UKkom~bdKS1wr$sr)g+B=+mpsgW81cEH)_zRv2EM7ZQGdGX}-Cicl-X$ z@0q!-^E}qEueEe9%UV>ojSjGNRl}Ddr9#11sB4?Hw9pszWNZ`g_6(=2C=uDc>@TML z3_HuTk0-e~#F?0x+d4Z%)o!;N)@)ndF0eomPKJYhN*Vf@g#9}1GUo_(bo+E;y*28i z*3fb$Y&UM>Fct_H=zkXWvHdEq{LEUBC;fm9f^BQfCv7MChs2-Pg8MuFZhK7LpG5p` za=zk!biXrpd%ttLy4euuz&m=HRq_`&68rCA6^+vGEye?gC|$9Afi+*LJuk;!Q%@&5 zCrbP=>m^(bT8>lv)Y$LkI7MSsVhxE;Cb z)o9XK(oBPNyR~s$lYCUF_{H*14s2z>D>M`>R7Ynig$}83S%xQ@T}orw|Efa?7H_by zD5H;5zA%`mJ3%|hpHNLq@RK<!jJoC|@frx!eo&MKd4|eTxX~xV} ztQkU=AcoA4yOK5b9^pQ`NPVhUu_hQ0vUa*l$U{8q;C2!Y%hc1Y_8U>oI@iBB4gaK_f9ETnd#7+aPcNis?b*9Y z<@TC28YT_5t^r0kmK#{8AP8Yljq3K=Z;Sx`z)xQYtCqQk2|YbO0ZO*obi%e+=><>1kv`QydI1lZur zlvl7Zjb;C6zZNJ(kjjg)>AwE(R~Y?cB^1}GMlJfod0C8VjqwCcVT*{};G-^@58KDO zDvG({QqoW+jucHq=&dhci7BvBFN5YcKO!U(^587~>Yq7n+`~5EdSPvZFxf7lT0^lY zE?}G62{QG75L`09r8+(S%Gv7!djTZ7KP+aSmsEKsCes|8$wF=g1?0}6;tF}RW1nVZ zmjSw1!G6}kLe4+LugmZMXm?&OfHw;{+b0e^_a&V#Wh-25F8yO$*k|wH8pK*C4C(CG zSv_%{5W3N3-6=DLhltaGp)tc6EQpys_gFjcPd{Ftaz1U`pMQ7GP$lGln6hTfFn@+J~fs|uH8m_mishm_ppzG+KQ^%Z<(Ke%ge=UlTM%sF>yu` z6ne)fdnqwq{ns)ChfC=b;Lwg-5^eV>Bz69ojTMV4=F+C zv#SfWfnrKNilgKI)(v;Ul%O-5bW~16Zf*XjWvzz6H4|CX&wQ$Pv9Zz?)Td68Nm~)0 zxey;#%D~VEmg7WoV!j391esNY3WW#e22ZtF^EYC#1{lInZ!*@ne zJ!0zgZTbP&Ifu4Gr%H6(9Z76pwLO`P&8wIh=FM={@zUs^2lps2>#S*wwVY3RX?fSPNqCvwwTp9B z?T2_!asxn)mqyR8n;!>isWr z=gVT#e~-N}Z=eGprUH+=`0P7sk%le+(S#h{jM(x1apTZ4@ceZ?^9uTLe%tIEePiC- z%lWu=xZBA2;+v_Ao%Qb(gT+I2dKm^UF79wJW0d{%eIQ`KnyI6^rD&DgS8uQ4PqCF{ zdaA2cPGUV3eR$u3rhm)g`flgT;|nR}`}7O;*N4H~^YhNJ z!oR7nG5d}q{I4THP*41?G*T|Q76>$)`m(nH!2xa)?C3ZnkFnPd!9Aay&)AQtmakM; z!Cwg-^e>OhJ=4I?Cx<)wn$B^%+u84u80F=hV#&f96m)K<&O&XDX;D}{QU4p1>deo0 zI%spfKH^fj^}~uZsBfzqNhXnVyuGGM06x_TFd15fWK<=!S3IB&@2l#fE1rIo(|1KM zePqQo?xP3}Za*54@P|1pbYW4qFcMX=O2Dit=Ec&V0@WU6UIiOA#lqGH#4*2S zXV)s47AYsb5s)RPXW>I_skSOF%qEH<-0aot7M7g{735CS=OJR)XaQ6G`C{rjBeK%SnXiK=<1%niEOcLam>t z%rhpFJ_8#$+?nCW?1DvuVLky4WRRp8cu>49E7VPzhQYzFH{yR1^5p6+Fv*Q^{(C0w#_W1c4LJbR73tMS!PpzpsJhL(jui|{krCqxga8hi1ISR;wByOA(1%#0IyyTJW7S+!FOZx{2#Zu*zcxV`M5{WFhYPI_g&lD zkzhjw0@Qn`jrqQR-UsXv_}DbGhsZXB)2rODj8w@);1DAc{GIBGF1$lYQDDeDb(rHZ zx4m?aoVM`=`8~R3O0v)8*_LLX<`&%eL1O*`;e*ZsowAvp20_h_%*vHa0^+)Ie0qbp zfC@UYpce!nz3NBm7+nI_B#jOTJi%#zbLAL;A`zt!)fE)l5aG?;AguSnW+Luy4z|n3 zaLgEGGll<(DLlaiN@ii^B=nVz0LZLby`1#WlQkm1Ji0#)H0VpPwo4hYvh zO_z4nkp_;j{9O<;0N$=41X;Ni0OcA-wFGOz5uS#kVy8Oe2s-^`Bo?8ZZFOZda$%+Q zDAZ6Q7ZM+*VZSE6cYpop zd~X1fep1$S-Vl84u5|Yb{tN3FxTxuzteQfw>R7z%vt~8HnZ-~fg{f$eevfqu(3MF# z>s0K`4JVmXh~JV9pJUT4JBpA&iV!1U6>|lG(WAN7>;W; zLsOgrtf3FfTyvy17~={sH7qaKfv!wwS0YflKnu@K=3W55e>R1hxKqTKb~zqSztDuRW`;tw@HPzfOmmBlazM|H#Iv}}HR}k^RPvO$1eIm@3 znYg~ARY;^4-HL8+`4)a=vwQ0H47D3gR}Y+N$zBa>3H^HnXDXz}yR`!74?@HK#}2Oz z0S{)AMTmFTov@LA&pFa&=I>QeU`=zFo`sv9UrweR^b;61?Dd$X{QA>fyvL4T%9g!E zR9t&?o6j>-NsIj!1AR96fT?#Cxhjzz-DdmGWqPi*U>)K-sjR;RCXM!gt$%waG;)5I zNqIM~Ycnfk@snb+^NU)MQvAjh0v;-~X@?qZxgw0?>G%~T_#WA_`}O(b*Il3ztka$w&fC)LjAny0I6G3M^ z>Vy-58*1bLCQQ=e_3paiiK&0X@T_&pvX3nEc<*uPsh^3y{_(^k2U1=xjb=nX?H~e|MyFnO1D5kblsexZ!-uDi2 zbJ~H2Yir80F3>GNW#v>r^ra)=&!%S@#C*`BK;~V5@KH}s|KXz{T)&PXtKCz}sj3B& z>|g)1KwEZ@0kdDnJ}NPSomxozHrlLT@3Pq3WGNs%)bLNRUqH1)vw8_8Q*-MTuG2e; z9dBfS2R|E>jdSMG;DaOU=VU(H1HXlZ#ee)6XlY3YT3Sw3>9kO}p~Nq%NqaJbG^q;rE$w_MB^Auha`0+WXd>r}kSpj$ z#=46+nF|#UU?1++o}gdGudl0~{h6L;KY#DJI}%|x=M>%aOR2)vz2YzUv5nQPzmOzF}OhEzpa)umu zWIC$l|7QWzlnTL^a-a*JmO=z&djX#x7+^)u!R?811z_@~mG^(-!-;xhaT&)pUb=eB zvMDFhy5@(C?I-x2T>nE0MR}oGt5qJ;{jRMCeR707OIHTFJqO>Rb&I@=BLuiJNCI(^ znt^Sb_EsI)q&Po1tYe}q^j9JTPHFnj;aS>c&q#{iD4BmgeR2dP)X{LI6qAGsj9KbZRa=f8&iUJaDTGev*o=zGa2Dq;D)UTI%)wO`s(%qhL>Z(FEYquQF;9*0V-nqUGs^q65Ku+$ITf z99ZYMRPA{o0S~0`W3G}b1sgIdz)PM+JEt>%*xK*xoKBzEA3Oe$4xd-wU#@pPQ*(0o z5367qvzApa08?|ckH;b2F8#+(ddm_mnpHn43-kKH<8WX@^GrJYM(ut2>|4xQIt<~S z;hiSTmu}`GneX<$&D^)m_@^`bokjXSE!5mzHq6xP6CZR@hX$y~O-%*|4jT!D1>(p- z(NUQxufV>iTyPJ7@qpDa*rpSG3sj(3Vlm1UmEh5Zp(5YCJ8P3!+2)L5WkZb1g^WuD z(;DOkRi)=uUqA>$2g@5 zih0NTRMSccrHgT=OCw&n(9`9KDz49Mz5#E>n#4E`q?+jEBlN*l!^oI4JlJ>4msz;@ zk0Y8CF{n1WH8KF?%aRyIaF88(6U|qkaaOGK9J696-P+G|3QHxCA`j!d5_OgaW?&}b8qV}^mI(hXS9Z~A7 z>~&c*tT{S+YiE|&jMU20$iy#oRie_W{eD9zhe-!iG7Jn^BQ=#_C~K6?q#30y=P*1^ z8EY^`FkmdnT`*caN6^koucR!)wNC_G^w;;;SxohZ5uF;HTJHB+Toc^RpOw6v(=$5( zKS%{X#%5lwXZ(jZz7snGFEihqW1@B@!Y^5{Pc+7irBZe9jEO zOpk9QuZQ4BBs1TPh2XuG!28=p=i4|vpUX3oTth$aH@st*y=@=J*z>$(vQ7#&$UKpO zzZg#hFW}{1es4cKMNsG7oUK$ThzzS`vtypuIY>D<1*e5^Od1R=7|A+wm36YLs*Pj< ztlL}5=|JOLGb5Oq8YaTNCiAjvuLjRQC@8{maN^ej=OOH|5xFT#s{8Qd%XH%l9}e6J zRkYnGZ8>Gtm~^3J=KC_U8^V2b9~cQGSq$1=6BO*6+4qP0Cqnn6dwE0Ia5`Ws3&ue5 zSg%v@oHER<0B0^6j*oCZg%);sFAAR1x0tJHvkn`0@N;vqhIPdiq0 z{W$2JVL2fmLscuUT7dD}FtM~c*d2BYYaMH)X%^NrTr3HNtxEl;vcRqo?22zC3nECB zW@2VK^RY>B^!1%QJ1e6__cqX`ZW1Rsm&b!sty4mED*&4GA$m4VQF^hiRAdDyDUvDc)Pq74ETS9R zHn}mg-`>!Y22QD7hHysAA5Z{GII=&M*e|-eqSDzUDaO4(k-V(x2TGp7Yv{VON z6d+wBkjKc!aCNzaEo_u*cD*Cc2;B3PjI@;5R5+BETceekeuz*_#*T|TV72}=+-XA7 zEv73@9{PnE zfla2QHap;k8eQ6*T>{I?$})zJ|I(gLoTQu#TcL2p%z*+bFe9wbZ_sDW7R+F7cF{y6 z7ir4N5+*|aq~WrT{Y+Ivn9BrTi1*8Y4X2*L-r0?4{%_lmZ7cqo0aiUCXB&$#mfD#^ zy@*5J(QLBO)MyvGujQ~@sV<@F7Th|nNe&yJTntWS_KNS%I=-$HB+otz;MB_$e<6!$ z7ucWP!rZ63{`4Dp+RyZP29j?#$kT;34Bdy8fJ9xEZHw|h3QanQ{Oe7Y8&o{1uzryb zWqnS9n(p)z(rRS-Ykp30{`7$vWetf1Gb1A-wlOi%3)jjt{-edHx`C&);`vGJLQUFz zbLp*8P1+Th^OdvhLG2I@<=K>El?*YX#zV+vU=);iqbB~NNWD6RK%PQlv@pIvw2k0bm5V^)IwZ zo_DqgKbwomUZJIbX6v;1U+|>gQ6MlT!JA1|Z)sQkZTgI?paQRkDeJV$@L4{JdW2}k z%2-WmqLAq>F$|f5ggw=6+(Kdn z09AvhP=skeI_(ebc|J~BJ-kG3y5#8W8bw6Br*2caLW1OU6Ykkq9q%Y&%^)kEPa_Zs zVzDP_$e9XMke4T>Bda9l$Z43iwuX%!#Mv(idALf+pu!#??H$!k2;HC(jnc31z=z(! znO@o7-L_O3Y_~lXEdC~4bjuR1LIFUe@&MC9B>MZ1Wki-9;fbR@D)5BFK``&izML0VFkLfcSS6%~T1 z3f=FAqkp#18ccwSHr_{=BmFrU8xsWe7rbz~cI-e`PDr+c?0ug* zFK!=8337l%b4sNe8n4IBSn}|3G9ble* z98<2+NY+WW`Oq-FqA6cWJ?HTwph8+sJ}psa2Nr`8@|ZxaykPo1zFhf-lyMgrO_Mhh zA%3051|wNeh4NL(b9hU8g|Z6MJ<5qK!d#T=6Ojcx6QquPdoUkizGTn{)^3ur3snPN zHJ{R-z>SYAiq98&?+CL(4tcw@_x~NZ36|Ug?C{y)pS6Qp7P(uq4Ocwvq`CG})?G$j+c-NJsJ%yeZIwqnpLjTMDod_N zn@jPSm>E>)f1S^dJ?XDXMRCA~N`wrtphx3+3$u&+*NI)8AHyo7^IyLC?_<(2b#UKkmHb0k4##Qg=EWT?x*|($*ECyWyxoRkTb7`D?Ow}$L@4|5 zVvf{J<%vH2xAFndMKiJL<88m9u4`xXum>sh0Mg1x3RZQSZyJ3r=S`0ghg#J23M&Ab>$Rr;;OErC$Ber?{thxk=8R%=RYmY#V2)FUFaiky4+!z_A25ZI}#g(M}WD{ti2t z3BM$+o+rYRL~xdd`}HLHVUO)dQonGlJM@bR2o!!hTH?E2jGVPxLx;N7edFJv$gL!I z^I`kWtg=tN09wpIZ7=}um5R&IcgIOe9aGhADPZM7jNlse6n37ufTf@r-&_rkb^6Mi zf(2eUI)murja$`ow@QKywVEKW^OAng(q(Y$7G4ij=6Xc=4D6YRWEN0pDpL;H{rn5q z?$~X6s86|HTYPSL{2Bxcr4GV49vE}UK z6!hwQh>{`Bq0cL<9RV+P5x|i=XWYd``|^mO4p25Lah>1wniPz}-2kb%OdUxkX_crm?1~nJyM~(BvryvY_%DF?V;7ds^CqAhSXPm~u%J_^ zUV*QhmPs|CG`%QDM`aXsic%u!O690hv?~W#ZkH-m5jnNImy@)k?q?bEmix`dHZsut zp0^twWuboRofh}}PgW&ps~%Wk4lMv3G5;EZ6Hz{>iVd?%S5d$eaDm#7;Q~GQUFdPt zgo3=)R!N!MT2`!qLs1^QnhOMah)Cy&9W(5_*C^>+7PNqN*>X><+y~f4Kv|k_FE)C9 zrg;dw{P{;hy_GyTx2}AxD#vbbTfbGZ?B1O2>%Jq1)*h?u4vml~U)_hX|*CG^ri4Hf>fk5sy>3L3gmA zh6eWL4MtXRkl&B2e{K$ByjPgp2|x3f=Xbp+3sdhBUconQsxKa{z^nv)U}I5V+9jL@ zC2}^b8n2l`G%NqA!a>h!`fe$>`%bjda@s7`%v*qb?OvuQ3`;uaFrXNOhPJSY(-iQ- z&GFw&=KcMBJOIR4iDjY3P1@zEYDQ?z_I4!Z$z6RPFZhw37WH$0Of_TJdx1l|M8U5N zM5_^k)TP%9@aoPSKN3>plR-8ErK;tLl1lX>nJ)Zo+(*wFm~!FsElhqU)!Yd0(mEQ| zBLV#bcv(ASb@Mkq9v@Eyb@u}8H@DaJ=G(tdIK~u~5PD_P^acqKs#J|b@pI2f;A~ke zt^ybuCTNpWi^5CsL-RDyqF861CsX9oy%j9w=%>o|&Be@5xBn3b(B=>Qkj_XwyRtHC zKHwS);n7q)fpxiID5qfo<+~TBS)>L>jxb{lZ+a>Pk%8E3rg^)<;sG$9Z2esKXi@ zbf#x!)~?(GxPM(dwsQsk;B~?UC0=Pc>5)$%s8fAT&keKb*j#jA+FZ0yZWq)CR1G0# zL?4LWNF!Gu@*}2)u)-7q@bc_E9IdWUOT{xTvaJ$GV{n-X9JNbsdK<{hI*dLlf zsaG)wUHff842uIQgO&$InW|Oe96r!kif-Fxk^I;+Ux9v?jl1B$Gk2Oarlc%tuASi4 z1aIWuI0mkaQC>?tZ=90PMJl@PpNpSg_HzlzZA*8rRw0(%yvyE`wfcQ}<Z&+GWpgWBxO{3QAq4?8uq)K^-+%3Bbn zcXDLyg4WdeGO}L6kUuNuH^pE84H9HJ<#w2nt@EZk`RaKU)d1NX4-a{R-^M-H>t~qJ z?%iE{WaKyFsF%gz-G_(7^7876PkYu$A6cq%ju%P?){7QH8Ilflbb zu6V5qhn!Tq=I5=w?KgR0TkCURv;a@u&HoVlKhF@}b=OK3^{gkyGFSV)9^aFO_h;lu13stTuZiNs$h zNk>1b{hr;lBD4iaw1W;fAWw0i&ZEv2RaUI)d3vQW=-nqHAChm ziTzN$r5dF*@ee-gXz$Sa3qt~N>ce*Srm_qW-{;*5G-WsXj-YLsjaKsQEO2YPiEZ%F zEj!poG>BkkajZI$QEc^}{v*S=08~6_y zQ=u#RK6WsbPr#mF7hs-`#jlRkjVw4ZT!r|9oS}ROs$CRvybAbHJcQXPEoPOUQ@e5t z4yG$y!~Xu-+|wDp0a}zBP#l-PTId6}gAHwfXM-c2stVQfx>``gWTk> zC8W}Omwp+4OQM4uLVhBH=Y5{4l9DOt%bW-OK@*mZ%-XG>1Fx=#oTu))>u2F~43X}n zRe21yOI*sWoRD54x}JCp=fWZ# ziwIcG< zk_ec63>WXL5?WDVbFhAItUC+J>`iEoQ7Q7WPmIw7>C5A~J4hhZ}4~8=1W7>! zlA*E~V$U;9cuDTak7H}4^ftDc>G%`o!POwxE}8?Tu{5157?_D8j>N$ z>UWwvmz`wFKLL_-4rpy)_dAnA*CQ4-Hg@O7-9+cxc?Gd0QLp!293vy$AMAVM%={<@odcB^{_RApw z?*9PQKUzw_L<4uZOD|?f=UFT7!8ekGnNoy6*7!p`=V1W~e0ao!mBZWn&!%PtlhjL9 zB}d_%N7pT^=)iG!i3-dnI5d^OddolmiWG=>(nhj!2%HhCc`(y0G2_WQ(~cGE^|kEi zCvX(NRw%T{{Lg7jEw~MKAo;heU*Vsvtbk(zVDEP(HtYh@<9L*Hi14WJeHhDcMDS(y z^qS@}4eW_aHAI1}f5)T}BcGK6vhvhCmRx{Lrb$$7MHzhAqh-UAVHY>^ieNf#(m11m0b3cGdTGv$8o z*08IYb!^=Y<2yKlrWThNpXY1Lq5kjjNA1=sihsLh{>AJwX2d5$phLrlQ&5WJ*t8jg z>#CCz-Od%@sa)N`4T}fHTjts^;ANYx4_~lW;J$fFWn1^D`q=T!(EY)PzFUz% zH58vLDdpG8_RZzjPMS9kI+Ei$$2ND)aE{2}9-sS_p(&~92nEnrnVd#R0>Nb5JL&B$ z4cIsfFKG3jg?`bV0=E0)ROjze0J`AT@tniXD2JKnAh&S1=psgts3V!DvWp2fRI>BI z!NB%&ckQq$im|UBlpYY?GfAv3Up;;>+gY8)QdBn=pXqd6MwdX-=P2!foGzN>A>tzY z%z$Se{z=K!cQOLA_u*8obE6}Cp;A~|myovL)Om5aNT@O@Ql3STvMj<(KNDa!43&~! zjILO`z_rtQBgfi4xzi|ElKQKC?$U?v?aueI%CO)P+WgGsCs}K*c(k>SrAJxB1=f|v zs3E^I2cq~VX`mAayZ zYxfnRrJlZ~dc{`0Uzmf>DNN_N?5v|G;z7Il$eh;wW_h_R1r>CREz^LID3+mP+YVNu zHXe0p3m#LMjqZ{rVSy(Jc#UdBDbq|xEYUmY@C2EBf?>Zas)0OKy+=o8Z5BHzgglvG ztjVRs{vfw`G_^}s}LloU*Nw7(1!h6tR;1vIV7&${jaCTUv7v#c=l z2eHYNzYk48Sv_>yKGxQqGY0l(rkJ!%ItxI$boSsj_e$3s6V=X1fl00z(7*y3D;d=< zQ@j?EDEVtMqN*nSC(VoeO z@VdG$9dGOX;Jk(AIWtY7aq(XK z`)s*6_ouo>fAf9GQAoBsJuTx*GhH_mOdg>HM-mCOz^z zC=4w1z5n!^rd0`Jl@n$QrDEl(YcPkmf~Kx;4SzLgC0JArMo}kgLD2u71+Z5lb4)mnT!1EJ6mIw}_Us(nhV!B1zI!zfL$P4X0>8drSTb5= z7vC2<(zfodMb;E7=BaY1q0-pGMWM)MMqyahy6>ptG9psqnTzvcbvr{Y_0JDV>w$m$ zdDd-E03O2B>-ch%ptcOrw^P{5slh3wX#Y72O#$X}XiTC5+?Za=Gr zBnRE3AQz3~=;!HLI+Tq;U&L=shzl5Aw4l$G!Wg*HMju?gn!iVudk)Ij{Epj5C=k;n z@W2l`MRj#`XWjIi{#>+o&p+Sh9tHe_P*=rNR!d$hr&kfEYzP>}F%7?av0~VXo#B5b z0R6`Qkr5YeZ4%#?&_2oR%7ZLiUo)?i#Uliyv~VvUdt3cMxa+_}y7e{4sf&2tIy1J@ z|Dfsh_wa&)d!*}rOF};A=ysU#Ufy(b7lw19S<2rGk;v=hW;@A?)1XDfIw4kI*7pOU z-Gi_ZY6_ zz@5v9Y*lsjXryKy`Eg~ag0vnwO0nW%R`E)~tS-Xv*2FU3vCS{#sUo;q^Q0z!N&e=y z_&sBUR&ynzhD%t?Y{6M-YW87CH8oq#3@wv`OB9034l^-29PC+wF-^7B_Q3X^Kky~f z7^iTnhuL%&-5@N#1brOV8OGxDBC;;7>kf6w&($!OVZwi(W=)whQxu^BsQzT4KK?X# zP@cg~vFa9pmBWX-L%(QR|4T(KSEEhQx~P0XdIiL5>o?uw2z4C*yJ2sx96 z{Sos_C*Ly=HSsm}}&TeCL}>C^N0)Uo43do8e^_e@b}~ zryALVylsyJNaMCI<tF8Ys8h>`Vd_04BqWxS+lrfGcwsS@AlsK!9qeJ zt5YIZMktTRy3GRS{<;t(Sf9Gds>&3A_fHOWFH$Ti>12 z>QR5T=IegT5aPoP#_2!wy?7_0rlxMg3~IvC(b2I?H;2+WdX+k867r7y z163=t3{>Cbu9CD^TVrTCW@ssv4cU~3(wFw1U`k zD+I9|@%CF#Y<|FTdfPT( zR_m?~B{u{RqmYyLgWW)2)p!2V)?nYxB~ADnRWuwu_I5M*o_JQ%n3qm?K!Z5ML!&bj zU-VNX#ptd#i7YBu`IX(w=g|T$aj?>q(6VTb=&q z_8}FRr-x9QbYK_nO7<1c5^emMM8wKS3}uK+p0NW1BAJ<)hlPWnvPP`P->X3m5O#mp zGj+qronaIyk-E#O|0~3`HSa)sPbyp~tGS`ARYTz{S*}=-fdeQ0^}#Ce@5Kc4FWeu( zHW)On0}EjI#X>_g0OFuNlmfD2?Gi{9g`=N{h6DBp}_JeF}t9IJyFR7Kid z>E_*JXBWjoG8fn-^V4@TpYUAd2xSG7*Qc~DYHJqdtseL>3K8m@ZOE<}2JGMArJwfV z8AoT9Gebh1x=c>4t`sZiQtT^RTY4OFE*ntd5bbe`*V+v)x=RJFwN^rr(6jatKgAco z+@Ph=6}0Jba!in;ocA*s+la{pIa*xn78Hb7*F8YE~@P>aXwE3^<3*T`%N-7A(Q)Zi;F8evn^EQB$} z@;Wv(K={^5&p!YNAVo15oXYs&bTp26d3`NE9217wFC(S+mcvpfSK{VHgeEk1n?QMWPNC%oz4rXBxB<9c&@6W zw#^-v>?V#9yAP_!&1s4Rmq6?9jFlSF7ov_x=ULY)+@@eJ|V0!)npS*4aGmH-;g3EKM-;NAzkmNCP(oIu+i-f@aQ;EYp1 z%oo$)Sa6jGc5ssGFvG+#&M1O#>#R*2aI=uP$^pEpNR|Zn5iJ0Ite<1K zO8B~qrFMhZb_Kt?vpxD)H0{sVP)WAJ-1_qN>bi!8;NwhmSvDwlu*%>vjsych+e~sR z8k6Cye4s=kX(bemnAf6DWdsQ$?8*Sm`4Pq02c2y#zNbJz!E!2d!J6Vq~2Xr^C1@ z0+M99y7*o7V9A76+&~xUe$b;I|808!xu3_e@DaN>LNLnY_vR=r6#Yn*VU?lh9j?hY zb2>=sBy6@`0y93P`%-u=NVZ&&aPr_}tRAWhnNal>q$D;_%WL6&s{iLbc;%SR!b_66 zN=%sO+h&x|q;=POSC+C1-~RvJ$P~+u=W1qi9GIcqVb4VVIAGckp?jHF90|Bf@TuFS zR1R_s%Gz*-)j-rGLL%9!uFH2dR6-&Q*uQGIlD z9HDULiSSV8yCrX-R|CdK#Dhy8t@jg)f|c-gxeXP)iVz-!D4Jxb@D&{E@@9dO1;hN0 za&+BSqT#9C?ATlNuDf*79V}k?9n9FyCvK?4(Q)8J#&Lx50TobM6jX?B9XRw*aah`r zqV!EhA*i`^;JDv7+if{N>3$oE zNLJtlr<79}SdBbwXWHmpam%tHy!U&qWTAL=zT&sY1YUx84eu%Q)%DMZF3%c zf5mTtnC<^&ML^i-+^B7MKB% z2*uwd1I8^vWkRdS;!1%4s?n2$6RHgo;GQGwt8CxkQFAi1BHBO{*&NsFzD-S5 z)%*i6Ga(*JN_$58OV;MEhrBhv*8jb?54-P%kP58m9c`VQoukxNND=uVyg9BQ)V9EC z=h4}e0so4++7Xn&B(wg^Kn5~Ne3?v@4y~G;CUbFP)MCD4 z;(gO?_XJO2))&%QaeM~-cm$7V0Qb7r(mR9rjD(T|XPG7Vnrf6wo zs34Q1^tuo?+92B|Uey{t*aH3g(L>3H-N%-tQhQ(>(*~wXG6x<%bv$ArPT}|=m3)`0 zx3W{uaD#C`tYJVt*vqKU14KCrDk>nOh6-2Tb`KtW61)u+DY8?oGLiJ18YZOg;PeJ( zLJgKUf3&2zxo&kmuql4-`<#teKzc##@}^d#q|j_cQI&S@Qn(u9R8&hdN(OYPRzNz| zoEn_mH+Ps}O`LR4HWWwvMXtWjfnN#~2NHNVWPVDvb}>*$FCM)*z#jgoOLOo$q->NH zCJP(yfnOvmKn;)5wEuiX?RR@Mbw=vUf^T>7^Uo6m9Pn-ySw{M5wjn>+=8Ub@rGm|vG(S{5u;DOWPjz7d=je5 zS3JA=6yhH>7}J1Og5>uR5{TiGgS4XHv(GcGjWYqpi@rmbRFtyDCw4*J5x-cZzc#h= z76@A1EL!T<1;bIrxK@Y@P{S{81PaQN0X8ubSQjqZHjL@T;)p~9tmL(X5>+j<30mg}i!0X|vXif8fWH^S066c) zhNm@kA`D;i zynrd(Pg9b(w@GlWsehR#i-*20%RW}+0Dz%Q-!gbL-n%__2@Grhr7?Qz8x*Q=fQvjH z8}|GeO20+30NeLit#&38ELNH4`2DWIIvPG51w1VKunUr8b_LGr2Z6m!P#awpe$ph- z|D)-vqoR7huV?5Oxd+0_|8ioexZb7FyMemTsg$Qt}-?-}m<~E?CR^ z+Ja9d z^=L|pM~YZOLhkMpPjDM>mq^9wo86cX`T~6v)^dsEo}MF%&O``gIg)cVqdGiplwIZg za8Jg18>G&7QX)%gDKkzT@2hj?u);2liE2^A3Rdp-PvD@TR-z0ES#+gEY{u;EtGaCh z)TgeOg?xoiOmI)m&Q@&PQCU6cHk@i(n=Z>uRYWm$*q3+Mja?WX<~5%S!DlUZ>UBcp znKg~EPt(+AellEo(a!};xyoV!N?8OW_;~p!VZh7-3uxaw43A|<}QxMvzG6l ze55>`g+xgrfY52a)#sWHdO;jTcV5ondp)Ycm6y{tM31Md9DlQ&>`XsYV-nWu$cWE3 zgf%-vFgp2YFi`*_|EgQYvg6qig_K^smc2B5(|P7D((wPwJ#tW=L=p^!1!$!mp*}9n zUC;AfC&pzJUPNtVov@ZR>bmJu}oP_l= z)>B8P-JNs3<`w)jN_CI~sJ<54C1nx~`y{d30xr3j0|Q&SZ7PPI|E+&f=UdC7f+$Xv zrcSIzri8U#6_HNtrf3AD599JB5z&f?Zusb4Bt4RxtnI zXJ%%y9O+mnY1x-1Nh(hhg$&jgR*kQQhW`ARe4uFDlFu>|wkk{80mj>nX<^1TVA;k} zv4Uo8Vx&lehLK#<4|u;=@4Nlj%*^xBhCeZ?{RTT68)QAuyF$-Elx3^-wKBPMC@!SB zhV^e(#Sll49ZiR+pcP)(;zj=O*e2;cK9M6Wov17n0YgNCEx(YUM`>)wt3Ms&kzGep z0aI{MCBy|y8)baic0R7E`L4jSfLF09~DdGVxzf_vnTuBuL z?>rNNe6g@Y!D25$Ih@y3Q1gwrVv~VgQtkrBb=U1!0+Gv)D|vJC2x9$T=rqJ|U|GY3 z@+ftpm~QeJzl1(N5Ocy;!{FH9Dg(k@Em>_VA0kNMnpJ1;!69S{7{++~NDb7tU%`@+ zhyq4{*v_5J9Q;rT?muY=Bihv5^fCRQE39U5_`b`)zFkf-@WFxi5q4afhSR8eQ~cNO zc;T4&F@<-Z3;X=A?lRTe@6Mk?-V=x?tLU^@EceQlcI zh`XA?$Np}2kXe;91Gj*)Fi@=sBcJ}B17Q!@B@@8b_~AlECzHTU!S^>bfaP6hHPE%P zsle5AZl$%IFEOYP$evKJubG@8wZ6h&D_$6~{vMPJ+VY6QZS3WV>_u``06MjGH*Giyna1F_Q$5+84p^=KM9ejL!;$PW>LyG~4 z?JRcI)uJtrWWR-7*gXx419((^%N)6;0rKuCz$%LpH3bnc%#lk8MeGzwAP3`R=I@h zgeAmf@m?_VW#6yn4&gj^sbP`~L_#QxKQxv0bB|uzmYP-H4MYDD&F*P+>#4q>%qn^q>bU0!Qfd}1?yp2?@m+6Ufb79KL?pK!U&OVxDo#;jph$zUZ%-ik7f`~1W)a+ zc7~p)ECO>)7Vj6Wn^SQeUFTq8@EdANDjM1`-R2Y>aTs>E@m zUx+|M`+HSmjA~WL0(PeX%u7LBoQ$kDKbX0z42mt1krkc@ad59R58d7IWtR%_;|vbE zPi%3Pwv>mSV|1~)xcFso7tuq-K8&gm%c2X=2 zDBX#F$^>MNt$M$A%KOM$eId&J(Wma&T5({5@xbsrg@k)6d-v<$V{cXoo!xBLE6!+j z5@oV%3RF3Pj|CzZdF(5?fX?jj5`U4%gGHis&>4$mu5tYV>h8c8nYjWt^nW49hOLz$ zn%BTzCN+H@j>Vst8#q`Cu`Mxu%({`rr@~lLQji1AAuO#hN3z0-i03cqHIi^up2DP+ zMja_+cJ-1@2p!P>6S-F#r`1y(SNF-rj zDiZ?No*2vZIp50thZ$kLh+yCLHsv!%l)t?LiRWCdAOpRiQaQz~!BogG!Wxf62c}L{ zMPCd;=`Vx@gKzt}H_KE>KA*>iMQ)}!<8mQCrD3?LO5)-=R3|xg-qni$b?Bo45RXMU zZVE8Jv#_9v)$Y)YVOz1DV$>VTmLw$v>ZD8w2aY*3FlGU$D`;={cw} z(mS8qE#-CT(>Q<6U^g9hYa2X2XS=(*n`u6KG5%S`rAi)4pU2CD)8;Pnzv;-^kyHdH zM-wzteVWcem&@}h>x{};Pihu>NML@7f=888SsK)DQi3Qa3kEaf2G8b=8^nwYYI&j^ zlCF#&OXSd{`0P@Gku=+xLW|(Ul7V5WTu}fNB86B0>rrp%9}WPOkHxt1n&`QsF*( z60UE&Kx4`U07A`0@=EPq@epYeF>DxS{p`W;h7xN&6v&%%OjRp!H*6~6z#Hp!p(5ZJ zcfKl=w6&ixM=iCd$C(fzQpv9HpFDpP%ibOPd|NtP_A{cZ4@jW6@?5lBJ=I2mRE{8z7#}ROB5_vHB&2eDf+~7H2voaS1ha zlql)XVls?l*49vrYo}?+Wa55%q@U^)IffqSh({F>cl8hyDmeA|-?gVstp=w5(0Y@? zy}UJQe!_%HfP@cMQH3)8nGlAlhWckoQ7%#`x^WjUaX;d*UdI?6*<7~%;I6oUfz#kf z^skc3(Py4+wa0piIPUMNNR&#dZm_GJq)3>AO%d&ZR$hzuh8sx^)7R&u8A-=Q*wksC z!)rKQhA9kCA?_D4M;25USQwE}-Q>NbO`Q9qiLFMkr5H@XODm<=cqySf2|0~@cFtN` zXUaVL2A$=-I`>$T)eLxh*jR=4VBO%jNLPfPg1zWl^R4rO^)a&&f=s(ZvTLItiC;z* zPUQK5D=KfTcDCUq8mvIKdZcuX>x^6Jl*(=+&hEZl?tld_p&LiYu)E z%LiL-lyUj&!L?Vz^Wv!+0=3WH6O*vxZ-p=SYR-i?m2jz?`IUB=(V4oCy@=0o3ZD2( zW<;?V*<)hCEMpYZ;zT$!!PTKWd5HtWVEQHk$g{nL<(fmYpkX)A2Ic2{z$euAK zC-cUn6n_$dglG9^*&<)lB|PjZb7)CtRFP^z8FYR1?>60r8I`TS zleaYED;ImR<|0;eS@d*6OVi0k)*7MDv!uG5NI+e zpBU`rgo?!kq{%;LGD4Nrb~gYFiBrI4Xh7oG9Uuf~P7QIXpUtT{o_Rt?jC>N%Cj%n6 zq}P9&1KX5^SLjL5^Z1y3=;3np;ZZ%U4p@ccpw!w)o~5^9F0#&i-}zwsuGM+3qYlsQ zW4qYF14}s93?aJ;wFnPj{70wY-AZSx)TtV{1Fv2PL5CUM)Eua`5u>jRr+hR>1YATo zvI(E(_+$?{QP<{$B2W!_jtMM{ifu&IhWc~|wvMc3NS456yk*{~<0%CvwC{071Wa{J z$I9{r&@_uhPx87r&)poFCzBeTR@YsGyZigAn>n@J@igXNKkpR4u4D!x!5!uiQ~4YJ z07wkFah^D0tXTVoCeo>Q#aKDTI9_u>G*}84BG@=7d3CeyoP->FxB1DZP6+R1CGfZp z<4We6nM;>$Zp}Rr0Ni%diFWpmyI;nXf1dS3@Zy(p)my5!p>X;Ra^zORD)o?96a#Hz zi#ib?7-p02GAIao;reK-Q_|idagqK{3ozG_fh<+~G-r$zx~w1v3zwxO13Lrm)#h4` z+F}aHgRgiZWBOqv%)9IYkhD@j*qyRK-~--%7hEBt5EQ4woCFUNLVim|^*2_sAR~Zr z`se_vr{64YIQI4hQNJB0_}<8gVuCv{FeF&{0tTvOAVmn=%tWSpky^c*1 z#sl-LGtC9<$wIYS`R2Kfnyw;;(QBmGN0sR@d;{!!MLc}I_2if@0AgPkehQC%`>bwQ zjJ#GXC?K)M!-ng?SOkYZcGu-Z0EHX*Q8sWpUo9uW`^`A@G(Y01Q0R!PwVK*-bQq@eh$EC8h zgH$z%vGSw5sIwUZY$vFE-YZWp4@5l}u6p7nAe#uoQOcmNo9xSGRzDmt(pHMd^o>+< zMXNN6v3Rb*4qsE6YXY-^0=XVshUP8To0f~t%u8q%9|d4hh|_2>*thOlG)QwLUY@{`|);)N+Zo;w!R!NnLD;S??XhhBY1oM&3O9Hwyr9Ig_4;N?e-R0k%AmX5sLP2^@T>7dR|VT4_qPtwj_7;30uA`H-{ht*}Mhr zIHKOClVJ!58c~5_EA6+kiC0$%wzJ`>_W=eb-#+VHhZo}`Xod{kHJ>V-dD zwUSK+Cc<`9qM&hVwH(X$ zBUSZg368}=y3kTiJr;Zbz~U@Rq0{Zxky1TnB5kjri`AY`If+wv!JpkVllQBddhW+7 za&2pfxD^*v5D|opR##X#Il1N4Rlj=Xe2aKNF^&I~%t-*A)PC5n9Yz6xkJ}#wM`3os zntWaXq*N0_>O9Prqacw0uQVl;UQ9b8k}(iB(ODZU0MSxQXKWmI94{iQXAQRz zqp0+9RL{8=2X}U9UmCNni;D~3kd)21{l=S){4moZUg6(Cb$r%*@&Bw*>gbY#T29GT zj%Dj)VofZf)KWDVSkpmT+jIX(vcPCb>R#}r)sBiO^dn5T9xNtu=kJ(diJ#HRI~kt0Q4Y+m=j8M0I~ekEm0dRmD$M-P6sN)kV{~d~k*@GHud(E+DByAM97e_lP*6#B$5V z^Lq1mcPl9Q9gUG0U;NP7jRH{WOxE7-Ls+R?kP0f3kiS-iHLMy?2+>dKz!<8)+7o~e zrG<`iVH83$>74DTo@nqTC$GTNn~Jh1pUvSq5jz#lI!Yi_`zU&BX7eate670sDQYm@ zA9F_VbeJkS0U+2&^L}qHKdVnkIGDJ-ZXPttS!lqbEXfE zs?0(4Ih@-wbaRqH8KrY8(rw1jA2`(-Inr>OBh|}13f#XbP9EqZL*N)V&oeYHDZe%_ z+|uI~>!57_yJ0GU^<RsTX&IUuYw_}7Z;cLeJO zfQ@yP2C^Ait-TXm&8sYuikF@hVZ{DknA5m zdak70=-@EhrwKms_jZ73oDzo6NTlm0%5iKJHw1hWivO;0z;GQ(djy+yM=(Y%Q)&@5 z^jVgx>E~~_NK2icHNg72Ry+qwEU_Gfh3{MJ2@WoC*~-4EdJ0-r#;DP?hz?sqv0J*?M`O(?rq*HD!Pw~!oYP8 z6(0#57pAZUB{Itju44bJhFoR7j6gA_1=KQqa*9!Kh7#0Q?N?C8sP$&3-YF<;aZqx0(2SAJS zTJJ3h`Sz~E$K4mxp6G;)07UT)Pc&$FJGcM+t?8Bndr$Dkpj*_3yQQA^GB%UmyYpt; zH+KAjW?=P-p)fO%pRSdmLly^}>Ch>!*FB9?5=(x|IVljm0@mytX+TqDuC zFk2NaDpfrP=bKQa&%ndh%l%c?MG*Ps-&ZImf4?yjXDFw4YSfR)9*D-?c?17ERb|?L zcTR@CO7L@$KvIhulNuWuO5>%LDrExI9~GZrSU%;g%gmWT@29#guV;w1SJeKPnAqc% zap%jh_|6&sE7nEO1A5?f3jbA?*JdAo;0wv~Q2wif|E@z%0y64i2m9+a?=Jt8$b6f7jZ0nDT zpRNc(<8HM2l-$g}xybY>|LVj`i{zVSy*+6QSls19f9+bOTs?7;nNENt&2NMR8IaP;*Pm z5*>c(3EynsbQ6^k*{iF#`iwgtTyG=9U|M3x+_oPpkKE;D1?~BF*~cwm@dwJ+{TeTq z-DQizS@(xy{#Q))u0QZ1Z~e^6-QIZGe!v1^vC%uY(lvrr<|sH=gj7*2Z1W5wU@-NV zYm@oUk7qCh>|!xxwcR1QCV!a%pPIz`r%m3-HoRXtyf0dM1`)-dkputsMLv+f?$EtH zPrsoB9+qSjCpFXn41-4@{DRdDWDh>hd?P;8Bv#VusVl6+gDe9#qBC9`QWy`adl5e! zf@&G=IlA~^9lX;1@YxR9zdk$=Lg^_$*vqFWGe18PPvd+GVW1PF>|VR*w6+z!5pTjv zi&q&&KWzfSLbQ+DhV0m`u37;@2BxX^guWe6vqOT&$Vep0t;HI{R=0h{Pma0JW|u7g z-z3r!H%CV_RL$$zCH-e_SHz5k7hiB9U7pR+`COOFYS=b!_F-h~snOWW+Ce_=&+NeO zP|UbmLlwYpp#8a8D66sV)j(~R%p><#!iG45eyQ#j8EeFESx8iwH5`VNFq|mNI9~%? z^yu*)^?6(5Z%uxE&Qf5R{{Xedgc<`zwARo|Vg;1Ip72@NeA?tMBRhnT%z|1Mp2 z^gQ`JoWI>e9T`c)`^CFnD8(K(-%u{j$ajODOy973u6I!DwZlhegB)kb%u=er2nO!O znb-mjlQ<4+@?3D7-e5v-gyiveRiR}oL_aqe4|<6upfQGv1V}WhD0iZIKf&RIaD+rr zQ5VW}LH*_6C`Y@#+7X|go)*{<``BnK`5g=YzL2K*%RrUbL}3`Jf;NxpO66z>ZUAH} zk}>s^tWY(Xm--v#)Sj5Z)QtH?*Xyy&@Svfiqf1CbiIPDm4VGP+bmf|kJHAz>;v!T74qs{LCsUCtb2toR6Dui_6)Nf%1VXrsN_LNU3}v7+oxN z#m(uTqF{_Ht3@U)4QVG@)J7YO+G_g6CCBoF9TB#~C}vuk9*H4?c3A|Z2MK#U!$--;*II)wdah8Pf7}O#nHmdAK()%KrY}O>&rKh9 z-0NO}*?DCE%=egpF)x9ii?muT0Ux*dWRbvB9EO6h$}#I*P%~Wd2lmU!!!JXduVu{M zFOfkp7-Fwzuj{5Sh|A;K>~9%w$p6A23QaVxNgd-?5%K~n8Bu&F-=7op#VF5UY}FzP zC1DkwG)f|L-sBf4Z^pYW{>_(oj|2?Z+=YI$%x6bSJZMnRyS}N3)-(T*=p)GP^@ses zbUb8AUg#54LFI9BcFA3#?v1yQry3z^xhkq;GV1chdwP0;j)T7Cj6t62~4)Mm6Jv;uO21W!IHH5o>n+ZmF@$j=JL#+nFTsiu%~MO%dk z;G`EY$!76fA|$3AcbaP%-XJw-=$1(wJmauzsRq))rSWMol7t1++PfVg;izAtyw)z)^I>KBByAVR>$ zr#n+N1I57;#lVVhoo#j}yxq&a#a=wmO}li_I~xBbeceiU!!?E0+lGKEltTSj{mUo+ zZj}`_8p4cZY&bZC_dEdJWxqSCXa1lo@tvJ>n76;;uXynZ&Rd%=IV|LeAMS^Zt>` zY|dfu$B!7M&pQNA2_x*Gv~}KaG-mPk6R7(jbNA;6sP&+=YBbIYHB0aKmq*W#MXPHY2)Oz2kkib{|5bi;K!V@moV7TjGt|$<~6c1NVw2mePqaR*n=1a!Hpcsd3 zj;n7b_JyTMMc+IMYLKJ;P!=CGcU`dTY(5AR-~?wZ`}kpqVU~ITg@>DVufp;3e$yL!9Xj zg_ieuQ{7J0=40K}if%WW+v@M4;PAN#; znr8QIaUWl=f?|q7rJlF^f+BMe$#?4BF5aT1gSM|9VtQIbhRjj#kh@t9yhpz-J&ihl z696GJdFz5@UH~4VtrvYS5CIT}6sC_eW@zqw@TF=JK*ydH`ao0mT~$`C5gZ+TgB~5p z@X&SomypOKNJR_`|vbN6^H03n+fGI6#6K zplG9#tq&>iKh?Kmgfsi4EcB(sB_8+*7?S^t@hNT{Ss8Tw#bq-C$o3-nQ%Bh)w^F>s}492NG4x|KaS!J@7W7<}3}oUMT>M%LI`*vv{D;}ZR5OsIy`(VMq#qis2}QM6^+`4?K0Fb3$jsTjrC@ul znZPi7d7n}A7eP`(Nh1BFfk&DSUQwUSG6aSLzV~N{xjLUR%i%T-#KJ1gyjj70I+f?3pL%WSnp^;n8yO8 zkm{k7yHHa~qKaT%>+1Jy$L~w{Ny}}9h?T@Hnm`p;XOgh?5IcK9r!0w2a0bdN8SEt; zWOI@deVa7=oqek1^kwOUs2}B%ojBEt!toZ$8r2-t(HgtdMVGyiJG?T(kQl!xF>s z9brOxW!@?g-}Unzw4D$$%Z^vdeBxM;>AVZC+YaCSYfO6Hlif}{tD601Gr8P5GzpOVM5hL_w(Ezz4ymrZ;mJF$D-aA}iF=NBo*mr}7 z`lT6~kyBYYF8Xx7Xs5OuINsGf`pc+js0qSq@_nlvVTre}3e1eys`%(cWY)wJcP&tf zM4xp0y}foojyxa?ItT-L<4E`~=QY)!-^?M_N9Z&>3HV;SPzzzkOVGf$;YwpdFl|&=&{RE#LIVeON3WrhqE~2Y#C&< zS5C1nMP@2y3f(o@)JT$3o4gI>JdE&f4vNA0O?QRV1?`&dLLJCM6SUKv6o)rLu_QPI zobKKVLfq6iuinpR^O0GpVM$1YpRG@LUzO-yv5P;kJ*F6XU;p5DeR<^l*QJOE=KS|Q z4Kv`dY8WAI`@tIz*uIE)Y?(>ikjb7jGo)J#uKX=+yrGGP3hbagjewwFFjQG$yt^|L z^Xv8HZZ%578dcs9Ns2?q7`X<(R5|!(od?ZaJNTHm9&d}u2ZM<7?5nFE^#`vAVeT0W z;qmsGW+&IHogv4sJw|Mtpn;-|K|$!|fCUsP%zbCqJ-)9bVi2}jwvalxct#hH^Oo!p ziX4)Oe7qPR;udjNUy)!t8_=4<6bm-LMiA?60YZGvZXjj;3Z1 zqCgn4rMEz@`!H1Q2qIyuW;m()Zlfo5&KZK0NN*d)B3cN#!6Q{ab{+cba_Eb0@%bWG zb&sY;p_&*X&ryq@DM60t?{Y2ldUYs10xg3DHKP81PlBSLuHG=Qt1u*?m{#u)W-c(( zJeitm4h4Ab{l!om^zOP+n(bEPn;#xaO}4TQ#Ud;1dz<^VUxCiXJ?J3d-sC8cd1o!X zgW>`A;c_Xrsd@W#v=T(wVaddD<+7VQWcupMPEF2W?xFq<8_JtwJ-_h%M|4TYtuDkT zV0GjBKgY_1(yB;lcy;6iZKQINLh~T%Fvx;^I21bo4I~;P=ef7;V(AO_2+*!URez{% z&ee03BX#o++_LO#i?}k*RfFl9!IR6uCAA;7MFOz19>R= zGwq!kP^XyZ??yF=Gr@vJB-f$|Qu<<9Q&XIZj6VfD`P1iFKa@k`US_S>C=&q^5T4gC zAp_nI=87H*EaB(dtg*X77G2Zi)DKSWQ0(OjBP?EXkdL)SSt1AlU<+&EETZ5c^lYs_ zOFc2}hRQ?Wq{)0>MFdN%HQ6NSbD)QU79f!Xu8f#lA2M!`WTgaNOyE$qp1pbE?EUoT z$L(_**pQL}Yz4`GK6dK#+okp>?T=v(fUomEA}RPpqNT4d7t7((ZVTj!avbEWUptG| zTgYz_*RpEdzN^-}Q)WgIq1etwf`BDCXxwIN&QOu9o5c^ zP+2Xfqqlf3b?=^hT*{t}GCn&!DRlhQnG;gR>o^YXeGEbVDl$Tlm`jsersAQx?$G-C zw?D#+g%H}sI7jQ;)gzA_%r%zAFMD%aHCFbQrgpXt?Ae*%01RTC-kH8fGCJ?B0Chgk zBq@z?vys~&LMYV;jh3%*%x%zPfojjt9NtAKyVlM<{PI6na6__mOQ-=45yIAn)Hq}g zL46yV;g9j_(QEAin!%3niFlD(nlxH;SKjfI`^&P@tsY0%&CSg-JU^B%-|Yrit`Ge? zT5s=v$leseedyFq(pc-qmM754{OvJk(|Lf=&b*mOOeIZ9Fku-&A8oG!g)IF^y0%VP zDXG?I;)iXKLfB=SIdt=eDtb>&CCJ1ehp6rcG+pJB*!B%7tb&Qj0?6Fq@RHq`A2wpW zJEQ^=>*{KRd^fITvo9_MFB_G8Yhn70jLkFv!7`VJN4B5HLH>~PiwpATI-3R-Fbwmj z7W$%geQ9zPwY1A7H5qyTylM|TG-H8qEJXYzQW>MfA&yb7jkaE9?$yf@LO2|USlp6C z6pRG~qxVaPa{B2@!O6el@-9#X5yk3j$nTPc5I(IEeM0@vlDd2{@o(9@X7 zD|ZxC|IcqC?~>`#{IYIbCF@)em9RIu_r)%W_uGotGMmfMaZKyuq>_s>5P_0T!W;3| z$w1VVi_-@FuMz}M=t5&CIg|vSF#u~|d3%CDv!5s%Qjgr{ZY?V-^(xvYu=a8}Rxnh_ zEz2`|nMe>(d-vMMk8Ue5stP`X#HV_S)%Wca?gA*dAI%C47tix1GWsP=2;rRj`Lc zv8$_g9}Pr1=0zAEr9E5Lq>9ws3cdik%v^>X$-(^|>7N7wifg$1{bOa+?!m|(^pD0R z3;cKWB9c3RnHM(KGALqs4YEt-X`VsNQ$#s{r3$+2_WZtGhiYFz9X_hnR(b^{Tgx_c zCQ&aO2{>>yY77>*0zL=QQNTqHZ#z~iX0?etI!wwXN1maUt4ymJ%Ekw*$M3cQZR~{R zJT060NYCx;YUKwx|M{pk)GNG~>4}YxRy{ zQAIYO^%9vzr?j%s^3L*B57R2c>6O(wx0@YbA`}H720PI{sl|b~Bqo#zfK#fpeU=h* z2b(~cHKa1V9-CS;Ci?BN?vcmytP7Nu7*4ySY|_XzKU69Du9inO!#<@m9n7PT-OkWf zRto9g!W&dF*HK7B8jq3CONOm;+37x5k5O zU{9ATcl-@syye=}-a+A~b+64KXm7&-f_>~BfiBNgH*rt!Lg5GoXe%ifkBu95%bpl~ zZ-SpmBQ4_O?7vvtlsogqLA`*+L6N#{Tu~iT?*q;n^g&!1dtz7st8~8hEgCTeZag39O;7LJmoPF|_yIoYmfo1&cNnr{8k>-A=l_5{ zmdnN%_(27o+M0tdhIdqRC~8S@8EdGj^cImC%GF87dx32QUKQ<1t6@*P;kU2f^94s#I&@6QI@6eLupoq zF?sai+V!jvO;4na<>@-W0n8z^swW~P>isTrck7nf8(mUYgh=D-Fh5LMCW-C&u=hk} z=H%fZU4c~0(t{ijsD5>SbaD#L`pJViZ$A}TQ^RW1?N0=4PXU8{9JHL87Dv#Ya(5f*oN(Y>pTyE1 z1KObn8fmGP&#Ey6QJq|g%j_OfCkUU(!8m$-Wx?mp zEY9MpvgA<1RQqwQ8Z$;0)D&{V09{Qo1ItQ>H6aYkZ`O}ou(Z!LbAWuqT*6v5{ogH# zKj0aFyl;OUUfxdkMEEZBtuWjQq{#flHT?77`zYQfT6z+fg#w^M%>ICE$eiM+G`mHshXXk_~l7L{gV7$NA3$j0rNMrPwmR^#-k^ir75U`O~^ypBS)Fy zdtfHe#}G)>*QF5#+G4Zs5H;k)RW_Xw0L&mTX)vzd$uO0z&1>a5T!C3}cz6T4%j`0t zCvEeE6RNX4ydkgp0)^p;U^>W9c0|f|jqTbG#5TNArCSHpbwi7c_5J&;F^{u6i+DAu ze?|C-JiBjC>tl*38&~eo$^G|d(1r)L?jq6G#4lUhO~o%-BZ8y33Qm(mDFkdAX_C4> zF;K?Mqb6<8&KWMT%Pz}PPy=dG@tjx4966@c4`mwhjMfYFStJlH&BCGNIHr)mYRKO) z!B9BUn}^>m7h5CZ59rThVqeznu4*=)P{dkVBJGh1f`RB|4l9cpO?>PrLamnBU;SDV z|Msc#`B}ikDx&H9DeClJjWgCYW1jha-rp> z7j&<1#i6c`FvX!I+5O)rd3E`3#8EyrDVJb6;bp&XT;pUm;rehdP+k+1E~{Yn+EM-R zO~}~S-`rw2Q}rb}IcL4p2mi>DAE_6VcZH?pQ9a(2$=C-3d8{Sg@+wy=3x^yU_G%hsMGSn{gFV zN*8%r=|BjHcrDaRX-K?M!NC) zsr^9+kEJD}yHL8C7$zeTn?!LKqj~J*#(*Hd63SubE*2DO6k~1}GihN-MHo!_JWa?( zkMlz~Y%0HqNi&w$LeuJ{XL2x&Xj(zTKgxpBUq7hGorEq;4wuB?_gLnGh^s64r=t}! zqp~75$K1Q>B%9sNKyJupCZnkzc>@Hcmg*C`^LE8yZ9gyGBhJ>=W28X$mBXpCcsQ7J z84!R(G5(AMGE}bSn2X@dgZXe(J;yah3*;py;%Ad$F^>ut9%w}DgJ@9qTIXjH%4jzk zkZs$Dzac))CA^~hKTwJVSs@1fSz-1j#@b#)tBwujMjsZ^voUM3jwotW9~Z%?7!r?j z`ofrXn5t(Hl1AIs*nKfJ8YV)nOSMip6v*8V$%1R1&Hol15nQ4uks>r(Ld@QbzgN6C zA;6zRWne?wQCCe^EmIF5f^}d{qsWGNrd=8|H*|kz0n-LY(XZSt6Eo=MOSR>Qd4&`b zBiB|!ZZ>~Vv%aWDa^_fN%j9b;-f)^g{ew3&Ho zDW{$CM!;~xz9x@J>L$Ak60m9k1zO`D9(EJ1pd3FG+rQ|RfBq*WyZ(pe6Yk<*8=NHV zQRVMl`=ozS;kxmuoQD1*nyU$_*Vv7$p3T+Dp?HE#z7P7x?pueocF%VgUC?zw-#aCV z^$==soD@wu4Ge@w(>RpCX3ppyTbU!5<$;lF$fCyp1nn< z+y{jdu%B(2zP##Q`PFqp)9XmlU{wn<)$|-@nw_RTm04Hp@5RJs(SfJh)YJmtO;RvE z76Vc!Wmy36)dFMaMMq7qO6&VKUR)@x9$Zt4A=S@ucu`625KW5Gi#Sz6ZW@9i8dDmW zq3@#MoQP>RQDl3Q8xxx!PQsp>&V4_ME;ED&r7YoSk{0oRraxU)AZEOhQ85e}?KU|# z^3;Z7QQH7!Jl{dp#oJxeOQr6rQ*GZ>DlYlL&uz@lE=q58wUneR1gZj>@u6EKjAojl z#0`P`wX?ep#pl=E7eDB!p?e}w>C?w;Cx|SicVO4mg2xdBnpOISMoi1EoI~sN*VpsQCU5USkX|BoYpY)Lk<)Yf939e zdVBUG?R?SfY}DMHetR%{n5zqb_lq#=z-uK>^^Cvlf-YTx|1CijLNhj9C1YJ3F@gta z<^*{X%cQcGHjdo;#YTDAmi%CRJ}@9Gp9bo2e4rB~L7^~rC=r`HzE}*dS&1-2)PvPL zk~ZoiG=%-c*F!!GG2V`~jZK+5=3&Xa4c9E8G<hbc=%S z=oC9wVXfXbBV-%Iax)=TmQ1G$V9kaFJXOnRYjX@+)_3&u{BykdXF6s0XBtW&Vu<~N ze_>;uW?7n3V~KEkKBg!C;2dcy8pKd;t^XGDG3Yu68YH+eDEzS}Awm3^H}KD+_?BS@ zL4)6wV3_R?B>1b$JrD2mLs&y}0E6*7RRT-hq#QMf-PPqx^m*s@Vu$?owa)c2r{%JP zz~OoIV-Rf6pC97A6S{1{>GT|isGt`JB}e<~o6W@!bJ~vc>y6Ez8d0qUqNkf9=eynp zK?N>_AIVlqpOID@YXh7tA!f@6paBGP!cmJ2QY6X5777XM-YEd04@&OVjLMz&qcZPl*J3+{!*a*5mYOBM0{=Z?ZtXGgr?ZMrH6H^u-=1`% zDmc@~A!$}eh$9B{hF>`&u5433pI(d5Ph5k4b%~9Vt}dSPO3HjJjM-=wRQx(`M!}{K zfNlO;wll8zo6exWdL0d_z0Q}X>@Ug|O}c$X>5{cw?3#8o%-I5uwhCH{OX1P)N2aOf z;RW;mEVJq636<-vNiKEBZ3?YeGA~F(h&O!kptY*1bk#Q8=W1n6thphgQl`U!!Y&`g z8ESZAVq!oDutD8TEag-?bEtM$i{)fYL5@aWcE`z5yEpN>Oq90A19o?*?p400c?+L+ z#6Na-{l4`*-R#LfJ97f0XJkmd7)7GL+fen`Y&XQcp8H}wsm98+=LF9K8+PZg8cc9) z&CPyYBd!dSMbPh*)R@S={mcj6C^qiZ@^@Fb&OzF1R>S^397=98)l6ddC7D=8 zR%WggpOzRv=3Z@=kEkM7>u*02x?gBNv3K?xBkDY)B?N}ai9bl9*RWCVa_VbPu$8eq z351OsoO;Jrp(!$oKPXm^f0>j<&E%xRs(r|?BJ%m-Cv5G#=?G)&*HP_c`uL>9y)9u%gDgPoMDJ;>U#oTBJQgu^_dTi6!%eQc_)EusI3-^=uv?JJuJ z2_4W7UZL)LJ$^)ajwUG7ADNezchlYn?%mlb6hEw1S`)G>;B=Is3H!#7&qg?!&g#bC z*BTgo<0tl~i~o{I_d8L91>q_>Pyf}%W9dDNH1un|+s?J%Agpg}O#Xms@!k@8Zq8yt z{kJB49k+!{DzmGnLUgERC+rI@p1)mSXL1$0M}ua_FMr#J58MqSn7$30ert12A`iH) z${Y(rB!9$>d5Yg*c;6i|w38fyL(jVLsLPtnALIGO)=Ci*lvc%`CRFDa8&<3*YvGK^m8Yq0&!a+d%AN@G=8{ddt?VaPyyu6@}UaC}Q zT_y?P;o({xX<|7ubP!BTYB9+<goHbjSJz{9=|W|3aO3WZQ$9SQlt69?%I-@tHJr-Oa0ugp@_RMO!}jU`?Pd- z6%??2ZA-fOaKQg-MQ9`;=rU+|rE~O2>_!2dOcXs849`j&+3re2G`K=bKE_5^PgmT! zpe%bR;Q8qDdhq{fy6T{){%HRblFy5clBJjK?(W!k zeQ(|j|1q<3=iYCe^Qq&#zW12(5^jIZ9EPVT`uua^3R&!WhQxSzNYvg+IB+R{)MTau zBJd~Q2-{}z1cod%H<6MJNk>OVj{pU0DqV>dxJUn3amwGC8XQ}xr=t#k_Ig{mAv|5a zS)7Xe-q^YDk-zyvQb8Gi35$xwN&5#J6=tki*8iroYsl&QZ{vPvcOZSwhY9qO_89>+cQ)bg1-`O8TsieH7~uJ@@4KsZv;` z+nZ+EI=e#}w6%s2d;c+-!>+Qp>s(u#gD8f6EFqu1ZG9Rzu;AQ+%lq14YvugzY6(*F z(uZDRfbtFa2e*-BZQVu%Stf~r>Hhx5SLPt2>&kQC!P0tL&$rege(yt`vsP%(ipvYd z-KkI{7>AXwd=ll3 zG^k-#^n<#@Q{LVCC}EI8NKeyV9m&XZI5>UZT51NIjy&Q8pd(fwU~-`>?s7_ ze*MkGs9Hxgcl9C21**XGAhnL)_`#07>^{v74 zjr@quDG*>AUC8{iE{yS|QkC(DR&H zI?|Qq(FtglYW))1!`(gE{$YyB*S#HDTT`*|^6HM>+GVnxgVXyur&k2VH|u`)G84-*E2-co8EGlru_61=eNHMCPI%ebf$tmOmwDZw%5{l@X4xvJH9?gRAigK z;)HuokKqpp;Vof*At@2UP|@-;n!;MzV{!ES;HpfDgf$g2atCiUc!VegGtYu{tw&(Y zj?&A@09QgKZctAkx-bHS13r4ll9!iv8dRrLym+GpmA164dlMUHO=CfXAsO!qwv+xc zoU)NVD}*?d*ZPASk9T*3S*}F6E@oGaI-d1%rxc=Qoi|b!N{PXm^+`Pla?o+%E}4eD z5zpK|dAx#MyTHW!v&zPl55JKqtAcOSfG#-eqhlKFDKdU|Qauk?kD40WVqB|waExt% zX}~&-hV$dG3o)@_NkF~wYHl-zjU3)dcA895*HAK}x7?zv!uo9L3ZLMe)!6)GVX{Y+ zfGknB)$;n|+5iB<{xePdo(eB38?K9ng-0t0e?TJ@ToDdGW~6n}SNdRK)Tf^P#Njw0 zab|o0SPf*{m!4NDvg}MMhi<<9iBxIo9eW%XVv-7bv_owu%AYf2!$hvSf<24>V>9$C z9;~w&?er$Nw7R#$RDBslm$Oy6Z?e(oO6*{m+YHQWl{^u1%e)QxUhDUO@LGs_wf3JS zZYv{$Rsesn}xOn@(46PQIkXarLZ8d!-7H-@YiiM?l zF~Z%5kn87utK^^GZYm_h&bbZ?Y%*YMk8py+scrzhaaDHO;GLxO^wcGx%)%larty08%fm~=JkV`JHntTTlPiZ_2 zBl>k4&n#=}iL@F|xq#9b*zxCpL|q_(XFSca&jw1ja8c`0JotrRTzdK5806%8yzBb0 zV|s8}iPH>rEl$E;$x{Ay$>CyAMd9qJI?Z-3;*+{yOg~{JJHd z&F>P(m0{?R?UQY5>JhLXDIGZ=4Ob3guBxhSf?|w~fhw3Q)bMBo7qTnFtx=Oo3FBlP zjF+rjErX(LC%$fOfgGHGY=UjdrjI|F^yt5?K{rT!4t}Cv)B=T{(0N`hxrcZvouD#AfdQC&5QJqBp}^Z8foJMHeTL6%=nWyc;`{C^Hx|V! zcKm0HB^JC@q59Xg@duuRU5f)3_LCfiJ}BF2lLqob>ubuB(yADV_4gsA)tz)cCL zd*iJMn^(UPD=I3U-!OhVxX2bSc3$m$ST1l@W})(_a-2&vy1gY8Y}jyCPKySivtEh> zS4g)mm5aEa%F8>Nafgmh+%3z;q#~6vo)lc|GUYF%MSE`delQX8PS#!X$eL#}**LkQ z#cys}ECtzLnj`B&?rXPH)C6IZ)XmdU(?^M-xfYgwxX=Cq)|s9jy}q&W)^Of3|F;wN zq4Tb&_Oq6t+gA`!FXh(t%36o@)aa#9cDy#}mGtr|F|JqzD%m5vpH`-AX&X#UudPR^ z)r0ROdTOMpW=bq~NyQ-q|NVY%U|xC4m{fT``$HdueYw=_FV<;-PR?LBNI?4w5wcVe zZp`|j_BGWHx!cCOnT_!@+pZNyfQ?%@S+X+a?j1=2KI-DQqS0EIu;i|E3H+EOitoo> zUTz(}CLvSVp@#7@8Ix@bkqlP^UT)qd^Mt%BbEbBog-x_Np~2G=@;(ZU7{jBIJ_6O2 ztxKX986c+@sAPTON4H?2f<9;^KTl|@HwGbKAsT9h-EY7CaexIZMiOp9UFWw;h3Gvgrx&Gq!`D%J4bo9)M@Q@Z?$28fq z)~w1YUi>Cr{$`g5*NlwJ^`*V(v-m9efipWf?YUX(9Gz??f*r!?G5TlNWV{qTeFO9L zB~hJwmU=(4nBTH-bzNOzrBc!+lvqo65xsdBEc{GAK3$kgaFoH+F?wnz* zig%g{g@a>j5(g}HeVg$BfdZ69m)F+%D*9N{FHu2Jq^k)(v}jfLEO4jX;4ZkR#SCigJP>pzBbj{MeV zIbUTR&8VwH8yz=r`+2dWyvzawiUK+=t8=XeBGsYqjU&kklh`a$t@t!mH)Y8z$Xea# zomlhN1&Se|vpaByH9)GmO;<=#VZRO>R1Vl5P27-a+$qx@qyRs3@Cy z&Ew=4^Vt=T;dQp^;RKf$-s)fLFi=2&zb|D@v&?|qu^{~?Y%Ad&ZEPzecx$E-$)td` zDL*i{DCOyS94C;_JPxIbf&31Gj7Ja9>hVuh zFPzs8aLBN5uOIMIlIh`mrMz#Y7?h6{F_@cJV?8rMyRfFwE3U3$kzoz90?J;=yLjWZ zTNwMS1*)n_X>0WLSxb?A=M8oX>q_J`uA4><1|BZm8J{;wwM=k(nVFs^+nEg`QP7-qBK^gJZ zRN|Za-g$d$w&eF`&=;QnxMuKaNqnBt3{7>|;7-HR$920z#zuc|Ym4%=Cs6mz!jyIY zK2|mb^Z&H~zSIW!IQhPl;perxb1ZPa^hgIOCgVo~)V&q*0SBsxEdzF(5}(HP>F;xJlel6Uk zSSlBYp7}2MzA-UPYk}IjawZgw=FLkM@QO*hvlheAz)(8xs(oNz(!fXk>v7<3Y)P&2yBX^GMecC7$+4%9IR`ql*dq2pJCl+n9*2B41S z9E29o-S;&*d=F#jw=~tpEmq0ex}7(*o$1P;{>Fa zC}S<)S$*zkNpE_uMc9BQDS?WWPPP4hm%3kFPOcOg)4l%pkbcj6+;Qgt_pKX~-KPlu zpO9RV{AgWy7|%rZ@cBUt-e#B4&CGX(ziIlLY>Bu?wvaA&xMthUJH{vVkH^y>`F03$ z8E&0~QtpaU8g3mNwE8Gnt^hi$vWTf1o)^b)tx#&^9mSaD%6f~VxfI6SV#W}&Kjwga zP@2`X{~na>3V9+mqrt?hxZcsdpdcUhur7j7?6O}+g#03*{gvyblkK+Os{1{<`G-Pw z0P<1nX!;XJ_g3~~$=#zf>a$6@8dj!mNk4%VcA3hf->&H%v{ zK{s>vd~%bB9d{J##MDC0|5aCXX-Nmyo--hVPQPnDet>9u1P?FA*KrC=iT2m3 z*TZ($gTGgReoVBp=SK&)s+KgHu^o73{6d4&A zv+k$I8wRi4k@@7b)V-M?^)lo3tEN<`*>t0Of+spXDH021@;4;iW&~YF;khD! zA_cm%$azP%!mYEOVTG2a^B?v}Uj1^Cl5l}v(Fh;6+6phdo{6#b^%k6OvEJXWsuHdt zJeDg~Fu=T-AiJRQO5O2(;ImtR7}@GK(&sW$?)dHxl*xot3EuBJIKLmXr;uk%*C49o zx>})r-o!E2h#ax&cjmt-_)BoKYWyus()7I09chhz?5o17{lq2zBB<{RvI(m)+9#C2 zaD_tg@WeP?;mc;75OO439Nl&CMeQWrCWn}ERG?Rpj-5?97fHhJDpCPCi(+DO=Lglv z>%sH6t~#9CywfBOZ5KL;{kFKaX5P@=H~5HbB`}=G9q~T%?d}|81{;Y_fGlWu?pEGz}ge9>3dxT4eZn#S3t;dHlQBq#Cr9 z@5?XWo_Y7+vw9{dix9~go%g#B&Eau7`|vTpd`)*GjFaC0QR zF<0v&vtN%OJ)zt?4RVbijO5$_j`{GJ`=)l(X>e>oV}9r9L^Xd5Un+rAw)u_sAfWV^ zBVdXAFrvq=N9m3rUt(`$OaWw)Nfz9>Tm>)jS~F`9m%NHLsd(cKc}_Dz@+_dVId(sI z7%Q<`*sHOcr;3(Kx)z2F3^ozS!#^id7v9JAitsd+D9soW*-t~S- zG?rv#Vrd#CEIDPdyDfSykc&rO-Q$f^i!mw1isEcFnXpJV*kJG-4sr>z{`OR|zAwCEg_f{O2G*(YUhp5jF7qjkHoo2sC|=|2=(C64D25oNVrimo^#g zCXnSyc;5B?w=hp4pc(SMmk572sjN&2r(e%$9tp31?5?yvwycU!mDZ0v(&?k1o}L^m zjw>N$W`iXaTi(JIna8Kgl!+44IX_EG9+Hv&uj! zS0~aT$uIfw!x^WGlX|*`k(r5$6<0csr$t+V?_Ywl)TNDu62Sz_%=I-*f3JG6tOas` zk}di98e*WtQ{5R-3>2A-m(?0Cb`4)H? ztyas5KI`|@M}>X4slHMaeIqG+!YW;I>sThQTyG5fx|fadV%A~x6fKM}+7sl2{9jIbRn7}kC-Au|UU=A?i!nKB~n57IUo zR7H0abA!vMmN4tq7&#G}D4yA>JSew_0jP@!W~;7SnsXh6j8ZLOiM)v480Z3X`<}n7 z{g9DjA9UXPO9;*s=<9)n*E2M>nLPj9K;9TA@gh2f$GJOKwG=SoGyEwVh^~`#teJan zA5_I-QK5^aO&Ta@@#2T@GhWW2u(3J_1t-F$hK9BbHz!*?$%eyw+!>7ryp!>UvIXqC^@^76#x7d0eszc7zH=jN zxo@A9u4UwCx&G2U>kJHD-`$}Beg&vWhh^~p7z=j|-97F=ZA#MKhVncs#e z8kxZ0QI~siatgz!XiyK9wG%)%3QoMX9+MPhtHp$B{i4|3jK4hN-3MoHo)ELSoZapV ze1GD}UJ#y`i4*G!C^p>zlZlK--mi}ji9WEO3;D4{S*xhu43B=CCVSW$@Z6jsj1uOK zV3i<{Yv{tlVfE*A>wC!vk^{KBoDr*D2n3Iqm>4*RYunnql(7*>fi|7@9|a*4xL7nu zDrkh>VLkq#&N}bvPTWwpMex0q5@W#?VldXnUxIq5F?6t^XM#&BR&g0@OJFGm2f1;@ zQ5~fs*N413gwob>4ZY7i{&Pf_tM3u%cjc4c0|{`f9r6TdVMZMuKLMB$NG=d)Zurv! z`z+An_vd~sqF+|X$Qb_L=a1$o8v}I`^ zA^QO*P=ghti-;yS$@$)+AACSboTB1#`S&=}@6pr5?+KB$!zDqJZsKB=*w*u9cm5#_ zU8L7m^oirF`&`s*@m{L@;KMYo7sxv8{JjeQ4GVE8s6115+{%JxG{}ek3n&)9* zN{h#(g?$eOadr3Hdw@O?^awvLV*4WS7i{FY&{=rQRjqy0@^WDFDM=2WkXp?mZ7BKNXEywR%yqHMC;lU5t6={xX!A#qEn4MS<&`lk;6UP2mKDN`Ks@g6K1tY9${XULB>J zs;i@upunrxwlwA#=2HM_xZZ&~MU2xPy%6wmtHvW8$NyTeSM#%s>lG44f`KJ-olgl z#Lvym#X107chDq*(K)8k^6oT;P@n&9imB}nnQ|E#MxzG^7)hFLA#Xz)U4DWgeZ{v`&}txIt7 z!gL7oY>5eGx^e&7_!+^F2S&4Ss0PlumxJ4na+na?A()k0uSh!lmBYCxG%a9@`|j)y zldNBlT0g3e zkUhZRy|jwsw~{AVljWsNP#hE$x?OI%Kcp%)p@z5UKh!7u^i$Ot3XAS?a9~{G@LyZp zLBi;mj1@%>Cqg^_WzY|~BDeNER+F`$POeBb2t%%v!zY~^LK1_`;r;WipR%GOs@Xo# z-H&gk*Q2gtTVw0K3BUIF9=*HUdf1>>_zV6Q_Q?w@@D ze!+7y1V6zZ6fM7hk^dVp!QQ#NkPN-NOc>5!5Um}6P*0Y?blD(VYAUO1wOFhs zYsKUzXeFi2e*TSBcklE4!63Bl${a(#h#?Y#_~XQ?2(0fMd(q^xLc`!^CmJ_{5W%WR zS$P=3K6u;U?`zypEp?m~zvt6L>ygLn{WK-oljY`|xg_mB=r5Ixn(kIz-xM}8WfE^k zvtkOEkVo-bRzitbVT%Hn;O+Wpr@;h9g*~%fL;9ywPnOQ|)L%!nOtkAaAN2O0{R*l7 zJW7Gi$uEwCE)0}Ofv&#vD8#1A1;aktoSW#;W=a|uUq?CXKJLtK#TWd=N}pF77SD8F z9zPsS>Tmj>p)IpTV-CF^2?xOHClvGlgoVN60wz$~M*L(jPjFuP5eaI8*keI;eR}$t#SUl7!#+ z2hi3Z9WjoLjiJB=l_vHAAE<)|xYHzq(y$_ln~l;ajQBRW1Xt=7W@Z-z$Tlz%aRcil z57lIeb9{-85dpii_1Z>RNyQF|(c1oMR0ktSB^ zc*w}nCr;YZqk(p5F)M9egXiY70ro}T)O3HP)s;lpIbL{7qz6%A~V$|dS-905nyS_P3)NwvHTqOP*eKrXYJ=j^T#wiO{A#n0Ql7$8tdF? z>x}APpM7;hYumJRXu?KIV7FVsB<^nY$ zf&QYlqeH2vo_oU`^5ou$LPD;9Q7m4E(M=X8lNsE%h0Cb3!4J zyssHF?GZ7fFXKO{I=WequBN+Y!JnoSScjX=ZyVX8krOg$Bi`{vN-O)1dc^jeVusIk znCeBb|1FKl3PA!X|Dde@-nGvTSNET%O>c3paGcr3YdrPUh0ex$J=nVQ7J~k88teOFH*W2XQ9J^Mmd#up8Z@2{W@5|Kv?5B@x**-~P&)3itp)>x` zFwq=lvhhd3VCh6YUfZ z75NubEcCZdv#Ti^%HO$Vg{XaAHK>5(`700v4^G%m3 z{rINl9x}^Iz5n>B1F4B8^HL z=FDpjkw4%H7q#w03C>e*`p+?}Un?M@n`+0-VkP+Rc_{E^SN=qVmu#f!lvx;-MnL1@ z1(btrrD873v@Q*#Xbol)1EVKlD+doz@V)XGjx(s1OC-`wYJ!Ly4)(2SC7m>*`~MOY zM8=eM`l>SnbmEXi&~C1oApGE>ID$`&0*Wl=JPKuqaLazLi;{%x?;Ep$a`uvRvvPE`-1QNyO zd)0^xeo|kesHv!_Ok^U@6v#~~TWiS4v3Dnw|V*c4t_-tR7 z9h+S)HhR80p8_>L&m;hFYC3b>7vuZ@5n_jut?}cfQ95UR>h9ByuW)#OOx~ofWif4B zv0Mf!>2PFWq#ZHgmyJkBCaobQ{3wY@`zs=6su6O(bab!oIy`KhccGxu{zWlLw>1$> z{o?BkvbICba+auXIzWv9=WqY?bb`~`m@x6$EmZ_5SG#_q#ISQ&X|rZ{vm5QeD11)K zQoemqJsiWec$LF3fvjQv<*iYYzX{A?WW=w-iGZ&ZMe976H(1$EeD^s-@1}D0CiB`S4Ib}6x`FMX z)sZP?)pupFPR8#}se6G=i)%u-4+7D#&#G}+@6sw?0FFYwFaWx2@%x+gcs98SM~)gT zGKF=l0i`ATvq3eS_8@AgrHwRkL4gA4wgt;6+h|ko*MN(<6gfOudHGn!u##-h4V*Fr z)-CHT6XPyugRLK)yNYBuO`(!683U*$gLrU)0M?!iO+cf(ajA?xYm+xc3GwRx*vZ|6>Zrminr7Jl~{y zBTO;Q&8yjxx>Ax$6t}q0(O=lMbu9KmVfvOq$KPnFF96gBk0GYJzGP4D+q%)WJ9s!| zruo0D(>T-HThe<)t@xfl3wYe9sC4=ybM5nbYz?Vi*NZ(PGgt1VmSac{%rzf>eZ4N4 zhqrM*ES)#?u66p9kgh8GogA3E8oe#cZ?x5`J8Yby{-mcRzC*cDl8yT}=dS zN~5=lpLNr14L>LHXpT$~@8nHqIdvRB96GqoVXe;z09sOys68iNHOj+p&{_33 zr9<{DFhbFodjxX7glovLJKUf33a;ypFP09Df*;~>fZ5Nn0mOscM>>?o<^t|B-0cGE zl!wy+=gT%+(@i0+bY*7ONc~0M(I{#uPw8xc__&px z)%&iTnc{2<{ce0O)N#lF^0I^uPwA_hvGK7<%>+T3;$3vWKHn#}$+Y$IiHF0#MuN28!2VS{RqzyST6R zch6J&prHQ<9<*tz?Hc6ql0q7_J3@*$1m)dOq0wIn7t=@TXjyFW|@_kFWU~d&Hz_-W5pvwHleDx#yQOB%rU_d!m*Nk)7vF|NBuSlnP zZ~H7r^97q~{aqCLcDQf1g+-p;cGN?qq?bFT6#B!M zV}kU4W#ay$p$+%q*2^MtrkHE;avX^?(&f;rLQb;%IS`1+%L~l4K6R|GC*GfaUdCp9 zD`t$})akT+*yv<(rRpv@r)*#eq3m5+B7ztI>?8;TV)&2N1m89ztE8UPy!k99*tD2BZ*I-EIa2frdTL;If9(Ok z)oH?38RUd=0#D#wv~D=6Z0}WJV5JDku_HKpmh)K8V0ud4!lHRUy<$hFS3SQCs3rOL zftB#V%+WEXv9U2jOfKE{j$}Ox8QggXA{E4dBdz#BG{Ovd+CZgRXVmt$`Isxtg!#?A4WW1zz{h>n$)y=!H& z^(wu|gi5z7d+0_HBq1KfqGx1KD5jUY1Wt<{GV<6)(ZXeyR>iFhK^v_I!dBw znqOqHAX?3?H@Dbfqpll@)lwC7p`3ywsll!|Mng%>P$#OT<==@GE-pU@2Bgi>qupOy z1l>HY|GoHQi84O)g=_B{6TZIh9-86yff$vhwE5p#CKEc zJPX~#znKFGOyvK`OMTMfY5glsfl}27v0J6CZ?yH=&mMCjFA6T&*GZmb8R4m_bPM74 zK&-tS7mvqb2NnXSezMEXFs6>KuIKCRJRw>b(E9vW>5eqpV(wATRJAlD*OgJE{R>9^kush)p>4_U?5bV$Ck277x%;QW5I$DN%hi1qXD?9r$CK^1d*4){ zb59KFp@sM+!X%;qwZn$*i}j76Cn82pq5RalPT;Q=qxrqqtpCwOQXWq+d7Y4lm!>&5 zQO@z})6<+*A6{#cbDPro+G@SL4Y;FYzMYQ5yNM+*Vdg9?sEk@awWr>x38Eu@n}IaV zq_el8AhzNT>j@9mP8exx1LrOv9AF;nPC9}_VAFYAjnKW*GcwxQ_dDBPyW-68z0=S3 zI%4?e3h}&|l3l;z6k2Kf->=ns5?q;c>K&$2)VJ=X#KVJDCK3JijbqFAsQRj4%%FnH z+?fPU8p|oj(>d;9QV)4M>zh#<@~dqToSOal$Z7Ah#(y%9IxHJeddVx^#jDy&4hPFJ zW0-OBFHXdJ&7mP7AI{p2S&!O^=p#$t1fAGy;HJEFdh#S*f4U~HGWu1Vj08(s#?aZ& zhqW-%>*Rf5n|;-{#L`cY>op=bg^=SJk#6r8j-(WQ3D0oVvo%oAZ=e@Uq>671b(U9a zpdL|XeT``6?7_tuwa@KMisj&$=yVRv$rK!)v_4t(PxOxK&KU@?UiVXaue<@{G6DCM zW7+uRYcNQ`ZG~yW2=>kZiMUsq5-dSqSce8e1rT}g^ceT6QI8$|`C-ga@^U>4D+VP# z-kNh>sFDC?g+_RZ)I)j<@_U8PnWIIBE3-(jTf`}Rm5O^lx?4{T5Z5o2E9+Ne11)db z+W%-haF)=&v;^5$lFi9H$q_^hAoQ+}2~b1>RC|l_CXBRtO3C|d z>C1rWMI7`}3~uA$ayygXWs8OFy8CS&Ix6-^2Yvqo-Dd+fV$%J99i4Qu?L)2YITm} znHqk7vS}x)9Wo>=j?8K>i@Gu5^OCC1HOeRqPv4msK~PuXG>=HuK5F3%%x*hD8+(k^ z2SNMqBBdl&lBWmIi!7!5YX%YX&PwOv4O(;61XPPO4Dv5`NcPou7X|{$XjtlSu~9Sr z;8i;aSYl$!Ymviod=aJR#;S0EVVTx;EsVi0{$oXNT|+bbi=rBkpO^20HOm93hGJbG zE{wzNxCs>y!Tp^QnlgA0`*FN)t;f(ExKw0UG;gF4Jw z*ZUlt^0VlSSTU*=&y5^PNFuam7TN@IDzT!cOD;&WX_P1fX9QH{x*8)MqU90GTq$i7 zwk0gD^ujvmzL+2`JiMk`3Uq{=kW%&nFyz0yG(actLw8~x0s*WEGsUXc=Wnas+lr=7 zSaBkE1lro;#$eL#D?Mzl(`=W^-LK0&Ti7`sLVQ3?`yE%X*F7pd;8b;SJM+!=Gpj*f8DO3T-KNi77?Nun#1 zI+9}KVOOJU%WISr>yp3As5A@c*0kJ`Hec3nSlwgWsswzWxIMG$o0^g-Gi?zUPF|bg zy={v@oEidW{limz`k1jhVByu6qkm5mF?yD$_vwYW`A+IIBWv&@)UMa6SWm9>J% zrY=sGjX&KOR1ee{7tpq)6eRn%>iSzCoH!~z{vxu!x67m&K6L-4zEx5Uli72)ZhV1s zjUU`U-*|}t=DQyWb1z6^nV%h|4RnFB)dNN9d{+`e{5TA?YZv+wGTOVd8VHCmPmNVz1~-j1u!?4b8S)ro%R zq^zYh=T$HeYF&o$TxC&Rnd@L}65-M#b5I$~=X8PtKMIJoGKD>{_DRai%m1N&x3}(f zC#xP2-PxTkyYt|pfUu3$3!QfnL6;C@t@x=5E zSovoSO1TBS@`K;e#Vc}TQbdy^&0%|KL$8cB^Q@)d?(?pIdieW%+>^*Pq7#8cMUh(z z_E<5PfG)4EOdIS!V9JYN#jA23x(qimsm3_bNcjKk?a>0_7=Tandra|9v(5IjIck(v zzZg;VORyY@t@Vfc0YsbUb`0MG_h_Ukp>lUF5vY_;1bozs|3pDYtDt zyskri{h;^$(8y}fm&>8Yto29I|NJh3$N*$WB>MYywaY(suQ~TF5l8H@;rpycQBT%8 z6C?&VaA!pWqQ58rkn0ahC3MR{1SIaI)9o1qSp{#U#v@X~AF&Cu{ zWlDe-nSw;{nroAfLtX}m3Qgy-1*>V}Dlq)JHvnGJ00cnoPKzG}UFCcKO4_f1GzNpw zjxY{+8B8EeD)sS73vIW-l@vy&%Yd;OI37}Xc?n~_3%G5NKPT%Z?7Hqbz)q>bw&m&w z{9dw zTw$$(@S?`(FLQOkZ8?@C-jXm{Xb*+v#tQgQTA<8b&hq0m9u5ln;;tNQKiiN~GPAL{ zLSOG)?@shZp^p=;XDh8YFCzCVePXZ0(8TWN?@(4`WMuC(r^?-o^%vTILA;Mgy4^^B zJcRf7{I>bn2QMsWf?wY$_RjMVzz9atQA^@Bf)ulrr%0d31kOuPiX2D*I z^_ZFQZlqPG7Z*w6sLX-5WCn6t*vX_` zLiAJRHXQ+dc0?yhyB=gT185BU<>6JYb z0$;)&-y9)Q;+0q38SAv{41pMce0SA511UzmH;au>I@@dqp1V(oWjZxaksgf()|F5u zs2;VU!Y0mwUP`G!fl_&H(Nmi`v13?%VBp?qG{a}nOo>zD&UtkYR1QJD%VW~HHxJUs zUi>b0=_bG9X1^%0$6sRdce|cy3YUkf{^`{|yG$=rWUrXe1F}~thnlOmwe#1H=wdJI z=pr|h?uj z#`XT9O%YRbH4+R?pTwEhRrs3$_|T?EhLbr$|2eq?2T1lkRkHW}Wc*c5T&c}CdM4$S zd@S+-sC}@VPA@y98~Syk}Vy_AG3_nw0Qs- ztY2VWXDs;1RqD|o*T>~&i0`vF(~;L-XKz^B&=MaSJ+cplZZ!!_&1Mrep|2db-Jm7g zYn3F1DMe;1rI1=174lMlPg(+wXj|Z`_ff(d(V_laN&i56(-~3U#}VEmFf=-fgf99(jxK!h z-}Bw6rLS++>+^lF@1+Ta;q{~_n}xFJteoX!KnxUphls}8IF}3h9jm09``ne%%DU$b z7GB*mz{O08Aa=;X!SV4wx5`=t9)F6FY5M?_?zPV16N$mFyWNMjRigRUWTe zLpPLF3rx@f)7;}c^vSdsN+#l!xDMQXn=yQAa@hLwk?XIk>$_wxLH_Y?&=@BlDt*-D zhb{c>;io6TO-vXRL750?NOyV6+&mCv)D&<+@2-Sds1#2$u@GTpql$vDJszq3Kk-Qa z)fFdXsr44;{DaZh*Y_rE1vDX;}rp@ZtrRu5k`^ANYe;`+3VIeo78_R7z^d#q%>+NLXjTy7i|Je!3 zlJmT>Uu04b#Jcwaz%y^vXORh@jPVeLlWR_qOt#Jx`W`#scUNEPa>=ZcB{(1k-G^p& zzl?S7fJ~o>fPK4soxZxd+K`RUW}*~_9@bY{6CZxpR8duB;`>{0MdKe_0a%i0J+5}7 zS=V(H?W^rum#|q=w5r$@Nm;_NjyiiSsy--yuEbj^T)RFykf0Rux0j=+^yVs1&zf5i zjqtEK$t5=&wNRr>77as8be92q`afBQ0W)@l9Hzs^`-H*^17}BXi{u4W^sk8air(fh z{KtAm2QK@kLl_?v%g1iKJH?x9QUd({>SLtfOnIM+fvM2_fAE<+bM{ptXL{@*qKRD~ zqLFoCYleN|*QL|bZGoShO$FjOpzdSNz*UOqknEb%!| zizhSrPtgMrm;Fe)abb~2imIDn2K<9h%=|5%9kL*OvM`sAnt57D-?RTr+VebcwAl$lqP>Y)kf%LHt;0{|!iEPi#G!#m-J zjUb;h*PLx8(?_KL{BL#rrH$vEK>79n`uW}e{=4Tf7+|Zbt?lW4(uFdLyrDxk#deyOzrY?$ zBdrJh-*^5(xdd0`Y?(zi%WM>C_z7$UC|6DyQ=-;&*CIC7PWQSsVIFGfkAg82Gq#P$)~ z+&vmW<`b3V6@|X$&DZ^smb2;GOqyRon|hhr#v5Hu6f$|7wA0!3KQx_XP+U#dwL@?V z?(XhRkf4De!QCB(!8KU$;O-VQxVr{-cXxLPZr|a#-;aV{P{q_tpYGmkUu$iY6gHUn z0`8zmw-FNo5s+LWj>T!5u<9>xmR^zyZfHW$*B6(beJz4Bro7@hB)c(GEpq>>hB>~T zUOmJ1j?{BcLJTD6_zLr|dZieAG+U-by5qtQmtRw~`O0p=C>y9c)CQjCLbY8v_Cq;a z$D$wlSGFgX#%{UmvwUjqm*(3O&wTE?NzC3}Ux4J9Pb5Mo$LO1>gK9mwQ9`M3^Z7DK z@3P{<+oH$aZ|Ulq*6X{>xD?f!)u*eQf3=(zoUyo^Q*e@`@RoIcc8tf-jENGcSJj&m zh808`y0#~&AJP(DP+Xu;t02PI=3aeAsZ8duHMq%Lc6C{CAju4&!g^G5@pL5}4>QjW zpInQEMjY2(wsqJ`+K-0AAGuc_#AohQP5<|m$v^%ibbjrVvw!|f)PCI39v0>OFZYAz^ESzT18{@A-?M$)J6?L#UVl_u zdz@>y%4hMijI{GQzwoV?+u#ChpuaXhj;PHs#SSXWd}#T48DJ-zEMW`YnAV zTZDPxhed8_CA=hF0XXJBUW!_RI)%Rf%`aw0ZNcL+WgM+WPbntiXYs4(F zn@4nbM~0XU0gZSI)s10v{lsL402QoqT7Rn6DqK({tP-;RqM>d;u>+6~n(4L$ADXiP zoTV$k)FxT#xO|MPmRW3Xyz-|wJ&q9Lq*BhTO|5!lI_o=u5Yj(SM22Ta$BcfX`{Biv z>`TDpmHQ;OJCF9i{oW7i3#(p{!cQ+z4(kQ`ppI8<)?G9e8Ok5+nB3O$H}DeQV0IhuN>Yxn&qr5zA@YB7IU$$AyadVN{nY+@1Yd@0z| zwSBgFomyTS14XWnha%K7W+!i4))s5P^T44SL9+%OI%TaMGS?J{v>CC*n~EsLW6mi_ zYTA+NS4oIH|8^WrisNKqp2(!gNg3u2Iu?||0&ARfK_K+;AL2Gmu<}(Nu)2thS*Ijt zD}yfjpl|=6VD>55Njwh1&Gb@%`Q#LbE%RDBp#ftY?TOX{H z$jodUa<~>VGu>-fBLUW?%|-L9(Wv#;+lF`bh8;h`fpo~@Eoany?Y6#QRPZ$nSTow+ z#DNh#yg&ZYk~|E2{S?gv^wl2r-=4FsOFAA)nhvkWUslF-c>oiX0Uk^jm%-nk1pa~R zOB1l%6O^hXW)P8j$Vq#8+C}iEH@md|HlRfQ@_k*dUsUMQl2OFeZJVBT1zM;MRAFcK znn%XqWEC7!^>dXh+R^GeycHX27J=O+dcb>^i_9ZV_30`v%bG_Xb#-n zo_%ObklP<)TouX)`z(F&Spz3(uRW4Jq8EHGh)(YI(;1%`|I#0?TCMPXv2xB8fe%99 zo2r}6XE6)jo0T|$*Zz)v44*4Hm+{Q4p1y#$tx^5)&mDVp0#46RxoT`+C$fYuM&BkQ zSMmkp?T}R9dU~8;@CKh@MB`TDFM&`3E6z^LSqO}1w+rc)s;S#)*XmMk@ENV%xpRE7 z+|I_}0`;t^G__<8%s?dTO||YzBG2Y$4(e!*nBO@rilGPKL9ng)?f8Mw(oni)0iJ58Ui=ZyS8($ zXJGc4z~8V~%ul$LNRXS&h%q^GkT5GYa3-#z&It1UP6JH}ExUwU%57?)!|iT)dwqj3 zr~`@@-k2_DT#PBA=5a`ep)1pGQ{<))rq;=X9yTe~kUrNTk$0Jn`(wZq0*TNZxReN7 z%MLB!bchDx;#7}3-9|g#;UtzC;D7@%{`qv+9-KPoM_UDDVVygeT zN$6rIMG5WeHs9$)uj3m7EI6h_XQ-pw{$)hBdsJ8_=Drv2{~%Fx z*>X+Rl&MolDgH(u!09vB_K1t{?rPWh9A4*nqD84Qcp#!$besyjGmbz`_dA8Lx3|Z& zmfxKNAu&Y0`mJ?e@Vse{|NO^%3;X5|fG_2BKAM53<~8_xV??S034_!~7mdk#H#sM0 zR@=kZ>d02J+pMR(wLREF3^uZ_vq;+!CuzAn$wlCaX};H73|V~v#r!u z(%l;te$lQ{XvNH$CI1K4xLR!UOXC@%+c}@(9@6{u$M<6O^yI`2c=QA;F(~e5w3&x2 z%08?q;%%O;U);pYYgDK`^pHG5un0Wyc03X6^ZA_N5kEA$+HLvrD5wQrSQ$<4Qxe7N zt z^icakq^nRU+5LWF;upO0pKLP*e9*!K3S+o*23wQ{{I(gfKN9Y|qqMAZKA}P!vst@! zMbT~bc;ZAo6ROVrdk^tl|4JLGC@VAlx&R`B4nZHPZY`f*m1@0=ux;Jrukbnr?GyU| z7e)fO`JYMQzILmDjY=-ZKfGmO_@;hVU~WDm7U1|=(`|9if$LB`Ha7f}$<}(||L7O8 zg*Y=ihHX)tJ0kmow1JV&z0%3jO1Z^D$J(I%+%@+n>T^ehZKF@8$3kb^M^}N4u<{>4r14ZL2i6uc>rUn6zY*kxZ2F)K) zyE9B=ujC72{NP$-)8#AVsMbv6&s+D|T;BU}9o-x(0=*H>SEGR795S9y5cx2sb0mKf)+16Tv{>$9MElTg5s1oRVa;) zq~z8%HV*#|CRh4t(R}uGGSflvGeOjC#Hlc;*p^m#Wq5TLj~I9M_bfh$fMwf0X z{WVR;!1ebRJ|Bl8%<<=kEV~omioKp=y>a!nBQmvl?!scMJX~KoH0=!xvI$m{VA30| z`p*^NKP~)iZ>!o(>ubhSrpFzQn*Q+KoFwsi9chkbdH8-SNMF#~kFa$^)PHlf-2wqq zg1SK^Do0{6!71fmy*O0uHgM?uDm6vf(Bh?+BgK7s48Kmu=@DajA(R&;5W^2H zk{?xjH@+%j=QWQNfbG}%Q~xN4C0hNJ%vH1q$o!S$bk*#?9kH{S^Y)ZleGo=TZLHXm zo^|)&uIMMu`p}9P<0;{nPxp75JO*KrrK-~o^0*U+lzBqJ7>&SR60_mAk(-#9{zEhV|eKx7Pwn+bc~83`s}h=(T1jB7GH%F zH)wKpIW{&nx{v{J2M5#ToMe>jiQJeV6|;#+l&EnoVx@P&FHOd*(Mgl^W%5G5#{Syb zZ4|z7PH~>gSvgob4K1|Vgp*itVT(SXtYO++iH1yS?KqI4;J6{*v}0ZEs0w40y)lzM zBq_+-ODgmC*G0eu&}6fvSMBY?2f+DN?d`yS|D>(0O~~)`3qa3-@lB`j;m6PvOV~$v zoLnPTc}3aw3znnxbM}wAdM5|Jc5{_zZ zhOOqbvu@M#=940F-XMk!EEzXHEX(Wf%kEe$*;#`uo6_v~*a(NXdTsHF^v}Bt4#V=r&?t<>p|=W^b}v+BeA7I~meOyMv$Wh3@gR(H%)?RiF4Pw+ zV?X3puH>A*IN3G~!|-6%VbYeS)m9LL+)p5LIAzqVw6qjRWyGTS2zlA;7(F(;-5*uc z)HJxXq-AqPuZSIdt+5ZeXoX*E`8$)$Iby8fz&eN%*=$aMi%9|zg`_R3Vo6}g7^N+8 zT<}Fg=&6_HVQUbF*L@RdKkE^FIu4`#*&M5kNU_|8U2omUc^j2s8(!70lDbywVr;TG zwV-Gbs2#4xs8SD^`{v;?b2th4TRX+{z0&7f_f!R*FOJ>rLG7tepGb^NTT`Wf6?caj zS%+YT+FF^YQQ!|GhDyj`+=OOBL!mz@T82H6<|AodEcmco;*d5gm=GeROHt}>t~AW; z$zE7+c70u}x+6aKqBbN)Cqz-sYL}8iCj%{W-@SfAp2o@dhyA5CW!smbPl)HK!p0Ii zAT+Pd8`6bq*|qR1V1!cqfi$M{vwtc#j9;k1lp!RUa>b+y1x&2knhHjY5FFdi{Jo4yeg&fJUdGukRxbrg?AcFsus$Dh?o{Z-lM&k?V~Rngik3&2!7^ z>scP2T2TeX(mYlr1AP z!GCk`6;)K-wD&7AXoh|&_gTa zBGN+e^oArTwl)q2_h^wMpNC%V*89Egh_-#z+hR|j>iL}9!m8ZeG6(x`kfVo#-7!>Lkj z1ME8sjY>PESO@Q7?C^{$B{;JOP8l%wwF;)a3Z^xwwIvL5k*Z3dWhfajBJ;zGDAb!T zoQS!x6T;jzqgtt=V)TrVJe>qN$&B})v9e5qx3hkrcK8f`2Tl@{d20GK zK@v>5$wthAJ@k>O%ZKh;A+;3OnKZor4y$;vAbn@d$>X&H3o%gKwqA500tId*KuG~T zdLW8nPqpI5Y&yqg+swv&TTV1eHv!W-qiAf({>luCCIxcs$8w75h=xYW3L@Bk}tdtL9+BlY%W@@xVY(1X|1%=j?%xuO}x`kN*x++}KA zY#LgLiUEP=q=Ak*sdRI`;aUpS#E^LrB!7dI6C22BUe%@?{^!-JQ9xA$_vSVG76btN{zl!o8r zP;+TU8mkE@y)bH=qZTJyk4{F&`JI>1OzJ7bVzM$TL)ph7p(+Xl-Sd_+P{TA*daoCC zBsCOrWEZfQUPXxHMWnpyDGUZ|-<+=Bo;o`J628O`?p%L9f1~cNZxCb3yp#Q-JeDCi zya*&9ct7*@M-p}OHN;Om=lcAM+Uwgse_1;htdw6rz4%eB2&|zUuKB}UOZ@j%{q;pR zioSCji{~byV^l@m>rV*v?k|lnNVpeR6tkojR%S;!@yJ%+g_0Szw>v<2K}JlzxA@it zZ!oCFReeT?c2x%2MuMVCe;!7OG|)}Ot2(O^G&)obtW!92vft!tb>$t4lQ)|e4Ux_T z&Brr$uXcyyO+$*=Gvteof57Fe*f7QfGG$JZ1F1?_t&W_|qpxG8V_BbN1krW()eky?xai21qTeqFlr^RqbOjvs|Cb%6*ya zVAA2*EAMjxCZWm@oKy_e=POGX1}wzc@Rj4S26b6XgOyl!|HA4y9NmDB(L{zSmnGrE zM-X_!;<2}ZNupoK31I6*mar{XAn2+K_$QJR&}2qJX)JE@qZ{XP9yY5-rgI1tpi0?P zR3#KK7gs1>T$vlC>nE|eOp}MJ)7RVK<-+5xi}E7wfZ?rP)H;q&>0r2lds34FF~ zFBm$m7&MIE6)+k7`;R!xdObydis^wiS8c6a?^oeRMWN?Sl>Pp5pSP!XEEJ`5o~KSq z{M_okPXDP6R9^E-|LsP2knR4m$cxy}0rq9!-8poT~`zFoc&@}&m zCb*aX;aFqwo&E}_$TgW4>Y3sO0{~oSx3B;GyeIuKfAQ@Se}pXEwyD-JC2m}(|7`5j z^a~xiC@?BsCbVAS4~L0bt{lcFRqReZB0r_lcDk{xZ4^+gwBE&=N?RfYR%x(lpm_>> z1}hpABb3pbwEBh9JLwpz%^Prv4u53h&K$fH*zcW%yq#B`B^~5K{}v$|-Lm=Ol92QJyPr8cVy%XSM=T zN{uP|i>g-{d-+Rwj!pVl$|~FX$$HMUUH&RkX~rLm%!h4vv5Xr0kuTe+J86Omn_OtS zE7HS-F#$!mm7#6~Y3u|u$p*8wVA3$jmRG&LE8!QEH;T6_eedM&K6@O1guU*Qe*Qdm z4or;5dZUN(%gI~JeJ{`e{HM4WVXVsD`ZZtwk?M6x{|V%N2jFb?G;cdujH@@mO_X$9 z*!_xfT(x@TqJViXEqCk_Xj+ILLRACB6e3xMfaC@KTLlHTc0zgAd{@5Qulg+rA2CLz2ya% zwo!ey$?w*Nz_2`SS-4=X5| z|F+mM^v0mB1v^%3_jQff!^5MH9tg!v7(`&$#zHVgBT=m;$7R!C+idr9>lJ^nC3m#+ zx$KPY{QQ;^^4uw;;>Y8+6s83}c&l5v+h ztT6Bnb%#!=@RzTz-tGGH&e3#MuHh9fVV~n|Lx#=eee#vrOcyx+iEtLe%mP-}{7-uA=eE11n0N-$s;PSA+&uu_1I}7Lp#Df=(Kqw*62vJ% zX%zc?{f3bOfdY>Pj|DU-nhWg+Y2R79-$rtaj15@9fN` z5nCLFviIFU-KlcHh^~76AwoB4@((!oYeLczeEn=Z`nS06=bqjo|U{ zPXK-te!B!3xYj%!*48IH?Z8Bk^$`H5yU!+hBon$R`hF?6el7T}_~jMT6Z<^dzb*S501V;p)U3eMNsZ?n&^yNBaD_Y* zLJ9!=1w!Vdhx6N)ffr2tbMTR<|--x zM#9-m)DY{SMXI9>sxAk3d#M&4E6s0d<5Y9B9{@7C=D%0h%KLQ?&0yM-T^Qn?KOHR9 zKtSKYi1}45PYf(=F*$f+laP>%*d&n^)ZizBN<$@q5QOisyyTt~o&F zh=L$R#Wvn9jyu|S!Vidq(ArOz+aumT`xT$J7j<2n4Kb2O)b;1lbwVpl-zd)=3gDZB zuX4>}?V8vd;B}I19};Z`hf@pqD)rWT?Eq6{*2`knZW^%IfDs|WWACUA!&!gY+COUV zJ#+89)F%%rz_dWJ(GNh>5WGIG0&f=pX7;?&vi@=g$irf|l!1V{?>2crpg{@SNlAnx z$E(XygJr9Z)%h=){K6hRmR-B3L0(fW8%H%&K+ljsJ^oPK{Wm7{yrm&xE$zhA?IRdE z7bzk(+rYOCm#(8qs=uxrR4{F+mnh^zo(g$}bnk5?Q%CW!3}rF3NX!h`%tx}Sqd$?B zhMMAx0r@VWD@LhMAV23=CJIk~`Vl?mEo z4A343tp-W{>LFwAjt3!wl|=~M|Ca=n^hX)muL^1k5x+yPIxlfkN=X?ol4U0baWiBM zOpzFjpDh9+zaA8JC1GhLT4-*_gkfXbQVh!SfO2mhp37KTj{OL!&p~(a&C5EomV3PH zU;mcYWz%f9jSL;pmw-x2OUqd^WefW#hKjoqdp*q%KU#)EHAGAuHiIoP5L4JA7ORu_ zkl2r?`n_ygAt~ofsMPzNhI?u&Bqvy1Xv{VDqvO58Q~Jv4ki8%OyrR55bNF@WKHFzW@23Wzr_hvq;1=B zST(h{WM+9rY7BUgdB0u@@f9gGl^Vnl(=KSQWA<&7@I$oFBA{{t6v93h6-Up82FUd8 zg?El}`Ftm#5bw_NezauPYaO_~P1 zHh*XT-w`9C#J;{^vM*G>0+4o$UM!X8fjUMf{$bJL07J@nKq*Miz;Ct?optr;-)>xJ zPT$=?HW?e}(6klRh??^xDrtt0kFyY)!oWW)e_`SaU%IiOfS}JIx&D0@&izHOuzyNXh{reGfq5l=+3kw^*u*4gaUrE{w%UIuOL4flymd_Lj zag4;Ek-tD*zd&|hX+yieO6nK^uu^$NOu(WaA57xyMhZl0{?|Cii7-*iw!bye!ojbX z>_(dEp_NaS`eZyW)2L#(-IHsXmb^-j8zmVpF&SqUW6F7*rtnCl!qr?M9g7hv9$c>& zWv7`}yk*k0WArRhJS&HZgR_DQ4DU<1P!{64Cu4)#!=9iD`O}<=icAHtMWu;7~TP0+Htm5Auw# z^bQKAh6ZD^1ivWF_OKI1{37l`5^w{bo zqoGBA$4a?D6d(n$n&QFDx`oTDS$s7%Q8A=8##LpdS2UhX?rmI@YsF#PC;US=fSnCy zvCCc6m~JToDX#B?C~%o z0L;AaH(e@iixWSAs*=GOUhev}&Fwp)N0%5#9dfc|(~?jJl|4O!qo<vnt5*}M57Gr%PR>8)MA?akn9CFU=++;>Z&*MA*Nc^aXHe9e{u|HwRnpt= zv)kXF9$5aCeLn%Ym7t39Cm(o%@IjhgY&24f1p%LYyJ$YLDpAxALt9mK6Sl>Cqn@)x zB6UB{TCG&Kiktgcw!tFaFxR@0r&9`uL#tXibQ%KMBV&AkITWl7++ctKFJl5N~W;+tP{o6hVjLy zp~-xfvt)X7)1P`kMwXQ#c@$7hdWt_Vj4*Z$xo22Y;%M=!9@ zw?xB<9-s3rV{r+Z!^ReUUuj}<>ly|%<;7CBi zwPP{<4=iB*cN&O-TBhT<`jiF5_448BruBRLXkKcWxKJsw5?z9PbT?K5UOqp%RaI+@ z!JCay1rq@hhpZE&EDWA_lL8GvbKT_YrP~N#y`>HHlSyJGBY)ra06(~|^(y=UG`5bz zw$rC0>N#t!fl}Y*z=A#=k6Lg1z=xmGu|yZYdGyItd#ugHShN{C*1^b(_zt2pV%TD6#{UZgJB4&l<*m z@p?RZ+%K34Bd*L~*I;0!s7#iPOAv0r`?M+T!?Jl#Z%_TEYnmpP3~*Uw=#8(g)fV++ zu*kfW(yZIpbT#F)lHj{$71*FJhSigjL!Sz;@z*>`>p1(!jQlVsgKp#qj~!q@gE+!T zV9d@Z+UpY++?lVtE|iab*I8}bM4sz!&m9*XFZWRp?+KM_H|4IEfGH=Vp>>xDU{2oi zKi*9RS3oI3ok%hi3>($Pl3Bn2p zVdJdvy1lzC{KF9r=d4(X?g55&9rHK;(^neWx0L3T>6)_grT$=cgOVcU^X{|O3M>_M z9VwLLlv`Yu%HN+2i=0|+`Y0>7eh1~CxJ}1@9@}-Hmj~bZOamCPs>$9zkJ+Uz^{id z7Lvk~5Sti&Dm9LlYFA09F20{6c||Lb8x?-}^Tug=7MJx*nf1IwbG_Yh)9^Zn6*>A7 z!j zM5YwpnO?%$Oeel+)839eex;dqxWuM&hl3~N)UKpL=+2>3F&~4ydQjfp}A)`e_(iCh?bQ}GkHLN_f&RfBo5_o342Kusu(lh0# zd_IRk1q1KTF|oJ^WIrdy_v%IJ3%rBUQyZu=q!d~ z!(hfj90t34aOW;c>zQVqzInI@o4IBwA-m`(f=k&`!%lZplbVXem*Wqz_Pl_Lep z@>zV{*XCoD4ITX^?C)G45D<^zasYWIjfD5VD~@oj@B^j1jgfEN)XkhuDR+mc1`VbO z19*Ch8~Habh&Gg5`!`E(m$=v=d26<}1S+V8A-h1z=SU9oX`nE#&?Z*BZHMAICx%*b z`Y=9@=KIHYi4sVha18h{V74k`0uN$WIWU)6!d}wk9I)^Ux8wHz5j5vK;OQRa48szN z1372h1`Dpz(+FXLRfF!6q-_)B$X#6R%*FiMV!!~hnMaOn!m=(&$uRoItKtZz-K>kLmkaNgJmWu^y6!q&16w*7o zjBzWPXCB6S`mx)8blGM0r`H2Y^nrf?!02^zDB?2#dbz1B;P08P5)gipvCVQ6e@OsWlerul!{ zbzg!kd$lGE;*Lxc`e5pM=~jAo(*!18idu4@*>A6ZG#}hG-N>7(0)LgT7?r6xQN`yV ziI-IZ#3sq4*JWa;KA(61a7fx8&Cr?E-~o0I6QD>0TKj-{YV-05`NI|z7EoQ&td>*g z6acWNm4ASpn%MG28Vn9cTYk+iXmd;;Q#-kfA&1G>oK7zKF2uI*?rvedZN!=z8il=_ zl>sy`gv-_GJLaB|)cOsF7OvA@B}?OrWp2P6xhbhWW<7=3VE%=CUsw}$4O*Z}b-PAH zid1SLyx=tFoQ-Aa8~Ge%5y~ExkoUe<*RHWH?o0nA+^w8|s1UeFiS)d9EX_7Rj?wJY zkPbf0!?Vme_9DuizW|I8 zdMrzLoDz=`cn-89nWalI7Qa?>U+QE22|RJx|BqWx{A>=&h!SP*pyy zfxzKD_Oulw@%U*uuF-Y-@w?1aaOML_woK&Pjn0$0Hce#7%U`7qwOXH!;ZW!0_}29d zW20JIXl#6;{-htyiwn7^@5tZD$!S${{m|uhzoxc!%dI&+!0Pw@uMNo>ECCtJN+yFL zjkCim=wUiZx~gbz=!c$?cxO08XGFnwh1*PSy-(=8yfKrFz5)kUG%Ahw#thAeOZO>4 zg6j~@9_mn)Cxz2MW=2g4jVeHb)Uc_jN+-AIk}1_o4+w8Y#9{uRD>n~#OMv)jG35Et zu8%2t$#*bU6@JA5@Okwb=VFj+he#=NQXKw^-gXqF=D)(~zLfX!v+8v{fG{D$m!c=5 z|HXm$L-3c_or9+N_pU7bvNWgz4ZU=f@L08`6Gg?sB3O{ukS8r!=ce6q@FX=wRmoHX z!vUEoTWu1PSDDm^%?K5q**UCu{d1@rlT4ScKVeW(9*&D73Lj#odgyrme156g3>39x z`d#S!m*Q}KsC6!zyUS)dO%^yVT{_Z)zADD1$cmaxu0ug_4r8)2yOn;4diMxhny*dC z!z!j%I7#``OL=gal2Y>2iiah9CUH0&JX(Grq3>v#>dic?`)v zH^JS8S&{j_l^x0oak_pk4dYlKgQGXy!t(MNu#-%4)|NxVEtXaP)$pjSHykA1jc%1H zMS+|2$oZUBFrrrNnY6q<<93G8Bi#?oxbW~u0|wi@uW7a*Kw)4djK`a!mq_5I$lQ4^|Ecd7|zOYovgmm+Nii z5ew>EI|C z4is{i4cDa#&8uSuFtha-OL5j))Da2hG^3SS@XV9uLfWLRBkb6z$=jhc%a^$H`^0f( zi5HDFpHm%WRPrtH0m+Tm^^6ecCRkfr2W<0%J42qK{og?(IbI~AjMy)#R%&Y}qfV#y=`6~^lw)I>XzM6LTPz=J^?$_3^lrV<+y$?tOg6*xj zjoDL1W)G1X2PYm1`pB9#F2)SWn_`G-mSB7(@oG#`&r+`og64A{1E1R6@RMWC`$JqY|UtMnLd(!#jHD6dTAJ_$i> zryRpsuk&GeMGj|m60*uWhAOA|g?Dv`?_Ni|05s0HR4m#jtPRw}8u8X#xh z&uw6)kHs>!>ZnaAaMCdR_dI?wkZ<1Nf_=UIex+keZZJ6hBYNQ94!dGYf)3npHPUfD z{BL?aC5%x>?W4Bf-{_`Fi%6u>#nzbyR-uiza7hEI)LJ}fVc6$meBo^FU7KzFTEj<2 zR`&srlg)<{dN3ciG_mFMFS1<|ZSnJp9HW>r$+0%#5Tw+_i`azOLl8vsf z`D+T`O-Hu*C786K4}82RCIT(L@Tr^U3g!Um8sUh7tri=VW)w86&_vc>%o zZ*C=L96(4iZN%nXFrq#Dp;cxzq<52a69tVvmhHqC9&kCk6!>$llZ`v#4(K=nc^&^n z89tr0MBUunOwfP_9FQAfS^uY%jbyKra`0>hme)&g-4>I@G4r7gMlF+<$N7X)4a4Ek zh`@VKQc}!**!ksnP$u!*sSa|mWy(QrT_UYhiV^tQIO|pac;GV!MDREtVFH{(cQA@^ z84)#M1FECB`j~i+<1k$z8 zRP4W&*1?xXkalF{y-X6Ryel6?@>aEkk=M(qd$uhyQ&%GAJ zK1ia#R>!W9C^)i27S7*r-D#UJwsS)x$g+K%i;L$X30EPguf#hS1hjC#kPQS|`4_Vj zN7+yM-s+LRLY{&De`$YIk>9TF7@gJH1v>Dq+?JHOp-~4Nc^EhzekJy!90FJsZnOGk zYn(Zl>V#AZeM53Ph8UrWyG)>Ocm>e>#$~%e-w+7G@&hvAOKyn??BZhB>n9(HlHk-Z z2Gn%LlqtYrwanZj$bb%IKG;;F^v0l)1O3_kYNZzWX`0Si*SJ)qw$OaDMG)$wn&dfx)e=iMOl@na3lPL{842 z02Q({b#p@jlVlecPkpMy`8`$3eo}NbRUbZV--!g{t%;0gu}!d;B;s^TNvjRdnBL(% zo-v@d0c#5A*De5vy0f!0?m5hg^8cNUp8$?TuS_HrPUkeZHHpem(Zw_`F1ZzVhr}m_ zHiN!dNQ`ZWrHxq35p7vR#_@9ur9V)90P!$T!F~0+JA-k+aJCRYR!<%s9bImTyQBYs z&YaWMQV%B8kjofUD_-tun4}b;z(YujsjU*&oaMFW`W>p?%Y{6>7~fp3_`4Kg=<-)J zYPe&38RDN}=qf+#jhJXkMY!A545C(C3{bt&sv3j@o-N%mL4Gjcn<6`i(&59L*{6TG zCR=S_|N3JpdPXK3T9ebsSoL*^B4>G%5Fzc3#(XxB4^I#D{P{11sjpPNUZ5^FsNCg_ zzK1U22FNB7_%|UIZ^}nQfx<#EHUi-){GT)dIWW11n;qy4zP+iz3ABbdZ|hDqh!>&M zoqtT32yAueJLy$mSzQMGM%v}(99I1UUGvjiU87~ZBcKa{C)6V2tA(yo64i4mG?8BZr+ zxCO2A!A;vvf!UQEk&M+0d&ByUK@5?#tB2eB5sU$-CaE58@+NLy6r&S$$L+kJ5g)x1 zWyoqq{|SYUr_Ha0X!CBpuzB$#@0tx+Y@Mq>s3ku%nS0uDz+Tk&cx2wALSM;G|p(9x3}9L zY_>HCLIw{-~Wzd~Hw?qps6%uM5hvBFGsA~o?U6qe{m{(=`GF}gF^ zbQE?y88#Af3k)1p*snMc&PDCA8N2I9u`nrC3V#-hOHze@t7RoqHuJQ|Al3ZG8|-VL zEBuMDr1m#XkLC{n9PHE*qJOPr4?k7j2+!(2cVs7}4$MQ#xQU>C?l?6~4PgH5ybET* zw*VqG*Vp#}PvpC{2iyX8wB}}>y#|2R4#9to490%HoZb9Z9dXt8&!429sI2(5*!00WujJ+XAyv5KPQf|QR z#Kg$K@uTR;j-nDEvG#@E+?n;;WtZy#p%gI2DRlF1l=uIylCe{cCi)ZsuY^9C2_?bt z{iwyCsybg%l$#-zez5-B-o2W3EU|}ihHxba#S=Mi8yI6VRHAo74+LJZ^(m;%s>+GO ztUy_iYsF}AA-7vzI6KfFDT%K0*E&0zl*D=JK0PU&EB>}w-e{*2MavJ6(DdV~ozg{= z|IOAl;$CoM87>lTKF4pSr&07R9ko29xF-p^ot{lKgh{T_KPn=M3!1We$DX%C@2rua z4-N!QOi3~w1kB< z7rl2N)gEhVqRyJr0uUfyQXT@k(u7;^R$SzwDcGdB;;p#^xVECPaHY&^&_wf|18>x1RSZdH>&ujR6m zvUzRk7Rk!g(6{M1s7e?*;3i6VvfAsyeUVzDD??4J&J^BQcOc^fjG+bqL;yXq;2fIz z?ft!4CCi>iw(v}4XT-_@eFO%NY}oXuo?zDrP)A2yPis z8?s3mOE%JY1ZSUhym@o; z@Zd%DySKf*LGTbeIMyKX8B%%sr8>W&ws>#oWcR2Z+grQ|reR^vo7%^gLylspz zuMQwQS?hd8FKTXOY^3s<4cK)QbBy6%jpurmG{ca+FFP5#)qa(U7RbmJLWlLS>&a3E z4vsxh6RiNRpE8^cuz>(>q^s&z-g~8^8GsYuGx%TQ#?3O>SaY6vY+f&nTzavP*f-WB z7A*rduJ?1nK;i{)C*v)~H|aovyTNv&JnPxlS0R8T&IfD1r>i;fn*tVLVAPDAO&8n7 z9@%W5#Yvs1RIlja^9>aQw zejkvc>!YK93@$+{!(8Yx;%uf&jh@UY+$tMzxiFF&f%!x1G^`5`i`1BLu{MrpQb;d1 z&6**P7a=JY77pRc^xxq};D00{#`h>4}-84(`gJz;mgPWk*y(_vHQ+8`PF^vT-8V+-CNpUKE;!D-;AIEo~;Ab|5l z4meg5#Zo0XS#1+bj3An{r+}V_TD6^>`g{CB~mHM-a<%;?618;*;^qgdu4C3laRg1-kbk< zdVl}-a=E(R;`@yIKIeSKIX6^k_UmKf;f%Lhq4qO;=TO{tjkeG;W`=Zwlv+T$)g_1V z7k5I@({I?e_a|{GjnqCQm=>Tjhz&e=$NB?z&^1A)$;Q(^_rZs&TEfP{F;Pm!+NO1KuP4MdShnTTg+y{d@*vv8xc7rno7%JCilSgfC7ty_Na+Q-WN zER`62Kjz_z>0j>$Nd)!CIv&3xG?$&~oV)a<--<+HMl0qjGztJG>;o^6pDE%}W!Kl+ z_;fkSLVv#B3i!@R`zYW^K?#<8F6Oq~d0(4W!df0*ZK-H{ z|Agb&(Nq5Azd=8Bu2`}P{T;D=-m|(kkZVjj21d?TKmIJ3<34td(5C0@j%^bboSIOg z!-V6%ff540^N%7^SJzvnb|>ql^7hZ`^-%vcC;cTM;ip;tA=em@hB`DHb~ zw{}c9&)oIRgMdCLmgKKGVFx~s@@)fk6>=ZN?5}e_gqb3UNs7=#Y2Zj=M_1=_G8jGt z@~6k&oU_qJ?HkkdS2Hf^Rb&NYm~i{~y`O&SSJ=yL|6pZ(;ry9jxn3T^{hR(>y&pjKc_w9@Evo%EBRH88*Uw zkNpSxPs%d-E}jXnCM;TtNr&o<=p^WR@(;+rz_YIzJ}aW!Mi zJSLvr9W4uNPfDByU+0_uvgxHhyPlh9Hv(yX`O;?4gava)yk%~Ga?E;~zqEA&ZM&xc~m&J|}+oVd0FFNnT$&Rl3T*?tl^Dqtt9A)MK-_Naa#uzv|bojpO z?+WO(-u%V=v#ig#%YWZg^0O=oYLDL!W*M0{Mu&a9_xtxyT;4bT)%czv;@Yuq zsptnxRG8{#w|~K8;Hs)BXfwCas<&4suApa;INc_u;Y$m^lt=w_^EJRT$C9SOwk+up z`8mj8)n)(bxh7lx}ld z{%>a~6rDT0GQEBT)Wf5rvy}PH*f2k@{@pyC{g7e%zec~m?&-wkP=1(V8h~sFrI*^U;SgTZGOSSQeu8GXO*iXR(Ye)KtA8xr689`*6#7V^ccL zL`*U`lj5o~bt^Rux!}Dh>xzOt8FBgQX+ymrehw@;tdF*uY3knoD}i0stBL`r$lD1v zn*RQ+T7K`bpS};xjZ)RYiKZ=aykK9wAQ5KVe5q)_Xb-hg89a?81^pYO!)06aeACo!WDdnr=FgLp8K|A~Qh*em))_H42xBmbp*TFzBx}s<0 z__elI*%_^N!7d8hu@(5A&vb>)A_ls zNfgatN}4{Y+%2q9Y;7N2d`>R5m<&$2d+fdoQ@_(VU5l>|T85&P#Tvohm`AZ2!0~cO zTl(_PPw)7@S;MRuZ5U z-!te-U*A1{3n^XZf3y~KPi02G75dD z-Z2^tY>OmbCg)JQ?dd6lYG8@#U^i$|6f9B3jltet$r!=$!L4tuJw3M5GN_tb$;Z-L z{eq)%W1p$;D7~x??*_MBqip-Ag-n|Xf%r|YbF zWHR*sUVz)}=9VLwkF>NDGBtghjCd;0?wIqr&DG89zijb1E0kv6zpWqQqkfa3GWER9 zRnG3st)I2~&3IJ=O=YE}tQ17DniQs#w52B2{N`Ot<1HWXW@vn+l#55W9(<C~@8)moa*PNn_>>s_Gyue-$xZf-y zFVTy>9$T*az@Sat$6s60UyY;5+7}xW{r!rslq|#DoWChtiEy@rQ%bKs&l$rf6Ex>gpAa21W%ga_Om5K@UMc|vN65+fO=DH>g~uhbnw6Q&^yY?}>i zF>V@>M2Q(HXwIqnYp-z|9ykio5N3S+dKnWFQ@r;9$4}fDZIq-gmMn>4ltG19bcf;4 zH$4(8^!fRDdx>OS%g?z#qzvbl*@$q=Z3H%~SV+7wIQi(p?5oBLw7Htb6;NW9aWE{8 z%<}njIWY$R49=Wy-xl@=tuR8w9RPxZ@_xY+OjgMMVHrhK&gQ0X|7{VW7T3VTT{MDHS!-IPu@UeS81$0wy>kCv|AL*8{<;GOINTr3Qg?19q@cXxLccCynJHD1e^`wgu~Lq{CH$$cFi zynv>{*saeRQ*tD27)L9H+*AbcxfF`t?5c1d;=Mo9!|mKTGo%?D4B9$0d=*G85&V0L zL|)JkqQZ`07|{S%JmvH-_{Gd73;}kGDkEuDk&9w~|KWpdjM=b_h;z*Z<{kXZgFF0N z%_)O^l8^nQuklhl6x@I6jA997tv8nzj3@m5{W}RE4k^ALtl;|w1`)x*`1o6F;haTW zSLnh305(qBqp@t&0WGS@peuCylv6c*LLo?Z}nA}_+bID%>#ix!B?!28b zWcl}ev3B{-a&y_@)iUz)i9bKWH)##^9(?|ZTEJnrU+8j&DcRZCS)c+Ne8Ix7w6yf< zFwNjsVJMz+jnZcPmY$Y-L*mvg(l8|>J{lHWj8&&wryeq)N+#;6#8T7tH1I^*&5QZs zov82S=jF{|uLj&W#zo1p`XMVOEn?XM$D1?QUW}pO=~qc>2HNk<)BY}KFiNd&Xy_8W zJS#dJ92}B}HY0&}&eI?<^A6_nOKkQ6@r2+IX3Be78f+nY3e&ZHE{;+!MivwD2ERO+ zg{gi%T%E86J?fY}VMH6BQ6mY|KfEC+THMN$}m zZeGlq*!>byIJ$#{EU12VtB*_4K{qq^#?xod3SX~0<|$CWwI+1#o=#W<_cdB>rz{Zf zn`M>r`SUb6-TT)uVl+!ZY9v^iSP+q8%t}g1(z3HJ#jD|DaITlqB(e~Rc6sd{x$z}- zqrJ4I=_r!4vAq(QiG3!)Ww_By>({r@^!!GVCwa5C+{2=O&nEZA@$qrr$OxXICIqYd znws8GQDn7BXf#j5s9~#a4_I8nKp$RndLI+hIJ-rdKs$ef6fefRK8li~z$H^xbdg&B@I4q{O8`}Jnj9u({=TbczKJKM{Vny$!*lSZi{55NKF1AH!yzZ(I_);(yRAuqR<%)=!THY2 zrO)?9m$t=;pdAc_Jvu3%Shn#*Q*?a{tpOvV7j)ZgpY`V`@Hb3Oo+q^Ce+c4oPu%Iv zm$@_=YkN(VOh)~@5P$H{nEd6cTUS+U&*zONPDE$Ilw_?wd+7~^Q?|bYq>J`3T|-oj z5C82Bcyy~-gU|hjRuqNk6eW`V2cIiiSzR}fmnUgbJzsU>h=vF-w?@}c@bm%P6j_kH z2JC#C{m_s{H~e~f)Jw|B*hp}1!#P?@v| zAp>5$dX+}_ImM68P8c#0LiMamu=7vqolkuO13p<<9J~AbY)ldIBv{Th`iE}P5H=b% z4iF3Jne6v-$mD#|&LXOPYzqLw9TmhPixUVcRf zL1Src&97;?K1Vatu=Hs_RS;G~Si>ucFhjmTcs9AYH?+S#mZnz^<%)ZgQ(R0A^(b>f zVj^p&0EF@vwMXV%3Bm+LTqaHam$geQNn?2Qf@^D~*`rkhGur(I%wqNYH#`oi;v`)J zyvFsZ;ZPIz6DKa6BCPzHeLC2&q!DeEm)eXA4NniZ#5SsTHla(57z8#&7tOdg*BFRQ z_Wlk!?+rdFd@(NZ>dl)g@oH?z>hctda8cS^R1l9tX$5g&^_*yXWG>u7nWX4o8()3! zNUP;|Z)GcS@)W1vk|KlC7_M$*vo6LDy2+Qx`3gUsJuP-csVyEBHCBzs7P0rwq>%keH z9$e>+RI$v>C3+K$D>oo?FQmoz4@`6~g=lKc?6&D$X551RH8WHGp_bM|3bTqtWd@w# z8r$d3e{$SQ_!yLt179O+PH^e^1IH&PrO4F7KfZY6LaI?hvLr%24fW;G?5gC7nqap2 zb3HpLgIm8^JK9X=E=TkqAlOTFip{Oei{tIC;i8~C!SP}STb)&QvQq+lZg56Q!1Al7 zCv(vnC2)w%gB@qdYVJI#D0V9}A+!V*Tya|l(HBWhi^*@E!`woj{g$eY+AreCJxOQU zi6eW(`vj;o_luLsAxI-7@HtyM1gLid9Qy&KpTB>9dIF;vg>+($HiE|kY(&14mXuf$ zP;vFOhS6uMMtzL$UPzL*ur*vP)aLp_Ymt;*bGqI6l$~s3<@^tGz$S=HX}XTqvcheyM&>)?;O-z4zUuJc0v#;|m;rtuo*-#S_;!!;Iz#2Tc4 z0b3th>|8lv`$EoiDOcirI`LL&ZN*-S3g=+Thj@n9^N0Xq^<=nTN8y=H&N!?+he`JX zqpmpq;qR|+uGbvs+l-cl*|o{7YY%7CUN&&s!lvTV_L6~F2{bYuk{9ZADM3;)GH1IF z$6j`F4_7!`fz;_Gl^zKOE2YfHfM$URk{vc-QPEkr9mOY4s69?bCmUDxwylS*mG@nX zFg$DQkr_VbgCHq#{95ZsRaV;*t$jHfPE;IoSxnac{^~khyiE8x-S&`;nE-8`ehpof z(^})}A-w?Ri^DcfZf?e1x?Q8DV|J$W`?$T5JA^52+a0p`iU!J|G}24gAz?;da@A=u z=7+kvLYGI3Av|LMpS(HJ_bY#iHkZn$2W}aVjaed9pa3R*Lmt$ma9$jEHPm_j!;{Sx zY6DpKP~{l^%Fz@%nv2%d((+T|@Cl7(!YK;Fl!1EW}qF|NY`( z$@(mMKY7FL61?-=+?fFl8AV9NseJT;=7d=qsYE(4tg2+{;`0f1ME?1_^aom$Qc_YCE8nU%k5}?{%7QZjA$hB%N;868 z)E~0djSq6l%9noU8$^74R=&O213k);XS)MXtX3>%CGJ<1h2V+7VI_aRB_VFVYc&OThhje`kP1+ib3+*=+qpsd9Fl@kpRJMHv zGk-8s=D$HooP_3ahe53;=_Mr;5Fc}MGcq$V^Q*Vgd{c$tD8O~=VSBn?G#_{pqz(j+(>)yS4NPyphnITsw@E!X1 z;6a&8RJ%yV`*Q}zi8-(_y1l7YjC`vVyHfx z2?00){>yNsO!${@c*~YE1ME6E zPKp_VPE~tSWdfV7w@@aWc|anan{vqTV!$ZvmCAscr|k_J zeesa>e*ejnfJD1m+O@T{KB3F--5Ii|eUJE}J^yEAnd|Vw5N74lNgzp5KGF5ATK`S} zjWnSDRJ$Ju4+c(qKZqg0l6AZ6dcC746s9UP8}q;LDu_KablAn>PbzS*EFaZ`kAN9r z&XOq%nIWxz+m-8jfH2VYJlm`IoBPGEP}^BMzTa|=i3>Pa82<_3Y>|ScY;>(++MnM3 z{Ah7!^Y&Q+8;2Ut_a!zc@I0#FV@k@)F^5f-if1{ZRc(d~yaRT0zCPA{yZlKviQoH5 zFx$cH!j;0OUn^jOQRN#VGzi6z=3ai2xfsc-<8ZP$OW-=&kmEHTF8ymARcO0w3{c-! zjuj~i7#SJeQmqEEro(To--f9NG8{gP525&h@AWpZr zpg~(?Dxa5_bYHEyw@1g-SXhp8G*c*+%>pUaC2rivfKA zKmct&k1?ce_EhZnqdXVmF;tR#&wp|L8XPn_-d%PL`f|$Od9J6g-&6B=wW8~0EN=|W zvAyJ(-EH3L-O<1K_dM6#G+WCwwJ7ODUo=Bxuf%;R#tjYs{VmUoh{mZef@Cj{2D6Yr`juPPghv|sqwF~Wh`DhSu1&ly`iyVpam80U3E>5U!_-F_L?+MLHH5%cZ<6TR-Umy}Q zu~|O4CN77A#-WiC3RN(ZlD1_Rpf32TP0ip0#^pW*1Tj`+1}OSqXwo?^kVKGk6f_m! zJxxC5Es3KsJ;6tL!4U#FF^;wLJaJQkG=$ofFRw~SNF2U_;yq5-`f-nhf#IgT{=Sa9 zJSOCraDWi&SD%$Wr~FoT{&wA{Yf{-$qeuG0rYl8?{`R+Fws0O5dr~Y}LR5#T90G8t zO^Qcy?AaZDWu%5#6kkAufr=h7YEE9B0z}px!dtZFR|q)DV8>KA%vKzHCh3Y!-9Z2H z_3QiuH^+CJ(KiL}s$WSYNAD-$-O$o<3?{l6+?a{I+xCm#Mwu;C8dN;GaN-_5nq-%& zm=QT`SXfxKc5wzLjpz%8=hoH-+c$_go{oq>1bvvL*07Ra*CWp{`sWV`QNZ-h5zctP zS-7HRGt`n8v7Ojx*c;URr~ja3U%Kb@B0kbG=Xkl|z)Z@sVYTdm;Y!DAP?oadR;_Rq zCg_SJhEerL+>b+lAw;JMy<7H|iOCgKt4?>hpBUq45w5u8UY$Fi(lUAH@!D z@0F7iz}&S1(bi+A>@K`H@)~a(_9b6}_-y)C8pYJSmYgajO)6vscss#O`a)3)4BX2$boiB5X z&d}D(9cF4sA1__88UJ3IQ~I#$W^2(52N@okYqdqcrI2#*2zo?C~bljr{2&&rTm4^(&eJu^b>r8KxxFY;L%NF?`=s-pFcj&`mjP|i;O3^4yI?+&~euW_x+cCUQhN+vlOaFGn)FdT3TA1yu6E%ILw}>{0F}lu8oTQERc?2zuxvNFZYIdZ%SBkkHnXp zSwfDSVJQd|IbXh9DHKK_{6@1w&;*GlgVU>|{O zgtF49iV>~-{?%|*9Km1PLt!LWLQW;_1)MN#tQ_WDhA89=hqpzlu)qB4I}WFqA}6rb z7({&F42Cs*UrYGf+=~j}^ML(abJ`&+Tit=khgL-%K{3#C%Fd!@NJ;jr$$hQaTmIkY zlhw$w;bJ7IUjs4>_+ucFtMz$n#sW=Z8vdf073;vlu}tuX1GniWn~nT}z99R4q{z== z8)83_b{$}5IF%F*gb_!9n?#}+oEfkt;Du<{c}QJU!z}@JR1Tz+lR4_2mzyr$>WpL2tO#eoM4j|Z)4KqsJSI@6q+kpE@>P(qZMc$<7v z>*D!v5gd8$x*=s+Jkm7si?zY`Cm_ZEKq>1rFfO5~leezR)A|G$tvrJ|CTPuS0rLXv z>=1awYAKSHO9cuu!~aU%Hp;HV58dVnO9js!8(_W)NA&5{JD;6{BGD2V-&E=%6uc@f zMAcLqmOxB1gV_N0MSC$gKkO*sqXL^Z#FaT*zWwqHPTfFwr@*buz(k4qGTTwKRi**1 zW3Q{ZhAr=RjAoOsP8lxVEYa}bx73FE0RSs8DD#{udFe6w(NLbjRU&Q0oImz?_QK=JRK~I`Fb= zW-_1Q7Mpj=0hl269ET-@5PyIvQ(enI^?~FITY(i912(Gk$*SO^M~~{^x5GUQC15(a zHs*f$QYi-O+Ir|)%UbzlcyX^ZJ+%9QWuyhB4gUz?#qk|PnEIdZ{>942V0qa>2p0#-DCdb?`UA$?bFb(ynQp^Uevz<>e} zlbf4cyV(3PQp#w^oKeK9`Ij60&eK6kOo%5zUrBNBcu*|i1iNxKB2^%-y=;Kq6395c zYAU=E#_VYt1nUPU(|d1`z0F6{UaZLA6xa5{ym%VM6!9PkIZvn9Kcc)lQFIo(n&Q*~ z30bUEA*?inKn3pXo^WoN%7Kyng*HOiI}V|9WO^EfaFC4j*I)j~A*@ z_HbSjlpl~>?em9WzlSs28R8d)JX6SYfl8UM9N@$qabEp0 zDcMjgD0~TVPO&gU>(s>1K>T5E*p_~d%FE{EU?1`BWRVV90L;7iG5tHq;$C7>@K zdr44x{P*U6H5;(!fBqymO8SqkwI+!>ZbGj*7Qk+ar%#_20Hq0=66XEhX7N&CkD5*Y zY0$KsofmOv9xWjb)93_?k@Bq9xpjN@E^1h7*yP>2+Xi-s-mwQG#t55qky*=oA(H&4dI^9<1|`Lbd=3l8%m!&u&6e*W+j&>U`gR%jOSH^n)NEBaji; z9$4T3okSwyFxA5!>Htcp&R2ea1+qDSt5fn*6%>JphJxi3l8bQjmbSKV;M$P}a5yZ< z>O02GT)vTOnFnmKA3jXS)}3Bem)uf7*bXFDLVfP2Kz3pxL^lmu7bu%|c`C7<=)I=A zar35Qvq^0lHYB*v{!Ha2;4)r67fIyKF2Oqsk5I=7bNc`V-=(=a-)(AvkPNXUwd=B> z?89mozFtz_iwfKS?sT@uFmOS0ngCm$2e8vDOYf5y6$Fj;)5La*45R8 z@iWke@HSISKfRkWp3SMMqKA9-jO|I|`F}6K`j+$5&XKc{Tp9O?=&ebFhl-Fnr@8fJ zT>+j$zojp*?+{6PBzM#hIu3yBm|&-*CDbj4FasNr8#se861)AOG&1Z-5(k#aRqxu} z!CGJ-Au$<4kOmSAc7WKlFFBvn>TpsAj*}h;Dv&qYAY=6n4q}J2U<5RI1KFUKEJ3NB zEtqYv%ajin4*E!*UKQ1s$6tS_w$Hti0Hkyu7}4c{?AiAZ)n&D`DAhQ~y=tO8=O&9G zEdnJtQHNpy(WlA0*dc;;a9u(If%8agKl(d>k4Yh+!XQ(y7XoAfl=+KR(_eCP;oZpO zIH)t!EEOLY61t%6Z%55F`Jy~7PB(VtzPy|INgzr!5mOi8A>$-nb3e4j7`UZ(?0B$J zs6wtP8x}e)H?3-`q_L}tkIowqoP_(46*(52_cK4)P&GC}Nd%O@C zWkw6ySP>VTXse};Uf(chLrL@%=)Yod-=8&>UNu%jj{l&?`dP=QOA1;Og! zLvr9D5FxF6)KS0M)ROE9qeyFJKPMn*Q4gO67RVk+>Wh5k?`ZIkm_D8sl)BSSsQE6X zx*x3+>{=IZ8@OC2#RsFB+~{G=4~aSQk+{o@b}}iZK}} z_>2{zF636%))YZZ17Oci28@T+QSY!@|NF^(xrr}wqbnVg+4m>s4l-+*cde`T z->f%Od!0y38lKhUJ5v13KHVRfo9@R`HAJx}F&r6jfZ|_MQv(%q1}7U`SO#d;9i~wh zf7uEZLthPVAX-4EAB2;9bk=ZYq7Rz-dD=9qRcClHm{J=JFAPHMuP-?Jm5Dz}uR4*C zcG#6=f`q5Uu^mhg0t=zC>UBa69e(V+j-s?o9o^r5)&NhWa7O1=bth zLsg}#4w9J~T+!X;04Kn^02k^~gNN#x9ip@J%{QK$f8wv`46S;R}%} z#$Wsz8fvl;c^C%2Jy0I&YBvk6aWhmVz`!Bi1%SUmYwbvxv9kw`moEPq9qsS$NB3#) zf_h2ZLOuuS6u3rHyL_6i<|KS-rOLkKp8w6d}oiyI$J z(Xa~X&o)@=lw!F$-?0aI@FEwC_b*+#Y!j3TG=bCu?}H|+H39pDIJj#;CS^~! zWmhqIM@HrW#f^kp+KI$eP8xe{ALVK;1=QN0q#bZh%5!taZmOMu?&L6qJa-fg&MpqO zE8)#x)GLY0Ix&^}tFI&+{{}8!Hm#Y`q?iwMy|VkdTl?1T%JQ&900u}k!E8_+t7^cv zGi6qL`D+HZtrBo_Vj|TzfR%Zt!hZkZL(If(C4iT>Gc0M?m*L8lY0N7GHe}f%>p{UQ zbeL7L`BQ=inI1B=u(0sqNUw*#W~S2Cssq%miW(ZkusixK6#(Uf*w8*y$Y|9M3kxzC z)RsQ>VqLv5z`=(y%bdTXTl%N>Lz##J322Tf9wdU9kJ0LE4Z;fBEsw$T0U{94!cYPL z(b+WZ1;!o$eB@dFE4~7+5E8t3M1ifRrw7&IxtC%HRXRWcAlmJoJbM-btXoRRXIQEy z8+FXg9*3-x3o*}LG(cf3oyU}7FBXc_06>9xXIX(?paNQ0`8`e#<(-I}YyrvhR&QdY zAafA4;Y61gYKbCi?~+%XuSRzuz8Ls>FsDVavr^!L?(;riE-DtDm+{iSS0dKPX9sb- z0mek4KwTy4Fn!5u664noUNV^wrA$D*eL`UY1BLF|+S8FrT3UpJge-Jn+wa8h$WGxWy9LLHpv}>YFf(1qya859--{=&`=;wrWe*fvygyQgU*npf&!NkZu zY~;&)4M)N{uY4`97&gWu0MG=CE+7?jF9M#kKivEA8JtZEuMMqBcl|!@t$ZhXlL%@= z24^*Qb6@+0picu@L|c@;PH+G&aLJn|XF!UJ z(@Nt($Vo>C3|wOxkbj_Xmb{V*o<4jNk!Cr=f z?)~+L73DYU!pUR_DWQn?{#`=)oJQyy67?96?F?&mAriRw8MY2n0p!(K?3<((KiYt! zvDTbssp}504X$B(1+e}oQd8o0=u?S$FIcPUAE;~!V@lbo|?XJ}r@OXFb+ySNJ zFd?Vm_X~dX)_s!+es}(}+I9M}Vdmm}8T_(D>Z(1WC4XD?gQ%*@n5Mudh6HFHE|VX_P}oFrk)r#L4e3 z=5m;_dzH=^#~J^&wf5Rd#U<4F@rdx^HFv0W%!?~?PU`=Bne^l%roP2XZ|xICy>GX0 z)nur<^)#K!SaP^hn|}9zr7ro{;qG1;5%JN1=!ZM76IdCDt}sP3&A&7P*-E^ZAJUfb z1?-4Gwtj+}_Xgf|n3CXP0UPA(-S_k711N{kDre;Fbc*2+7_U*;Gu%g6&!T1E%G&l;jI=~~q$03Cq#d3}O5uALI9D>JDW5nAj00&(|?E=n9=eMtcf=}%Y zfP4kv7=?4@O&9;RFs;tReK^L0F-G5}$f509ynFArY?|3vKdvH2^I{!<1ZhByfsYRA zPl)Wd<{^0WLF_nhn2q?>E_)`J_U`s=IRp-bvuQkEAHDyt9*J9x?N^7Tefrd9)e_kYg{8Q+*K&QZ16|6&nf1p~7`LoDOi_=@vyCe2}+ua`CIii6Yv3 zXa&uu;4t~N5~~4tI6$cvI&T?6ZU?9eEF6M>Hs99x_$%?t!`MUMk@Ivb$q+6^pl%5iEO;1q&Q3_pSt`@pj|b;Sz;gu$u7agRgHErq5XWB}9xGXn9*Ii^7NT=?96 z;KzciUH*a*0o5ReL!bb6*bMNba_;VDX&7EEAL1g*tcQ3II};Li0R?y~u%V+tNeD!5 z8(2}iZ+@%5h~~J5s5Ky?A`~865qtnd=SIBAOSNe-@pm0dn|XoNrvL zOEMvXCg;tYKDoKDP!3NfFTxRjfm1R7`@`Smwb*DrWwBw`bYl9!wr18DGYx;yu+W`I zN{ADA=MyYI2&%9ovjDDl@>CIKr@X!K{Q2{jl3xRUG?{_oND|&QdkC(a&HYh3le6PJ zgyj7605%mk4nUEO6SN@WshlH2=mKzTLiu$srwQ$(25pL*Sd9UwI^d)1#Rx-M8rz!F zcQMGJ!q65%u>=DP_55xOS3e>VchA4H!ts&COas>v9t!ymK))LtN1&Yjfs^NRghfQ2 zLpJ>dve`E{531Wn#2R$^Um~`DK7P*4{ha%K$mNmNU{uG)GMfq5Lmi5+;q z5(b~ouZhO1ozmUoh&C@CDS?o_2E6Mal$@o|e`O7iEuqD@pNlHQX{&|W8o=C%WNZc} z7@7L@J&w$5*T*Uo29|#TS-c_dv@v`JCar{~=|1!Bgij#-J3i&4_-U%cldG|hZQc3( z^-2lgPIy}Ly1Zx}5n)PKE(C#OvIVa+mqjb85Jlj~kxyQS^nXwD zeUfXU=ei1e2KUnvmBd?bzAZRafz|dS9;*JtJB(SxpOGlQ32y2+oEDKsh3|*MnEe)f zz$Ji_H)~&sG5i6oU%!ACp1eSOXqkC8-5M;u+Q(0y=0bC$#~Ii@B5s1&EU`N)`R(7& zf527p2C=N2OcQ&y_rlUDaRpWq9VW#7DKhIU0p|1e3D~Vl;FLK_ zV7l!zAak!WZ`+e9pbP1>KM{y;o@ohjfFIAOtaQnLEttUbNKKOh)V&!v_7-CmNt9I?CLB+0SHhxoI4ZZvhh$5-(1-B0Lo=EG&8o zwd)E@K+uAVo+__9o4v$MFmp8o`YWJ^24Su6cOhLPvS)=h+# zibtv#4(4hN*Sg=TJ)9vx++kq6@6ov{^l0}$JXw9w7pJICb3xVktiJle(R4s?#vFtE zWWcKK>M>l45M2v+{6yh6vL>Lq+D9T7V;K|IqE*-n-tIkL{ZmQ+tWeX}@(KL9$yC7? zA!`I@8z{d(i2FzsEgyHHhera2yUyNxVt!L76-4{&P(?7Mu#L~^3ctb~sS z3Ft*ReQ-wo@+;skAx*Hi&AQ|aNg$|40c1!8^f>gS4%5xw&+MkbOVaR7uc{)FH<%4l z9&{Rq0mOoM4&Y+vH8FUvz+c$}tPn^lhsGBTp>AgqpTH6}i)aB5qK@7GQw*LPgb{@T z$gp_ioq9GB#z4^pS|x@6I?dn-27|9MB2K^zAE@A6lr{J8qF*hquSb;|f3`+rx@ei1 zPAeRA;n&9GN(i{x%@s}sfy@X1Xw$wG!YgPnEI{E#s!SmrlHfE%jH;ZSGWq&qAT&Yv zsykb=b6!dhc=Z zn6u!-x_p%1aX}66@XpHW($dt>)ZSYdfvHfd0gV$H84cl)bxx|2#A+3=ZD6Iq>{!Gt z_-}di_cvgdf|~&vn?PRF1OTTKLyC)40Myhfczl5H26I+{5^{h8^oPtS`422ND^lzE ze#x(;L$Y7zJPLjqRwGD92=8qIola1^APMAUl*n8rH3uLpi2Dt|()CF3fv`BF>v;J^ z#WW6p_r+fwP+WtJ7g?+z@py|)IQ!6#CyLs&LR8>$Ki)Oc*=bb3NJRI9`e6&9)vKx! z>Cb`DtJwZ=a|x7mOyOF=X1h`NfrRF_mhw(yH| zVSmMm+A)Db0<2i&lbbYzGmz}+|0jcNvg3K4@1!CoCgkCAL|dseK1?N1Ai+{#BbD54 zzj6rHHt;|k6#_?W-*j2j5Yh(15kmn2gaju=BVfdc0H(LN2od`1*(mxr=1e`5P-y$k zG9!+@0+g_2DTo2U4_|_+4>5wC!?HymwtWS#>=e#$XpQhZHL1}3mXzlMm<1$MF}S}i z;EA#8PR2K&>aB>Q<04=o*otDui&Vh^l5>U@>#AxaSa<9J;WUC9K9Gik2RIzW)`F=0 zP+-Ep!YH^kw+@$dy1&1zkKuIN`rBw*E*%%yLu>|KexC>kTWJeY#Qkoz+lo;B} zzzy~vd}e|PJcon%9)7%ar%@KWu8?vZ;A~TqAMdYU8e{INdaR|@a`{PYXUoYQEiEXp zz%k~a*|aVyXcMw^qrly1?T_E&>4GToK_&~ZCYlko0Yt6D*eix-NKr46=r9{53VJe8 z-RV4UA$Z_nPXirx3J({NynIiV*1x$Bvs|3S>l?)J zlvwD%IzzNYoL~GP1C701`Fglo+?zu*M5>TlX24sro8p4tk;%S+C>DGuAhk6R=JSCz^lPpSRWcUF`Gzy=c{o!u~#gh*Xh)Hq;Y_Pc}-Goj~_T@=_>)*jIM~e`cMaS$hdFoDI zu6G+{JS4%Ihyb~y?y!Z|{|T*BPVF!)upJda(1Fie&JgcpA3W@{V}2*zJTO{!fZrAKG0zZxTD^_P&fcTE2yIR_v?RwK@rtch`sr5^E}l>|8qfdu;KprS zxHR56}N zZ7BMVuhZ+-=`}TspgPDA0L%|Y6!29asID(T^ha}|4~LzB=!-B&25mLI)S^}5WYmxk z0Z>S21LxGy7LFj<9uBzAyn!_Q$JjN27awe!%{9L{moIwHyQ{B&_nUq{&!flto0J62 zusHY(5CIWf0233c(Hw{_DEZ0NgSqHTQFG47%f|gl`ikMi*ZZ8l|6-&Mip3Cd%FadI zeMxwHYD&L42Fen(u01+LqnKzRv+e|8KnDRIHMa9*HwrtbjgLL49bscAKoN6()awbY z4Ld8@rKHxYv!lH^B2_5vcjVn{uV!kYo_ET`pC zaWg{{`!vMVMrZ-45dAT2KLsn_4`|d3&J#*}NT|?oW0B;5109yuskNuucflucx#mhZ zUqTl0V{#@YS2lP-FS7GI8HISN7_t!@9GuiAk2Vaw9~(aDzpk0+aKa?H9`Y$uK*1|i2c&^~3pQ_m5c<|t z$rS&29a@ah@9W0JHW=0epsnnej&sP+m|e3M;{(GFVi5(3sTHs@ur>SF%i=U^Tz1T> zj}{W|Q}|ubs%zgW2iR!H*B<6pJ{lISAzf)%_$l`WuxWs)^z9?1PjodYY{n``BUOA4 z?t)qdhRh#QH;!j|k4u)`MnET4{jbjtfkZxh4RuUrY3W|y>pmkn_!;0$r|shmG(bX7 zhod3g_1~N`gM|ojXaMiFF#sl;n3$L(hYFeDGwACCb&>aF5mkzPBObVdrw;CHOf#&) zbZ6w{)GzgC2Dr;jJA0cwDgD=XCXOA6>5cYj3HnetG43SDlK4RXA+%if!C0ZNI}kJ7 zk6!`Bkx}dzlo1HyUqLnl8;HK03h^zXo%W>&ZdJ10xtMNqAmF`#2e^iXNP805)4GJ z%x@0}f&C4j$~GR#c%Av=4E~=X6g=VwHQ*5tNwnpi7SWa?DogF0mjk{T2tkwAYY7@>jSZ5jtC9cY39G@&NAPXnO_z1RSi5%_XR_7fkoF-K?|wr3`c z;Y0aV7gB5k!Ht+*U;zVAM#17jdf0&C0;21~ovq#Z<5C$vvR4du;*?Q%i48zE!3$Tm zd@IQ`ytdDpnh(Yd$Vov8#=Mxxewomt#1o|>1G9i;frIuQv6mAU!GEXFu zTkGrV-;KI|RQ>b-boh>~W82AEM#K()Xr42FErT-J+v01HR;YUYmC1eZEP%LMs2%ER zu5%_F!*bO#wIRGoKpch+X>yK|qQ+(Z@wqRZA8%K=TqrRP8v)QyslMW1Yd45aj#dX1|fcB{{A{MIWWaB7g=%W`I9ez zJZ+M6YK{cm1sEJ)tWw;RE^ZA>3g-60|B57l5WsmGR?&qyP93lb6FJ7A_+{O-WhVO2 z=}r6^7oMUli9f~fy9|=Yh0T&rkA)-Z zr$&SkHhlcw3t4KK*e&(-H&!bsSpv}@b-62^Wdv!F1HfX^5=>dWK=DjQQ%5HVW{3(2 z2_bC>Q0B=(Fad87Nafhs13^GZ1&4fX21*AmabCB z)_)r;{M)I8@v3J|o8BSF0Fb zXK0`dQ#yD`A8q$&sYa}87%YPGI>-2Uc=DWlhoY#K5C#HpMC(3UCkE^HKO520O}D)KdmQAz zUV2IC--x*_mpb9b*U+-xUmk=PYP|A|@p1w5zW#vECQ*#cm*vWu9C800&?~_DL$au4 zLIxUWx11}=qZz;C=SSqrnvNDZQhx{D4hL+;iU*e*Hs>ZoAY%YU0BkeZmvmwP4Bvn7 zpiwFw-g7h4(q|PC9}uab@Pl7;cpL>>fnJrDpW_BNkLgs)&^D zNkIY79!3NK$XpXg4M3WPMz6GBU*T(Nw3oqXoki8XfAo(0?f*m1FGJ@W_W9v(Pv}4f zI~esV@T-Wo*d4%>IzrgOGW|t-1;sMwoO>Au6U-ZALCyTa;$SRu_?RY2 zB})N{H8Qqf+TRSYF#yrt8c^dxb<56kOG_#L*rRBkxAf_l&1a+Rn2Rqz1Z{8pb^w`6~{QY}zd z!6TK?VXm2jbzUsrxCo={Y$4_LN-nsLrlEDVociU2g zGJ3n9#=SvOz3Ux?Vq|s@uX*bsfZ_T-rPc?odaDuOrnGtpRXuSX{p$C)iaVbkIG?PQ z_y79!=uz+%h!L64DP$K5L1?{dBcrCqy>18#4QMfEuuVfN$3Z+}gv$eUiDmXsdQqNh znX|yN_K%O(7|6eKX#hVK@)+Ep?uRi@ z?SrjFkYx~`8g!B%Wq;X=@nBHNAZN1V$6qA?F(2x? zO#o+`PYs(R1NN$bQUaMAY+P-#4Pc1`PHMRp_$WdQBuRR)tBL`aI(=}0zPj%LRNfRq z04pmihi9`-61)c@68PR(&~_JEqT^X;xMUSQY*|&KU}Q(7_P{k>w3jV9;3tLUwh351 zEi=>ST0~#Av4!p6hJl`5^6V#A_u9~L1xkOfTy~wbPE3044H27RFIYNwTh5Z#nvA7w z3_!esHxL(c3zi9336QQ%__^w^u9b#ApRKB_MQgy9u3ctBn?GHWfB&{D3BrVi@O%#> zczkbQbMT45bhqfFf=HqtS7&wBqjThFaM(3>d25h3xs&%66hG)`T<2%45W3fdxI*8o z>rO0!TNLTUM}BSQhg9JxJ(&X6upY!q3huW!0yC)dp^bxBJ=;-5N%&S7XRz38s2~D5 zlQxjX5;y2@lave#lM?AqtK&s_^r3o>&LD^&4`32`0R=7aQi!J!>Ft87?E2Mp5TW56 zBoUPx$J^zzc~4RhV$FoMvF{Jz7=&g_V#)d;$K@KOJj*Slu^pjsZaJ-@6KxJ2tvAVu>(`CD zU`e&WEjypUKvZNmX(|Vq1W@ z0~Ct$i_xl`Db63e#8Z>;9Z8jf9qiuhB;UNaZdSBk_m#i?=#GPI8p)?e+8QNeiZNgH zJaX={e7kgmgXQK-Vel6iXu_1oMMr{xp+xx7U+_R!l_S1m?Ciwn?@)@790of(-=xNe z`CYZ%Q7NhD*n{N*_f%@cfcbxQeR(*QZPfh{QAiF#rZ~tH{%HiP$oio5RZ+chyJP=sT;(-}{Y#yCD)aOG_7R9PL0;ftK<;A=20PnLJ+ zpGjjR?XZH9{_&uZ_VW~F8_11;{xXB+%^lL3(LpP--iTX3}}i@qrAMl*F=vV znHo^oms7cYyet9})OaPCvKf5u#H_2YzYGI1tDpxHl0*j@8m+d{(<;zqN-n#Gb4|Wr zz?%^h1L6>O;XLd#P^(T&PhY)uEdrFX7}O%X)#3w{yOmwOHQy#L#B3_wrb#%~2%m(N z#R7By#?LbAUbX>;^z}LO@$vOQKl75znV($>&9at1eE2Y9CIR*x9v+H>%)NAplTz{X z+uTB^l(e*jswxlCD$jA*VteKO!ND(}dO@gPfC~wpdFbyU8IR9pYmwnzz?XZ)t+(q{ z)A2&8)Q_<);fke&aq8N&a^dX7+oZI#4ze(&UNnFqMsQ4$Z35IteT0lV(p4%zcs8<= zfr_b${^OrT74|=>N!N?0IeAA5l~4b`z@fp$6k7UNYwkKU^Txt_mv$h%6Q&$o4JDaF z14jUmX(UR;XIXF*CT3<4whxU$L$xt_@WFix9z)*ICNWe{-+VQ`%>>~Gk18Q4$)zb( zi#+-~wDZs*VX*q(AM&BhCTulRtL|b2W-|$~j88@xRF(dWHWeY%?ZcO#afr0m zf6n3Civ+DP?}>+h=Jz!6CeBv0&2U6B9&OplVZj$3y#Mp~tjn*7Ug8Lt4^s{i4c`^+ z1wz0hZG|V-afxZl^8dkzBdsH?^A5)HBXLwM1-H&)-0Y*CTg zPT&s=ne$iofi5D{Em;fTFEXlp;Yx?F!CqWk>|A%dEZ~XA`NOWRe>)K%oF?#C&zD7c zGnDA z8HgUKKXlyNC4?~k_(;T818VSzgf{hv6b9 z_F3WB!t~k>h!mD06^HOFm^cIq3z!~ygqg*&KoL$9Yv_yw1_t)clOxE<%Oup**B(1| z4D=v86W~B$h+u%Wz-FOUWaRdF$hbj=&>qF@m))mJWo_Fu-oYmWzIrR}Csg_EV=$Ig2G3 z-B~HvF0;+P->89%Lm(8FVMY$JEbi(VRG4&mzv6T96*3YMOr!ury10y+jG47|DM{C{j9|?(3E(%_cc@ zw77Y9PLJ4~p1F|9-13;o$w@Mb-AG#2PT@XD!i>0B47G&kyXFPsKSTtR4i0XV&dnmYXn&C*N55b67cLA@$3q8KUIDh@&&EV8T4}` zTIKn#Wsae9(p(~HVJ~043{%&`N(HR11_-(YW&9mP5fY)@)P667Qm@FJVekKZtqnem zXi+la;*8DBxlp#Q4_6LsOY59o!^<0?9rC*eL9iOimgs~8zN{8^V)X-bJM zMynCwP!G}YQugVDfPxv02iS55{0t{6PkIB>PG@HtF$mHG03ziUz)#vzIMTA8Ifr^^Aru~M|b`#W@X79K62y`nn-Axu*P4zb~PzU z=24`klxoqthsg#R@7zGk5~mHksuwn&hKR%fF3j=gWV;ns?-$ zxmq;Ta8Iy;X_ZO5nNK$_8FFRxN5)FhXt1cKQ^sb340F>JrKK_WuZYtHnMt=jT9|dJ zOmm>bG+s(CyM?x8%Np$B8tm8&-u));<^_Yx6FD&R>{|2cmBF2NmFSO-tA6M#WiVE7 zifZr?Y3S#mVWnU+D6?{N1)?nz(hlNnG&F>KzP_pYGdKON;_O)w?O>a`(yi_V2;ClS zrwA#8j5k)?27!R_{z!qvFUB!$Qw4ZYq_Ump+c$M_Ne8^UElRTO|JhGo=aW)|G3M zw2u@)`ga(31gO=EmqL4wQ$&rMTsrSiH8-AgkmO|%^<@wDDMaNTIefU%X#>j-jpdH} z|LGVd6TakxYZNf}W%zZ`uv6ErUHk3hLt$L2cFS*~yh8i!qPhz)b9D$BlBVW8{h?Lg zufBs!V__!j((m6vWEv~hNJ>gd95IJ%L!9FAF4s}#>SCFs(8Z~fFhLT6(5M*~==uKX zN#-xHh}<+>9=CDCzcfGzzr`Oj5dK=Rzn>ScBXSX*semcvM19#Ix=sd_Xa|R#5Frv<{+rV!^4-MTO-g`aaISc zcdvIbx2S0B`SUECYgJjuz(1B*&Be*Nx2K>rcRM%jWao! z_wQ#oR)h{N|4gU%GMEG`S5zI#9I$TDNKtkYys0X_hwF8`a0-woYIZR!c@>@m#BuA^ z))V?WcV2RPQ=c$U_sY%F(+FW5V|hP|oJ><2fFk4XtqPbn1N( zi3!2jUz#z9VDP`ej?&-yHQ|#;V$i0d)?#H zyFbl82p)lA(pTeMb2B$L%lDa}tCm*U&sD|ua#bJx`l1mmyVs9zmT(oDEXVe|W09tf zR7tt9H=glA_yQkKr1-WT$da)74I?ZXzw^tR?B>ec^Lb7uV8Tf^&SG|~3#f7}-npsQ z@;Q#Suicn<&c@5dp3Ap?aEs8c%8a*DgY1jRQ*-iXOmIhiH4f_b3{B6`PhMATW)Y9y z%+fS&>0q4HAgz53q5GX1r(2!^^NN8}3!yqhbz*BP9~A!7R!Mc!COeU_%(BZ>)4QzY z6K$UE{Sm*&d!tJG9-<^(8 z@W$6A&4X8Gmxqc*{rl&jT$4zY(ZF&Bc8MZ3e zx6iDjKK(&n9yhickCrOnO(h_u{Kt`af!)^!`|At@@w7#_*tD1akkcNl(D6sb!pzD^ z;V!Z4em{6(=(k_N%ih{#3%e-oX9GcX9iwv{#myU4K1{c_7Z)5kTjFi~uaBumLbOMJ zU0hePw*1KpO5~reHeur6>yiGg9Fh0q!SwPS^xga)9L}S zkxf}Zew}&N&ilIb6a)1_YljbIk00}(CU+K-r&<;{U)RszPT>7rvH1JAqJ0rJS#4T2 zwh#GHjh6?_=zDvs;=Up(Sfa^+kBAvnKJ&~yEXU;JRc-`kofrb1Vc?TwbT69Myo5 zH9t-D$t_j&h#mLzgMu{pm2A%g>Pc#AYkLfCM*oZ0)S+O4o;u^)dYRT0hUVNnRO&ei zgQy;8W?lf<$?^9|XFP%p8^qnD>_fR*S*(l0Udj2&Oy%}FzgWr&pT{n9~nNcpq4f#0fdv)qxL~t6#r)DG3C0B{lUjRno|*zwYX{uF^uA z!k8+4%ho$NGB{n!(%PB@qi&dMtE)4)d+(lvvaktyV79^fRb|K z#*KI}@-3-SZfuj84c=(VYS}7n%0r}HsahO~J0fdp=##TK_C=yj&4%>e2quAdhHl5Y za(W`|B4+ovPGtCmw<;YUYJd7{-&(4l=u~$$3aM$8L_PjW-5AD;)y&EO?e5#^Z%KKN zYoAQ!wp9C4Btrgaf4!8@)NW_+Dvt%G98{>0*CyUr?80Xe)mMMo4)-3E?kIWDYGuU6 z8X^Hy`v-E;*e!A<84N~NS6%sje1Y29T5>ms`B7kCUSauRMJZaz$5SQ}fRP2l142=# zkQ{RND-IDoSAnga{YWz7n{7>44Bn$X5nI~m4go%(!dB!#K>u|MKb|z$8gTI48yx5P+D4+;Oi@Q#oV9 zdQ%<<1#ttu4eiTrK_G!Xg0qP6?dD5765n_IInMQm!g0RgvPF}u9d?Ohg9D-xIm#`vESHmNPl}MjrQFHzmB>Ls2OkXYz`?-Skqvs zJhSr01N0C3-dLIVCgy|RP*x^W|F}trv3-4g&4ni&Z@m4g;LTMvo!{?XGd>&RJAvi( z!=vEH7}WBl<-b-1vDFb*U(6%`3$ ziJR=$@uH_H0&C|~%lfxYDTeeDwPMN{*}8#&>O{;ik_oFGLHF)=(0%k&6`4#_V`K@5XTX- zU;V>}`vb=(=NCX?$PllTlNAg6mBnFh5a?lZ6`_^WJ|hAaABr=~lwtu`%df#SAc7}4 z*-vdxl#1mlf%6TijWeYuIUF5@LUU>M?9v4&jON}oyVq`Ua zM>~w^hw6rWongbrv?_@R`6ha+@f!2GC=M^>+9~i7q&6n}Vc%Gulqpdj1Cw;jXzrCK zCIkTY@32ro6tRJeF~A5=CW{>fByp;_y0WEOX|jgG_U*!8^#)rGz((}stVXtibBZCK z7)f-s#54kxV?|pkG`EmWcf|;0%mSk8=e81qPfFt!hFHiCONdSHbTt(!!J-aL2{Mli zY>mz&NP(yGBCCi^-IUGIgBsXRz2~&-=?58btA^xG{@JEYn?UjVm@d`nfCjpu9a7S^ zxHvyvyW8L%F;fDg5FH(j7P9xPdUG=~-tjqz!|ggrF9SSgU0t1S_wx|a&AKF_&ZBka zC*9R`J#o53(_^dXG}?pwuS7PvUJ6(QCgy2MQ};2_)PZf#tvZu!hgEwqS5%%e^?PmR#qR zxp4b}7~zU38(LH?*$$=nO=8_gt|ON=ad1ct2!_P@ncAm6&Y%MIHaidn`b19^mxWdt zETM?}$$1{)Og(dR^Ga=;22(@a9ARSuf#Kw1Ar*2dpg(3I6{4TtqsZ&G;o|{;I6r>N zU%es-GZ_yanC1*EOYeF)LC)!N+8z*_d^rzf=A;_1s!I6}tGWen$K+n4H}fm_IhT$K z&0Qzw3E7+-8+vHpX*k29@|ot-e(&W;dn_&ADGxZ*K~2AIG5~5)HWt_@G z^`l^o(oa-}#bm`?dE))L{dmz1FLlv!*+~HCWzXiZkG`K_#ld2hnFe&x^M3sQ?}HI> z>9fRR=T(fo+WUJ-UyUlMb)7=3nLQqT>5}I7G_PeV))`)3u!=-n8U~b|@|%%H{N)Nk zO*?fs=RY+oRyyYH&fd0Fkn=>4pUcmjE=|Bg z{v0+c>{)dCVEu{c?(x-a`?l68*9_12*9>u!hg*wv-5v$5MnKi|jo{=j`0>EwyyZyJ z9GJ@JSEx3yW6DNUBL+QXmv_&c@bvWD^N)Y&!sA9XW;Drtc<54T_#qNrzlNGWgUXqX zSKD7iH5Clqf%6#zq@=xK6!2cyZ2XRKv9YV#Jk6MMAP_OnoPOLC%Xp;tzup7>DcH%* zXJ7`8m|oUDg>70Kw!IW9Wg>7Mjl#*cUazONu6U@+9alF__(7<#uK~f@DSMvVvb7rD zCCiUIN$zroxY`(jm{G)MG7XTF;2B8znjoHPe!^~ggIja@^v^x6?f*V_aIB#7zVD{8@Ia)X|L!sQgxwDC9#4FsalZ^KoNbHBdC z5!1bVQ2~JqkdjGciXw9#(}v#v`E`MH(=f;jZDBG7ZhoCu_tJV*E-Dl``>qdvv);6^*&TjQzO|fOq6q z2-Lw^>kOSACBycM3-fl0PqvtvnnEq>O#QC{Gc5pXCKeXPfWGLjYoj%`kkKHW@iD)V zY#6e3yv@@LY--ApRkEWTV@c&Sw*~*Mby1n(n5dB zS?$@=;hRhfKQxWdsIabU{qMj3@}X=ZVh+G-V9zlh_u z3ur=Maiiei;OryMTt7WNg0Z^xz@}l}k_NFw1MJ}xzf&a2vn5I$)Ynm?`rQOw4JwF- zP_>XVDWxt!O9N89s6n{`1P2?Jh%T0nv$HcPNA)6D^&UR|F~135j64^(MBQ$2ClUoR zpDZD~WwaMyk#vVq{am?mgMnbS)q$b0aySQ1f>!cuV-KxlM`BWvBrqK+8;Tb$+lK%& z+W&+`V~<5dj8x!~lPcM957I_X!#OO2D`{!n(MM5ksUm>zJpvN(U8A6=ShH$dCk4VJ z3MTQ|$^tiemJHoD*WN_Sn8t-Nyimt|lP^T`m>7gHHN^rEAR$Gdro%WM;dekf_`YAu zLtVH?E=nTmes$CMzoJc0>L*X7Ay%+%>kgh?qp3j4XeLRgh~%y8^e*oMx BjiCSl literal 0 HcmV?d00001 diff --git a/src/MQT Qudits Tutorial.ipynb b/src/MQT Qudits Tutorial.ipynb new file mode 100644 index 0000000..89a942d --- /dev/null +++ b/src/MQT Qudits Tutorial.ipynb @@ -0,0 +1,621 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "53702878", + "metadata": {}, + "source": [ + "# MQT Qudits 🌌\n", + "*Discover a New Dimension in Quantum Computing*\n", + "\n", + "Embark on a journey with MQT Qudits, a cutting-edge toolkit for Mixed-Dimensional Quantum Computing.\n", + "\n", + "🚀 **New Language:**\n", + "Dive into a language meticulously designed to express quantum algorithms and circuits. MQT extends the openQASM 2.0 grammar, effortlessly adapting to registers that feature a harmonious mix of qudits and qubits in diverse combinations. \n" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "id": "c248f22a", + "metadata": {}, + "outputs": [], + "source": [ + "from mqt.qudits.qudit_circuits.circuit import QuantumCircuit" + ] + }, + { + "cell_type": "markdown", + "id": "2a47bfc3", + "metadata": {}, + "source": [ + "After the import of the quantum circuit object, it is possible starting from a __DITQASM__ program to automatically create a circuit and manipulate it, if not simulate it or compile it to a more suitable gate-set for the machine.\n", + "In the next cell the program is explicitly written, although several methods for importing programs from files are present in the library." + ] + }, + { + "attachments": { + "2dqed.png": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1wAAALRCAYAAABPvKJ2AAAABHNCSVQICAgIfAhkiAAAABl0RVh0U29mdHdhcmUAZ25vbWUtc2NyZWVuc2hvdO8Dvz4AAAApdEVYdENyZWF0aW9uIFRpbWUARGkgMzAgSmFuIDIwMjQgMTI6NDQ6MTAgQ0VUh4OVFgAAIABJREFUeJzs3Xl4HMWZP/BvVffMSPIt2/gAX+CLw2BIMDYQwAZDICGcCYQEDAkkTuAJATaBXxLYZUMC+4QcPAnsA2G5HGBZWGx2CUeABNhwY8AEY8AWBmx84Uu2ZGlmurt+f3RXTXdPjzQazViy9f0kxtKo7+mR6+236i2hlFIgIiIiIiKiqpM9fQBERERERES7KwZcRERERERENcKAi4iIiIiIqEbsnj4AIqJdied5EEIUfS2lhFIKelislNL8PLw8gMhrpehtCSHgui4sy+r2sevteZ4HKaX5Wh9vb6Gvm+u65lrpYw8fc/hnWvi66nXC74n+OvxaZ8LXLUxKCcdxYNs2aj0cOnz+ST8DYN7Xrki6nnpbSqnINdPXsjfdK0REuwIGXEREXeR5HizLigRVYfp73ZgNN2oty+o02NLr6oCjOw1cHbhJKSGlRD6fNw3nagVy1aavq2VZkaApHPhs2bIFW7duxWeffYatW7di+/bt2LFjB/r164chQ4agsbER9fX1aGhoQGNjI/r37w/HcQAUAoty3oeweACij3Vn1J4K30vxYw8HpJVuO/x3PMCMv05ERF3DgIuIqIt0ZiOcYYk3RnVAEw52utpwFUJg7dq1ePnllxMDu3KPdeDAgRg6dCgGDRqEAQMGoKGhAQ0NDSbY6m0N6fDx6KBTKYXm5mYsWbIEr776Kt5++22sWLECa9euRTabheu6JviRUiKdTiOTyWDkyJHYf//9MXPmTEyfPh177703+vfvH1m2s3PXmSMdAK5evRpvvfUWcrkcgGiWqNp0wD127Fh87nOfM6/Fj++dd97BBx98YK5DVyilkE6n0a9fPwwbNgxDhgxB//790dDQgEwmA9d1Ydu2Oc/eGKQTEfVmDLiIiLog3K3KdV20t7dj3bp1WLduHbZt24atW7fCdV30798fAwcOxPDhwzFu3DgMGDAAALrcYH3xxRdx8cUXmwZ9V7MpUkpkMhnYto10Oo0RI0Zg5syZOOaYYzBt2jTstddeva4Bra9xPp+HbdvYtm0bnnnmGdx///147bXXsGbNGtPlLRzE6sxYuPvdRx99hJdffhn3338/Ro0ahYMOOgjz5s3DEUccgSFDhpQVaOr32rIseJ6Ht99+G5dddhm2bNkSOd5asSwLF1xwAQ4++OCibBTgn/sjjzyCX//617Bt/5/1rgaAtm0jk8nAsixkMhnsueeemDNnDg4//HDst99+aGxshJTSbJ+IiMrH35xERCXozEa8Me04Dv7xj3/gueeew1NPPYX3338fzc3NcBwHra2tAIB0Oo1UKoXBgwdjzJgxmDFjBk4//XQceuihJqsSHhsTp3+Wy+VMEKeXDTem4+uWavjrAGTFihV48cUXcdttt2H8+PE477zz8PWvfx2jR4/usa5j8cBJ/7EsC4sXL8bNN9+MRx99FJs3b450rQuPmbMsKzLmK3ydbNvGjh07sHLlSjQ1NeHZZ5/Fqaeeim9961s47LDDOu22Gb4WOru5fft2bN261RxzeNlqZ7wsy0JLS0uH70trayu2b99edC07Eh6PFR/H9cEHH+DZZ5/F4MGDsd9++2HevHk444wzMGjQoEh2sJJxY0REfQ0DLiKiDsQLBqxduxa333477r//fnz00UcmoxIeHwQAbW1taG9vR2trK1avXo3XX38djzzyCL70pS/hoosuwv777x8pUBBvtHZWIKHUMvEgLulvIQS2b9+OpUuX4uc//zn++te/4jvf+Q7mzp2Lurq6isY3dVe8S2B7ezsWLlyI3/3ud6b7XtJYpXDxj3DhEiEEbNuG53kmq6gDss2bN2PBggV4+eWXce655+IHP/gBbNs2XQaTMn7h13R3USB6XcMFOXQw0l06GNQZto4C6viYq/jXSTor5LJ161a88soreP/99/HMM8/g4osvxowZM5BOp8vaPhERMeAiIiop3ID3PA//+Mc/8Nvf/hYLFy5Ee3u7aczHM1a6wa+DKCEEHMfBJ598gttvvx1NTU34yU9+glmzZhUVh+iMbszX19eXDLj0667rwnEcEwyGAwF9vC0tLXj66aexcuVKbNiwAeeeey7q6uqqfCU7p6+VUgptbW144IEH8Ktf/QorVqww4+X0ckop1NXVYfjw4ZgwYQLGjh2L4cOHo7GxEZ7nYevWrdi0aRM++ugjLF++HJs3b0Yul4sEQblcDu+99x5+97vfoV+/fjjvvPPQr1+/bo1RihdLqSZdCbEr2UfLskwAnSR8n+RyOTPmUL+u70vXdbF161Y8/PDDWL58Of71X/8Vxx13HNLpdK8b/0dE1Bsx4CIi6oDOLKxatQo33HADHn744UgAkE6n4TgOUqkU0uk0bNuGlBK5XA7ZbDZSPENv76mnnoLjOLjpppswefLksqsF6n0OHToU3/rWtzBmzJjEZXQAmM1m0dbWhubmZnz66adYtmwZmpqa0NLSAsdxTADieR6WL1+OG264AZlMBmeffTYymUwVr2LH4lXxnnrqKfzbv/0bli9fXpTBymQyOOigg3DyySdj5syZmDx5Mvr37490Om0KW+TzeeTzebS0tGDp0qV48cUX8dhjj+Htt982hS501mjjxo345S9/iYaGBpx99tkVB5uDBg3CF7/4RQwYMABKKaRSKRPodocOfI444ogOu6AmmTx5Mr75zW9i8ODBiQGgDnLz+byp9Lh+/Xq88cYb+Pjjj00xEsDvRmtZFt566y38/Oc/h5QSxx9/fLfPj4ioL2DARURUglLKFG247bbb8NhjjxV1Txs4cCAOO+wwnHTSSZg0aRKGDRsGIQQ2bNiAJUuW4PHHH8frr7+O1tZWk6FwHAfPPfccfv/73+MXv/gFBg4cWPbxCCEwZMgQnHvuudh3330TS9KHxzbp7JzjONi8eTOWLl2KRYsWYeHChdiwYUNkuVWrVuGaa67B0KFDceKJJ/ZIMY2lS5fimmuuwQcffBApaS+EwLhx4/C9730Pp512GiZMmJA4R5TOzmQyGdTX12Pu3Lk4+uijccYZZ2DBggW46667sHHjRrMOAKxfvx7XXXcd+vfvjzPOOKOi4x41ahR+9rOfYerUqYld+yoVn2NLB0DlrDd8+HCcd955GDVqVOKxxLOznuehvb0dGzZswHvvvYc//vGPeOaZZ7Bt2zZzrYUQWLx4Ma655hoMHjwYM2fO7PY5EhHt9hQRESXyPE9ls1n18MMPq7322ktJKRUAZdu2SqVS6pBDDlEPPfSQ2rhxo3IcR3mepzzPU0op5bquyufzavXq1erWW29VEydOVLZtK8uylJRSCSHU0KFD1cKFC5Xruon7d11XLViwQNm2rYQQ5s8+++yjli5dWvE5bdu2TT366KPq6KOPVqlUSlmWFdn+Mcccoz744APlOI5yXTdyXrXgeZ5yHEd99tln6oILLlDpdFpZlmXO27IsNWvWLPXYY4+pHTt2KMdxKtpPe3u7+tOf/qQmTJhg3gMppdnXnDlz1Hvvvac8z4ucd/zPww8/rBobG836Qgg1depU1dTUZM5nZ3IcR1111VUKgAJg7tOjjz5arVmzxpxLOfS5u66r1q9fr/7jP/5DTZs2zZynvlds21Znnnmm2rx5s9m+Xq/S94eIaHfF0kJERB3IZrN48MEHsWHDhsicTfvvvz+uv/56fPnLX0ZjYyOA4sIFQgiMGjUK3/jGN3Dddddh6NChJmMhpcSWLVvw0EMP4bPPPttp5yOEQL9+/XDcccfhN7/5DWbMmFH081dffRX33XefycrVao6pMKUU/va3v+HPf/4z8vl8pALeQQcdhF/96leYM2eO6bKpr2NXZDIZnHnmmbj66qsxceJEs1/dtW7x4sVYsGAB2tra+vy4JCEEhg8fjq9//eu47rrrMG3atMg4Rd01dtGiRcjn85F54vr6tSMiimPARURUgud5+Oijj7B48WJTjdC2bdTX1+N73/sevvCFL5hud+EuVzpA0QFafX09vvKVr+Css84yY41017CXXnoJy5Yt2+nnZts2pk2bhp/97GeYPHmyGf8khEBbWxvuv/9+vPnmmzut5PfatWtxzz334LPPPjPjn6SUGDlyJK688krMmDEDlmUhlUp1q1CDEALnnHMOzjvvPAwaNAgATLCwfft2LFq0CMuXLy+qBtkXqFj3TABIpVKYO3cuLr/8cgwfPhwAzETera2tuOOOO7B27dqiypFERFTA34pERCVIKbFkyRKsXr0aruvC8zy4rot9990Xxx13HOrq6kwlt3jFwvDygN9wPf300zF69GhTgAAA1qxZg3fffXenZJE0fbxCCBx77LE488wzkclkIkHGxx9/jKeffjpSjr2W/vrXv+KFF16AlBL5fB6WZcG2bZx11lk46aSTzPfhCouV0OXf582bh+OOO85sSxc2+fDDD/HMM890ez+7Kh3M6vvYsixYloXTTjsNJ5xwAoBCJlcphTfeeAMvvfRSJLO7M+9lIqJdAQMuIqISXNfFO++8Y6rN6cbn0UcfjVGjRpnlwg1ToFBsI/yaZVnYb7/9MHHiRNPdUCmFbDaLFStWYMeOHTvtvHSmSHfPmzdvHg4++GATJKqgsMdf//pXrF692pxjtahQUQ8AaGlpwRNPPIHt27ebxrplWdh3331x/vnno1+/fpFKhd05Hr3fUaNG4aKLLjLvow408vk8Hn30UWzatKk7p7hL0oGWfg/CWa5MJoMf/vCHGD16dCTD2N7ejkceeQRbtmzpc8EpEVG5GHAREZWglMK7775rure5rgvXdXHkkUdG5iCKN/7DXarCPx80aBCGDBli5uXSQdemTZuQz+d36rlplmVhzz33xBe+8AVTCl4HN++99x7efPPNogCpGsKV8d5991288cYbJsuk/xx++OEYP368uYbdDbbCLMvCwQcfjMMPPzwSQDiOg7fffhtNTU19NssVv86e5yGVSmHq1Kk47LDDAEQn4F68eDGWL19usrnsUkhEFMXfikREJbiui/Xr15vxWXrC4cbGRtNIL6cxrpexbRupVApA8SS5Pdmoz2QymD17tinqobtJtrS0mHFc1WpEh4srAP75v/LKK/j0009NNzYpJYYMGYK5c+eayYirRW/fcRwMHjwYJ510EjKZTGQM3pYtW/D++++bAKKvBVxh4WkG6urqcOyxx6J///6RwHjNmjVoampid0IiohIYcBERlaAnfhVCwLZt2LaNwYMHY9CgQbBtu+yGuG60tre3Y8eOHZG5r5RSaGhogG337LSIkydPxj777AMAJgD0PA/Lli1DW1tb1YKOcNZEX5fXX38duVwuUnRk9OjR2G+//RIziN0RDp5t28YhhxyCYcOGFc1vtXTpUrS3t3erQMfuQF8rfQ0OPfRQjBgxIhKItbe3Y8WKFT2WpSUi6u048TERUQlCCFx00UVYv369CQSGDh1qxrG4rmsyVp1xXReffvppJBOgM0cjR45EQ0NDjc+mY0OGDMGkSZPw4osvmsmdlVJYsWIFNm7ciDFjxlR1f7rBvmXLFixfvtyUgteZtIkTJ2Lo0KFV3Wd8/67rYty4cRg7dizWrFljggqlFN566y1ks1n079+/ZsewqwhnckePHo099tgj0uVSSomlS5eipaXFBK89MWk2EVFvxYCLiKiEgQMH4sILLywqEa6f+JcKtsKZmvB4raeeegoff/yx2Y4QAkOGDMFBBx3UoxkuIQQymQwmTpxosls647Nu3To0NzdXNeDS18V1XaxZswbr1q2LdEdTSmHatGmor683x1dNOhiwbRv9+vXDlClT8Oqrr5pztiwLGzduRGtra9lBnw5K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K6+8YioVKqXQ1NSEVatWYY899ig7uItLyk5qnuchl8vh73//O5qbm82xKqUwcOBA7LfffpH3ri9nbsIFVJYsWYLNmzdHfjZ06FDsv//+vaqSIhFRb8KAi4ioBN2VynEctLa24p577sH111+PdevWRSZ+tW0bRx11FObPn4/Zs2dj8ODB5im/zo719GS1HcnlcnjttddMpkdnKRobGzF9+nQTtITHr33nO98pq3GtS83rLmnhroU6kD344IORyWSQy+XMNtesWYNnn30W06ZNQyqVqui8LMvCpk2bMHjw4MT5rdasWYNnnnkGuVwuss6BBx6IsWPHmuNkAOEHxy0tLXjuueciE2FLKTFu3DhMnDgRUkrzXvOaEREV9N4WABFRD7MsC7lcDo7j4KGHHsINN9yA9evXAyiUg99zzz1x9dVX484778Qpp5yCQYMGFVUojI/Z6unGqO4OpsedNTU14c9//jOy2azpfqeUwqGHHop99tnHFNGIF5Yo5zyEELBt28xPFQ9gpJSYMWMGxowZE9lme3s7nn76aXO9yz0vzXVdPP3007j00kvx/PPPmyqIgP/eua6LN954A0uWLIkExKlUCkcddRSGDBkSmQusrwm/17pAypIlS/D3v//djMnTAfPxxx+PYcOGwXEcBqhERAkYcBERdcC2bSxevBg333wz1q1bB6AQcHz+85/HjTfeiO9///sYOXJkZHxQbwisOqK7Bra3t+PBBx/Ee++9Z14XQmDw4MGYO3cuBg4cGDkvKWVRN8mOhIOZ8NfhIHSfffbBnDlzIhUJLcvCa6+9hsceeyxSgjx87Ekcx4Hrunj77bdx/fXX46GHHsIll1yCe++9F83NzSZ4XLVqFRYsWIDt27dHjm/UqFGYO3duUaDcl8QDTNd1kc1mcffdd2PTpk3m+iulMHLkSBxzzDGoq6uDZVmsUEhElKBv/mtCRFSm7du346677sKyZcsAFIKGgw8+GFdffTVOO+009O/fPxKU9Hbhin1vvfUWFi1ahLa2tki3uwMPPBBHHHGECbBqqb6+HnPnzkVjY6PJpDmOg61bt+KOO+7AkiVLTKbFcZyS11gHuWvXrsVNN92E//u//0Mul0NTUxOuvfZa/OY3v8GGDRuwbds23HXXXXj++ecjgVsqlcLs2bMxffr0ou32JfGHBUopPPXUU3j88ceLKlMeddRR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FxERERERUY0w4CIiIiIiIqoRBlxEREREREQ1woCLiIiIiIioRhhwERERERER1QgDLiIiIiIiohphwEVERERERFQjDLiIiIiIiIhqhAEXERERERFRjTDgIiKibnEcB2vWrOnpwyAiIuqVGHAREVGHPvjgA5x33nlobm6OvP6HP/wBN998M1auXIkZM2Z0ebsrV67E/PnzMWfOHJx//vlYunSp+dk777yDCy64ALNnz8a3v/1tvP/++5F1ly5divPOOw9LliyJvL569WpcdNFFOProo3HRRRd1GgiW2k5Hx9bRetU6LiIi2n0w4CIiog5NnjwZlmXh4osvNq+9+OKLuPbaa3HKKadg0qRJWL16dZe22dLSgqOOOgrjxo3DH/7wB0ydOhXHHnssduzYgc8++wyzZ8/GYYcdhltuuQVjx47F7Nmzkc1mAQC33HILzj33XDzxxBNYu3at2abjODj++OMxYsQI3HLLLRg+fDhOOukkeJ6XeAylttPRsXW0XrWOi4iIdi8MuIiI+qi33noL8+bNw3HHHYfvfve7+PjjjwEAa9aswaWXXor//u//xhe/+EUAfjbr9ddfx/3334/W1lbMmzcPt956K/baay+sXbsWF154IQDgyiuvxGuvvWb2kc1mMW/ePHz22WcAgB//+Md4+eWXsWnTJlx44YX4f//v/2G//fbDVVddhZaWFqxYsQJbtmzBz372M8yfPx/77rsvrrnmGmzcuBErV64EAEgp8cILL6CxsTFyPs899xwcx8F1112H/fffH7/85S/R3NyMF198MfH8S22no2PraL1qHRcREe1eGHAREfVBbW1tmDNnDo4//njcddddGD58OL72ta+Zn91999149NFH8cMf/hAA0K9fPzzwwAO47LLLcP7552P27Nk4/fTTAQDNzc34z//8TwCAUgq33Xab2c+jjz6KN998E8OHDwcAWJYFIQTGjRuHf/7nfzbLLVmyBJZlYeLEiZg8eTIuvfRS87NFixZhxIgRGD9+PABg/vz5qK+vLzqnJUuW4KCDDoq8Nn36dLz11luJ16DUdjo6to7Wq9ZxERHR7sXu6QMgIqKdr66uDu+99x722GMP5HI5nHPOObjhhhvgeR4sy0JzczP+5V/+BePGjTPrHHTQQTj55JNx5513luxCeO655+KYY47BLbfcglQqhfvvvx/nn3+++fn1119ftM6qVatw9tln49///d/R0NBgXr/jjjtw5ZVXoqGhAYsWLUJdXV2H59Tc3IwBAwZEXuvfvz+2bt1aziVJVOrYuqIWx0VERLsOZriIiPogpRSuv/56HHDAATjuuOMwf/58uK5rxhVJKTF27NjIOkuWLMGf//xnnHXWWfjRj36UuN1p06Zhr732wtNPP41t27bhySefxDe+8Y2Sx7F48WIcc8wx+Od//mecc845kZ+dc845eOONN3D11Vfjy1/+MlatWtXhOdXV1aGlpSXy2vbt2xOzTuXo6Ni6otrHRUREuxYGXEREfdBDDz2E//3f/8XLL7+M559/Hn/84x8jPxdCQAhhvm9tbcXZZ5+Nm266CbfffjteffVV040w7txzz8UDDzyAhQsX4phjjsGIESMSl3v55ZdxxhlnYMGCBTj77LPN65988gkWL16Muro6jBkzBhdeeCEmT56Mv/zlLx2e06RJk9DU1BR5rampCZMmTepwva4cWyWqeVxERLTrYcBFRNQHbdq0CXvuuSf69+8PpRRuuukmAP74rSSXXHIJZsyYga9+9auor6/HPffcg0suuQSffPJJ0bLnnHMOnnjiCTz44IOR7oQA8NJLL2H9+vVoaWnBWWedhXvuuQeHH354ZJl33nkHJ598MtavXw8AWLt2Ld59910zhqqUuXPnoqmpCS+99BIA4Nlnn8WaNWtw7LHHAgAee+yxxOON6+jYKtHZcRER0W5OERFRn7N+/Xo1adIkNWvWLDVz5kz16KOPqgMOOEAdeuihauXKlcqyLLPsvffeq8aPH6+am5sj2/jpT3+qvvCFL6ilS5eqfv36RX42d+5cNWzYMJXNZiOvT5kyRd1///1qwYIFSkqpBg0aFPnzwAMPKKWU+slPfqKGDh2q9t9/f9XY2Kh++tOfKqWUamlpMctKKVW/fv3UoEGD1L333quUUuqRRx5RI0aMUFOmTFGjRo1STzzxRNG+O9tOR8dWar077rij4uMiIqLdm1BKqZ4O+oiIaOdTSmHDhg1obGxEKpWCUgr5fB7pdLqnDw0A4LouPvvsMwwfPhyWZZW9nuM4Zj3b7j21oXrrcRERUW0x4CIiIiIiIqoRjuEiIiIiIiKqEQZcRERERERENcKAi4iIiIiIqEYYcBEREREREdUIAy4iIiIiIqIaYcBFRERERERUIwy4iIiIiIiIaoQBFxERERERUY0w4CIiIiIiIqoRBlxEREREREQ1woCLiIiIiIioRhhwERERERER1QgDLiIiIiIiohphwEVERERERFQjDLiIiIiIiIhqhAEXERERERFRjTDgIiIiIiIiqhEGXERERERERDVi9/QBEBFR36KU2in7EULslP0QERF1hBkuIiIiIiKiGmHARUREREREVCMMuIiIiIiIiGqEY7iIiKhmdtZ4rXL3zXFdRES0szHDRUREREREVCMMuIiIiIiIiGqEARcREREREVGNMOAiIiIiIiKqERbNICKiqokXqiinSEVPFtYgIiKqNWa4iIiIiIiIaoQBFxERERERUY0w4CIiIiIiIqoRjuEiIqKy1GqslR7npZSCUipx3BfHghER0a6KGS4iIupVGDgREdHuhAEXERERERFRjTDgIiIiIiIiqhGO4SIiog7t7C5+5YzXIiIi2lUw4CIiopJ0IQugOBCqVmAUDuj0Nhl0ERHR7oIBFxER7VQsikFERH0Jx3AREdFOw2CLiIj6Gma4iIhop4oHXew+SEREuzMGXEREVCRpXFVHy3S0XHf33x0M5oiIqKexSyEREVVFb+suyGCLiIh6A2a4iIioanpb0EVERNTTGHAREVHVMOAiIiKKYpdCIiIiIiKiGmGGi4iIdosiFeEJmjl+i4iIegtmuIiIiIiIiGqEARcREREREVGNMOAiIiIiIiKqEY7hIiLqY8oZryXKGdIVGyflb7eCsWBVGm/FsVtUa5WMdeQ9SUQMuIiIqCoEgIpqb1SpPcqGLdUSpzwgokox4CIiospUqQGa1JBl8ES7i/j9zXubqO9hwEVERBWp1hN/Nkhpd8YHCkTEohlEREREREQ1wgwXEdFurpxMVNEyO3G4SiVP+5khoGqq5fispHuVWV2ivoUZLiIiIiIiohphwEVERERERFQjDLiIiIiIiIhqhGO4iIh2I2WNRUkYr9XbR5BwjAt1RzUmLOY8XERUKQZcRER9DduN1IcwUCKinsYuhURERERERDXCgIuIiIiIiKhGGHAREVGvwvFaRES0O+EYLqIetruOL+Bkn71H0XWv1naq9P7xPqBqqtbv1GoU2qjWdolo18aAi4hqgo0KIiIiInYpJCIiIiIiqhlmuIioJpIyXOw6RkRERH0NAy6inay3dbUrZ1xOrQKlao2R6Mtjw4rHZwn9A6hgwi1RpVuukuuqYquI0H+rvS/qmzr9PaLMf7pEVDDaUXGSOyJKwICLiHYpSik2xsvVC9t+CgDfPqqW8h7aqMo+C7xPiahKGHAR9XG7YvDS27KERERERKUw4CLq4+IB164QzPTlLoRERES0a2GVQiLa7ewKQWPt7PrnzgCadlm7/sePiGpAqL7dMiHqceV8BJMaoJ7nRb6Xsvj5Sa0m7qyWSn/9VCMrt7s06ovO3avsmlbrn4Ki9ybhMseX2V3eC6q9cu7Togz4TmzllHO/6+MTQvDeJ+ojmOEioj6Jz5qIiIhoZ+AYLqJd1K72ZLSaAU61tsWxYERERFRrDLiIdlG7YnBQrQCnGtvhxMxERES0M3AMF1EvVOm4rmrsR2/X/Kzc3xDViFXKmaA06ceV7DthO0ImTKrcyWZ6w5i38HsloDq/HOWMg4ltJPmyC3R68ROuKQNbKkvC74Oymiw92KrRn5ty7nF+Doj6Dma4iPowIUSHDRgzuLvTqMP8p/sqaSxVq4EV207SAPjeTEFBljPJa5kBffj8BZIauxwGTLWUcC/vQo+Iix5exV4nor6D/1oSERERERHVCAMuIiIiIiKiGmHARUQd2rmdX3pZf6Fyhov0omGwu0JHJXanIiKivoZjuIh2UZWMC+jqpKF6m/EtF2+neALP+MTM5erJ5nj8vJRAp0FXZ+Pg9DLVEB8TkngPlDoWpcoauxVZvMzj6WShsvdJfVvR56iMm7DS33scV0VEOxMDLqLdhFKKjYY+Ivw+FzdSkRxYhYI03ie0u+D9TES7AgZcRLuRnntqq7qSPKEq0O+1lKGe4QoAvPiCkXUqbaCyUUu9VW/q1ktElIQBF9Fuoke7yCi/JPnuRqjeVRpeB0zhryPvswKkUhDxrpEluiB2VdE9tfu95bSrUZ3/5uHDAiLqaZz4mGgXVauPblHgBuwWDeviYMHrdEyTEuh0DFIZ0wwnNvi6MvbE8zwopeB6KvL+qKIxLgpWcEQCAhD+fqSQfkCs/HWkUP4kz1KasV1mzjUhoAB4QgJ6G+G/i86hk/NgW5eSJE1yHnpwoxQglIKIL1P0OS7nl5PodD1VfDSVBWoJvzMY8BERM1xE1CGF3bTNXGqsU4gffJTZoOvOoYQyVUopE2A5jmNeAwAvId1WVOhDeUVHI4Tf4JTCD5mkbgAGAZy/TmH/CgCkH3CKUGO1Kg1SIi3po6VfM0VeEgpphJV7D3YygbIQCYtU1GuAnwkiKsaAi4j6hOLMXTk131HT9pPuFhgOsuJ/CyHMH8uSRQcUPy+pJPwxddFtA4CjAzcrCL6E9P+Wlp/xMptSgJAmQ8bAioiIqHIMuIioT0iq5lfW8+py4rIK4hHXdeF5ngms/D/BgQEQQsK2/QCrEHTJyBP9pG6lQmcFlB8tKigozw+6XM+F8jy4rgcXgBAeLMuCJQSEQnQ/qtAl0T8eBl3UCyRlpWt0byZ+vvg5IKIKMOAiIuqG8sa4qUij0PM8E3C5ruuPq5I2pLTg9/6TEAKQQoZ2ontBdjLuDAAg/QRV0IXQEwqWVJCw/fVdF57nwnNdeMqF63qQUkJKCcvys11Kdrgbom4q40lGGfPgERHtChhwEe2iKnnSWk6hjeRKdL271VNZAZGEiYBlQpRRPLAj+r1IyJSJ0Lgnz4OnAGn5EyS7rgvHceC6rrnWUkrYdgpSWMm70n+LMkq660hJxdcXhfH8FvwuhELA8zw4ngfluv5xKIVUKuUX2lDRIh18uk+VKnu+uEDJSbyT7sGkcV2hib5VKAWtxzMWbSfhc1zO/R5fpjdVNaXdU0X/jlOPY8BFRKSVE7gVLVPcUvOC4EU36oRSyOfzcBwnUg1QZ5Qsy4JSVqdxrSrnGBP+oY2vIaUFKOln0DwPIijQ4XgePMcFpIW0JSOFPIhqrWicZaW3XbySp7+1ksv4P2YDlYhqhwEXEVEpRQ0+BXjxrFjxakL5mS0BAaU8uErB8VyT1bIsC7bt//oVQgTl3cuo0KFUp1UThUjaTlJZej+zJoIsl5TSFNjI5XIAPNi2DcuyzM+IdgkdzVXX0ToMuoioRhhwERFpSd2eOl8J8YBGB1GucuG5Htygh5OUVpDRkkEQ46+vyizgocoY1JI0n1D4e4Ggi5Uy30FAwLIEpLDgOA7yeQdKuaaxalkWu6hQzVVUSbSDbRUm/E6IpZjhIqKdiAEXUR9S7mS7kXE7/oqdrdVp06ji7kFJe+t0fhwVVOvr7KA6mdQ4NA6k8JoX+V4qACI8ibIfSHnKg+P6GSNPSMAEW35hDC+6mbImUNbb7/ig49MTR5mQzYyR0ZMaS0jb8hN4rgfXdZDNZk23x8Rdlfg6vC82YymJCD8aULrUS1KXwjK70KrC7yAVfLjM74Vwr1/9iyj+C0kp85L+fOh1vMLKkd8ZAsVjtsr7fUlUHvYs2H0w4CKiiKKJdFFO+6HEAPfwdkR1g64Oj6aTAfnlb6izFxUUPAjdzVAIQHjwPMBxXTieBwjpVx0MqhAmxHDdPaDK1yoqHCAgggDLC6ooOo4D27ZN98M4NgeoYioacJX1kKSM7cW7ESY9kElcN/Qx9lPSxZ+P+FYSC+YQEcWw8C8RRYQn2u3KpLeVrFM71QkDOo8zQ4Gm8J/Ze56C67nIOy48L+hGmLIjWaLe+NQyWjHR9kvDB8U+8vl86fU6+EPUKf0Eohd+JoiIqoUZLiKKSMxiVFCGtseDimqM0RAdd88LFoJ+1q08ZTJbCgKWZcOy7WDC4uTD6opaTcRqCnegUEjDdSQ8APl8HpZlIZ1O94JAmnYboUArXLmTiGh3xICLiHaKndqUqmasF2sEFnVOCub0UUr4mS3XhacEpGVDBl3xvGC4SmGar8quRudj1yoT365lySB5588bpidnjmPzmLqlGg9lavQQgoiomhhwEVGnyi220dk6ZVXiq8akjiJhb5VkvMo6FgtKeXBcP9hyXUBICSEFpLTgeoVdxQtldMbrZIWka1WNzKLrKn+uLsAfz+V5cPXcYjVQq8CRDe+epWLZq0LVQL+ojb6bSr1PpTK6SRNym67MQhSPBStrfr2E1/Q8eiL8fXFFUqJq6fGeIVQzDLiIiLpBz4zlegquJ6CEgJACQtjBGC9gV8wFhSc99jwvOfgro5z9Lnr61AMqbWwWVVUlIuplGHARUd9QqyfRSsB1PTiuH5SooCKhkAIeBBQUZLmTr1ay+xo/EdXZhHhWAQgmeO5s/c6nDiMCUFmGMp7pKnuiYyKinYgBFxH1DUmloTudPAxlBQuuUvA8BU8pCKGC7k1S76WmatWNLpzVEkJAQCQGXB3tLWkS5lpiQ3vX1p2iMN0uvMEHA0RUQwy4iKgqOm3oJE5a0/lCnU+pnHg0nWe0ypgYTEVmTE3mKQXX8+ApDwoKtmXBkrIwmatSoa6FHe+tOKCJzYmWeCzhZUSw2+jkrPGT8ISHQsAZjH9RheW9oBuhAOA6LmzLhiWEmW/MLFs0eWzx+yXLaQAXT2aUcNlLbMdMbiuKLnFi9i9hX+XsiePDSiu6zmbMk/JzvHpevGByYX1fF00aLOOf/eJtS6GnTA4+LwqwzNiq0p+z+H1Z/P4JKOnfeSoYA6qXiXya+L5TFdWqh0Il2+XvtNpiwEVEO0dZv8sTHjNX8O+RKqcrUnkRYFl0sAUEZdX1RNChY+/8NKoxF5GCFBJFQWvsOJQSUEIVlgpSUbp5qTwPyvPMQVtCQEIAbpDx0tsTKtpoVuY/IZ0HrXEisWFbKuAK3kdZIkmRlNgUpX9cTrBFnVAAhFcItALSlIIvMbYv/p4rVRQoKfM//8GABRENzxMn5y7j0ycALxxkJRTI4Agxqib+XulbGHARUa/W25+6hcc2JY1z8n+AMqtLlLG/Dr8X8DrZjgLME3zzmoJfQlH4wZHrunAcB57nwQomQlZQftNWhTYEVVwRLmmPXW1XCKBEOi9h2SDMUn6GIprvQ2IDvKN2NJtA1aCiwZYKZ7mC7/3FosopHOrpz5gqvXhZmU0iop2HARcR9Wq7SsBV+JOwjPlPRzqfZDlpTFT8e08VFxJIvoTx/lz+cp7nIZ/Pwck7UJ6LTDoN25KmS5jep1CABzdyBEkBTkVdW1TxdpJSV0IHZqUCtISJq/WxR3ZW1LctHrh1PUvX54XuF92VECr2ekzRu5VwwyvlRX9e9AYnbD/2gIGIaGdjwEVEfVJ4XqDubgcIBRYlIq7OujWJePe84k10GmyZcSexbn7FhyTM+gIKQgBS+MfueQ7yTg6em4cUHixLwJICQnkmWeXnlFTRxGJJcVIl3SQTt4NSc5KJwt/xRaQAIIuXjneDLAoSZWQRnURL3C11TAdbZvxfIcvlFcX8ZXQFjj9MSHgjiseUdbVPK99cIqouBlxE1KvszIxWNfYlpYRlWXAcB1JKOK4D2/OCCYN1xcIyGpJlFH0oHtECUw3RLFPO5Mo6CAuqKkrhb9l1HGRzWbhuDkq5yGTSqMukIEUwSa2AXzgjyKL5RQ5ixxg7gEonsi5er7jogVlEx7pFwV5sLJgoDlyL9i1k4bVgIl2zI1HYHotoFIQfOijld/XTxS30EDuFUJbLfwky/ha7sZtXFXcbtGP3e+S6l7jXkiZJjlQ1FICQEtI8sCg1XjD5ZaK4XWF8Vl/+ndUTGHAREXWDbsD5JdQ9WFYq9Hq3tx75TpU7rqmcLYvCsUuhoFw/2Mpm2+C5eWTSKViWBXgKnnLhKT9XJEKFBZKiu0qOsKx1iqPR4gZDUmKjuOdk9H3RVSTN9x6U8KLdESNVR0LLR9r6nP+pQAFeKFjydLAVzQLX7F4pd1sdBVdERFXEgIuIqJssy4IQAq7rQgjPZLsKXfeKB5vEn4D6kyR3IqHXXNIynfL83nYCfszkKBdOPodsth2Ok4dtS6TTNlLSCroZeibQEBBBJgBwg6ORMhzZVNCFsKxVZMJr0ZMtqvKf1F2wqGBGtFOagoCSHoSQflamKBsi4Fdn7HpDvc8EZOHgylNF47n8r4vHxVWUFVDl1CAsFgm2+sr7QkQ9hgEXEVE3pVIppNNptLe3w/M85HI5WJYFKS1/gcQuc6FvRKGAW/i1pIIPxdupsGtbsD/HceDks8hld8Bx8rAsibpMBilLQk/drIKKcEqX6daFOYQOSEQQYFZ4PGU1tBPSV+Ws18lcZqKoK2cwQi3IcoULheismpKFMXCFtURZ5cf7WtClVHF2y4/dO38IUVZX3ArXiwRbiSXgiYiqhwEXEVG3CEhpIXC+xJAAACAASURBVJOpRy7nZ7egXOTzeaRSfvZLmSULgVU8Q6JEwpxDsaRRUnM+OvmwgIhFFLo96ScavMJxCAXXdZDNtSGfbYfnOEhZQF0mjfpMGlYoKyFQKByhVJDt8gpdEoWUEEoGy6rozhMLGJiNBS/KUIMcCW3fhMZwcoWO2LLFG4uPOiu+pgrwHH8sV/yw9dl5AsKyEg8rOlluNIvin2JoPFji/mPb6+TnPU6fk/ILYgilB2p5wf2r7+qEAivxWwNBd83gPnPNGEj/p8mFbgoZSv0TD6HunUJPZSCjSysRFLgsvA8quDWD3RGVrdKxqtXYLu0aGHAREXWDDkRsy0YmkzZd8HK5LJTykEqnIYUFISy/u5pS8IJWnY6NdBNVFfWJ0zsp82BUQlbMUyY2kVJAKQ8KHvL5duTa25HPZiE8D5mUjTrbRsZOw1ZBQzQ0VknqpqmSUPD8ADHI+Pg/0XvWJ+U3wr34xGAiKB4YWTa2XjknHDTM4+dvosOk7SRtNuGSCyhAubHdFVZW4dNNWKawrOXvICguogNufdPsNtkuncEyRTEKDw9U4e4G0HEw499fwfQKnuf/LYLJxDu8VIUgt7AnmBtN6LtXV/AM7g8hBDwE2UlRtDkioqphwEVE1E0KgJAC9fV1ABSy2Szy+TxczwmCrjpI6WeCdMPOC1qGHmBaoTpLVPZ+wxkT/aQ+MWZTkNIv7OE4eeSz7ci1tyGfz8EWAnXpNOozGWRSNiwh4HluOCoK76yoOESkCqMppuE3mj3Pg+sWBy5Kysh6wlNdH0+TWH5fFYKtUhXrytt6wqYLayohAOEVdU/0dy+CwFcCKhgsF5yfCUJ0pTyhyjvfXSwwM91OdRZTJ/XCyc9S64bmtKta4KOjPB1s6cAL4fu3srFgRETlYMBFRNRdqpBBymTSfrDhunCCyn+uUrDtFCw7BWlZAKTfKy/UTc3SWaUuEAC8+GRGQNDy181Hv3tXPucil8shn8vByWYBeMjYKTTUZZBJpZCSVjDfViETEw4owiW/dewhpYwGA/EqdCVK4nvB/F36Z1KFlu1KcBEPquLFGeKLo7hLYUWCYCDpSIUpIKKDDRnpk+lXqvfP0/+64yDbLL8riQRb/hgu81hAxRaMr6qLtFRTUcDlf+8nG3V2SyTeM0RE1cCAi4ioG5Tn+V2SPL8bVEpKIJ2Cch2odheuk0e740BaNtLpDOx0ClLagJRBoQU97qqS/v1Jr3rBpryge6OLXD6LXD6HfD4H13GQljbqM/XoV1+PTCoFCRXMr+X5JbyDCn2FHcWDp3D3v/Dx+Ncg3LXOsqyiZTzdXUwHcUHQIXR2qjuFNsJZrth2TMO/i5c6cRxFvKukWVjvNhzw+jsVulJJEHAJISCsxK2Ej7prB9tbhIOt4O9IsJVUXTAYo1XoqooqZfdiwZYeC2aC3upMgk5EVIpQ/C1DRFQ5M3Yl2o3N8zxks1m0tbUhm8/DUx4ACTudhp1KwbL8jJeQMkglBZmOMn4jh39rFyWYPAdKOXC9IKOVzyKfz8FTHixLIJ1Ko6G+P+rTfmbLrwvvBscfFMSAa4oIqFDD2c9uKRNsVJJ58TyvKIORkslRRzg4k7FuiImZtXKq2lXQfk+cmLnUeLvIerLQhQ0oavT74/hi474Squd5KEzGXOqa7+yJmE1gpBDcw8F94Xn++LdgDJy5X/Q9E95GwjbD2U8hZZAxLM0P1gsBkwIAK/gsxcdw6eqSpktn4X7QIxGJOlOtZnM5E75353NsuuaW2M4ulznfxTHDRUTUHTpIiY1xkhLIZFKQEkjnLORzeWRzeTjtbci3twHCgm2nkUr73QyllYIIAo9wZbbYziK1IJRScBw3Epi4+SzcfB75fB6ecgEopFJ+FcX6hnqkU2mk7EzwVB8QngAs4Q8mUwKFcm3+/vRyunksdMGPChsdUkpTQt5IyBbpc4oHaCbw0AFYdKVO91+1J4xlnX8QpeqxWkEiUxViqUIRiVjy0LwWlE833d9UcbGNHn9uqu9/8xmIBuc6s2iOOvJNgeu6heyW+Qx0tuvC8pHNJwSwSn8fvAdVnEeciKhDDLiIiLqg6AmkQiFgCBqdnip0q0tZNlJpAVdK2FIgn3OQd13knTwcx4WTbQeEgEzZENKCbVuwLNtvXBfNECUixSjCQYnrun6BCuVBCL8cfV26Dul0CnV1GaRSNmw7mKBZFaoHWlL4gZ7rBbXjC+OPTHcwEa5DWKK1XOH1Q4mtxZfT35vgy3VDDfNgLFg8kEtQRmIqYaX402DdP66DjUV+JEJdCWG6soWDgUj3uXCQIP0iI4Vq8r2w+5s5HmUyovqPCmeA/UUKq3WwSTM/Wlee+JtxgLHvQxU345mtQodPIqLaYcBFRNQFxQGXgp5jKFwC2/MK3TksACnLgpWpg2O7cFzPz3Y5/tfKU8irdnhCQWRDje4SsU14/JPf3c6fC8y2BTKZBqRsfyLmdNqGZQlYuouVPjYFKCkgVdA1TsHvuiVkEDxKiI4KF5hhUl1v+AfhXIfC3WD8CaRl8Joy7W9PefArrse6GtaAPyQr3I9TFcpMdkQFkycHGS5Tec9UylOFbEx43Fn4b8hQlqv0/nq8e1C4umC8YIYK5ueKBVvxs9Hj/UwWT/lzaoWV6oYlpASCIi6iEJ2aVGI46xV+mNHLQlci2k1xDBcRUaDo16Fp3IWezgfd6/y2s4JQ/pgV3aj0h0J5kaf6IuhWpaMNTynkHQeeFwRmABzlwFEuXM+D53p+UAQAkGZWI50V0d3ypJSwbRu2bSOdTsG2bVjSDn4WO/ZQ09JDIRMkdHfBSLcw5We89DmEx22Fxu4o5ZgS4EChF5zpgqgSGsgq6evif4bimQcPnt/4NslErxCPCn8ETrgbZnj8QriioNSjdcyy0f5uKty/LzS+pzjwVQmHHX4htEK4u1tsm+GqhSK8vMlySShpmddMBic0LkzpDJq5FiiMVyo+mm7T74MOroTyq1t6np4U24FUjn+fBLeR8OCXyjdH4yFeYLMoeydUIWiFLLxnQr+HOnslg5elvy9974czivH3MF5QpVoXh3Y7ZTWTO12meIxg0hoKKvJgoFKJPQl6+qFMH8cMFxFRB1Shhe9nVOCPaZKmy5QHHbAo3bVQB1gBoQrrA355jJSUQLgHnExBSfjVDhWghJ+1UsFCngCUJSEsWTQOKvwPdPE/qiL2d3S34RLZOgujs2bhgEsE3cV0XsBDIQthArZgH8IEcNH9BqtGu5cVH140+Aj9OFw/QXnhjE+Q/QpdC6X8bpae8kxTRwCwI+PkQtdEl2dXCkpYoeMR5hSLjyhyyEWvqfDhIfq10uO7pB6XhcLx60wYAAjPr2IZKbYR/d6/3kEAV+L4VNErlVGh/+l3IJwv8l93Abh+cA4/0DL3SlCRUxUi88L7oFRsTJ7n/4EEpP934Zbyr4EKimboLoiRLoThz0I8uKvCtSAyOo3JVFGQnxik1ejGZLDV8xhwERGVohu+Jt2k4CkFGWSyzDgVhLNBMONWCrmS4n9Y4+ONlH4Ab8ngib1+ch90s5KAJwQgRVCUI7Z+JxWpOhMvyKDbrYVGsu4W5jfuhfL8YDDUdQymgV1o4HsCpsJh6Z3Hvleq+IoF24kuV3pTep8ShayJpxTc2Do6eC0UXyhs23SPQxnXtIK2k584DK55qNugfxzBFTQXLxRw6bm+TBQaZID0PoUAPFUYp2SSO9VpdAm/wkpwaMG9HnoA4X/tFeJGLwiazOdE+BlK4UEI/8FDclfBYNqEYK/FAZWeB04E/48FpfpasOMgEfUwBlxERCUpf3iWHq+jgwrdvc5TUPArARaKBSBSdU8hIVBI3FU4yFBBWzvoshU0LqUsBFyF1VRiAFaJSNCl00mmm6EofK2UHwEq6QcGoUCskOnSHSFNvFboxRecYqn2f9Lkt9LuPFgIx4iAPyZIiGCONBXM/RUqcKIAKM/zS7PrcVOh6xCeE6oz5v03B9P5uDKl1zMBgjLrmu/9iAWFIAN+FCuD7xUAyCDuENH0pT4cE4R0ehqdMtnLIKsoVejcle5iq4N/EXwNCKnM50K/D8pPGftdDfUxxvdmXg9+JmVwLeIl90Nfh7sUhq8DEVEPYcBFRFRK0ID0ez8F45Y8zxQA8LvYBf9TevJgf9VwpiV507EfhNuGyg/0hBnyIkx7O745HWh1J7sVOQxT3CEahOgEReSAhf+iUoBQohDMBB3L/PZ2cN1MPKGPEx02hKMBpErObsUvYXCBBGDmh5JSQsHzkyym3R4tOpLYtSfo3lbuMGcZ78JW9rqqcFlENGBEcB4matdBk5RQrg7Eg3OyhH+RvULmS2d8/LooAmXMslzO4ZprbDoV6unbgvvWC4JAfVLmvhXKjL1TQSAmg60gab4t4W9HZ7mUEBCQwbg3WRj/htB9H//bbIeIqOcw4CIiQqFxHP5bKg8imMBV6MIRrmcal0qpUBEEhBq4hQBBb891XXieBymlqcYW2T9ULH4ItRKDhqyeJsssEWpUVrOPvhACnudFx6Hp7msKJuECJQuNbgBBusN0qVRKwZKFwEZvsxBUBMFXQos4GqyEqt+FjrGjczaBaJApk1IW9lIUvAWBshtUmxQePFUovR/OIob3q78uFVh1dHym7LkusKK75unxayp8rogso8d8FcZyqUJwrDNfOnozHfIs//rHApR4Bq/UPF9KKbiuC8dx4LgulOfBc10/U+UW5qLz595yoYR/r9vB5MUSAvL/s/emW27jypbwjgApKQeXXXbV6Xvv+qZ+/8e6q7vPWMd2TpJIIL4fEQGAQ6bkLE9pY3ulMyVRJDiBsWPY4ftmCp6qMAmL2kLTEYlM9KKMP0dchW1ZhsufOOF87L7wA9g4V8M5WLuXz3GcnHN9nVwPYXEvPhdr/ekavi0a4WpoaPipUT/UpqRLAEklPTB5yhRKCh2KXeyPNfavesQLQJSUGxN/Sprat4RLZ1tAyN60/1jfFKmEJuy45OOTBERa3yYeGsvCBtDj6VG0c8YjWFg1zzqCa2Rr/pap7WlE04gEBDFOGzDX5MXl65/c9CwKWSXKlfWuvJevwSp4I85JCDk1L3/A9ruOgLGGTP3ae6zPWX2NppRwOBwwDAMOh4ORrYQhiqZi+rFJkkkiiSpKCok6F6wurgsBgYAuMPq+R8+MnhkctNdYMhKZoPcNhwCQpawSa2SLYVFV1jRQW7dUnoGKYzY0NDR8N2iEq6Gh4afFWlSr/FajklKaECwnE4BFsshTq6rIjZGt3JhYkoptVOl/3zvhyiIEmKf/Vcwn18iYoAZKBIMYSlgFORUT7CIbsBTFKmXxUyFPdaV6YrdWUhGnC2AiouF/r/2kKnoWQjjpka7Jztl7LUb8Z+spZEoZlYtvUCZdVV2UEV0hD02upOIBuYH24XDA/f09Hh4eMI5jjs6KCMA9EvdgCgiBwcTouy7zOgIQRTAm/c6YRiAlxCiQpI25mY/oSbAJAbvdFtvtDl0X0HV9jpcmCIgJRAEuCc8UAAQjm1639vxLqKGhoeFroRGuhoaGnxITclUZ7zkdzv9OaUKiqgWNhFWRICB/7ga5pARXnnNFvEfJ1iSSVL33TQxKKlldC3htju27WvMlOkMoxCoJkEgb0ybPR7QteCrYp0S5FuP4BKyRrfm58EgdSp2Sk5u6+bIS6QiANG1OAKpWLk4y59tygiAlSjVZZHXcZeCT65RIoztEmbwKc0nRrIVPiHLW4TyqO8aI4+GA/X6P+/sH7A97DMcBgCCEDl0XsN3uVISk20G6nV7LpD9IopmMfk2QKmqKJKQ0AiliHI+QOGIYj4jDgMNwwGE44v54wGazx2a7wW67xXazRd/3pqxo6YNOGknr0jx4l49lY1wNDQ3fOVrj44aGhh8SC7t67c1cbzRLEfTXcQBn1TVMiYEZ5VLWPqnbkhhzDRARgUMA5/qTtcEgiwAIMcS9+xRArGlXEryGZRmd+GqoCKfRj8n7LhOe30uj/pk86ucRQ1S/R2deOR2zHF99j+HRsiI9Pz+EieuzgQl5KjhHzXES0lvldRMZfuaFCIhAMI5xskYAuUaJjUiUxsfV9702S+oDWR3rehyk++RkhJ2JBItwsf3NAUJBDzkBFBgJwN39PT7e3uD27g77/YCUGF3XZwK02WwQuk5TJomRqPSGK/tlLY0ntVJ1mp/GgJMkpDhiHEcMxwOGwwOG4Wi1W4K+73B1scPV1YVulzsl8sQg5hwlFlTy/fSN7oOGHwOL1FpgccN/TSv55KX8qBdsfel2b3w3aISroaHhh4PHUeoAwsRAL67+kiJYR2RMQpxSBEw049GpMs2efyJIFdkCtH4l1/csjOlq1P5Z7sVlfbicbAXz8n8nxdBz6XZg5ThVMuzkJMUaQ5fUzQHeWDnXgVlKJtn62NPqjHT535NNcSoiJr6czCJjZyn1zfbrGY9JEcEwDPlvYJrGV//NzCAXUklJr4G6Hqz6e7WoH4xIDAYQPGzIFpUjQAJBmwd34NBhjCPujwd8uLvDh5sbPByP4K5Dt7nAbvcLthsjWpYmeep6m39OonLxNFtmUsPIhJgi9vt77B/uMR4fIGlECITLyy1eXV/h4vIKzP2T2/9e7oWGF4o0vZ++e5P4zIhuuye+P7SUwoaGhh8Sj6bC1ZGqKrolSbISYS0XrtlxFnlZcXXy3BkqMiFbE4Owqnk6byco/+T0tu8Ia2p2iwe9q4PrF8Cilrj2MIOSW4v6UXU+QBUpExMGlxJZyiIa+VDa8bbXLl5yjkjGEn/e6CIidF1XUkur7davnYgHI1m5vqsis1Ktk7zKaUIikxEcKp6GMWk0NDCQgEgCSSMejnt8vL3F+5s7PByOEA7Yba9wef0Km90lQrdFqNJep4fLz+0K6asW9PMm0wUs3bT0jAuBcHX5CtvtBnG4xO3NexwPD/j48RbDMOLVkPDL69fYbLbfvyHc0NDQ8AQa4WpoaPghQfO/q0jLQgCjjr5Iska5AsKKYMYMgmkERR2Qs7S/Olrh61hIV68M2gITRer7+8JZXlSPuDhx8teEIrQhJopfnQ8xwuXRrNz/DKiWw/SYSQIgFQleSw08R2xjusRzvcUcAuBpcFV0B1iPDubjY3+nlJCSAC5Hb9L2i/HYfhXpFoLEpIl+QWu3xjTi9viA9x9vcHP3gBiBfnOBy+s3uLx6ha7fapSNitR9ITnTi3N5G0zHk0TWEzf9vvD1wwK6oQcz41p+wT0z9g/3uL8/YBgSBIQ3b96g73vEGFdbKjQ0NDR872iEq6Gh4YfDpBwG1Ys6Fc2Mc1NAmNZyeZ2Rf44nUk1W3g5dNxFMcM9+va41I15sYR8/uVCA27vfH+eaYE1u3EUUKJWAE+Vj4Wmd3lWZPDxSBEr8mJnKhFiEbEF083q0N1r5bBoNep624fOQo3MVAZ9HtkSKeiVEspKjpIRxHDPhYmZwcuW+0tTYQYgghLweMkWJGCMOccTHwwP+8fHfeNgfQGGDq+vXuLp6jd3FKxBvkMSiY7xCBGf7dE60ab6M7mM5BimvK4GJwNxhs7vUei0K2N/f43gY8P79ezAz3rx5c1J2v6GhoeF7RSNcDQ0NPyTmwgk50pJl3hOAqJEE77eVI1so4g/iXMeMRSNSEwO6+nu15qWOktl35+uxlruZZGUp72qfXkJS1SLN0P9gAokSrNy4V78BYQbEGhO7XDzXhEuARHYuSh2YRyI9XY1CVyJJQFYNzK2ZrXYI9ndNfCciGFQIw+doILpGUHx9CxJhZMubFBPpfsY4ImJ6fHP/r8DgwFb/BYCC7i8HPOwf8P7+Dv/4+B73cUDXb/Dm199wdfkGfb8D0E9FKISrS5Wyw2Lx3mTM85eCNItx6eVe3QMMEDNYuJBs6rDZat1WioT9/gaHwwH//ve/sd1ucXV1lY9na+za8KlYdRR8oVTVp+75L7Wtdj9832iEq6Gh4cdFFSEpwhhSyZOrcVuTLYZHJrAoqAZqIlc+m9Sv/JkHHlMWO/DiaE/B+h5TCj8Fnj6WXzgIqnpnwS4CrIdXRbhEIEGMbFFOOXRDHUaw6iilpohWpFhECd9EPa8axmxwuV/W1z7uMm0hkJI2XJ6nJOqiVfSPUo4OAYAEwv3DPf7+4T0+3N/jbhixffULfv31HS4urtGFLQQhHyNb0We7zOSc9TgxTkAEWQopgXiDze4aw3DE4XDA4XDAx48fsd1u0XVqtjTDsqGh4SWhEa6GhoYfD3UKYU24vD4oJQAJEBW3kKRRFBIzXmui9VgmoRm/SYooghvJz0l9IiKkBclCJl7gkpL4kpDTCP0NIiNU1UJViqC/7dEwgFTVkDp4eiCJRsBI89IAOBmpU0NhJEvPaV7W00VrpUj3EKN8lMf/hUnXWgpm/k2EQABzMIeA1hemfA176mRCIgKzxvJSSnjYH/HPDx/wx8dbHABsL6/x6vXv2F39AhFrPZBW9usZl9jy8NBJxqVNmC1N1MhWEq2/Y+6w214ijg84Hm8wDAM+fvyIq6srXF9fP93LrqGhoeE7RCNcDQ0NPyCm0ZFcsyWaEujiGB7hmirhValkAiwKp6ikxbkCXYxRjfqcE/cMkP1HmES1hMp7P4xS28xY9l33Eq7JciJAKIVtnurJIqaA6NErIMqYz7efvxwFYlOhjOU7un6rHbPXeSz12L4gnko9UlJFKn7B/lvAHumyMQsLEguE9TtDSvhwd4s/bm7wMEZsLi/x6te3uLh6DeIeKQmSVHVjf3Jvn8t9UnU+AYIII6YEYiCEDpeXV9g/bHA47HE4HHBzc4PLy8uJQ2NC5hsaGhq+UzTC1dDQ8OIwN1Fp7QNKSoKkKODp3xrhUFlyj5gAlNyoz5IV9nvek6m8n1JS9TwSLfy3mhuaj1BcqiHHb/KqyHPoSBu8MoLl1HnlWCGM37Th8TNB1c/ig+pFVdJVSI/nIYoA0FofcVKag1NGsCCgWH3N63wAjQ7ZsoRhGtmq0w7zMoW01dGvSYqqVC0D8rhPnJcZmxMvEJwtIxNpj9k1SLB6uLIuYqtTEyCK4OZhj399uMHtwwDeXeLVr3/B9at3AHqQEIKFFDPX8l3IWvsndmO2yJwzkh+sp1YlVI6XIJ9XYUYEaWZt2KLbvsJ+HyEyYv+wxzgO6LpgkVOy/6cbWpDY1fvllPPiT9xjnyvFuOGzYi5cA1mZq1eQZsvMBWtQ3YvzbX0q1gLD5Ful9av2JT4XfkY0wtXQ0PCi4Obnwoiv0wgpKUGxdDNvZDz5WwScZJpVlp9mBPaI1SIC4ZGtaD/JxAs6cDZ84+QbNFuH8gh7+INAgQAK9uOhnpmUvFSRrxeEc0b76DL+AZGlfVZkhWfGUxJwxzkdVGpClCNhCYJUWgAAmazldYnkWjKPkpG956QdAhA7WV+9gGzVyz1bkDJaXhvz/V8qK87IjCQgRoCBw2HEHx8+4u4wAt0Ol6/e4urVOxD1QCLMLs0vApHp5bu+0PpZJxOLiQCEAijskBCANGIcRozDEdhtCxkHllbowiqVxX1zmm49M3Y2v9e/RR1gw0nkDIZTWQOEIrpTvTdf5ryixechX+oWgX8sDbnh+0YjXA0NDS8Ojz5eKtEEr9VJIloDZKmDYup2ZDVd2bBeW90j2/I0Qu+lNK/denbqnz1Us3FImP7+ibFmVNQe6/w5W9TDasDUgNfXmoEX4KmJHh3Tb/h1402TK3IFVE2ZUciVv85pcSjnSgQST0iso9RifQqYeUIgRDQylAi4uX/A7e0djseE7fU1fvnlNTabDcYo4BMXkvi+PAENOD69HvpMBigRWRNmQUwJwzBAxmjkkk3tcylTv4xwYUG4zhvA88fe0NDQUKMRroaGhheFNefioqlxJaRAcUq0JMvC+1csqrG2LVq+m1JCHMcc2WJmMwopp78tPJDnOMvnioS88oWf2AB8zItLE3LqEQ+/BizVJqcXMvSx50RKCsmw17AA6aT+b1ITaL9TRE47NGru6Yy6TQCUJgGsaaogVJHPPvm0YzELH3EAAnA4HPHh5hYPwwChDS6urrHdXSKmcxKnbIwnnQX1Xv4ZrBHo2WtL+dIMxQSJAkjUnwRACJRWnCVrKYXT4sDnDvH0V6zvXENDQ0ONRrgaGhpeLHJdDVCMrGwYW81Wmv7OhMjs5Fzzg0eMzUnqliBZZItEVQm7EErEYUL4qq9ZzczJ3LmaPBDlAeZar4ZVLARF1qJhsPPABCBloiXV9eM1fahl6SdkHuX85khaIW2Tsy41oSrbsI+qdZ6s/FqBTC4xYcEIwe1eCdcQgc3VDlevfkEIPcYk6LoAxHOI0uko2KkUpmcHeGerFUvPVdKl5DUIWWQ6Qusxl2Oep/BihQTRmpLoYreec9OxtR94Au1ebmj46dAIV0NDw4tDtlfcAPZqYjeGU/W7Ilr6N9TIXSlsXxCumNQzzmzfTwjasRUCQeCg6Wez1LGFwQdRtUFMjVVm1nUTgZimtqMb9ezKec1Kewo0ryivj5cfewBJRsD6fuU353+mKkWwvq7qdMKsYV/VghhpK/Ves0G6I4Cqdaf4p+NFQtqX7Pb+AQ9DRESPrt+h32wRRSNi4yjozriElgIUK9s7MeCT9Vu+3Gw8KVVlWQIEEoxxwDgOSGPEpt/oQmO02zGBOZyOyq1FjGeS+EIlCzI3kH1stdkxQmX+WduhvPLZimSZcdnqcL4c5v3rPhlEM7/b6Zvic53Pej11g+OGl4dGuBoaGl4msvGLBcGqSRflGi5Zfm/uCF84xmnqjbbUQUtKUy/5SkTrHEwemgQIkQpBEGXdDKFpBK7hBM45SHKaDSTSyCK5LZ0JFQrhCtXfRrz8c4LkRtrTa0oW15yk50S4piAGUhyxjxHHlMAdo9tsEbotXAFTuyLYeB9bz1x97bl45gXrt5P/DQBxHDAej6AU0TEjQEBxBITAnAv8HAAAIABJREFUApC1d3gSVLGpx4ZMUOdGjiw/svzkcymEy1NaiZaMsxnI3zGW9+QC7fw1fAY0wtXQ0PCyUKWATQhX1dSYJKknPPlrVCTLv3fGQ7Q2sB1WkOVG9WRM9SL1ah7bVFWz5SpUuf+Wq/BVQ2mP/T+Pc7zDuUNAdfBzjzZvCxAIa2Q7tyFIKCR/8tlkSwD4z1dEEWGMI45jtGArgbsOxAECEwvxHXkCcnqRs/A51iMCDMOA/X6PGCN2zNjttggEYIzQM6LpoSfHsigOo+V1kE9vqcV79Fqpvz+PcJmzpF7vnIDJE8Gzp9AiG18An+F6b2g4B41wNTQ0vDzUtVJ1OpcJYhQVwlQiDZ7+kx6nMGspYJJi/v5E1MIttOegXk+Wgaf8yw24PMJmZ302nNcryw1u+50vGT/nlIm3ZGZWwpEiZmMzTw06mQk8EENWhFk+facI471gtH5jMSWIqTJGFB6QBUKeXtl81Z+Oc4K+K/stAoSg4x7HEff3t9g/3INIsNttcXV5qRQrjiqAQlyRyce288hOzCPMMKJdqYSu7QLV5GrxPgHMEK6+KdAWAvN9fWrMT2234fPixIVqSXxfYyQNPzga4WpoaHhZoMKztJRGoD23XH0wglIyFTn9TDwyURmcS8Pb08PsAUyElCLiOEBMICOEMFWII8lNdaermoe82MiUphsRERCswTEHNdIoQIi11svIXRmh/90e/H8aZxxCml0dE1uX6jcrogVM0stWuc38NQEqifjYoNa+sLYMA9wBJnmfxgEyjuosAIN6vR3CIvwyxyMKe5942T02ytmWVPQCpOMXfS/FhMBAHO5xd/sHjsMdNgRc7Ta46ncI0RIjvebRBGweIyRiA1rs1wphCubdyNmB83q2Seqgk1ivyTMCLqOOCWW5Ui9mr5mrLMQqUoZCrCaGfl2jWnlghMqSqJdfHISyzI9M3Ja1VSWrgWpinh8gOOlRIKBy0lXvYXZNrzlO6lW7I+bU9tYEf37gc/YzoRGuhoaGFwV9VlorSqvfoJSgctFp9iP599LgW8nrkSo9KQlSGiGSTAIeMPm6iQEjs9ePjBqea0TEmi7I1uTYCRczUiZa6uXnNSW1hi+OR4/6PNxYkWKpUsuKQTYn3msrDc8cZb1ewnZ7gRACJEWACMPhARJHIHSI0a+nT68Xe04qq0cHF29WSAQIaX80bS5Npt6eEIc97m7+ibvbP0BpwOXuEq82F+jAKgNPqlOTSBAWhrRMNk4oWaBPgfMYqwXnpAxcCWvokZlRMpBEJdEe8ZqvjwhIrCIedr9PxBDyNUTrBz5PJep5qonkarPm2dz0ozZiXhey0Pm8RKjzwoVErbXfWKxn/W2q/lg6Klbu/WqhhbLqZIWYLNfwY6ARroaGhu8ai4dSTiG0YnkjW5ISRBIo122dIkIz48SXt8r9cRyRUgSASVPjpeLYGclBVTqiVEaVG12ljqvUhrQH7cvH1zqHAqDve2y3W3MQDLi/v8XxsMfmcosxZfv8k/Gc753zHQFD3Alh76WUQBhxd3eDm5uPGPd7XPYBr3YX2HQdZBis7I20ho4JRS3SVzwlXLax5wWHF2QlQWAkCevnV4RUBNMVV3IovkSyhM0PNKsFE3O2wJ07Pi/YKgRVanRObZwNoE0bDQ3fJRrhamho+K7xGOHyGi2SBIkW0Uqp6rtVolWr3kQnbjXMmPFeWx7ZCtZra3U958A80q56KBXJKkZV5d1eK+pveHH4audQAGLC69evsd1ucXt7j/3DHW5vPuDX7SVCx9n4f8bV+1mwdijEPP6JoOqDSHi4v8GH9//C/f1HdBC83l3gerMFxYRxOJgGBUM6hgRGMjLD9QZW7tFz9nt+vub3unjozgjPqtw4kxeDzbYqxekio5GtcmBK5MkdMwIQa7R7Tsps3cSzKP1aJC/nLjY0NHxLNMLV0NDwouA1W0qwvPGsRrbq9+c1EQvIivXJDBlHRCNcq2IZzxLKKN5orwPJhpNnHuVUpUa2Gj4Nemkyfn33Bq9eXeH+/h7H4wM+vP8Xrl+9xjZ0EIRnRrg+/VpcCzKtLVPdFgAEd7fv8ce//oqH2/foWPDr9TXeXv+Ci34LHhNSEgRmdYYco5ItBroQJk6RZ4fyVgdZL8IL0YzasWO7cVqWxJUsnVh5YSqVKBaxvk312HKNoI+Bp8NezeXktXy32YBODPhHwnOFjhoa/iQa4WpoaPjuUHuOmTm/TimBRcAW3RKJGt2KmlZIuQajsnqceK1FuObbHUeMFeFiJhPK8LSe8x7WGhkjTUMkgil1a5+fYM2OA1cphZ96hBq+N3xLkizQeqiLiwv813/9F96//4DjccT7P/6By6tr/Nb1CP0ORB3SrIbna407xikXsLtUA0LpiIf7D/jjb/8bdzd/oGfBu9dv8D/evMF114EFYA6qUWNKpO54YQrTNFyvbYLNIykBTDklmOaOEx/UrHl5XrZCkjRpjryGLM6wJlQhttd269dOnwlRFIuuUSzRbz9ufv6YIf75/MD6fhFB+85VRE1k2mH6B3Hu1M3rc02cvc5ZEWvT92M1bhWxTeM42cYiEmr/Pf10mJ6n1Vq6KuLZ8OOhEa6GhobvGv4Azak7Iiq5lqZRLe215WIZz3ho5bqtEtlinj4gzx3vJEpFltJIKpgBIiNaKA/Y2mvd0PCJ0GiJVkP9x3/+Bf/+45/47//+Xzge9/jHX/83mBi//8f/DWEV6KiNvdPX9adfl2tBpvo9ZqBnQCTieHjA3cc/8P6Pv+J49xEXfcDbV7/g9ze/4peLHboYp+uJyPd7EAazRrfm+zIOA6J9lwLn6FeOgtV7d+a95+ViRFgKMVQrXKxtNZ15+b3JSxPe8CzDMoZqHow2qLX5I88vMxXM+vv5pDSnj2NKjrE8dw0Nz0QjXA0NDS8CmXTlWq1UiFetSphk3aBZrnDxlnvBi1EmZsuca5wqpmlHSrCIza3NFuFyI4mh77fnesOfgF5pgu1ui//3//m/cNjv8X/++i/c393gj3/+HeAer97+Bzabbf7Os+oRzx7NFLXgpggwDkfsHz7g47//gduP/0I63OGy7/Af797i3etfcdHv0FWqod7VQQIBCGCPgBODiacOGdu35Ol+KSk3YdZaLyKEOQE7lVKozCwLWDxGUNbeXqsfJUzXPdc7TEIgodyIufpqnpvcr+TLTOYdm3uEAKKAHOWqB5pTEFdaW8z36ydzCMlJ0aWGhk9DI1wNDQ3fNQrR0p/yt5IuSnFKtmARrnmUazUNZPpADV0HriJc4kqI9TjOwLzuizyqxXUaYTGKsoe5Pd8bngECabqbNUx48+YN/uf/9z8xDoK///PfeP/+D9wdIt4NhN9++x3b7RZdF+yWeuqiy1b5J45omS6VTIY7pYjD4YiHuz9w++FvuL/9N1iOePvqCv/57h3e/vIGG9pYJMvuOydbsAw5QGXkUYhKvT1NB2Z0XZeJl6cXjra/yZRH808IS1JRHxsPCGWlQB/HGUdjXgs2J1y2/rKAvk6V0MZkXUQqUQ8ppyZH0UmjYD63ECFRKmnR843gPP/Uz0S4RKZz/s+07w1fDo1wNTQ0fFNMjJH8YLNUmgTApd9dlTBGSBy0H49Hs4BCsHLNwtRYmlfyE8QK1ut3Uv6eIIFIckE/UP9dfcsT+KlSE7Olc60FdxAKIPspZMtToZDTh9rDvWGBNWuYigeehPReACxttcPvv/9uER7BX//+dzzc/Qv/678POB4/4O2v73D96jX6zU5XwQEA6fJUEZnaaWG2fYK2kapcBXafltcJJtQHASOBSZDGI8Zhj5uPH/Dhw3vs7z8CcY/Liw1+f/cf+K/ffsP1docODBkiQBZdlqqG07dXHRONzczrrwTMBOZg39VWD648KmKd/FLU7zOp06ZSCvXlp3U7YsflEYpC/l/92cqyc1URwWKZWrV0Wm5Wou1Ub0qg81WZQuEnTd+vo1t1JMwjfFUkv94X/1pKU949meuqMX9l1PVagJHZfDwFlHyZmePgzKHO67bWoqEEjUjWb6wdC8mHk6pVtPn+Z0EjXA0NDd8My1QbybQG7sF2BcKUtKlrjKAYC4mS2YNUFn/YE7EyqLIBJxMvZu615faIbwPF/sgNM5cbzPUgCVDpaksfFAoQ6iy1h6A9dtRqrfja4kHe0PAoqqgvQAgIyIIIAiAJ/vLuHS43PS43jP/+699wN3zAX//7Az7+6xVev/0db97+BbvLV9jtriAUzL8hYCf/DA0Yo9xhQurTECnGLUG/w3Deosa5SMT+cI/j/hZ3N//G/c173N28ByPh8vIS7/7yO/7zP/4H3lxfoyMCjZomTMEbm+uWldQJgkjOTcz3ro7q0cOkPg9WZcDAk1SxGCOIgMCaeieSoE3HlWzlGjCLHDEnJbSoDW9jPfnvuJKJNn/jxH3uqX6TRrnIc6JzOFUyXJv7ULG0BCBVTp5qhaTjBXdG8Cx6xmSHXnSb7v1yxktYksZz9utLIVVjyZkOKK/zsTi9qvqZNHd+PZp66sTXSdlTG5qkmzf8TCD5ckncDQ0NDU9ibfoRZyHiZEtJlhjhojga4aoepK5E5Q/aKhWw2lh5yKWEJIIhRaSoqVjMjL7v8+JK9mRF3XBtypRCoJhVnIADmAMQAlLogdApoQtVLVcNom9mrzR83ygRBH9DozrqLEggMEgCRBIklrrGNA4gAHe3N/jbP/6B//P3f+KP9x/wcBhA3RZhe4lXr3/Fq9dvcXn1C3YXl6AugIgRiEEUNBVQVCmPiJAQEUn70zGZgl5MuQ9WHEcchj32x3vs9/d4uLvB8eEex8M9NoFwfbnDu7dv8O63d7i6vsZ206Mjyo4UilabGZORR8m/c6ovigphnVX3GNSXUUd1zOniiofMuTaqJltxLthhioiehujrZK/LBEyFfTqiRUqhpxk/ec4Z8z1bqOMZUaz3c82Qz3Vg8+3WkXb/u15ndcxozrxtvqoTDNgi9l8TYgRrInaRCVe5bnTIpyfYp0zipwhXkvLZY9uRKorYMhl+PjTC1dDQ8M2wSrjU1WxkJwHjCEhCihGSIjipUVZ7qilhScAWaUaYGFpjjBhMlZCI0HUdum4a9GesEK7HwJZSSAHoOoAZZIQLoYOEToUzQih1XHlc522i4edDfSU7RReJuf8cXI86EVK0+8WcFEFU0jqNAyRF3Nzd4f2HG/z9X3/gj5tb3B8jRlIHwcXlK1z/8hqbiytsNltstzv0/QaBOxAxyAkGAwh6P8aobRmGYcA4DDgejjgcDjge73E43mIcjuiYsd1s8OrqEr+/e4ff3r7F9dUlwqYDAiGA1EEyjqBkJCvq+DWNOBajubq/xUPD7mx58iBKIV1rRrNFypxwOeny9ENdROCNmmuy5XMHsaYyC9OCcM1xFuESKtH+6nuTZfjpz4ESJFtscxJpqQgXUS6BrQnGXOTDlwPK4Wf++klTjXA1vBS0lMKGhobvB55/72QreSPjZMaYPkynZKsyuDwFcK2SvXog1wZVSgld15V0wtl4Tg45PzcJCQwhRnDiZWqEnlo4UScsX2toeBKV+Qg2kiGScgRWkijZihFpGEukSAQhjmBzWrzdbPDLb7/i7fUFPt494I+bO/zr40fcPOyRHv6NP+7eYwSj6zbYbHqEboMQeoBVCZA4QChCEC2dT8cyDqV/XWBG1wGbjeDtL9f47e1v+PXNW1xfXeFit0PX9bZPltILIwNdD8Qh77DWQGqEye/3fN8TqubmK9HsGbJgRG2Ue8S7rkWyaBdZJC2EkAmYzhn6IzMjXozQ5flnZfuT1+eccyeUT+2XTCNcqwIPOe1y+vl0qYSSvEk6fRJNCAKoSre2sREo1yU1z31Dw9NoEa6GhoZvitqDrGl80HSiGAGJkBiVbFlqUZaDFzHdAPNw1jMZWU7idEMQkZwqFKMajSGE/LM0VtIjKYSVJ5SVWEnwuixC6DcQDlWT4x4SildcyGTiq5Scxrsa5hARJAIiBCxK6UlESVcSSByBmCAxIUVzSoxGtsZBidfo90sCEC16wYhE+HB7h/vhiLuHA24fHvBwjDjEhCFGjDEiWZQlimjQgAhCKjYTAiOEoKm4mw36vsfV9TVev36NN68vcX250UhZv0XoOmiunRntlpqW4GQqgSUZabFm5rWTxUgliSCNsThdUtJjgnUSlJunE+WUx0ePNZakYVnDExbOGldDJPbCNk159LREEZmkIJI3YNYVlpXPHD4a4ZqOZbXh7okxz6Nga8ug7jeIWXSLPSJj9aee+px/I6sjJilj/FoRnDz/lzdyhEukIuyGxfGZRb+eM25V0SxpqY9GMFfORcPPgxbhamho+GaoyRYAkzerDEQ3ukSqnlsljUiMdC0sj7rWoNpWjDF74iUlBA7ovbZqxTtdCvcL5g/mxGbUeNoVB6Qs/x6MWJHVnqBK3Wle4YbHkQ1BsVRCieZYKC0QaIyAkS4eRnVGeA1XdlTY8hIBiiZ0ISAGXm06bJlx3fX4yy+vLPU14BhHDGNEFGCI+luvXYaEAOq03rHfKtG6uLxE6Dp0fWepuYxQpbJlUHJrvrxFrmWoaWsEVl6W09o8GpUgCerEIMlCCSQEkmmtVb3dz+tTLuI6dQTMNjRdchZJrw3xSRNmj3ov5hleii/MdmWVGyxqTk/PM9obuUS+yMY/2TxXaxHoRWkknMh6gnm0r/r9veMpMvapOCdVtOHnRSNcDQ0N3xQTz7R5u7XHViw1HXWz41lka92aWBKluhDejQH30BNRaZI6W8/cYPPvugeYiCDEINJePh7xAgeQ12pVNVvkNRJlpPr+s49gw4+GqSNCJcyRxARkqjqn0SLAMYIGJVoisXye7ydgek9EUGRsmBECsCUChwDuOkQCZGPXcOhAoUMi6PUcAtD1QNdr36ouWK0i5RovqcafM/hQXd/kkhdkioDI9xCkGO4QW6fXaxIr+UICWEBRpo4YolxvuSZS8TmRI1WyjKz5DhcFxyqVOVkaZaV02HWdzhuLNOOVie05NUgzNXfQgsZhHt8TO2ECqL4/SOX5XV6eCIjVuWITMim655l0LXfh+5rpaoLo+PQxVn0Xn/X9hp8BjXA1NDR8M9TGSlZcq3puiUe0MtlKWaY6G49ei5FX6r+WhMtJFTOjDx1C8D5Yj6UNrhtvNekSSyOkQBXZMs+1ES+YIVr3u5kTrpWgXMNPiHnTVUDAZqxrqq2mDaqwxKh/+0+KoBQhUokF5BBwbVST1SkxuhBsGQJSArMbzqIhplTS0pg1+iRMRrLM2DZiZ92tALCl3+l9mCRVGXNKuMgU7Ty4o/VA1ueKTBXRWjlQXatFZNEtTx3TyrY8D1hqcmkQ/GXP0zx90SNEtbAGiFRl1SJe/v1J9KtOKXSCPOsTOElJW9mxehx5sZWarvUdmq7Tjx8syphEx6ltDv1Yw3oZumCQlOE/gu+NjCxq8Z47vppsrUQsGxoa4WpoaPgqcHOP/JUIiEwFULR3DRvR0lRCMa+w15+YLDTEXtoDzSyc4kGH5fTXWxMwab8d1uY14MDgbCyakTYzFQhVI1E3JsUK68lqtuB/m5eaGRQChEM2TNU7j8lAfbWM6euGnwzzNLFkUS0pDXo1YpUg42CRLY9wjUa6Siqh2D3jjXrzbUIE8V5dAJykKCWxq9Cbi7Ndz0wQITA6AAGQAAodKPRm/Ou9RMw52lFVKJm9TmAK+d4yqYW8FJXFQXXfqdyrzoiWpxLmcdpxYbFUZIt4uZPEfjIZlBI4mlXxlIhOtQkdz9xotkZU9fvMqHgV8twG6L2fDwRbPRdNIuruhNFJrex9jMciZGFOGpKg28gCFvWezF04yNsRqtYzmSx9a/Z/nlKn7IuEAE5KxNOM9HlaJ2DniDy0l9cgvo8okaSne1WdJo6Tz7mQTbLLUiBAhD1npmSqFkLJ7bSt/kxyA2zfRetJlsdL08NO5NwzE9TJRd3QYGiEq6Gh4aug+NjNIJFkZcb2ulIhzGmEYr1y4OIV9lBd8R5OfcEWHZvVJXSV6hhBDbHJs3G+2llqj5uKmWyRqrclctJFGg1wwkVAZEKgxw2M9lhuAJCvb9h1CanqF6OlEg4DxEUx0mgCGfaZwO4rKWl6Ri6Mh2AYhtxbKrdBmNSdmOUorNGtCAg0tRASAASQBGh7YLvmzSAt5OCx67zci/Orfnr7ZZeMrS8gR3uyl8IiRcJAFHAyQ97nEKAQsJQgwjYnSD7WJdVPidWcR5TzUv32PMHJMrVTRqZkLP9dEVCLgASe9ayazGkCkag90FDIBtGYa79ABASeKglifvilImf230rwZXnKqtlqUnM337/yZSf4ebLNP9W6CHoOZoRlDVRts2QayOzwFvESV4+sNgWKpR2AHvZKuEjqJf3c2PZs30qKbNnH1T5mVA5TpqptYm+YoRGuhoaGrwJ7HOe/9dkmyx+PbGVjycmRE7WVZ9mCgOnTr/Yiz8UuxNO0fEAnR29ky/trecpgCGBvZhyspoWKpDJZelRDwypITbxcvwggG7ZGIGQYITFBhlGl300Qg6KreFb3DZxkTe+JOI44Hg4YRjXaIarQ6fdlNphtTNXwLJXMLdKvfC0/YpAzsx43ClqnlIxcsB071mNCzBq1SCru4MS0ZFgqiVIFSNukbyQv8wTOSR1bW+ZE6hoRW3rnNO0aQJWWqMTLVRB5JsCRlV/9X65VWvMsre0HTRn744MtjrAqFTGH76ttiHiMU/J1uL4+j0T5LrnoUURKsSJZhXBNBilAZzNvJlrm+CqqkeY3g9fhmpMi30SFUPnx8/HlXcrs6ozroOGnRiNcDQ0NXw0TQwaYkS2U6FZy4Qw3Iv1hjtUH9CL9xNY9SduZ/Xa1tsl45mkr+WFaKQwyW6pg0BSaYM2Mg76mUKkSfsEakoYfAymn2lnE1/vPWVNhjFEjWzEq4fLGxrlFQjLJdCyiK25gj8OAcRyVqImgCwFdCKZ+OGuvW70QQhF8qbz5Xw21gVuYZCZ++fZkKtHxak4pRDSqZV3NNeJS4h7xFmDSLP0csmXfXx3zE8vIynvzlDnvC7isc/VUOAFqGfZqW/VyNWk61ZB5jjoy9dixqCm4pAhPMczkvKrd8/BaPpWPrVDsuo0JcRwxjhFjHHO/t5QiiFnl/nOtHC1OhUu1a9agWB0dtP7Qol5dR2A2ASWpSKsdt5IKTtPrMY+3zfAN56ERroaGhq+CkiBSoSZalaGUo0+eUuPGz5wg+brnD1rRB/UwaCNVZu0ZNEmfkmkKCrA0enzk4r+9RosDJFSiAYFNNMObG2dzEC2+1fAUBCiy5k62xgiJI2QcQWMCDRFsTY0Rx+KUSEbQJE3SnvK6zekwDAOGYUBKCSEEdF0RjKkWXnjus5PB7c9vEODK8GjIxNgFQGES0ZrMJWTvR0AoaqNgT7uksggEkKitIVZ3LztkzmVhp3aFpvux4kTKRCoTAABV/68kYs2oeRLBr8U5snAIFdGetTluNbblUSt9hfrX4vvi0SoX94edL1U3LF+22VCqeipfR8Xu9vsjhmHE8XjE8XicyOozM0IX0Pd9fp2je/X4ATAoHwf/LXaMUtK228fjiBBYywFZ0PeMEGZjrvd7LaVQD8L6wWloMDTC1fAkzjFIn9Pn5BwloHPW+70pHjWsI59Ljyy5NUeUDaQUtTaFcu2FEiL1wutPKYmgYlRV2/DtxHFAPB6t/gtIlNBzmHhjK/elr0BrYepxU+XlZ4JQALjTSFbXqQJhZ4qEFuECE3Lhfrs+G1YwbcpraVNpVKntUaNYYj8YR9DR+mrFMTc7BmQSoc1REHcPMENS0ujWcUAcR3Rdhz502HQ9QuhWHBgCLTikan3qwGDqNLoLLBwXFMJnudSXinqLBRbfEatTIgAI0IhKjM5kAQgoCEi6iqRazahFucWWyeqoHiHLKW8lup7FP+z4zMd8zmGQlBYEaPms1f0qX7LrpSYXLsoh0GvC12dzWYoRESqCwjNiVvcDK9PqlKyjel+qtMJapXXKRVI5VFHHR6jrzAhEfXUeyxw5jCP2hz0OhyMOx4Ro7QC6rkO32Wanmf/MCdYqSNsdAHppkMXVYtJjk1KCREJKEdFSbYcYs1Oi6zpV8fTjsUZYq/PS0PAUGuFq+FP4vE0lG354SJX6JDCl52Lg5B+LbOVem+aV1hQgTA1FTwmyB2EcNRLg/bb84UlzcnXGpavZJAQQQyhYGiFBLJ1QsgQ8wfQDdPUzJ3xDg2Mq3S1AimAzAGlMICdZgxOuCBwjkEat2UrR7gVX4hSIVBefIcWIYRhwOBwQY8wG62azQei6hcOiwAgAQVNnCUVlrg50EIrj40vhrJtHGyeL5agRoGqDQN5HEhPeIZMhtAiXZdpZqEsVDzVgaFEwAB4KU3JrioRf67nnTptnOjWZGYRgx0bnvGSeK2IyYSFNg37KmeqkdP7ZRP2vSl/M6YLJvkd6TgDrJUfmwGJCTAn7wwG3D/fYHw9ISRB4h67Tptpd16HvOzCH6X2DpwmOPl6m+6SciMGkaptBEpDMMeEpizFhiAlhjNhu9UvsarOYzu2T4/3kaBoaGuFq+ER8LoL1va2nRcq+EswTn4urUwKiemMle58Br7+oBTPyufY0ICC/XxeTj67EJgIGITCjC14+jaJi9sj4JvAeWxw0YtAFIHQQa3BMQQlY3di4XlW7qhpqzOtxyBt6xwiYIAYG7601AMMIGqPeI9YqISSgeCug9wpSxTIUcRg1sjWo574PwSJb6utHiouL1KNZuRcWeX+l8jN5D/j2UdxJhMZuYeJCpEQAsSbLBBCLzSFF2VF/SoomxWlUy4kDmXKqRuofI6yfB3Vfr7xzi4VW3rD5UdMN1TkkUl17fv2ZWqBQrFLofFOzucyPD6AEzceTTKFRfHwW4XLSRQSRCBHLbCC2TgKMlBL2+wfc7fd4OO4IYh4JAAAgAElEQVRVzCUE9Nsttv0V+m6DrrMehnnYJTImJ2fX5efW1s0+JbjSbOi0aT1z0GfIOGKMEXI4IKaEzUajXUpgGxqeh0a4Gj4Jn6tz/OdKF2yE6wVhYtx4+o6qTIm/Ni+sepaNaEEmBAv+4HXvNfT8paR1W9H6EQUutSrZQKivl7Uo19p1YBEuCq5MqAIZFAIoMEQ13z+5IL3h50Vt/HJMEGtcLOMAcsI1jKBxsGbHFSlwo3+i6qBWbn15J5OUD5ZO5ulRJDDRjSpK7Gth6HoACAicyRVKWlhOq1o6Gb4FfKzZ7gc0GuFziZCRBS5OFxEgcZkD/NiyqhmCpZqTlKSJiLUEq4jWWvTpszkTffVPqPmtHQxPKSXK/dSk+mxCuuxr87NYN2X2deU0QpbcpDmLcniaJco1JaSvdT8sHisJLBHjOGB/1KjWw3AEAmOz3WKz26HfbNDxhRK7vNtKsArHXwpknIM8WvG/CVz1o9v0WwiALmj9WIzRashGbLdbbDabZis0PBuNcDU8ilVyhamNmlO8PhHz9TwygJMhgrV+TJMv0TwRwj+d5Xydsw9tnn0e7OmmQsDFq+9KbGRNXRGrvkOe4uMRLlTeaF8nitEgEIyjKrEBahgEZoTQVcaXG1eVf9SZnLtkMyxqFSoJeFci9HquLJBBWc0we039VXs4/7TwGJRfAWai5uufIOAxAsMRNI6gYchEC+NYfke7VwCINQAvUQ9dpwpmRHiVCojQbzr0fdDIsdfbkEDSmL+rgYkqUmXrY0GOYpHX2bBd51wv++2nRR9S/RpwI984ofDUcePjz2mDAhJNLcuy8kkg9ncSFfEhAijZA8MdQlI7hADhpLHHWYQqTzX+sCGf0mSdt1ZKQHXKdI3JFpxJ+P7lJWaNfIk00lSNMeXUVL1+kghiHCFJkCQBYumJa3VK1diyY8s3LRpu80eskOB2/4C7hwMeDgeIEEK/w3Z3ge3uAtx1ALTZtpTDlP/3SJ36wJ6+8lYPaR5jOTzMbMSy0M/QddgQ4XgcMI4DhiGCaABzwGZTH4NCbhsaTqERroaMs6JFqxzoeR69k1OUFeBO3nqkYPXJFa8Qt8X8eM6+PyPi9rNMxE5/snEx+4DE/dBuqMQiAW9ES9N1tMdKNmhI7Q5vlqzrrEi0bSiOI8Y0IkpUskWM4KkvAt3WhGP7ii0tq/LYZyPU+22FAJhABoVQiBZr7xYx93+tPPaznPeGp+ESLAyPkHhD42hqhANw2GeCpaqE1sh4HDTF0EUcKsgjfxQ9Tb8egSKAUTX7RblnBTClOxQRBPP4O9ECq4ErFvGSLJwnRuY+95E7H9mIXvvMBSkAzywsn3lNjpEmTgIiLtHHoOvN6nYpISUgZKcQjKiVSBhE7BiJTWGSCaGnOIrY3FNFKD0KNBl7Fa3ycS53kKc1RZOJ1zEVApooJGbiIfkrvlkmaMQzAQJVwRRL1U4x5vHmnlaAHmATXSFJk+3FOOIwjviwH7A/DhAQdheX2G0v0XVbdNyBhDTwOuN19aGpxVoW+zXHird1+jUjlMbC3IVHJrYRuoQkSXuMjxHH4wBmRt931cr9PM5UPxsaZmiEq+FFYUFo5g+hRdqY/jeNyhEWca+z0zUa/hTqlMLV9EIPQVXkygkTigEzB0H7qLjB2JEWRgOwnl6yJMz5nFtUKn/saYMMhK7qtWUCGZ5aaPVdTtbmvb4aGgjIhmcd1UUckWIqka0YkVwgI46g6P21YrkHntqOC8ZElZefK9I9jtpNkleWo7gwxwM4AGR1jLQS5XgBWBCaWvABmASKpil0Fm2RBIqw2reKYDnpcgJGASwqOc5ebyfOsZz41rFPZEI3Hd/p4zxvh7GGx0QenlwvIYtUuPpe9M4FHhUzqXZdfqpaqVHBZNtmpCS43x9wc3+Pu1HAocfu4gJXl9fo+11xWH2TZ6zH3wrU6cboOpWeH+SImLS1gqv0h8BVMO90RVlDQyNcDS8KJwnX+rcmDyZazq9rb6xs++mlJukUDUs4cZoYKcVQyZ+jCAtQKk0y69qJeWerjhmBuSJqqDJE1j2ieQH2SABb2ouRqhCA3lIIQ6jIV1BPOBvRqmpZGtlqqJEjThapUrKVMrHStEF7f4za7Hgcc+RX3FmQ17QOEUE0VcJambNW53wsLW06YHc+UP47p9Ry9dkLw2P7PSdWAPI8s+yjp5E9SVQ9DMxRlOvhjFCJ9fTiMscRkNUPCXEyHxFkQYzOPconSdcssndu/fQaYZ82VMbKMiWylyQhQp0A++MB9/sH3B+PSLzF5eU1rq+vEcLGLm/v3bXqAviimCsZ6jBsPMwI1ENiQrKmy5pdHkDULcRGGhqeQiNcDQ3nQk4/CM56ULw8e+XzwYhQkYafRrNqkBsxVXTrKSxk38sH+uMu2moonkriBCqJevSFCWTkSnJqodVxcWffq/vLNLLVMAXB2hqYumCJcCnhonEEhgE4HiFGtGQcc3qty7+rwfx08+yUEo6HQ25u3HWdCl6w9os7zzFl94QRKyKV7QZZhMuJ1w92meceU2s1UlUUB/C5AdO5i2dOoypK70IbIpV6n5CVVdXnRHSOKS/1Ojl53p53MhZz6Qqx0rfL+8yaHFmrbPoyZTmLbgGIkjAkwX444uP9HYYxgkKH6+tfcHGhka2UtD6OvH6MVk/DF8TS++rXQ91rrO97DOPBHBupNJV2rJQtNDTM0QjXT46JRPHaA2duBH/m7c5RG69nmQhn1HQtxryaC3/Gpj5XvsNPUAtWK2up2pcJYCT12stYPP2UJAtnaGYfmYdUH97BJIQp2TpJI1nJ6gnIi7lruXczdJ+EpxF6XQqUWEnHQOhzCiF6TafytCoVYmF4T54XdmoavjAmTY0tAgJvVpxJ1gAZRtB4BAbrsTWMph4Y4e0QrKJwPYrBDEAwHgcchyPGwxFxHFWRkBg9ByV8g4pkCCHX3mRBCaYs3ADAIg3uYCh1i8lSaMn7zmEtuvFyMUlnm93UE1pErOS39ufININC0qh9q2YtLiYy8qn6OxM0D5pZhI24InIVIZRK6GMtwDJ7dogsEujPOm/TfnEAc3/Wd5NoHVsC4RgjHoYRD0MEmHF1eY3rV78CxBhGJ2zWegOoSOmTu+TvntyHZYRuZSHLVJis1eofzTrKKp/jqFGu4/GIzabP+/sl74PPpQzd8O3RCFdDA3CGJ/Gc6f0R3rYghY8t+GNh7gnlKp0QllIodbQLMHELqaJgQJJUol1W9RzHEaN584moyL9bWqH2EjoDZNEtUu+9eN1Wx9bcOEAshVDTqqBki8KpvpsNPyEmRqoIJA6QGEFD1LTCwVIHhwjO/bZGUIqgFJGiiWqITBw8S5MZZtQnDMOA4Tjk+q2u67DZbnPtTV4eT89hKhQT7B7w691EYrJTwhPsPpPz6XvCyoQxT/PzYyBkt7+owp8fac1MDlrT41LyopEyqSNgVaoh4DV69W9VivS5cWp0W0ROCAlp5gisUiOf2LUFEXnywHwKioJgjKLS7/cPGIVwcXGFi+tXOnfiCSL0tYNFZxW5lWjXVDK/CWU0nI9GuBp+fJz1NDljobOI0nwBwex5+COaKo+i7jeU+7+kad+tup5LIJPIFBFBoqldAUBKSDEiHlUC3iWCA7mIBSpD5mnkaBkzKDCIraFxZ322Oo92GSEjKsaCWVg/AW9uOBO1UZybGlt0AylOpd6Pg0a6opEu0botdkEG1D+cI1010hgxDkNOJdTmxh22mw36rveBTAe54vsBLFpl0SvJLRA6VeUM+p5U9Vs/y3W/iCTQ5JeJougfeUnuVBQjR6dQarlyrVfSSLkUkgVfPKcrwgQGZ8TM50kPjFXnWAN1Zcw6vtMRks/VzxIoUdNxHPBwOGCICWGzw/biCrzZIUmpivN9ri+or31tyRkblVRHsaZ1bHmZz3gMG35MNMLV0ACcH746udwieWPxnpyxnh8hZaA02CzESlLSVBtTYZsKZwCQZCka5RnIfiySCgOMxwGjiQMwswoEmEKhk7Wzj14mXVqjRZ3LwJfmxrmOharvfMo2Gn4aTEQFREDRUl89kjUOFtkaVBwjDlrLJcmM8bofUCFdaxGucRiw3+8xHE0oowvanLXfnBGxL1ZuTg00wsWh0zpFV+WkAKKQozvAz3Ptr83DNdnCNBvNIJYMKjk1jchSnr3+i6pUzirlr6i0Qi+FeeqhLespp0rIUrXlFUQ5LazxmSDGXmKKeDgccDgOADO2FxfYXVwiuZrrfDw16QQQvtLzz8nWk5FfIJ8DIrJSzKqGK5+eL3OQfwRboEHRCNdPjoU07tfa7sQPV3las7tLFp65uY/3s454MVmuTJ6LRZbeY1k0hqTFflJ6osmIreelpR26aeivSv1JAklEgnr8KUVIihBJEIlgEUCiqbElW16y1ziD1ICJKWKMY75muy6g32xUVbCukQCQDZHc1LgylZxouRCGkSyPaFEIllZo/bb8POYawy9yGBteFBJK4l8hSWwtDhAjcNyr7PtxAB2tTsvruMZRlxGXfre7KDsb1JovM2W5trWO5IDD4WAiGQGbbY9+04M6hsS0Mqf7/Uggr0FMBAQCUafRW+og3IFCB4QO0gVrg0AW2LWkwp/0BlidmheHohDZXHtFsMZWgBIyrb+bzFdrf+duyeU3oRAo8ibW1fcmES8A2khrSg7mY/b07qfweOZd6cMmFJCYsB8G3B8OOAwDNrsrXOyusOm2iHJeiof3ln58i1DxkWpMIvPdOn2NekLEqSWFCBppDlBdQzK1SoD9XGJ2jOfrOG9IZ435rDTIn/MW/a7RCFfDRDb4S2G+bp69XmSUezpGvQwtlzyn9mr5lbUUi5Vlnhzjyno8vWP+NF7xgGqRsH8mZTk/F9WTMYtPzMfyHRo9uUGxJBUMMI89W6NXb26M/NsIF7TZMUmVAuM7zKqMpWRLyRqx9kEJXbCaheq4Zy+xe37JSJdHqiw1qg9qUHad1mpZVEs6b26saYSyaGr8lQ5mw3cMjTolxCwrzdDSHIqSJd5xPIJGJVw4VimF4wiksXI02DpFCY2skqUCgoCZsN10GuntAjbbDTgQIAlifZ6mxMgaLpMSOcr3TGcKhOW3hFLTKEENTr8F9OfnvQmW/GotCkaThYsoif4nUs35cCJXOSH9uSCT1cxIGUApVNePvVmnZANA8DnZxTZWOEFKT5akCmCOp5X9rJ5b4ICYEh6OB+zHI4QEXejQ8wYUCSyEtMK55s/2tBjgEt1KaOo5Fsyp6J/uHls2vABCYOrAoMIME0BnKH2sberUvbQaYz3D7lke45/3nv1e0AhXw8vBC4j60PxpRvMJ3R+27vmsvNfuCSXkdBTtz7Lc6TUH17ecUGuH5MI4qMnrrJ5LPGUq86WVh5QUJbY4qlR2CAF93yN4ZKvaZk63McMyj2gicU1ao1KlEObeW5ZapTyNJh799tBqcIg5CFQ8Qe97iaWnFo0jZByUZA2jpg6OQ06nhUnFE6ZCG8Dpaa7rOgRmxM4e4V6DZZEKbxA+m3owuR/gDgjS6z2LZdi8FFjrcWye+pFUCb81Th5HwapjZxFZI148DIjnhr86swrbWnE4ptNG/9oiuV2Bk3gKSOOIw/GIcRxBxOAugAIjydrs/kIggCRNDxZJ9qiWrL4LCOSsLtTT02VP+GeN50msOKfP7b/W8OXQCFdDw2eEIE1ek9D0eShASmwTW5l9F+knNSF7JOWzSmIo6/iGKETLd6GQK/HIVa7Xqv52yWT3FM6eCylGxHFEGjUi5hK9wb3wMVbBLbEhTKNSgiIKkBsYd5o2+HhTY0ZratzwKBIAkKZjwdoWxAgaRoj9pOMAGqMSrmE0Cfg6rVZrFgHk2q+5uuAa1OtOeg8AxbkgwEShszKyxGxzctJl94ewKdu5w8GJVnY80MT4b/fB50F9HBdp/YSlV22uLgGsGN6V+Z6dWP6sgV2rK4a3i3M8B1RHZLV1QIwRY0wIXQCHAGZt7SEcvnef6QICQYojYhyRUgSRtiphIN/Ha1i9T2YOWDcDnsLzbjdaOmXlNLVr9/aXRSNcDQ2fE/NciLUJVSKmnmZUf1dpEpNUjWVtWJW4YutdGc9Xmj+rON0USbK0cW7imsmWSSZ7VEpktjZbp0W0tGA5oQuMvusyGa2X89/ETpoAGOlNgcHcgTqLcnl0y0UymFtT44bzINbU2EkSxPpsWW+5YYQMJohhghkqkmES8Ea21Eu+Egk+cb0JMI04uZgC/Otr4QgA0JSurBxOnNNnKWgqoTBNI105emFp0C8g0+B7x/z85ObL0zeXr+d1zXWz5BXoqdIUbqnyCRfz9DwqtrKe1X5eQDVPasog21wqlp1Bdi3FZJt5YdcOCRBjzNGtjhmdBYbFmpkT6TPmyaNYeG956ws+V9YyHBcc7IWdi5eORrgaMs65+deWeFbt16pBcOKBUy3n20ynmtsCC4/xvIs8rTzI5sXH52Eec1ofH5EW2T5WL43KkMqUKqYpAZtFX0BUcvcnqYqzEa7Wr/35WdcfyJroLiW1UpBl4CUmcEwT8pWipghyWQkmV5moNzEwQYhBnaZgzGvsptLIpU+NEAGBAArgbmNRrD5HuCRYk1f/CXVk67nexYYfHkZeIKJCMDEVcnU8WM3WEXI8Ksk6FtKlHvFqriBT1iS/xVXNk5iykyHGWAlkaHR3s9notZv0niGpIlH1veGv2ZmWXePcAX0P6jfAZgNsek2xtR9izkYkAUshm4azcdazdVFIvLrQdBGakqB8riuw6PmufXqfinO/KkkQU8Jo4kboOsRkyrPeZDtNn5NO1upH2WK9q5G8qTdzNQvkDJNi/kwkIjBrvVZKgo6BOB4xDAcEAjabHhw0swIkpf4sTR2gfv/W20mzbWnE7OmUdXHl3XyAsLw2TtR8PrbuRcD0E2ye5oT8dDTC1fCicU4/kVMkYxpd+TOQs55lJ1O9a1dUDoTVnm8CKJlc+SOEsWztqxhJeRNSDTenFCKnDYpoXyIx/ui7ar2OpzG7ynsPotzodREcnI8lp0ppahQoqCe4sybGWZmQNaWwamqs/62kYzQ0GHw+oQR1hERrajxGVR8chiyWwWMEoolVpNLUWOobZcWY1LlE2U4aI/b7PQ77PWKM6PoOV5dXWUZeUlL59jo6XiEbtCAkMnVCruoVg0e0tNm3BAYbORO/1z7H9NjwaThrDloKWTyi/3t6VSfzzc4YDidwF0zkKIFSwjCOSJLArJLq81yN8nymtSDeV4ePgS0MfDwcMByPkDGCO0YfGJ2l2ap45/qBea5N8VnEyyT/V9AI0jdHI1wNLxrrXi158nXtUZoXq/95LB9/yyVOROU8XcnJUv0UyoSLkMQJVzXpE4HcFe0G09d4gEkhTeU9ydEsr+Py/p91SuHCe+rEyomW77cdh8faGEyUBD1Nij2S1QFdZ2SrKwIBgQEyEY2abH2CndLw86CkvwKIAsSENEbIOIKGAXw8aoRrULEMGUZAotZxmQGqNZl2TxTvRN5GJk4iiGnEMBwwDgfEqBLgnGuqlGypE4NWi/andUEmB+8KnOy1ix3EBGRURMaaffPXcdY0/AmspIlNCQ2dZWefFb08kwCGEND1vQplpIRxHBFTQuhtLn/k8ZeVG9fW+pWvQ3/cxhixP+yRhiNAgi4EBGYQSXEsPnXw6swLIAvI1+/Vv4E15y9N/1wm0iyx9txfKXc4xzRokazPh0a4Gl40nhPhWqZuPCd98IkxTda19GCfs6nkKY+gxfiI1FMtiEUcApY66SSFoMrrs139qpOnGY11zVYtliHzB4Atn8aIYRiQLDe+6zqVfyc+PX4nXRzUi98FI1rThsY5wuXL07wzXENDQV0fqAQHQEyQmJDGpPVZFt2iYdR0Qu+zlVL5qe+BHNZdSTsGICliOBywf3jA8XhESgmbzQYX2w36vptGtulxzzhV13i5P8giXKXBd27+7ZEveqaCWsNXg2cH1G/QfIFzLOtzSNlZAyJwCLi6usTuZof7/QH74YCH/R6h30L7WC0xf759S6SkT4Jh1DTecRjBEGz7Hpu+02dUjFUKsLd4me7bYzV5872bvF55LhLT5POzTsRahGtlkZOXRSNbnxWNcDV8GmaeEw/ETHDGM1osRaz+ChHleWKZKOELPr3yeaogUE1YUpZRImPSzF4MXBUF56jKdOOPjKmMzdN3fEdoEWJSI2ltGpP5izq1ME+g6skmSpab71Eu3Z86GkRe9G7vrabJnTmh1iahe+kWR0f84U+T2dxFMwDJBqt6+82blySfV0mCcYwYx4iUIgCVwNaVV3mI1QgEQLL91VQotl5CPajrtM9Wx0DXqSKbCQMQh7L7dk3I5AJo+Jnhl4KKEZI27raUWCVQR1CM4PGYa7ZoOIKGA9J4LGmGfn1LfVPof5TniBo6R8QYMeyPGPZHCAR91+Nid4Ht7kIjt3lpMr+OqxNW85274W0OJCETjOm1D10fIOaQoNBZWiFn54MayDM5+HZvfDcgWjxdvvn5ISJcXV1ju7vA7f0Bx8MBt7cf0G96bPsLALySBu8RI6/NWt4T80dVmqVUlFYgM0j5Q4/PNOpEwjZud6qoiuh42GPYP0DSiA0Tdn2HPjBE0kz3igDiOd86DaqSEc/xwpoz9bxsnJVlZg/t3NLiFB69ntpE8KlohKvhSaxGkBb32TJidM56FrTDxA7EZobwBHN7zPOyth03Tqi2dSzKsohu+evZxKaerMXGClHIqYlcDCvxz6dfXBhYTgynS9ln9av6PU1L0py8QrzKA4CMuFYebUHpqwPocRaC0FSqd+Fxo+lcnaBewJrPAUZsE4pX38cq6t2XFAGJSCmByc7LMOj+p6TpWTFiGAfEFMFEmsIR2Ai4N3OVMn7zxCdU0tYcIGEDCRtwF8C9NjamLgCs5Ax1/dvslDY0+AUf4XaOC8FEbWycRiAOwDiArWYLw7HUcJn0O8eIXMc4I1uTbc22ncaIw36P4/6IFAWh77Dd7LDpt5oWmD0gdi9LApDMkFUD0D8XMgcXBxBZg+MuIHYdkqURUteBmSHESAg6bySYgMBZZlnDN8JZc9ZXnNeICLuLC7y6+gU3Nw8YxoT9/S32ux22r3uI9ABUxZBgvoAJ91onTnOzQh0h88jYis1QP6PInR7+wwi+OXGyNeB4eMB+fweRiJ4Zl9sL9IERXH0x+TP76QMrMxuijPPEzj2+woroTT4458uLxU6NX52kq57axreegUa4Gn4+1F6xuXjGvLar+gqvpCIu1y3nT55PjvEcj1cqT4oJ2bLf9iMMM8I0bU5my1GldKXp6FNvNmHqCSMouaqPRvHdk6lRsUW2knrMgyszCkS0RwtLApFkiWoZRwxxQIqD7lrXoe+6kiKfPAVQkMjOnYliMKn8MJsCoYQOYhLwuf8Wm5e0qvVqaHgU2bckRbDFGxvHERhHa2ps8u+D9tuSOGpvuJTMqHRnzJqs9nK+EADH4xH39/eIMSKEgO1mg912q9FeW9disNkt4h4Sd8Lota/R3S6n1XKndY0IWutIpISrVkxrKUUNnwRxZb8Ob16/xs3NLT7c3GI4HHB38xEX2x22u42lvJvi7Fo97mK163W7p8ez8p38fJRK2VPTBIfhgGHY43h4QIoDdrsNrrYX2HQBgbU1iYhATEZ/Ug8+20yy+soazFz25TtKo2z4OmiEq+Gng8DSggyPTXZr3qn553VtBwQlQ/1PTqBn1ZTJWKI0mTFR9duENZJFn+AEBWZg6d9SydmqnbbyAFzYdyl70b34X0SLjMfhiDSOGI8HYIxI44gYI5BGkGhPGBYVR9swIyRBTAOO8QiJg5KwjtH3AdybN9+ljS2lUrmXkimy/lpaf2IGZOiVcLkwBjtZQ05dbQ+5hidBft1rBJai9tiScQSNI+Q4VqqEA8j+ltGbGwvY0mKfrBN95O1gDWO7vsPWyZYbamvrIvfBGPHy2kTSlgrgAPSdphN2PdB14K6DdAFs9wgR5zmk3R8Nnw5NzSYiXF5c4Ld375BiwoebG+zvbvCBA16/3WKz3UFbHmhyA9EsijprJvxcsjVpL0YW0anS/AlAIMEwjDgcHlSg5ngAELHbbnF9eYndZguqaorXx3Te+Hwdc+cu8xn1yQ0vHo1wNfx8kCpFzic5mwBz3deqd3dq5KSUcp+t/D14g9Bq3Z88vvNEPMiWnX+3GGVezEtaR2LpRsRWPxd0n1azE2j+Rh0WBEgI4zDifr/H/f0DHvZ73Jt87mG/x3g8Ig4jUoqI42j9thICJYASegrombEJjI45FyTvmLALjNBvtG8WB1OFqwgXLMLlBIsZ3PWWShiyQIb216Ic3arzQk+nUjT87MgNuy3CpZEtq8saI2gcNKp1jEWR0HpxicQc2XrqXl4mHAMUArYXF+g3m5Ju3KkrR1J6/MpNdo0nsltFxXUScWlA660Q+qpNAneaZugefBRjsBmBDZ8GVj9cEnTM+O3tG6Q4YBwOOOwPuP3wbwwx4M2bX3FxdQVmrRFcBKISUD9zPst1mJ2S/h9BJOHhcI/9fo/heABSQgiE3fYCr66v0IWgLR3sme52gT/7J72x5kUBK2P2qNc8kya/d3aNVsNLRCNcDZ+Esya+Z86Nc/LyZ21inxyfnL7mNVh4Yh9nSmVrEa4EmaxjTtxERL1uXhfxiLeaQ8jEazWdQsTqNsrXF02cBXCPo3Dx7omY695/E5lMtKVXiPZQ8doNHXNCjAnDEHFze4uPN7e4ub3D3f0DHh72uD/sMdTiACmBvQrPj5NEiIyQmIAU7SeBoA/n7abHZcd4c7nFu1/f4perHj0FbEIHRvG+U4AWKDOBuh7c95qWwrXamka6MumdF5w1NMyQ7zUUQk5i12qMSqiGETQmFck4HJEOR8jhCBoG0DioUIa4/Hus0hIfn85EZnNE1GaoIQRrgH/PbZgAACAASURBVOxzBeqbfbIOstRBH7/AXhMBgREsoiUdm4hMBwlKuLJzgrQ5LnO7TxrOR/0c5DpSJYLAAb+/fYsggr//7W+4vXvA/vYD3scR43GPq+tX6DdbaGNm9kw/MNPksVg/B/P1ScvPpgPTZuC+nhDIHChAkojj8Yjj8YB4vFclQiLsdltcXV5g1/cInfW2g4C4PKedaE22t+I5OScl15eplURztkl+jk9r2urj/dT6nxcVXKY3r/K//5+9d22SJLmuxM71R0RmVvW7p2cGAwwwABYEdrnaFU1rWmkpmUn/YE3f9Rv1XbZmWq0ZSZFc7YokCILkgAAGMz3T08/qqnxEuPvVh3vdwyMy6zE9PYN+xLHOrqp8REZERrr7uffcc+lrL8/eSsyEa8YrgzrV/qI27S/T3v0ylEVRPQAm+b2OZI1ueUapBtPzCdXFxzKV+R3KeGkcTTJEVL2O1DPeKOlKIk/M/Xfy3kRO6Lc7rJ+f4smTZ3j2/BTPz9bYbHfooxBD4xz88jqOmgbeNWjaBt42em7UWpo1Ixg7xBDQdR1i32N9+hyh79Dtdni+3oDCBg+enGD56AS3rt3ArevXcffmTdw4PoaBEbONxgmBJKvOg1qXUvcXMiYHMWeiNeOrIcsIVUoohi5CuihErduSmi0TIjho4+MoNvCEKFHxnEq/6GtcRczlT1145RYPgAYxJq8zwHjJMzRKlm0KgSoNjp0DOV/60cE6qa3U7G9pcDwvpGZ8HZTMFCO7ADsi3L55A40BHj16jEfPNujWz3DSbdBv11gdX4NvV3C+kYAZDrcjyHNkSmoYlQ0kMKmNqsCFHAEpRTAn9KHHZnOGrt8hxQiLgOViiaPVCsu2hbNaEwwAiUcZ3xeuJcOwn6P9q4nTgYBufdzDiYBkrCfSxBmvPmbCNeOVwf6g9mqn1usMkP4CApfF0+gx5MUUhsNi3s/qHcD5AyqPVkfTSYoAsVnLpKPUepEUUGl9V6lvsrriYrGk3vZrPH7yBE8fP8XzZ6dYr7diPG0dmtV1HLUrLFZHWKyW8L6BRc6SGRAsjHESaS+JL8nKiS08gyH1Xn3XYX12ipOTZ9icPsX29AmePX+OBydf4PjRU7xz+xneu3Mb775zF9eOj2CdhSGjVtZiZ03Og406LlJeQPIgqZwx46uAk3xXkhAqkREGcN+DugDuJKvFvdRzZSkh1InTgAFKl6uD2CBxwm67Rd/3ICJ479E0ErA4/3XlP4WMLaQGGTBm6K9lHYz3gPdA04C81G0Nveis1HhhJlszviZSjjBosEKJlzMG169dgyOCoac4W2+x3W2wPumwXZ/CL1ZYro6xWB0J8VJ5a85oHcp2SeZprCapHyeWy5tTRNf16LqtmGKEHikGWGexaByOliusVkss2gVsztCJFa+a3gwZtb3s01cETQgXqvm/GHJMlTMHUNSRM+l6rUD8baYEZrwdmDa0PYAL6xqyPGFSOKsPfuXtZn14yQip9G0UH75KzRQPg+N0kMuSQqP7mLc3ilzrz2zYwUpsDr33NDO2vy8MTkOdSHUk41+z1EHJnvAt3aYxYLIASa8qJkJIEdu+w5OTZ3j45BEeP3mCbhvgXYvFcoVrN27BtQs0iyPYdil1UzDCI2MCa50VYFS+OAQ9R+VlqlUwhmBIJB6xj+i6M6xPH+Lxo4d4/OXnOH32GI1JuLb0+OC9e/jB9z/E3dt30LYLkPMlIgrrwFlCRWodT4M07PwP9eKHZ7w9qBdqpHbuSAGp74VM7TpgKz23eLeD3XXgvhOZYezBQezgCQymtJ+CPviewHYXcHp6iq7rYIzBarXCarWC9x6Ajh3TMXUv6k1ShwWInNa50msLbQMsW6DxQNMK8fIeyVok50HGwZAuamlQO8+YcRWMsjEh3xe1b10COCHFIKZJALa7Huv1VtQS6w12gcHGwfoGvl3Ctwv4dgljLLz3cNqyIAc4SzCWWOeTgayklBBjlHk1BqRuixQjQugRUwAzw3uLxbLFcrFE03ocL1sNEkI7j5ihvQnyhBVQRQ4PzNlX++IcmsvPa5B8Edkqaxp97qHWDVcr/9hX1oz+JIAPSYyJxKhqxlfCTLhmvHzsRV8PPOXgc2QgzY/ReQNOdb8ZbYYPbpeBYVv58XFyqCy0LkYaTS7AEGHKB2WmK/jp4JzfV++PMY7MN8pxTaWIWY5Ilfwgy5aq9xq/NyHpHuX+I7mPGinZIkNgI9mi9a7D0+enePDoCR49e4r1rkOzWuH4+CauHd3C6vgYi8UKMTECA8Y6MICQRLufW5xUH8egqGJx1M7eHXmcH5WksIhJwBGh2+Hk6VM8fnAfD7/4BOuzRzDY4L33buNnP/kDfPjB97E8vgbWRq5kpVnrMBFNJpxDn+1MtmYARfIqUXm1cY9iAc+hB0KQrNZuC97uwLsO6DrY3UZ7cWldYiZpSJpMPqwnZIZ875jRdR1OT8+w3e7ADLRtg+Nr17BoFyqT0oBNDmLsQcPu2YWQSMiWd4D34KYBtx7UNqBmATQLfVz6cbGz8v2vvitzsHzGIdQz1NDTsiIhADhGzQwnUIoSXOQEjuJWK2t3RmJCiAHbLmCz3eL0TEyXQghIZADXwjgH5zyss6JqyO0LjJFAXZUNkvgdI/FAuJLug7VGmi43DRaLFovlAovFQlqOKGHjlDQISzI3JqhBjQZKUz9SpnCqJ7scqbjKF2d/zZP3Yfibxs88VFclT60CuebS+ewgAbuEcAGHCReRBDlnfDXMZ2zGyweV/y4A7z1nbJZBmOa35G4lOLmuYaR9Hj2zwKg86FBvrfzs0g/xwj0ennCw1uxAJHo/elXtH/MoalfIHEvj0zpDky2ii717vmWiVuSC9f4aMDkwR5iUQBx10CVwTEhEIBj0aYfTkzUePnmGR89O8XzdwTZL3Ll3D9du3EKzvA5rF7DGIkCDgISiujIqEczHNcguMrkcslv1Y2W3hzlbzkN0IONw+/YKx8vbOD66hfuf/QMePfon/Pb+fWy6LTa7gJ/85KdYro6LGyGV9+b9y29eRM7IkP7ZJeMrtwTDGuThBCRIo+4QQH0Agvba6jqRE4YOiFup20riSghwCRxcFMbM403oAzbrDbpuByChaTyWywXaxoEoFbI1aJkiMuni8rUfrnoYlii7I7C3cmuEVJGxMNYBxouzJwk5I43gs9aEzV+TGedBBYLl+iWVC5IO3gQGpyB1zEmja0mCF5QYNuqk4QiGEzwRrHdYuRWOG4fNxqLrOqQErFNE4ojUbRF3CTuwGFLpHEhE8GwlRKsTCxkDYy2sc2gaB2s92raB9x5t28J7D2utyhSrxuASARmNByLQICRVwhjYsoaQr8owcsi//S/94QzTdGDgvbFiP+F1YDuZHI5rCuqtIk02dNB6vp6Iq7XU6P0vy67PuDJmwjXjlcFVUuAHmwzqQHGh2QZluwreG/MKVbgKR3wZ4PHgXNeC8cA8RnruwYGw2hGth8qFwfkY6x02lHRSlNoSmFwXYsBI2HUBT9dn+PzBl3j6/AzJeKyu3cS1m3dw/dZt2KZFYgOwRUqsrb9oGHMvIKpV4m947gXPyb8nYuGRRHCLJd777odwLcCmx4MHv8XnXzxF6v8OxjX4yU9+isVigfGHN08IM66OHBSgvEBMCYgMznVZvfbY6nptatyDYq/1WkqMqqBP2R5wuO8qEUIIWK/X2G42YLA0N25bLBbtAXnQJG2c95qqm5FaLBiS2i11IiTnwM6DvJf7rBm/rtq/+Vsz4yLk64MSdMBOQ4AiJjAky5tYvkOcpN9l/l4VlYnWRmWSZoyRpt7GIC4WSCBcJ4uYGH0M6DkhxIiIpD3lZG+88UPD+0y2vEfTNqUGsiZY5xlfnCfzK/cXlqnHDpbAJ+cVhShbmA6UQLxiOK984bJSjRkvBzPhmvHK4KqFn4dce3DBol5qiTKJGWeqAA1WEa5ScvFykPXuldPQaH9KofBhpyLWiQoaSazliKNzQwyrEieo5l2s2YFkHDa7Hg+fPsf9pyc4Xa9h/RI3bt3Fjdt34doVjPMIDBBn2cP+ZHXgsA7ex2UlOs1qDj+ZgYQEJgacRUwAJ4azDrfvfRemcWDb4sH9f8LnXz4G/uZvsTq6ho8++gh2LjyZ8aJgiPCWJRovC8gozY17rdPadUAv2S0OvZCxmAmXEqIcCa4SrIeGlJQSttstNpsNQoywLpOtxbi5sSL3A8tMLsc4iLTdA2ljbytGGfDS2Jh8A/gGaIRwiTuhGmWYimzNTGvGFTAkdXioz0pKttQBMKmsllMqjr2UuLyWgCLfAwathgXBqIsmAzC+Ldd50jhjMhjkbUQwphGi5UT9kc2fcgbsvLlqet/589mEmAFgA20uns+F9rREZa5Rvf5VwqXGXK/Y/r6JmAnXjNcKI+v4HHrKerVzyYBmt6rHx1JASBD528hwMc4lUfXvqcpqHXoe68SX678ORq44L8wAa1ij3wYRwK7v8ODRI3z65VNs2KM9uokbt+7i5u27MK5BAiHCgMnIqY3Y25f945rcVZEt0dnTwcVd/TqGTKqcRGphLCESAHhcv/0dfJctTk/PcBY+w+cPHuGv/ubnuHbjGt599x5UFzVKAsyYsYcD8RqUuAQPMqiQSVcA+h7oO1DfwSrZ4qTZLY3g13Wg58V/clH/ZrNB3/cwxsAZi2W7QNu0kgk477rNwx3KWk9rKSTDxWr/birrdzgPckLA4Ly2TjCl3qSQtzyEfs1TO+PNBeUsMFQ1od+T3KdOWijE8fdBx/FySZ+jQqnnFtbAh9wnJCpRlrJLDRcMgY2Tmi5rdD2g+aYLLuI91+DzjrXeFw0UZnlhqdXi8W1v/ju03fN37RvHeef9qudkxtfHTLhm/F7wVeSDNfYMK2p9sZKu6bBCObSWC0x5SIkJGRjUNVMJX23Pmh8/tC/TfTj/cdGao8pe1cc6GGKM36d+fLDEJRglGTXpGgqGGZYIBEY0gGss2BC2fcBnDx/j80dPsGWP9ug67rzzHo6vXYd1HolEtZ7PF6fh9B3KcmXyK+cn7/OByS0vFqvnFNVGtVANeuxkhBzK+8pEe3T9Hj78wR/gH86e4eTkMX7zySf44Lfv4+7dWzBkAVhQIuACR+0ZM+piQiFKegEmBvoI9B3Q7YC+B3fyO3Wd1HH1PShJYT4wkCwz3bRuH5OxJGpjY+89rDFYLZZorAMllgyBGgMUTIJDpF/GpKqmLKti62Gcl6yW80DbqlNho/3qCOTURVS3MZIHV/s+4+3E1IF3bAhlAFQkK8XyOyvhGpyFq5ADVYEIPnCNsfa6yvXMXL2eo+SODMFqWomUALERgwtMDCMuCgx+FUJRbydlA40s2x99J3W/yuHo/F+3fOHcUP2r41wZYPXYXtYOVYPoC/BCBGvOhL0wZsI147XGXlZqGrEB9kNNJANSGawwHnhIt4N6UNPw7yjDNpUCvowDKlu6eFBjSPTPuMGtKSnRArQuTAuXZX8tEiy6kPDF42f44skJtjCwiyPcuCPmGN579CGp2QZpYfTlKJKq8vdVXnP+sQ/STgnpJwCRxdkK1uHWnXu4/c77OD17jk23wz9+/DF+/KMf4PbNO5LV4315x4wZU+RrkBglq4XsNhiCkK6+B4V+MM0IcZAdVmSLGMN1m+8jwBirUfchwOK9h/deCBsznPYcyhn6vQXdIeReW4bAzoCcg2kakRE2LdAI6WLnpNmxtdoGAmXBimGImzFjhL3AIkOu+ZzNUjmtEK4E0gbhNKpnPJD2AcBMI2deY4z0nBtF4HB48hnHHia/fLMBA6ZKNbJXgzDQqamaRu6kQrpG23zFycvUlbnAmIOeqTMuxky4ZrzWuEqEhs14+c05gqYkirM+Jw+SB1Ps+323DrsHvchRvAgYxaoMkg0ykMmrZLsYUvwPwDqDXUp4ePIUX56c4mTXY3njFm7f/Q5u3LgN5xxizASUQTxYrB86pKlcMKev6vtfBMQEw+WP6r0ZHBlEBovVEW7dfgeffvYbdLstPvv8Pr788kvcunlbM5W6Ly/pw5h+zodq7ma8XigfYcKQ4UqpNDhGJ/21spQQfa/NjYM4E3JCFjXn1hQlgFNla+W9ZKww1paaS2aGcw5EBEdG5Yk6phyqp6jHHgKQpVXOwjgLOKsSQqs9uIZeXGQd2Fip9zIkwRRgDkrMuBA8Ik4AB3UgjEFrt5R0KdFitYCHPp8OjMAMgCMjhoCUpM8VOSdZKlMkFCiTQHWJSrCAASR865ECQ5Na70OMsAqUEqmSBkMGj4eHC15xwgWck2F7Dfb7VcRMuGa81ji0GN5fAE/S7ZP1TMloZalhcR+CPlG1cBfWiZUdeMEjeQGMpBdcjqO4nLFB7kOcwHh+doYHj57gZLMDNQusbt7G8Y0bcM4hxYQYWXqdAGWCGCjY5K0nskmZlIeM4EXmGheBGDB5O2DNbzGsyXOxfB6379zFYrnC2dljhP4MDx4+wA8/+iEabYTML4lwHcpkXiTxmPHqo3ylWf6g4kyYwCGCenEm5L4DQg/ue2luHHrpu5XkmuTawCJnVkeXBoG1LxAzl+attVSJgMFltN7BPclS9XC+y4iUkLR2i50DXAPYoWaLnANbC7Zqe01DHH5vyXheVmHGW4sylgMiG4xJiFKp2RqyWpSl8Cp5LzXWk2uK06DGsDrfjK55fX1+Xc7K6kyTt/KtXqqlB6b8geGLX+1SVQRZnie7Kq9PDHCcbPhAcOUVw6GmynN39BfDTLhmvFE4bA1/YGiuyVM1Og6vHZooZ905xSFiVQ+SeSIgBmBiSTxNx2Ngok9H/XtF8g7v8ehwCKTFuzSaqMZmIFykkdu+w9Pnz7EJEREG12/cxe1b7wGmRWSRJ5KVPS7lLJl/YvyzWrWV0yFNlvXvIlkaUmS6tsWewp8PzDeUf0g0nrMtlB5fDIzGr7BcXIeBgyGP05MzbDdb2FUjkcXEoBex6R0tOknr/8oOoWTypi+YfnB72UEePXzeW1/8vPx5X3IM86L5YpSvDAOQdgkce2lumjpw3IFCBwpav9X3oJhdCSWKz2DpP1ch/z3UVRgwA33XYbvdSpaLjDgSLhcAS21I/gLk2s49MCOpq6DJARWyYOPA1muD4xZoVyon9EDj1K3QgC2VArO9xuwz3npMp6TsikkpDRmrlIDQSZ1WShIkiBXhykRrMuHRoMGTSzslxChmM0RiimSKY2bFVjSRJZkljRQwQYpz9fofCq9HNcL55d/alV6P9USYngTOaw0zYo6ClMYp8b31wdWQSfHwntWOfQ3MgcSXi5lwzXit8CJmGzxRGw8NlofnlaV55eIwqg9jADBFlz4d0FkXYkgJsDkyOGyvzgRZ7eUxzAzViK2T1v5hDoPwKMpW7fPgqFR2CkwJCcDp5hRPz55j1wf45gjXrt3EolkhJgLDlMki7wIAJY45wjkQsdHb8EBAKoFjmfzq15T5pEI6xIlo/Avz0HQSzLCuQex7tH4Fxw1i6JB2EbEPuhgGKMtdLsFeK4CagFN1UFnqRSh1NoP3Co9fOyFbmUhlYxEznXSrw00V4ZpwN9kSG+DbW0q8mdDFnjQWDkAK4JibGXdA2MniMogVPIUg15MuKpNcjJVBwN4bFCOZbtvh7Pkpuq4T+aBzcNYihTjUa1kzXN/AnqyZCYhG6D8ZAmkGyzgHNAtw2yI1C6BdwDYt4IzKCe1g/17HDM7DfFm9mTgQxavCijoua80uZxv3NMgGo/ZwjF1xIRx61nHJDoMh1970WsvBshiln1aUCUT6ZBkYOyFcQDVxGAlcAKAy9inpUv0D6XvkcGUthX9ZeZjpV4MP3MlcH/gk8FtltOvXSVBGPoGScT8wrlzqJMh7zW6+ue9zVd8+46thJlwz3jpcqe4LB8YrqhZDLJkPmSe4TCpERfu2//pJOodyRiov4EsNiFKTvUV5PSGpS1P9PDuZXnR7IfR4vl5jvdkgssG1oyMcHV2DNVbWkBeeiUnIcrzp4eeF23i5YADJqKRLC7k59KCuB3XdYO+NywnXPt+qJpNMjDIpLoRKiVeZ1NQpC8PjPHpeRVKLdBUHJq1pPmz6O51P1mZcHQwA2QAgiVQqBHC+9T1s6JGCuK8VQ4AURxnw80BWLDJTCNhsNtjtdlKzZS2apoFzDqVhuTGgdOA6LL/oQo0BQwZEVpqXewe0LbhtQG22fleSVfpsyW0Y7+ZF0luJAx+7jOrDIJ6zWlwZYAwGGdmJcGiDQClVDZAPEKXyRjIvpiiuniKvpWKUYay90uI9qx2KHJf2Ze5TfNvD5GXrivMenc6we/28MJtAvSmYCdeMtxIvlCq3OfJMQ9Eo6e+csw8YyNbkOcXIwuAwKdO/iXk/9ZJ4MiizkC4cyoRkwigyhhh2OD1bI8QEtg6L5RGatkVIOefy1TGeYwubeKFtXbTtQ0hg9KlDF7aIsYNHwspauBCA9RoU86R8+ZQ7dbnU/FhxcstWwOPMl5633GAThGJNnKUtmZBZo9sxes3xkHEYtTSALo7lGjqUDSz7e8lpnqfmC8AAQaL0QrSi1G2FAO56JL1RL/23WLNbubFrdic8+OlUwZgUAs7OzrBeb4ohRrNcYrVcwntfnn+wRhCZ4+syyxjYQrR8ubF35UbOwfgqq2XtQLrkzebrYkZBbfdeAnyJR0EIyrbv2nMuW8FzrtVKeZ7TjWpkaT9OyAPZSgnGOCFbxlw+D9eTm4Fcz1ewO/994EpriulTUg7WAjI40ZApU/CB6O9lplRluprxSmEmXDPeOrwQ2TpEKKrtyMNZ8pAOjJJVZoyB7Io4Ykx5smIG2SkTGGo9CrIUofxd/lPJg2RetiHhdLNBIMA6j8VqCes8dr3qyr8GLmtq/JW3h8sJF3NEF7bY7c4Qww4rB9xYNFikBLPeaPEZAMTzt4HhY6hBWYNfspn7hIsJpfkmjKlIF/YzYbmnEhPAdkTKQENGkgmAs2MzhWrf6rzKrOb4mkgAOMFEibybGIoDIXXd4FAY+0FSFbVWBQw+j8gT6cI0Ybvd4uz0VDszJKxWKxwfH8M5mXKTGmUYY6T/Vv1Z55oUQEi9MYAZXAfRNOB2AW49eNHCtC3g2iHDRRiRrbkOY8YIOZ5XB/0YQEpgJVgU6+xWqAwyRELIaXDopEpfN/1mZFfObBwjbp2mEC55El84qHE1rpby4awieJ0wTWUBJUgzckM+MJG+6vbxM66GmXDNeOPxQm55h14zabK8r9EmVZXbc2UchWTl3/XnqCfYAdbBuenk6P8LZE35rThhFwJ6TkhM8M7DWKfNV/2eGkTc1A4N+GMZ4aGmxjWnPPg6jE+hvHb6Rpl06VHq/sSYSjbAGMbzZ0+wPjsBpR7HTYsbywVM6JF2PQwchIhOJIXTScvsN8gcWf8DmnEakyiqiRVIMp8wQwQ2y160foahUjA4JWnDYph1H8gYjXYOcrC98wqALFBfXEJ2c/8mKvfNi+wxxhF9tX9PCSZEcB+ALgC7HjYkmMTgPoL6UNzYzCizlYMce2FnAMB2u8V6vS7yKW8trh8do3WS2cryQACl9iVT70Q5ZCPbyvlRGAfyHuw9uPFA60VO2LRg70HGDpF/Y+RW7d6htd6MtwOj0N9o/slzDQCOVc1WKD3pOPTgoDVc6rCXCc+hPo1SFzmMQ/JUGmS0AJz3Zf4sNKN26iw/UX6KZwZV17G4fiYMY/ZIDo5v9np/kVryOiA6umt03Ixp7fEwsucXHbDbT4zpvZe5617UIPpCzOTvhTETrhkzroj9iNq404iQnEvKdEs4EWVCYU6jMUyW7/lBvc+kkjSTRxL4Mhc+ljmy54g+JUQA5CxARpoIXyEl9ZWaGn9D43BKXPUXS0ixx9OHX6A7O8XSGdy9eR3Xly2w24qlt9bnkLlkwrl0l0njjROSVGepQLq4HSKw0MyF1Njl+5zeSGSGSsiIlLAZAyHqZiBd+ZZ3FmJwMmWppi7IxkBYZ9IlqMl7MQPQxSXHAPQiJ6SuB3ZaCxiD1rPEQXJ1SZADRAh9j/V6ja7rwAxYY3Dt+Bq888j94Q7vJKoFppJ6Y0DWiDywaaRmq/HAokVqhHyRcyBTEa4LPFXmq+HtRQnSZZKUL+VsfMEiF6QYgTB8P0jrtwbpoeC8aykrNACM5LJEJM2NMf4KnJu5MXk8rViXbEhFB+MxL7/HdPuvFM75+tf3XUEFX7Ji021PM2OXfd/n+eHbx0y4Zsx4URwY5K6yqtlXBg51O8MmpgYYBnWZMMMClxCu/PxIhMiMyCJY4JyZuWT/vmpT46KWzCTxRc7FoePQiVtIhMHJo8d4+OlniOs1jhuL7737Lo7bFmm3gUkAcQRzHJpn6ob356hp36QD782TDJfRerxaNpg/q6qgW6SE8i5yn9bgFIIlz2GVjAk5c/KcOgtWyFnOtjnZVll0KG0sXTn1cMv6ZBxtrs/p24CabA0NjllkUjEK2Qo9KERQbnoc6jqWyhZbz7OsVfdXTxwCUkrFEICI0DZLHB0dyWLzEulUJl05O0rWSIDEOXDjgMaBlWihaUGNh9HGxjB2uFbqAo6342OecQlK490sIUgY3AW1PotTGGoak5AtaXYccVGwob7XWDMiWXnsHikHrjIW6TVMJCoA5KbdZj+T9VqDJisIwl4N1x5GKcvhvvq0mkuGmhm/H8yEa8aMF8ShieJK0bU9jjaJ1rFIBPZfM33hJTp2JpBzsLooSyFg23WIIQGGSouVPeVDtUgtP6/Q1DiTra9CuOr3qQ704HOICNvtFr/51a/w/NEjODDu3b6F9+/dhQGDY9CeLdowuSrhkrXGVGJ4IKK493fUfRoIFnNSxywMGTDWv3WhwNNaLrJDvZc1YCPPYUO6oDAw5EBkRV5oq8esSsQMgU0LkNPeNVRN2NX+6fbPP8dvD+EC6sCBXke5yXEMSDFIRD8EIPQg4w2C/AAAIABJREFUreWShWbVX6jUS+pPApjt6H2IqLgQxhiR4mAQkFsayNd4+oXDEMBnFOJOVq6ZUrfVeO2x5WEaD/KNWMQbV8kI357PdcbVUOzSoQGHUXYrZ3olw5U060vFNEONLoC9oZn1vunoHbWpcalRrEkXafAui3IPETLkOBYNKgCauhR+QyfrW8bhcfiSgzuQ4JJtDb/zgbntDTllrzVmwjVjxreMKw18ly2cCLisjSkRg4xF07ZaThSR+i1CvyuzJINH0sQhukYAm2KIUcZuJRll/3TyZB76dA1SyWFSnqgoC1I2IqjyewxC0uwNMwEpwhIjxQ6Pvvg1Hnz690jbR7hzvMIP37uH666B2fYS1Sv1ZwZ1B+qRfX6J9PIeEalnMpIdxKjRcy3nmGY4M/kZLUKUgGnmKhMxNnoec/QWBDItiJyQLbX2JiO/UyFdfSFvbK1mx3IWzICMNNctq5YSDdbzmXeXp2JYjP+qjuG1m6jraxu5lk/IE6dsbZ1AIcL0Ceh6McroOnDfA6EHUhiyW6OiRDkbhmm8oGFIojMxDIs5DbwpBD1vI/9fXzes1yxRJkwOsBbsHKhpwIsF0nIJahtQ4+WnbySz5arM6aj28lAYfMbbhpKXytndcsuyQcn0UpAeWybmDFduepwqKeFknNChsL439QGh7xFCDyKjvbbkRtaAGIiccphKvjZlLsnjrEHS8cpkRQYZ/cvKfpDRFpDnE7CX1YPr20Ueq8/HwaAuTR6gc543fdkL6y/nseVFMBOuGTOuiCsVyl5tS5c/fIUNXWr0rIPp0WqFo0WD3XaN1G1xdvIUR8d34doViICEmOONerMgJVDMski/uKmxZr8mu5MmEwAmkzMoZ/IG5zfZFwIZPxhFAEDq8PCzj/Hbf/iv6J59ilttxE8+eAffuXYMu+4QUgIbQnQysVsyQkcr9kB6TgZnRQYjjtRXhOlCWhcn1X0HPx668E/Aahai3oaZSElNGjJhKjtklZZlyZgxWuOltT1cbgZk5KfpyxuUzIfU+JiSlcu1ZjXpomrnsupoeryj43oV1/QV2UoQckVISrhTMcHgEEHZGKNTN8IUgdRLVjPGimiNiTlx/QVg6dcFwDg3ZBsTA4iANaPkNEOuJS7kfJD4ElmQdWDjpGZrIX22eLlAWLSwTQPXeLDzIP3MRXqIilTPeKtwgAtVV21FtpLWJHKxfpdrXqW1YSfEKyWp2xrpw/nwd50ncyIzOESkEMAh6fBjYUGwOQiUEgxV3EojcqX9BgNMRvyDarJFBkKh6hvK4FTvx6v8LbiadfyYKh6S8O/fs0860/RZk/fOja5fDK/yWX51MROuGTPeVBAAZqyWK9y+fRtPnp0gxYjT0xMcnz3HNb9EYgIZB8pZqvzCMg5fbVVdE7ALn7N3H0GyURr712hlSowYIiwIlDo8fvAJfv33P8ejT3+LYyT88L0P8NF7H6Ali91mi8gMQ1yavjpr4SAExag1e46kTh0WC5nIB3HZHHTI/emig89JselkO/mbKUrmSrMVTACsKZJDGANjLIiEZMljBuycZLmcLdJDqu3EjQVsGrJg+pONRpAxZMhKJpIBIq4Wb7oAGg7ptZhziYQgUc5uaWNXjrIwNLlmK8RCxorWVjOh+fMdxQ/0Yo7abyulBOcc2raFb5pqITxm6oRxwnR4KJulWFCbmxq3QNuAmgbWexgn1vBFapiNBfBafBQzvgkc+OAltqUjeQkYsXwH9Bovtu+5ube6dkJ7xglJw3g83CuCpeFnSkgxou/7kZxw1Gur6NcHJ8NzDyuTKBp6Io4y9m/5BX8ZcbuKaRJdVlN68Q682OvecsyEa8aMNxhMgPMOd27fwf37n+PpyRpnz5/j5OkjHB3fgPcLRDaD5vuFJQbnz8flcQBxGoXLkc8qhxI5gJDgHMGliIef/w6/+tv/ioe/+xht2uJHH7yPP/zRj3Dn+Dp4vQUMIYUekRNiiohIElVlkZtYa+Gcw2Kx0P0qeYjhZ973ae3cVQ70kDRxeuAc9rjrtOk0mTR2JcwGG1kuRgQmMc3g7F5HBrAOZI1muczQ/NZYwAXAWDDlTJcs6rkQOYkggyyk8EvsxCXrUsvgoISBRve96tNuyfswAzHfMskK4L4Hhb5IqzjFod+QLjhz0/LpsabEODs7w+npKWKMpceW816VUdnqX1+gpLvOJEJlUmRyjy0P9o38bBzQSr2W9R7k9TlWMpxkbMmOHe7eM+NtRN0CoUgJM9nSG48IVy81jDlwlIYAQ64pvCyilmJE13UIIYBJbOC999Jvy9pzX3cutKXGiGCZ8Vh4aYTvDcZLqcEdTXwv8toZXxUz4Zox4w1FTQJu37mD9997H9vtJzjbbvHk8edYrJa4efM9eLcs2afRLc+zV4ihH0ryTOeEREDMC9esP9TXZEPBRAClCEtA3G3xyaef4Ne/+P/w/Ivf4ppL+PCDd/FHP/4JvnvjDhAjzMIATULiiJh67EKPLgaVxnCJttbGCbVzX4qxzDsGdT3B1c4xcEWimg5lzsZ3kFE3sJxgJAiRkp3WzQg5ImPUnU6Jl7Ega0GGkKwRU42cDbFWJIVFmmilyXLOnFnJmkHliiI31Lqx6jMssh8MMWp6DSol8ufDzKCYQEH7b6k5BkIQs4xUZ7iwd1Hz5PfN2RpPnz4t91kr9ZJkjGTSgOHLVH8XqPqbCOQa+Vwa6a2FdgFeLuR3lRXCeb3l7JYdFqPz6mdGRgmcKdkC1BxDLd5DJScMoRhkIEhjb03qDtd9yWJhb/yqe2fFECS7xQzjXAlyUSZb9fauNLZmkwxUJAvVbdySZcYYtSX/BU/6Gm/w4i99mzETrhkz3lDkQTcxw/kW77/3PtbrLX77u8+w2zzHF/d/DYLBrRvfgW88uj6KFI0MQoiAIRhrEDXrUwdOzRXW2WlqClgFSkmlK46y1I/F4yL0sNRj/fwEv/v1r/DJr36J/tkj3Fga/Oz7H+Cff/Qh7i6uwQaN6dtBaufYwiWPhdp4p14WAcYYeO/LOZFjYMQYsVmfIfQ9vHVwzsFZK/VfJtcNQEwPAMkOZRlGvfieHPcheir9n3j/gSpVxDEBpZ4OKtUZZy4MeRAlJcQ9mIxEkHONljFIBupuqCTLOnGzswZwIjEkZ9SeXmzHkWVqZJVoGWW/KuvJhh+mPl7Njr2iKI1ZsxubkizozYShpmvUlytFUJxsTC9cQ9IPbrvZ4PT0tNjAL5dL3LhxA03TyEI3XyM5Y5ozl1YaZDNJbR6TZB9NKy6EvFxIn622AS0XQOORrIfxXj4nN5gGSLaM5mXnW4zRWDOS/1XEqyJYyM28c4PjEERSGMW8iBh7tbgjK9vqJwFglRH2fS/jJBkZRzXbuz8JsI4vNLmb5S5rYYxFzA3hRzJCDQCxyIONfXXHnpeJF81mvcjrDpG06XZK4PKF9urtxky4Zsx4YyFmFKRhwevXb+DD730Pm80GXzx8hNNnD/EAFqkDbt++C9c0UhOkWZaUJJORVSXAmHTVP68Cggiosr7cEcGAEfsg9VeJEbvn+PLBJ7j/2Se4/7vfAN0a795c4g8/+h5++v3v4pp3sLtQyFAmP8wJDAYZAweUzE4mWsYYjDMUCX3Xodtu0fcBwfRC/BLDOwfvvERojdQiWF1ApBillgZQxzsGqzNdqTnQxyYfxfjn3kelqRCaLKDCyK5EnCdhQBAnRyICRae1WVrXkx1CVDooBgtDtgvWAc4UMpYzXrDVzViRGVb1Y6QW9aSSQzn1+/UYv1fL+Vq+BwxZqshqGCDEq65hKQvQFDGu3xpvlkiuod1uVzU3ZjjnsFwu4fRaO3eftC6PSdSbkoW0gG+BdgEsJKOFZQtqW5i2BXn5TpaarbqWZSZbM1AJf3OAIWdVK9v3UZ1i0GtdiRbl5seD4wxykSZDxmrOAuiafGXzIR3PjTGwXtoi1IGtK5lNlWsaMobmrFbdkzBntub6oZeDc5KNPHrKfuuZ10VO/ipiJlwzZryhyBMxEQExwTiH23fu4Mc/+gjGET757FM8e3ofu22H3e4Zbt25h+Prt5BYFu85en6w5xaPf78K8SKV7Um9mPTKIkQY7pG6Dk+fPMbn93+DT3/3MXabUzQm4fs/eB9/9NN/hnevH+PYWpjQS7RfC7WZWRy/MZjkS+RVZGHWWqSUSiZC9pfBDDhr0TatZC1iRAoRhgh916HfyWKa1BlwsVigbVshbjGKpM8YqffR88waeT33+CcevNNoojjYTU5kmtYORb1llzsDUBQpIEiJF1eLFltkg2zsYC/vbZXd0syX82PyRY3WhA1uh0hJTTkkSp0Icubz+x04rt8rAdPPJPfeKrKqXpoe52yXyAl5kH6eo4/tuw7rszNsNxvEGOG9x3K5xGKxKNfX+HUYJFFWso/JkGQYvQNco46EjTgSLhqQEi1y0mOLjAE7JdiABhtmsjWjQtYCMrSpMQ9NjfshmyUZrjBxKuQhyEB1Ap+rxfYgURupY41ktKy1YLA04lazjEslbTUmhhiUexDmINKIeBHm1f43BLq8FvRt6uH4sjETrhkz3mCIAkMdp2KEJYN37r4DMoyEDg8ePMZm8xiffnqKZ8+f4tbt93Dt5h00y+uw1qJXadWhMXbIcl0t5pXbYlmd0VPfYb1+hucnj/Dowef44v5nOHn6JRob8Z17d/HjH36In/34I1xvHVpmYNdhcM9K0ssqJXF9YwviWBbMVKWK8gSRqpoDIoL3DbwhxBjl1vXoO3HZSiGCOSH2AdGI8UbTNOV4s5FCCAGU5Jgy6WB5s/GHgMH6XjYCJIzJWb0+yU81I8meFsBrBZU0XI5K8lRuE6u6ByKAghItqxkxzVp1arygvZzYZedDMWcg55BMBIwTyWLOiBkDtjTUixmnizQ6TDjw+5ugy7WfJYNJMl2FZEVp9Epqh80lw5XAvL/wSDFiu9lgt92C1ZXw6OgIx8fHJQN67o5YOW9Qm3/TOFDjAd8ATQssGumv1bZI3oNU+llb+zPnFMa84JkhqH1Ex02NU5XdCsUohqP8Lq6ELNd7yXBNtw2ACanObinkMpTviM11WsYM9b+TetlLkZ+mmVvK170dMuyZDZbxbcZLx+Hg6isUQHvNMROuGTPeKFSTYo7ul0Uag/sehiPu3bqJhfkxPlncx/37D/Ho6QmefHGK06ePcXT9Dq7duoPj67fRLI7gmhZkvARQkxpRZKmBelzTZIFKAJKmvnL5ikkJKQTsths8P3mM5yeP8OWDT/H06QOcnT7FarXAjz56Dz/6wffx0fc/xK3rx6AU0BLAXQeyrM1kI2AiOABJus1Kb6Qkv2chJGvvmbJDSGV/s4RRiJeH99LfCCtCCkGIVoxiwGEIbdvqwkLyfiklhF2HzXYr5h2QhYfzEu012dSA8/sc0MZPkyi1dqOUe1XnlfOLRoVUmutIpXEW6/HmjwcwpQdXrv2BUSmh7QHrwIaESFWZLrKNPM85dciTmjCp//KAMzCWB8mh2stzIYlUTsHoOEd/6YMvcRIvEitdhGYpISV1ZIs9OHZA6OTvFEApVHLCsagmbzUvPKw2nDbeY7lawXmvktYhy0d5P2y9SBTiC2+RvAeaBrRYgpsjYNEKAWsaGO+UCCvp0owiXeCgOS+B3iLw/p+DcQ9LEIYzuRIFAaIYZHB26EyVlHAkV5AfNFz2g0wR4/EJ2WRDr3aqM2AsWSowlzYIkkATHVvp/1RJBXMTeBh1r839t0gDDxcoLmbMeB1A/JXyvjNmzHhlMEksSRPhNEyWOcqZC6eZgdDLC1NE2O3QbTs8O3mO+w8e4MGjx3h6tkFgA3YezeoI127cQHt0E769jqZdoG0WsuAkC9YJUMqPDAycZhVkwicC+m6HrttivT7D7vkp+vUaJydP8PTZY2y2z8G8w/XrS9y+exMffvgBvvfd7+HW9ZtYLhagpP1hVPrFoS+9k0gNEFKIoBy1TQwq0rAIcG5ey1rQnaUzWbonVugjQlOK15KQS5IFg9HFNLFkyjgmbDYbrE9PkWIvtVVk4JwtC3LvPQxJdsxAmoBKr6tUIrn5cxpsx3NaDudI26oF0tRJrDznsguHwMYPTnfau4zVWt6omyFRIzVe3svNqdzQu2LgwN4OhKvYzctttGDS8zsKZOcFYr7jJayjytniqOYXEdj1wG4nGdLNGlifIq3X4N0OtN2Buk4IVwzgFKUmLw21hqwuMQTJcsUYEZjBZND6RvxFUiqZvvJxGCoubWJa4oG2AbctYuPBiwZmdQ1orgnJarxmEtXsRAkudPE54+1C5lDlO4NKraBIZfBnEEcQB3AfwLFH1HYHrk+gXoJIHCNMlACESaikhAcktNNxxVCRZ+dgmnOSAS+1WqZ6Dekx6PdikKuZ4cgsgdU5lXVbMBahaUHGwjhbvkOs+zATrhmvK+YM14wZrylG69WB+QwF0JlopeqmTmx54l1YC3/tGMdti3u3buGLx0/x6OkJTjYbnD55iLMnj2D8Etav4H2DpmlhvcdisYK1TiZFa8BMSCzEIfQd+n6L7XaD3W6L3W6DzXaL7myD1PVIMaJpHb733ffw/nfu4v3v3MM779zB0fERvPeSQ0pJSJu1SlAsoKRGekkFEJHIEw2pIiY7/EWACcRqAMJR6sZKtijXvwz/lyk8RblDM0I22xFngwwlOXW2g1MEc0BKATGG8vkIMRXC1foGy1znkyU/dfF5kSDqguK8MFhRENVR6ctjZuO4Gkmkm6Qei6MWomtvrmTUVp4CyDgY58FeFkRCvqzIDq0DGukBVsw4rAU7I4soJV42O4xVZ/6bKkBiljUf5z+ycYASbWat40oJJkf3s9RQI/557VlbK2dJlTHiCulJel9l44DhuQwmgsmPZ7KUz13bghYLmEUDtK1mtlqp1/JOJVR5sTvIqGbMOIRMwuQal/5aHAc3TslypdLwGIkLaZMgD08GQMWBMYUZCGr/HqNozdu2RVM3N74EkqHSXwwkKKPjRCZlrAZAuU40v27GjNcdM+GaMeM1RUlwJEBkdXUGJ6q6LpOsBE558tX+K5C+RCYEHDmL5a2buHl0hGe3b+P5eoMnJyd4+uwE612P7fopupiwDhERrJK5HH0XnX+AyPBClAaYKQVYK+52zjncuLHC3Vvv4Z133sGtWzdw584d3L5zE87lCCaXmm953QIcelkUFJe8CISs77dAb8Rti2ho5JmUtKhZAqd8jqDnxmjPmWGRkBcCSYlPlkhygtQwcFa+yGusc1itVli0DWLfIUZZhHRdV2rCQpDzYYyBr/vRZNKm0WJA6yAy0aplbXsLGR4/ft61Mfk7FUKXiaecA+TLhQicbeBNlsExyGi/qj4TrgDydpAd9ipN9GLAQc6Boh2yYWz13OqCSus8piDzckhFWYBmcjyp4eLIkjWN8jfVBgM8BPqzyUpeWNrpojJbeKopDRnpX5ayoUg2VcnSwKYVgtV4YLkALVqkVhodw1vAG1CuV6nlVTPXmnERMtlKg9Nm3VuOg5gB5Wuekn7nc3CuyPsOZFAnY0yKCSEEaW6swYcXyjZlJQHlutAhSw5ji+mGZMTmL8CMNwcz4Zox4zWGLBDVvF0L/ktvoRK9T0DoNcoZQSxNLmOIMDHCpASEAGsILTPeOV7i7tEK3711G30M2HYdnp+d4my9xtnZBru+Rx8jQmLExAgpIVogWQ/AwzfX0C5arFYrrI7FVODGzRs4PpIMVtMsil071P3KGLU6BxA5IUWGzXI+Z0EpZ2GsNAg2RiK4ROUnhYhkIzhYGCMNPTlFIMrkzjGqwQaXiTzlEoIc6HV2qJVRkwKprWLlOUJcDEgXBg2cNQC1AEtvr1hFgTPhalvNbmX5oDEIfY+zszOEEOS8eA9rrNgrqyxxD5XM8NzCdB6v06cyJKhDZLYgy2ST1LZcKSdgomQWTbaQF1LFzsK4Ru7zdpAdNrZIDZMXEkbWS2NfVNJDlcllwptrPF4KlARxjtyz2PZT0ixiyfRykdly0vqTqkaKSORT+fPJpimL5bI4sFHJYOlLTdWQ2hqtf7NijLFogcUCvBDChdVSpZkt2HqRHLqc0RICLD/rzOyMGWPIWM7iyqqug0alg+gjbNR+cyGpc+tggEEM+V7k8eGCi4wBbDYbdH0PAHDOoW1bUSQQVU2Qr3Cl5uuaDEBuRLZy8/WS3Zov/BlvEGbCNWPGa4gsYyoSrVy3FONERigSkxSGpq45C2Zy/6hcLcAET0ZqwZjhwFhYg+NVi9tLD8YtJAjx6VNChNYQGEKyHuxbNE0DvxDZofe+RPuNNTCGAW3aS8Whb2gwnEEk7lSi7JNMFefMgWa7QFm2ZiWrotFcCj3YBsmChR4IRrI3MepCwwCU+8eoIx1U4aKESfI/w2lFpga6+C01DNC4cKXttFZquLz3IxlfWYwo4YohYL1e4+zsDACw2+1AjPJa772YcKjlcs6iEFhkezGWLEx2XyySnBgH0lWMO6Z29cPiqJx9cZsviRWKGBoqJwtOKlHqLdgFzeBoFqdxQOfA3kktRutAyYMcA30aTDqcE3MTY0HZEOJQdL26xi9DLfUUMkSy71k6Bckmstbl5U8lpQQKQcgWGTlw/Ww5Jqy1uXEIIl89Pj5G0zTTvKhsXxtNs3VA4wfTC+9ATQMsl8CiBbceqZEmxtS0gGvEnITUBhvjOph5vTmDkTO25Q4Ag8xVWhpEGe96uZFmuAaXQsn0lgx+rqeinFjXbBdNrm4ipBjRh36U2cpjFHQf8tiTYhxqtYjESbbaLhEhcs5452yuARk1iCkN2MdX/tAA+Zs5xzNmfBuYCdeMGa8ZykKeGQytScmZrUK4YhXNT2omoe5UzCP5ISce6qby4p0By8NEnFfw0rSVsGhalU9ZGG/BbglutK6rclfLr9EdRiEvZZG9P4PmOitThP5Su8VG5DCwFoAB2yiueTGJM54J4rZnDJIJagSRwMGIq6EJ2o8plsxGzrABjAiUib608/0ankL14oW03iffT9XCJaWEvu8BdYDs+74QqEy6FosFFouF1JRp9tJMFiZFQlccN3CB/HDSsDgv4qrsX1nM5ahzMvo5WDEqqQlXtEBw4F7+5t7BdB7kO8AvRQrqnGzTOnUjI3Xig17LXx+xj+IImRIMo2S1stdIyoYo2ijbQGoPKfQg6P3M6LoeJycn8rkAmpltDljfs1xv1oCcA/sGaNTx0jugFZJFy6X83niwd4BvYLTPFozRRtL5yp8xY4xpAmoslxXjIA5RLd9zf7l6Pqhs46kOFCHrcIc/K3LESWSEXdeVucE5d7i5cW3mU+pTsTfMsM4b2VyHKklhDtDpDrzckzhjxu8ZM+GaMeM1Qh3NB6fSP4giS4ZHrYCzbEoMHYaiaZPJVpYcgsDWIYaIvusR+h7EgDcW3uukqhNyljsRk1rDG5Bh+UkkhgRZ3qitiPNsyxpOJdjqaA6TrVIvpcSBYIVYaiSWLWSxnizIqish5b+tOL71YTgXwYFiROr6UuMgzXAJJgWtpQJy9ox08cH68wo5lsuJ2eRxYwxWqxXatgUzo+979LtuVPuVa8Kcc5UEE8VgY9RoeVRfNGR28v5NTci45PWG8z46HnkjJWwqnVNZJxurdXTZYcyAnAWCR7KS6UHnwY1meVoWEu4bacLqG224DNm2NYhW5ZsV8XgRWCcmKyklxGx9nWu6YpIIPLM2bAaYhLiyIa3bI4S+x+npKXa7HWKMWC6XODo6Ks2NywKTUKSWZB1SIxktNA24UeK1XADegxYtuG1AzUKuT+NgNKqfyJSPr7bjPufDmfEWg0AlKCBy8Vj6ynEIoD43N46l19xgGgMY5EwZVdeYBmgqk5icKc9kq+96GGdhdSzKvbf2s/iXHQDBZJmySnCzuU6WGpcMV20ZP5OvGW8AZsI1Y8ZrgNodbyh41j5TKUqWqxAMjWpy1Ig+a+3WkNUqTobGIgLY9RrFjELKjDfwILUxz4tuUklelqOJE5skwCKYd2CwGqw5gFj6qRgzLBrrXlN7c6hkV0wdec0kD9D3TmCIQUE2F6CkWTMlXIgJcLLwoBjATiK91lqRHjoLFHIKUDHX0L5lTJVr4FU+nPGxHO60MTCgOoKcmym3bQsciySn2+3Qdd3IdKMs9qtmyV3XjWvAmgbeeziIhTmVonYqtWf1Lh/CWFBUkTKOw2efkkSnE4FNFIlgMmKrnmVBNoJ7refqGOQ9TBPEPCJEJN8AjoEEacrcoFg+5yzSVyVeNakkI+Q+hYjYB4T1GnGzQdxuge0GFAMsR3FYs6b0Re62Ozx79gzbsy2Yxfb6+PgYq9VqaPAqOyeOgs7COCfSwKYF+0ZcCNsWaBqkZQvyHtw2QKM3Y2HgAW1WnY9ylAiefljzenMGUK4DmQciTMgNjVVSqH+T1nAhhb3riSZ3SGBp6HGVs2fZAj5ntYyzcDrG5OeNHTpxtevUmiJHppzdVWfCUsuVNzQTrRlvEGbCNWPGqwqe/s4T0iSF0BRUMqiF0xSzcUaESVGLoqssTFULwDFJVqXvwYlhycA7C+e9kBciWWwXuROVCVL09g5kPNhasba2MoEiW75RGqKUfIXJk8+ZY0mlhWzBA3MR8mV1+ynKZO0SEKVGiKMTx66YwKaXGpsQwTaAQweKWvMUM3GlQX5T9ilnutSMgRhMQvKK1yHn3jJ5dTyQFeHHlVRP952s0cCzHDSlBCJG2zZo2wacpYYgNLkmTIvemRm7zRbr0zPEGLEzBs6K4UbrG1hrYK2D904MSbLzV76OaFh2jVoK7J94DJ1LVRLK+VwDgAGzZL+QZYbGyLUTxDJeFoUNKDcdDq0sCH0EpQB2Dlaj3MYYEFf9wVjeAwSRvlJFT7Tmru96dF2HbrfDF5//Do++/BJfPvwSTx49xvrkFNuzNXana6Su115uO1hiLK3BkXW4vmhxY9ni1vWyufCIAAAgAElEQVRjtN4h7jqskoEng9tHx1gulrAwctw52GAsuMkmItKwGO0SaMT2ndqFNDFeLIWUNV5cHo0Baw+76lKoAhLnfjNmvGUYxZ3ycKoOtCapaiH2oNCXXoUUYjX+Z7l4xdjLdTaV8EYQ2dG4ZwkgZ8UUiD2SIVjrYEmCcMwMU1/Ho6z5+JHhoCSTzSY3A6fiyMmWSlsEMfGYkK6Ze814zTETrhkzXkXUyQXOk25SoweVBAapSRLClSSzlWuUsiNhSii9Viq5SHmbGJF2HUwQaZ6xVEwayjQt6SN9rdizJ42KEok9PJNFIAdLDobEcVB6ZwlJozqUfy4ues4gMRmRx0wcrNQWsUla2B1hjZPzYNWtsPeAU6vkGIDkgNgNUWF1baSQ5LiyHDNliWT93irrYYCMBbHRz0dIJqsTYCFJbMth5A+VVSIpikSVexa3CzEMaTUDhqQtTlU+ySGCEqOxDoGFgIWul/qj3U5VOEMN2HK5xFId9urtDcXoNHLp2yPImTSm4cKkojhMg0LJCJFElMwRGSPW/r0HQgPuO8BvQUHICXoH0zZIEHIm9X9OCDY1ABgpv5/KVGMfsN31ePbsGT6//wD/8A//iF/84u/w61//Gs9OH+Hpk6fYbnfou4S+j0gRspiEBRlCTz1SDDApoCVgYYCjxuLaosHRosH1psWPbt7BP//oh/DXb2FlPZwSYBCBnJOkXrsAvBAuWixAi5XICdsFuG1BvgX5pToWZpMAyRIyoZD2USZvXlTOyKgGYKOKBqnHHRxYuduJSUavcsIw1OrKN+d845nxvepcqk6q+b1tNnIhAkiXi5r9N1Opn455snGGkK6h5pFASLVU0ABJynHBVqYLGAKTytVzIGr+Tsx4QzATrhkzXkXUZEsX+CiNWqPWbWmWK0Vt3Jokc1Bqb8bbGm+fRbIWAoJamBtj0PimFEQXyQjSMDmP9E/VYl1rb0YL+G8Q58rNVAJpQAClwUkvOcAGkR2GCJM8OBhwNOpuGFSGE8TgIUbJkpUaCHU0ZJK+XkzIjZYThCxlExNwEVoCOZdBKsuswtYmc7c6MXYZ9PiISGrAFgv5DLXWIoSAEHupYarqwbJrYv5cyZDUNKVULJhz4XuuDTOVeyQzH9w9yofGWW0odYNkEjgaJENgw+DAWmeYpLg/Qc6tdTApItFSso8pgVwSi/TICJzEjIIZu80pHj9+jF//+rf4q7/5Bf7qr3+BTz65jy8fPsZ62wFkQe0Ky+VdLO8c4ebRNRwdXUfjl/C+hbUeREDPPXbbNdanJ9ienqBfn+Lk+TN8/vQpYncKGx/jr+yn+NN//A1++MH7+Fc//jH+2fe+i++//y5uHC9BiHCLJdg3ME0Lcg6mbUHLFbjx4krYNIBtxq5rNJxn/ua/IjPeCFTBstJvK0kdqjaxLwG2LCVM1RxQarYGHBo7qQrEjE0veCBIe7t2QPua1Q3jjSP33BIHWmmbQNr6QhodWzE+Gm9tjj/MeKMwE64ZM1411AmcnF3h7DgYJLIZ1RBAfxdb4FDIAXE2rzi0fS5GDaHvi7249160+moMUKy2p5MoDZmRmmRN7/um1FGHFgzFJr/IT1ijtVp7xAncMyip2QMzYKFNeocCc7Li9MV9kCxIMKA+gXM9HDOMdUp6bTnfQ98nkvdOOSuT2dTE3Y6H3ZzcddnBF8LlmgYu11QpwUopYddtS4PSqLVry+USVomLZOEM+r7HZrNBSqnY0eefxjmRWea3LbV8k70sx5l3Tx9PkEwfEciSnPdEYrwReSj4d172nwzgErhRYmqsyKGMw3bT4eNffYy//M9/hj/50/8Hf/03v8Djp2cIyWN5fAv33v8RfvTe93DznXdx+70f4vadezg+uoamaWFIsmXWeBAMEid0YSdqxRTBYYfd5hRPHn+JL7+4j8/vf4aHX3yCh/d/id988Sn+6stf4j/98lf4/r3b+Df/4if4n/7tH+GHP/gOVksP41ZwiyXIe6ARCSF5J8ekjaFh7BCAMHVw4iof9oy3GYw0yH2L42xUg4yIFILUaWXTjBhUqZCQM/CczYsuI11as5XHkJwdLw3ZZYf2GdCBetXcO45RXfc212y58jtyW4/cegJGhg0+3CZixozXHcSHK7xnzJjx+4KqR8RhbeiblR32UnYcTNrwMkmNUooiMTScKklitUiuvuopRqzXa3HBM7aYLlhrwTr55p4rhnQ/ALH8dg7JWsA2IN/AeIfoHFLTwDoHo5N04R9f03nuhU6hutLJu2pz0BSGLGHl8Ai1U0Yc6h+478F9gOkjEAaii2ywwVEzRAHEQT+rNHxWQYvV9fMzcEL8phg1WZbasAyqSyLqUTovwIBCwPIxA1BCmRBDGBW9E5H0GVNJ4unpKZ4/f16ym8YYOOfQNJLlbH1T7jdqGHGVTzGvy0pDY/JSm2EdYB2iNWDtT0XOwTQNwqIBey+1T22L4D1Ou4C/+8eP8Sd//hf487/4z/jrv/tH9Mngxq17ePc7P8CHP/wZ3v/gh7j73vdxdO0WfLtCjwbGOMk8qpOm1JkRDNHIvwWQbBwQkWIPY4EYe5ycPMTnD/4eH//d3+I3v/w5Hn3yMcLTL3F3Bfzso/fxv/zxv8H//Md/jO+8/wO0iyVs04oTYdNoLy41byELGI8ilc01K7R/rmbMmCIpcTKMwQyp78V0ptuB+wDut6AQhxquOBCuLMc1lVsscHg8ZgB932O325W+c6XRt3M6IfnL07IWxdAo275L/z0LY73UrTat9k+0Q1DCZjt4g8ip7N/vY+6YMeObwky4Zsz4ljH9ytX9TOQXiRDWvbU4RpA2Mc69tXJhdMoGGcXUIJMKyM8YBytrfZ+k/VVCCGIDr9mNQ81mCRGEKAtI55CsExlI04Kdl35CTYPkPIyzRaI23L7pM7qPzKuyTT1hIFpFxxe1Ga72KaOomcMo0WKOCaaXmi6EgNT3laxHPosYAwwlmCSEV5pLaz1Wjkqr0USJ3BYiXO0oAzAV4cr1YWoOUYhZJlhTklWhdjI8D6HrcXZ6itPT00LKMhkrPcDIlBqw1WqF5XI5vjZKvQcXh7N63/O+kdU6NIKYTHiHaEit4i1s0yJ6Aq0WSM5jTRa/+fIR/s//+0/wn/7sL/HxP/0WfTQ4evcP8NN/8a/w4z/4l7j33vdwdOMeTHOMRI24YRJpNnZ0MkZBeMrnv34aieMbiSsBEgcku0W3WePkwX38/V//v/jlf/lTPPj1z0Hbx3j35gL/w3//3+Hf//v/Df/6j/5bNO0SaLy4DzpXetVJc1d/4P0u/XhmvOXgaqwiTkKoyq0HqwEM911xJzRxGJsARiKpEzWoXP8wJjH5OxpTwm63w3a7BYASeGnbVgkXA+RG/eJG0LGeKUJqeqXVAlsLeDFUMtlUyUlj8EK4suSw7is4f0dmvIGYJYUzZrwC4MkCmrRWKy/wswshlQW/kq4ki30p6K8kbHlRnvYbypIxsJq18L4pErUsKzkU/aQsD9GZUCZeMxCqvFAvz8tv9o2crksxvK24B4oTYJLFADQDCCd9xIxKM+0g08yRYmrUjCREcQOLmr3KhCwGgCWThNx8NEXt88WlnoITVwYakBqmcdqqSDXlGjhQC/ES4azF8bVrWC6X0gOsF6e/TMSlj1UA9VQWX+Xa1HoPjhEpk1dGyYJlR8ahLkQbTRMK6TWWwCnAwCOFHqk1CKnHl5st/vznf4//4z/8R/z840+x7gh37n0P//Jf/1v86L/5X3Hn3nexPL4OmAaJPCKJDCm3UbPTU8bnXIKFBHHZ33wcFhbEKyzbJY6+cwN3bryPn/74D/Ff/uw/4Od/+R/xmwe/wbP/6y9w/9ka/3ti/I//7t9h0SxA1gphpvF3pWBeRM64AoYgipKt0tA+DmOR/k0a+MlzQe47V2fKz9t+Tbq6ritNvnOQpW5uLM+TkbR+7RQEIVukGa4sHUy5X5/NPbdI7d+r4FxJic+Y8WZiJlwzZvyesd9jC5p50Um1ch4c7N8zIZMJ1lSTNCpXPZCakY+yD1zdX/7Tpx8oqM4vzcoUIulzZEi099pLZZTV+j1jtNwt9WQW0pwZ4hBnrEjOTNKsYJYCWsBWbpAxfxZeFzxiv2xCQEpauJ4iOCSQ/f/Ze7OuSY7jSvCau0fk8tUOoBYUiI2gKIArCJAgKW7NRS2pW32mR5qt522e50fob8yZJ82cmZc50+puqVuaQ7FJiiDFDSCIHcTCwlYFoAq1fUtmRLi7zYOZe3guX9UHEoUCCmF1sjK/zMiIyFj92r12rVPzktItMooRB8v+iip15AiRaxL1ACCPOfSNa4S5jFXA7VxuvhxCWJAVRS/1HAlwlXVcDKBpW2zubAEgOGcxciJFdEYt8jnVqJn+eOOI6CPIOISuA4cOVNfYIYsXXjmN//LwP+OHv3oKL57bxvSmj+BzX/4K7v/cl3DixN2g6VHYaizyp6i9g4pNJNuUF4Bs746p5xUIsdjcQETqJkeANow2sGzUFM5itHEUx2/fj2/fchy3HL8ND3//P+Ps6Rfx8C8exZyB0YHDePALn0dtHYxZlF5y8cf1PyuGeL9Hfy+IPUMeYjb2ge9E/qwSQpFDJ0davYalY3lBj0xrl5MSLE3TLMiPU0+/XrLMeT7LgG0xlAEzBsY6RGPBJZtlk5TQKaOlgIvNcIIMccPHALiGGOI6xwrgYhZ5WuQCYCXgVcoJk4Qwphn1srkkWVPGiVV6SKRNJoF8M2Wt19pdL6+9tyAF0GyUvTBGJFxGrOL7GpUC3F3PKIm2hUxt0QOG1dpePlCcGgEj0kxG6ndmQVFs5imBriA28v2gyOesc372CsjQASysGNkICqzNqRUgM5B91st9cK22IcugLg2y0kArWcgDIjv03ouRRl2DiHJtX4wRW1tbuLB1CQzAGYvaVaishbMOdVWhripUrhKrfau1HARxMWSxuiZibG1v4p9/+zr+3+/9AD9/7kVsuv249RNfxAN/9Ke495Nfxmh8GLau0UYBWkQQ4pIiiPoBphynFsw9O7hMNDFFdMakoaOsBxOMAnGjIJe7ABiV2RoArsJkOsGnvvxtjA4ewj/+/f+DMy/+HD/75aOw/9v/jv+1GuELX3hQpKO71GitDnuHGKKPdfcBJBl58GAvjdzJy2tWpl3uDbxyrZC+gbsfcTFGtG2L+XwOr3WczrksL9eV6dcPvXR4d9ClJ6c2FDfOSr2v9uZLDzHMSCfnLifMEEPcYDEAriGGuC7RS5hyvVZiq2IEvPZ/yjJCVqalr93KTSpzTU8BsgAZbcZUr9XBdyIVs8bCVQ7WWhiVfiXQlb+XV1MBlAKt/Le1vfuUSfr99Jt4ZTbveSwr8vRGTpQkhrLdF9aRCHCpMYx8iZTlIqv7ILK4GiqjJZLPAmipUyR5Nd9QcBa5AWKntV9R6i2yDEgBLxtwOg5S7ZmhHoMxMrvUrzcXToc9e1n+7OVtknLVIIIxFpEjmKE9ulhkgsxwOvDK0iM16pCywJjZrxAjQgyYzT1mLK6WCXhZa1GPakzqGqN6BKMVJdEHtIaw2c7x48d+jf/z+z/Dk6++CXf4BD7z+W/goW//Nzh8/B5U9QGADeZBa+rBhaW6JhyyjNYgcjmA42I4l+RTVMgMKW87hpXfrtvWOguvnyVc7Mmg3rgFH//MV+HZ4B//w0WcPvU0fvnzn+Lv/uMx3H7bUZz8yJ0IUbZBzj8s05QrGHovUqqyLq+cOM1sb85uV4Pvw1j3vY3MGyW5HrMonxk5kZMSN/Daa6vrAN9mx0IxACrZrPRERQJgcc8zM2IICG0L37aSPFPAlc957uXoIhcP2g5DQRcIgO1nqsk3qPKBDSFmh0Kb3QlZwdba/nPDATjEDRwD4BpiiGsYa00NKA360nO60RaGGF3oJSWxB1mcmvFyhM03V+2XlRfVa9MiMUIM6LTnFqd6lSjsQvq+DA4pr19uNkvQXimESKmPitEspQFnXb7cXJNsjFKN1/WMtTfvVGu2PmLOukqYwCJ7AaRAyDCYZPuzZZX+tDBR5IXwTgY/CqiiD70cUQGXmHWkWoyYjTZSZjvXZHDfuDpJ5ZipL1hiYWhy75zkvkgJNCYLeJF/Rh3eZRK03yK9NE/RXMLvqRdXVhWBpBmqczi4/wAmYYIueHRtK33AgtSvBY4IvgV3jO3QgOx+jGCBIDKiYAjnZg1+8MQT+Nsf/RiPn7mM0dE7cP+Xv4PPfeVPcPjExwAzBaKBkc2OkI7dvC5WH9z/koXBJfXrXoTzux0ivYl/3wOaBcqQ7Dq2Y7i6xj0ffwhvP3QKW+fPY3bpZfz8R9/Hg5/7JP718ePi3qmgPYHE3aMAW8uT5fcZWKjJWTe/9fbfZZTyyyvFMOZ9D4Jlf0Ql1QlyjFMCT1GuHfChb2rcBaBtgWSUEdXsZ+kA79XlCfTnE2ZhBZIBk1O1QuUcKudgk3S4vE6yXIdUjw3A6P1CE0JqeMGWxJHUGDGysaao5Uost9U16EHX+0CFPsQQ1zwGwDXEEO91FMQUgQtQJeYX2do39SpKPbjUYny3JrSLy5DpQvTSb8sndsvAaVE0AeXI8gqh4hRKUkJt5mqsDO7VZepGsPJdWW+Dvo5BpWpkNLPLwoBRNKAYYGMEKq2v00bUNgOsDhQ9OHphv6JaOatcKIFqUtdEaG2YgDEGmYAYddtyYkS1xxi0dYBMgJLtMFq/liRK6dhZ5IGU7VPRUMq2l2N8wTGpibP26CFCxRYRETwZ5z4+YsLh0bYNOu8xqsaY1mOpb4oRkQiX2g6/ePY5/M33vo+nT78Fe/ijeOjrf4IvfO1fYv/Nd2AendpZF+uQdsHqXntn+/gdTa2hCRJmMRXYd+AIHnzo63jthSfw7CNn8MprZ/C9//p9PPDlb+DW2+7Q7Qkd/e6+RKZVQFguU9aXVn74OilXSW7vFh/Ms/IGDFp4AtK5l5I1ySgp9uxW6hXIapLESeWwIiXcQzBgjcFoNIKrKmG4tAfjriucjmUq3gO0FssWKggLY+XBppQQap2WGi2V94shhvgwxAC4hhjivY50f4xSf8UhOdup/XuSnGWGS26ymcEQi7vd09U6sI4xoPM92DJEublxNkAgvmraW1RaIhUhawDnCtBF+XUyKPgg30BXAZf+zYkd6j+nJAkNqcGySg4tF4BZrZ2j10GU72vwqq6oxwtA6HqTDTVIoRABPUakpk9S4hzFhINClO1f1u9x2qeJBUOfBdf6C7FAT79Dp83yvPT38sZJHxVmLUbhXWpmWjnwqBa5UpwihghnR3DOyupYg8YaPPnbU/iPP/wxnnz9LYT9N+GL3/hX+NI3/xz7Dh1Hgxq2qhFDObbbS2Lg2oUxKr+MjBAYRA4Hb74d99z7AF58+hHM5mfx6yefxXPP/Qa3feQOAeIkQPeKa869iceuywZWmsGuO8XW8RgL38EAuN5PkS7hJp+n6ZqhCRjfS5KRpYRav5WuN6nn4sKMr7yXc0N7o20foKqLXcHW0krrkZSuGAv3BmMBZwBnQc6BtAk4W5OTdZzn8cG+VwwxxDuNAXANMcR7HMRQCWDsmYo06C5lhMlqnDWbCZGy7T7jXl7GUWpsgg+5v1LlKlRV1WcxSW+WV5onVGJoADKasTSasaSe7SKi3ORYZn2D3EjTYJgKWJIzysnp0YLY9UCHocwkdH9AQYrvLf1jD7SStId8pyBK2K1kCc0x5loNBIgGSY05YhCgbhLQilFAXarnSsyWrkcCXnnAtvhTkTLZV8Q36XtG2bUFkEZa4mdgrQEqAriW9R1ZNAh44dw5/M3DD+MXv30Vl6oD+PyX/xif/8afY3zwJOZsATdC55HBHEOlltfxmAqhNxeJUdvJuoO4/Z5P4/DR2/Hqi2dx+o2zePbZ5/DNf/FNiO9/YhuvtN7ao+0KUxDW4M2kQysn2kPcIGflBz8yWZQYKpESUnKeDeJ0Sj5kgwwqWK7c3JixG+3bxzpwztLUPrXzyACKV/swrs6MACJEqDut0fpPaxGNkfuEFcCVknMZjOmybpj7wxBDvIMYANcQQ1zDWG1qnOynFWilJrqxsIBPvbYi94XUfT6xKO3o55l7POnyYozoOp9voE7tv40yW4kxW3fbiyGADcGo5Xsqhk5AK0Lrs4r3yvHgjXQzXYYkoohZlR2yui3kgbE1PTCJDI4WiE4z0qlOwxcgO8lHRWLYy0q1EbNmtdkDCMJeCmMmTZblMw8OAYY7OY5KoAX0dWKRAXL6ecqusxKeCaSl2g/0QLKsKcqbpCiax/LnqgEMBLgKHUXMDOHhp57Eo799Geejxc0f/QQ+99U/wcGjdyLQWDi2aPOyk0wuXonRfQ+iPI9JDWI6OBy6+VYcPHwMr5sazbzDG2fOYPvSRRw6uE/qMKlaPV8X5yzIsvgob2r9z+Q5UP/BksENa51Ork+k1WmoWP+8rDXrdCOdv+/3kN0U+0SJFwkxfOgbHbcdyHs9p5Xx1kdMBht5fiQSvjIYYEMIKi03KUHGLG6Exf4uHQhXnGuNJg+MFddaa6SxsbUCrKwDVQqyqkoeyVxJj1mO2oNriCE+hDEAriGGuMaxcANLrEf5KHqucNFbq5eMaDYTpfyrn3cejiWwpXU03neAoWz1u7s+fynUAj7dbJkSsBJzjPSczDSgpgvXdUR8nSMlmbkYE2eXAoIwgyx9wJLsj+Dyvk+DrvTItVvqgpgHXAHy/jIjGlLNVwRzAnKcZYgcE6hKTbKDHJexkD8q4ErHKXNir1jH7unHpEQARN5aboflATwTLDlEA7QWOPX2WTz8xON4fXMH9uBJfPahb+H4bfcCNAEnxzPu7dlBnD1CrrMFy0IwBATaeoLpxn44NwKix6Vzb8PPdoBJLYNnSpIvdbxcqIEBkJIXxd/5nNZal9yrKH1X3UfzgUb6FnGW9faAq5f5sm5TLqZbYc6GsfB7GAqS03U+uaAmxUPu+edX3GkNi5soMa3uwxUTjQjvI+bzOdq2BQA45zAej2GsleXvBWRz70hLyRTDiHyQtc8WWyeAzybJed9ri6+3idIQQ1znGADXEENcw1jtrYJFKWFiMWIUe+5cCF04z6FkoxblW2sWCFJTAxnvszhPqdXv+iz7YpC62pFawJMte6g4zWqqA1UeDN6YYGtv40+t1ym/R8tqH1KAYsGcKDFhgJgNgNhja1bjlLT/o5e6viiW0QKkhM3KJhsqRUw29awgKhXhixEHK8sVwVSYsSwBMyjbhdgCSc6XjmMFWrkPzxLg0omK7UdgtogWmPEcj596EU++8jJ2aIrjt96NT37mSxiNbgbxYsPgWDBcUTfoWmnddYq0XmQI1aiGNQYUgW5nhjhvgZ1GGExq0TtjrANcOiAtIvNRCXClOklgdWCc/ibKzMUCE0Yl6ErTU/7eFSXKeREDCnv3IwFxOR97Z1N1I/Re3Ai7rq/jSlLkpGZA339ucdYLJyBgCCGEXMubP9JzSpxM97DKiW5WKXlmuEzR1Lhy+XWWnRcJg+vuXDvEENcxBsA1xBDXOLLddx5AJ/Zh0Z2QE9MR0qA3yUfWga1dQrOP9WiEihk+ehkMLiOCK0RqZtxnKLVZst5ESd2nWB0KE/lxQ47L9rLNRK+3MmYhBbwySSHdYYCZwAuFOBYcDZhJALmLMlbmAMQqZ7a10ELZrl6CSqzsKEuxvTBWeixFziYsHBk2MhgdUlNnhB6YkbJe8pM6JMDVm4Ygv8cMmHWAa2HTEIgNyEZcPH8RP33ycVxsG8TRYdzzh5/CzTfdBksTtcTWzaMvYmYN04v3CdrSYGYE32K+s4XQtagp4sDGFLFp0V7ehMugut9uGRClyCfNoqwrO7mBEI1BrGxmngUv9a6gSfLLphKpl4KtPJ9yGpWQ0S7bdK3o8YY8sa9v5JbEKuellPxILSG8B3ct0PpspJT6/SW4T2uSbitsFQPz2Rw781mWEzrnMJ1OYZ3TY+oqxi6LS8jHEhlxIoQm4mAtSJkuWrp/ZBv54VAa4kMcA+AaYohrHrzw4Mxsaf0Waz8VdaWjYoCbma2UXcyyLuQMZ77tGipYMbnPOWvzID3NMhkT9iAuDZoVPBXsVu9C6OSR2C2zxGzRDTow2zN5t27CbA6+OikIhlIPKZkmphowJgFoYIBLB0IUgKtofq07NjdQVjliliepXJBj7OWFkDovznJCZcLyscIwrE2cS9CQGBFO8wyLjJayKGXmnY1BII+3Xp/j+Vdfh4fDaLIfd9xxD2o3AQdIHVyPR4tvF6wWX31X7AWTLe+RdV/Je6WU95XzYIBiAPsOly5dRPQNKvI4vrEf9U6D2LRgRGWzlxiHYg3EkGbRWCOBsnQKslGplsoCiaDJj8LwwBgxKSjP2yzlEmaBywEw9XU4JeMls8td+PqtQcjLzqw7lsBj+s4u+3EIiaR0YECaHBdW8Iis0uAOFDwodvJ3cjlN53q6H+j5Wm5kjiGD8xAC2qZB6DoYItRVhbpWRjZdO4ggrSWwlADoFRFyPzD5wURglRCyUxmhk1qu5EZIhZwQ5WyHGOJDGgPgGmKIdzOKUUYGOAByPVaMCNkiPBVKy/umkBFyLGu2dDBf4jb0N1niiMgssjFdVgY/sc+qcyknyf9HMILeRCOknxbABtJvykijSoLtgZezYDK5bkvG2Dew89RVf9a6gefuX811NsvZaWhtVCYjacGZT8bCCqSszcAIQC8VZZElCeOVWFKonDQiKrNqE+jP0+lxh948g4LPAGuBpU3LSzVgJWJR9kXGbjKQ9wbwHPDGrMHFmUfnLW7ZdxMO7b8p13eFhU1Y/GZGquzaW8u4PURcOU55BaglOGHSABcEynyeAA8XAs5feBsXz78JG1sc2ahxz6HD2NiewUWvJo5h6RcthSFJYKxjvUidP2HhTCXTaJsCKpMeRiTAcInpMgWblZrPWllvaB1OyZ6v2VkAACAASURBVEIUbqPyy2PPRpABbAJyBpHkekPse3CXnRhpISeUrjblrr1BrxB7isVaXk1KFE3Se+fRFjF2cNyJrJe91FNmgxsU2YmlAzdjMDlXZ/MZfNfCgOCsw7iqUdc1cgPxVAtI4r5BSTKY5pU10eJCyMnaXZ0IuXJgV4Erp3bwlbCvxsDoveTGlD4MMcQ7jwFwDTHENYhcspEMBvLgNmT2IdfZZAajeOwaBfhKmCpGtG2LEEKWjFhrc9Pb5W/LCpZvyg2WSO/jxiC5EMJS32Mp9d1KMxruo+96XBG0pn2uTCYlYwSTmDFGLmznqFKlgoHMLBVrf6/y2JMFcJ4Py6BaARftOs2uPyTRJbAEdL7Fxe0dzLqASAbT6T5MpxuAMQjFsXw9Yt3pJlySDpBB6j/BAPpEA5PHs8/8CluXz8FwizuP34bbb7kZYfMyHBiMsFAzszaoGOCmt5IEONXYkEW0BXsF6PlIIv/VPkjRITPSbIzUWxbSLiKtxTQEMk6BWGpaa8U9Lp3XyoyxkabeoH4eIC4kcQQY2S7lTuSV/7Hyehf+98MTKcGWwJYXh1LOr0Nu75GYrQWme20I+A7eo2kazOdzAGKcVNc1qroW+d/ScUl6buc9koAzNJGW2n9oDS+pK2GSmCflAyvYSoD9Op/aQwzxvooBcA0xxLsY+T4Y5b/eICMiRq81NaVZQVwEXMDedFE6Xe9I6BFCkEaWzr2D2RgQsTY3tjqgN9KoMoEsawrXKWVdqJcz3dDs1nsYe9qGpftcek7uk4lFBQR4yYtedpSkSAxtzpxHVf3sF45DrRfhYoTHAC3Mc5Ut0jllgGDIAM0OPBy6iAxlKAH4d4m52mtc3TiGtRkt1Hgmo5DMHgAdtrZO49lnfoHZ5lu4dWTwuT/8GG49tB9mewuGIsAeJtU47hJS46bnUXozyQGBfJ5FZ/P2ZGUR5VyU7chEkhwhUkdRAozrZV3KpEkDWqeATedp+hocWOm5B63ZJJUeJuBGyUbcEBgCvkDJ6tsUNWTpyFgFXfm3r2F5PzzRGyclgEXeg30HdB6sTY8pSX6TLJiLcxhYZY+YM2MdlF1NSbiqqgSgrzv+GcJ+llwkpYYEiSkV2SBVFVCJBTxXlUgKnQCvuNDba4ghhihjAFxDDPFuxwLYSgYHUQuf4yLDxcmGu+iDtDoOXg2Sm2/Xdei6DgAy2CodCfd22zP9jdsk2Qgt9NlKGfVkC4wSbA2pzPcmslxrzYbmEugYkQhBp+Xi8/TdUBRNrcNMzDKPbPxQTLdufuWXy8EgERgWCBHjAwcRjUXkiO2dHezMtwETl0tQrnksA651g0NiVmBoJO+vY1GOYr8f2k08+cgP8PJzj2Dkt3Dfnbfhofs+jgMAqq4BQQDXiknG2hVacm4rjS6QQBRloEP6Gev76TM2UDkXCVCCMlTGgKAtHJyALmijWkZKqDiQc2BrENWVFFbkxGl6Y52CrioPrDNDZ6sMFFMzXDLrL2JZpcZXawp99Y8/qCGgqW8DQcFnVou8h+k6kJf7hgl9giNhrd02S0pkOCKMRiPUdQ1mhnMVXF3LRDHucg1Bf8ylBEM69qxFdAZwDkZrteCqfJyQrQBrYMyVEwxDDPFhjgFwDTHEuxTMjKgSQZOYgeCzZMSoS1xyJYSOaZOJxULt1krmEvqZ9r+KAb7rEELIA0jnHJxz+aZHKju7YkY/FzQbVQWlwZjcUKWhpQIuVwCv9PV3b/MN8U6jPEbKQTpF9F2r0v4tAFl+XpKArRwmhL6Cahlx7XklARjYyQg3Hb0FzlUgtNjZuoytrUvoujngRssKp2sa7zT7ziSyXWcB7nZQG8apl5/B4z/5R/jzZ3DrpMKDf/Ax3HPLUVTzBoYJQAcgKGhRViGBX0DBs7IWpge/DKnvKZMuBAOKCXzp940Aq/5H9YdAYuQSQ5VqtYiAaGRATkl2qMkUMqmPUmK3rYAw60BuiRWzDkYH2Mg1PV5ljLJMsZ1M61qY8ORNkIAjFhmXNde9G+kiw3qN57LXltZTsu8Qmw7GB2k+74t+eoD231qZoYDttA2N1uoSoU4AKyfG0p9rNiiZ/j6QwVZitXTfV1Xf1LiupJZXlQ+cvzvEEEPsFgPgGmKIdyGym5PQVOoIt9jMlkqXOJV+pOER0EvzidaMMrJlGUSe6ANCCBlwVVWVwZau0N7HKlm+ZItBlT6cWWW3IOPDLG25gQZE7/vY07Y2WAVFtPCaaXWKK31j+fvlyyvDL5m2mkxw4uRJHD16M946dwnNbAunXnwO93ziIZAdA6hXlnj9gvQA731ADTEcd3BocO70y/jF9/8Obzz9KxyKczxw10dx360nES9vYhsdJpWDqwHjil52K6CiB1gRDBR9x5aVdsQBJi6xyEy9bz7S5WEJTAdpcJ2TKMSiPqXEXhsAUsfFCrrIUgZkqe8enNZ5KcMlbnR1ZslgpKaH0t8JZFJx3VDGHLqeiQUrkzc3cpSmM9LLLt0XQt/QOAQYL/30jBpplHWXC/PLx0FqUs59v8SlZS60ANgt2ZAAkx4bUcEWZTZLDDHEJMOq3Nxm4L5chzjEEEOsxgC4hhji94zSvQ2kfVWKHltlg2PpeYT+Jqp2aLkHEXbBMDnpzYh+kd1KUkJXVQs32yveYMsZa6F1z2w5cTVL4Cs5mGnNCH84xkgf8Li6VGvFUmUZ4zNdsdFwOhautCQGECKDEHH8+DE8+MD9eOGF36Kdb+Ol3zyFyxfexMGjE4Cqq6/zexicQAH03IwNnO1w6e3X8Mg//T2e+dkPMN25jHtvPYGv3PcJnNzYj+7iJrbDDDuOYEYEN7IY1RNYazEej6VnEZTbYaWwmMAhYTCC6U/0HLL8vqZM1xBpDyo2lPocAJlpSHJQShcZKKWubEYCYgtuhQRruLf1XmC2bA+yqqoAXE4Yj4Vaz6oHaIkJc4uuiswAYgKl6NexjDWA/oNaH7QAuhRscfRAkhAW5hmUe+mhN8wA1jOA1oBiRNs04IZB1sKqtDwtd0Fivnb79aCYjbhaknPKaOmjFtlpNsywxTGRmxsPMcQQu8UAuIYY4neMZUtuZpaEbWREJEarzGSmnkek7oSr9SS7RrbuFnlTAltJRpjqtgCRHlLJiF0p0sArZ71TxjplNtOgqWe43kmbzCHer6GD8SJWx7pm9c2l6ZewwZppCIEYRMCxY7fgz/7ld/D9734fL52+iNdefhG//NnD+Oq3b8Zouu99dlQVYAYRlQXOnXkZ//zd/4SffO9vwRffxKeOH8P/8MdfxwN3ncRG24J2OjAz2i4gkCRXeHMbo3qEI0eOCOgy/cA0pKbUMLn2CmTWbNAkF+u3NxfgqydAklgvse3p62niBL5YgUySPBplNQhAlGuYIWW15JmTG12+FhQsuDXgqlJTDmU97AjRjWByM9xUK0Z5kB4pIlrOpjtEBOMWhyQF1Oj3zAdwYL8AthIjFaMYZhTOhBw8KIiRBiWdbZE8IywlvEgkhE0zx9b2NkKMcHWFyXSK0Wgk8nK+OujibMaiBinOgisLqqzKByuYqhIJoUv7XWv6UnKCrnY1GGKID3cMgGuIIfYc/c2kx0nquabywOQUR+pGuE5aCCbpk1RkLqX/0XKdTQHIkmSRADJGbN9Bwm4ly+gCvFHmw4J+P2n4NTNOxZRpgJUHRSYbZ5BmqDm5BgAADCh9r5/NEO+X2APIlqMj86FrJlllWq4wuyusCsMRAUHMMz792QfxpT/6Kt78z/+IyxfO4NGffhd33Xk77rz3ayC3ASatCVEiRiRTEUSMyHZh3v3xvLjEtTRJuUYU+l/JQFnvRoD0HiIlnykCYQdvnH4RP/n//j0e+9Hfo7t4Gg/edRL/y7e+hq898ClU7QwTZoS5R9cEbLUzzMIcgQOsNajqEaqqhtXzlCBJE+89fOtRkYMxFsZZba1F/YA4OYooA7YgT6TiqUyErE3icMGUqFkPEeTyEJTNI3EsBYSBIp8TMYtsWGJDbN/jqyrAlzVgOwbsCOx0gG7U1c4K05XMFti6XsJoVApbyNv6fmBpF/VJpIWr5QIV+/65GLHeE5iD/AwOIikvjZRCBHWFI2EI/T4s2a3CkKb/hYSmabC9tY3OdzBGrs2J7SxlhaUfU07O6bbN4nbt38bWgJ0AL3JWHQmdGmS4QvVQummuHnofRHA8xBDXKgbANcQQe4xyQJNuYqR/J6DFHEBBMpdZIpJ1+gmYeRlI5u8uMV06ZkzuhUAaf8md0VoLa4xIhkqzBF0PymsbwBQEHBUDS6kbIbAhGAVakoWWARE5k7OYbEmbHGttAMvNfLiRvo9jT7vG7G2yq020miNYgUAmyPJgxjhw+Bj+7X/3P+E3p17Hrx5/HGdfeQw/+of/A+PpTThx1ydAbgofHLwmCJwBLEUQIliKfpCgYj+YLJeYBqV5hL70eyJiZvcIgIEBSx6EGdYI6JE6S4/tS2/i1Au/wiMP/z1eeOSfsL/bxJc/eRf+8htfwTc+ejsOWkZwRtasqmD3AbYbY+o9ovdAZEwmE9SuBjFJ3aYxCF3A5qVNbG9vw2gCpa5qVFWFuq7gqgrGGDnXjLLXSSKsoIvUTCGBpwUTDTBiahGQfnqW7vUD+GU2jFnr1jQjIz2YGEDIy06ywAS+yBqgoywfJGMA14DNSACWFXMFM6qzZJmsleuMDuDJVcquK7izWjdmkkNkMuuxeRfnvU4iWe1BaolEi139XkXBLEqFXgQ4iI9I7GWD3AWgDTBtBFpxKZTG5jHfTzJrmX9L1GSIvOG7Du18Dt91MKTNjesate2HdlJeFVUi3AN5JpvaXMMYCzJiksLOZhlhrGtQLWYZoUpmKTYnDvrtqi67w31hiCF2jQFwDTHEO4icIUQxdsmAi9WBULOaC02NsZSt3MOy0iAqzQPFssCLspBymoW1XZ/tJ6JcW0G5RkPdyIwFkTaxhFoDU/+94aY6RI41h0JJjJWDMmbGeDLCl778JfzP/+5/xIVL5/H88y/g2SceRbD/N779p3+Ju/7gUyCzgcqOENiAIsOQBUeGTZKl8jxK59ZysRmXLwpmGgRGDUYy0iNwYFSGQFbOWeMjbLiIs2++gqee+Dl++qN/wBsvPoETE8a3HvoM/ttvfR2f+shJHOQO6AKMcXldDIBRXWFU1SubJ0ZhtS0R2rbFbDaD917dTWPul0REuW9SXddi7z0awVnbN6xNEmCZsSaBrnx1EaP7JSnZOjYsSc+S+532c1pg3owBKAjzbYCYWC8FXGwCoM6FSWqITiVpVvo2sU1Odw7sqtxQN1vSZwatZ9pBrKwKgTLrLrBBffFXwT+tPUzfs8jQn1HU9fbqB44hM14ZbKXjdpf9Az1mmnmDpmngvcdoPMZ4PMZoNAIZQmSGNQYRIl9fJAEVuOu2JZtAsIOpLLiqQFWN6JJTpV1sBYD3HscOMcQHPexf/dVf/dX1XokhhvggRM4G57+h93qVA0bkWq3UY4ui9uOKxU30aqE3WWOkniMmO3ldKJFmgfdS/0VqEs19oTyRupI56Z9CSZdf1b39r3XSzDRbSpsBbA2x5yihfj5KDeXx2h23fwSTUY1XTv0WZ988g7NvvIm3z76GygCHDuzHZDQRMMQCkqxxKsWCDh4JxNJfimD6v9kuvp8f8o9hEZTBIUir18oAjhgUOsRmG932m3jh19/F9/7u/8LPfvC3mJ39LT59+834d3/6Tfz33/467r/rDkyIpT8SpD9V1JE9qf1jqpVJrqHMrE2IdYCrn00mk1yDCSA3MPfeo23b3NTcEKEejUBEcj2QmWY5oXi+9wNr4iT8XVQkXs3YYPEKh7y89BuQlhvT9S4ixqjL5L6xexC3PQoeFAMoqs2599JnynuQD6AuwHQRJvehitJKIwaRXYeAGDwoyHW0bBTPylSadF1N6F6fyyvuutTTexGpcxYxZJuphBDeg9sOaD2o64CuA3kv9VxRW31w3HWdfdehaRrM53M5PozBeDLBZDIW8ySVmJoETku3I1KJpyW9zluw02bGdQ2qR8pqpUeq4xXpa3kPWL4fDPeHIYbYPQaGa4ghfofIluiaVqb0WrPYi9KQMiOPq9750yTMDA4BXdcheA9DBs5aOGN7i/alGq+FdQTEBSwvUAZ8TNT34HFG++c4zVAX+vwE7EpWbIghrhTrcgBJ2hYZIXjYGHFoY4y//Fd/hiOTEf76r/8av3ziKfzmse/h3JlT+OwXnsP9X/wOjn7kDzA5cDPaAMRoYdgUdWcAsFiLeOVYzMobAoijwK8wR9tsYuvSOTz79ON47Jf/hNef/2fsXD6H24/fgq9+61/g3377m3jgYx/FfmbQbKZgg8AmIPoAVgKGFRiQnvtRDWwS8CJ9dlWFAwcPggsDnKZp8iC6NMYhkp5KBMh1QJMgQZueE0ktp3Xv/Ha+ynCtmuKU7LZMQfmaRhAgQRyL2i+BtolFT9bhrFLBzKaQAxuX3fDIWXDlEJ0F1ZXK24R9Z2elubKzAgKMSi0NqaW90aI77UG30IvuOgTpqdDnyfr7Ra7fCsJuqQQ9u9mySiRVprcwWzXJ6LpOGdIAYwyq0UhNMqyA0mRmwcUZQwl0KSgl3X5p+1YVuKpBVQVUFahyap4kbCMXSbc9mz0NMcQQOYiHM2eIIfYYMQOs/KzAipMhRtcJ4xWD9twKOVubjS/UMGPdqZfeM5pZDm2Htm3lJgpC5RxqV8kAIw1ki5qypbkp06YGF1oTAWMQdTDDWkthrJMbbWp0ma2ipYYrDRSHGKKMMjkgBhdI7xS6wn5AyT6Auw4mBvh5g+3NTfz0pz/Bv/8vf4OfPvIYTp/dhpvegmN3fAIf+/SXcOfHP4Nb77gH+w7eBMMTEKzY0TNB6sJ6N0FD/SmBtBpp3cBKBDEoNkBowbHBpfNv4vxbr+DUi8/gxeeewKunnkczu4hjR0b44oMP4Btfeghfuv9+nDx0EJMugHZmQNMAbQv4OULbCVvhO3AnDnPJJIeUoVgxwdhtWypACyFkdiuBrclkkqchIoQYcfHCBWxvbwvYshZ1XWcpYmLNjLXKBkHPZWHWEhAslw2dhsiurFfepKl+bOEI6MmTbKWv2ztJH6XvltOaL03owAGUejyJIQNXVgCXqyQZ5BxQ1eJ2qNcndk7NHFwvPUzmHvmhxwklhmfxN7wXIdf4BMAD4COgrBbaOTCfg5sWNG8Q53Oga/uaX4p9Uq9YZwYQQ8BsNsPOzg5iBEajESbTqTCgmogTt8EElJPzJem2Mr2zZCXX+1DXoKqGrWup33KVKh0kCcep0faQdBtiiN85BoZriCH2Gkus1kLtFrNIepIxhn5OzCsZ411nv+AoxeJi1nU9CNPieplW5SZXzJcUQhrWonMyPYOVem1Zp3bORT8edS2TqpThJjvE7sErL1C4zjMQPeA7wAcY78FNI1Lb7W3s6zp85b77cOJQjU/cfht++ONf4ukXXsVbz/wMb7z0HJ48eSdu+9gf4o6778WJk/fh6NET2Lf/gGTlmQCIzImZECPgyMGonCpGr88dGBEhBrTzLcwvn8bp136Lt8+ewaunnscrp57DhbdPw3CD2287gfs/+zV87atfxZe/+BBO3nQzRiBgNpfBsqnAlQKuxoBtC3iP2FrANCBPmb1ApEVr76tEyVRVdY1Y1k4V0wDAzvY2tre30TQNrLVgZuzs7MBamwGXcw51XaOuxYzDGKMqQAF1pkii9HLhK7MXPWOyxIIlYJCBm06TgLixAiQMieyQDAAvz76wje8URLnUdNmBXZt7f7GzQF1In53Vnl9FjzBjABv1GidMV6pDvR4svSgNuH8EaRmA0DvYJkaUOYAhLoUxqHqiWO+0b5Lle4xAVVWo6lpbDqySzAlsp5qtxBgmJpGdA0ZjUJXAVt9ni5UBEyn7cB8YYojfJwaGa4gh9hoxLIKtgt3iKFbw1HVy49RaA2aVjRQF0OsYrpW/Y0TTNAitWP1akoL6ylU639g7l6HPfK9EWciQMsKaJebK5iwyWSPZcJMkhcksY7UQfYghUvRgSxMOAFKfub7ZdysApeuAtgXPZlKv0rTAfI5uvo3Gb2FrZwevvPYmfv7o4/jFU8/iudfO4OzOHJd9QL3vCPbf/FHccvw2HD12HIduugmHb7oF+w4cwXTffowmE1jrQNGCQAixQ9POsLOzjcuXz+PipQt4++2zePvcG7h89hWcO3cGm5sX4EzEgY0J7rv3o/jiQw/g8w/cj/vuuw83H71V/BA7jyoC1HUwnQfaFqFtQV0DbG8itA3IB3DTAs0cJnhQ14JDgPERJll8v4Pb7Dr2afncbtsW8/kc8/kcbdvCdz4z3cziUGhIEjSTyQSHDh/CaDIRz7x0HVp3vSBlDq8QcjmIu3+e1huckzcEIw6IBKmcIwJR7KXRVq851iqbog2XbaXXJ2G1orUw45G8l5rwplqjxM4XLL3MS5v5vsegKzFcJkag0xq1eass1xxo5noONOBWzgkOHpG9fF+TFqaQBwI9AJO/Ta4N1DvBCsMVVc5JJEoGaWZcgWsHjCpw5cDVBMapjDA3NXZihqLXfzPcA4YY4veKAXANMcReI/hFKaHq8WOMiNpTxXqfdB86ABKreCmcXg+41r32Wp9hGJKttg5Wb7y5XqwAcbsDrsRwIVsyQ/X6qNUC2OlNW5seL7Nc17MUYoj3d6wArmSckMwBYhCQ1cyBtgHmjQw0d3aAnZlk9rsO8C38fIbOe3RgvHXpEp599RX84tln8NRLL+H0hYt4szG4vD1HBGE83QdTjQBTwdQjGFuJFC6qcx9HhOgRYgMfGrTtHCF4VM5i/74JbrrpMG6//SP4yh99CQ8++DncfvtJ3HTTYUzGY1hrEbQO0xCBvfwGCh7sBdyQ9zDbM3DbgroOrL+NugbUdsroeVDn+2tFqt+52jZdAkS7SY+ToUWMEcF7NLM5uk4kyN77PN14PMaRI0dQjUcIyreTOiUmpivJEomW6+TWADOSvmj5zzUjiJTjSQY/xFo7mlh3BoyJIBMz+5Kky0xiCU/WgI0T0KXW8tESzHgsboeVg3EObGupPbIWpnLS26uuxJLeSDIpWotoFgFXUgtcq8jGF+kY7wIwawR0eZEUommBdg5uGgFk0QszaxgGFuBFxnHFLdZYrLCSZglwVbW2ALEwrs6W71w78ChJB8dize8k4cZWt78yZpEGOdQQQ/y+MZxDQwyxW/CaPxiSemQouyU9tii7Z6VardTYeHenqRQEIFkxi5REal0MA9YYODXLyIXX6UtcPK+sb5pOWTBrVI9v+tea/Y3JMINUVphZrYHZGmJdpHOBCjZD/mfWGibvtd+QB2Y7Wq8yB8/m4NkOzHwu8sK2ARqpa3HWwAbGmCJGG1Mcu/fj+MydH8H57S28fu4cnnvrHN48dx4XLl3G5a0dbO7MseM9Zr7BvPEITCA7EkneuEY9GWE0PYx9B/fh4KEDuPnmm3Hi+AnccedduOeee3Ds2FFsbGxgMh6jHtf5l8QYxIKeVB4IkkGpEQt0MZupYMjJ+rctyKkst7OAa4DOCquBrr9OxCgMT+mypyYG0h+pr6PKLLkaUKyBXAAAYwnGWrhK5IMxRITgEYIYKwDAZDJGNRplhScB6NoWm5cvY2dnG0RG7OfHI5UfilyNDMGQWVhelimXO556qWEe96dkDVM5mbxKh09UO3ck+TKLBJCMsF8e0sTNRL1mWXHUi0FAldYfsZ2DXQVywtbAVUAYKdOlwKvS5JK6ROqOxNoL3NprHvfq7GQitH6XiJo2babCXKTvqyV9uQAPRpfrewkqKWf0PbPYiEmGb4X5NARjDaqq0pYhsV8XBbQMzrV0UMMWtgZG67LYOXCtrythB6ke5X5pue+bngIM4NpC0yGG+HDEwHANMcRyrIjg0yAhNS/22fqdggymZEDFUruRardSvUMpQwSQzDcWTj0dZHVdB99KvQsYcNaiqus+y1wwWim1nDPMzIvrnorGTWo+aqQY3TqQavW5koJpkAyuyAzW70NorL0z6HGXD+XEwkQEFgtw4zvQXCWE8waYbQNtgzibIc5noPkc1LYwXuywETzgTd86gVnkZTHKANIIG9M4gy5GzOYNLm1v49LODDuRsc0BDRioK2C0ATOZoNqYYnzgIDaOHML+I4dx+KZbcODAQVSuglUjCqeufivssCZTMkLRc5djRIxBbNJDgPMeCB3ivAG38psoMXldB563sF0Qa3PfgaOaanAAh05d6Qgcbb5myPIiMs9EJNt76ZTk5VNUB+dlhBCyQ2I2vVFjjs3NTVy4cCH3AYPWj1XOwVWVmPNo7Zd1Di4ZcKTFLenLlocRtAbMLF9X1ueHykQP6fXLqbuhXMMiAexEAi1N2o2aaFRAVQv4qscKwqTZchxZhMrAGAdjnDgnkjglZnCYVq98zqss+yZSgk+SbDD9R/12BxBNcnAUS3xq+3OC5w2o20Kcz8DzFqbxQNuBfASrikKMLsTswnuP7e0tzNs5mIDxZIR9+zZgbNGqI7OEus0UnJKxvSSzqoG6Btc1uB6BsyuhglHtyWXI9IYnQwwxxLsWA8M1xBBXimWwlLPTSc5XyIWU0ZLJsqL+qiQR5+9KWGNAVm7oLjUCXVMHsiLlWZH+QBsb21y7Rdao1KbvrwVQzmgOMUSK3LZn4c3yBetE0r4AoQP7DrFpQHOR1vF8DuxsSe1T0yDMZzBtA+s9WHsycfQgVDK/GBGZwT72g8kIjKyFswR2FgfGIxw9chjeGHA1QhzXoMkYbmMDPN0PN5kC4xFoNAKNR2Jx7VRyCII1tCDjXV/LZLAwitZ1McYIg6d1jhQMjDrkUepZVNXC7FVSnyPyQjWHCAK6YAAEI6Nz3ZwUIRI0QsF4rc+Hrsr4aGXKsgdY2TA5OR/u27dPWk6EkB9t26JpGgDIBhx1XePgwYMYGSPzc+gZKAAAIABJREFUMsK6lNebZdnbrhLnhTVel9sq+SMBn5E7gA2IAxBIQE+Qui/yej2zFuQ8UAWw7WB8BGwNrjphvqIDggNsEEMN60CGpfu1UVdWpkXlwMLVuwdZjCUstvQzDZShAsBMoEigmHon6iPa/D6xFaYqsr5OTCfDdw22d7ax08wQYoCpHMiR1N5SYkYTYFRlgrG5mTGSu6OCUdSVPCoHVFZs320yVOrvA3u5bw0xxBDvLAbANcQQu8USyJIBYXpAWaqUCNcBXAZnXKpQrhjlwMRpNpJisdw91H3kKJLcKdOZpDWkjoSUisqdsl7U1wQM7NYQKdJwv+RNiDThwMrkgtR5rQMled1M61PmYorBO9tqmNGBOs3ye2loa0IQNjh6kHOIzNje2kLTNNnifDQew9U1iDvEyEA0gAUqY6RPkx7HBoBnwBkr5gDWAWRE1MvSaiGBgQQI1oOt/GOXRp5qiW6UTTIGcFEHtpW6GDrA1cJQV40YEnQduK20Vk1AKXUEkMjljNFrSvDgaHqDnQXG+p0XUpY1YGXTYmMMxuMx6rqWFhEhoNUeYKnRcgJibduKfG3JKZEBdF2XmyIvT/P7xELvKIiiUNpuMNgQrDEQgl+MiqKJAqI8Ay2DXQA8g12XwbbxDtQp8K6CSA2Nl4a/VvpWwWqraCpADJABCLAGbKWzJAE0BlKjbQFRUsfIMWiNFiOECNNFUZt6wBb3kwTpmCNimGPebGFnto0QGbZyGE9qjMe1OuEbUCjBlgWsmh3lel0HTJTtqyqglj5b5MTxUZgtV0gIh+v/EENcqxgA1xBDrIsVsAWVPBWfK7iiqA0qE/ulOvy9ZHllVovZ4VzrkKQia9itlXlQPxDqBwiUi6UT2BIA1veqyT1sMNxsh1iMBLhSlY1JXu+sPeY4IvogDVzbBjxvYJoWZtYAO3OgacCzGTCfCSDznZhN+AAborZQAKRPHIG9x3w2w6VLlzCfz0FEmE6nOKKSNqKotVXQZXtQ14Fqp/I8L6BKkyKJKTFQt00AHFnad+21r1zhBLrwHhEiCzhKxhDSZsHKwDoEsK9BoxrcdWqO0AJdK9uhEaMQeHWvixHwRvo16SBd5Jq6zctTk5eegbWZnXUMXur1Vb4v7qcO4/F4ge1Kj33794v8MgHWGNG0DS5vbmZb+gSOkw29c9Xetu+adS4ZMtLrLBHnEihiA4ok2yebRxip97IBpvPgzoOdmGoI6yhGGmJ9rsYRdQ0OITseGqgzIoDUJF6YTtObgKCEvrz0gMptyx3kwRwQogezB3GAh4cNARwiIgICxQy+LYkMMcaAdr6N+WwHHDpUrsKorjAdjVEZB7QsIJMccoN6K/3MrLoQJtv8OBJXR1Ol3692+okZpF0OoCGGGOJdjQFwDTFEEbmB60rRhDJNzOAgmUtp5hr7xscLAIv7bOnCgK0vhk/LKwdAK6BnQa7YB6WxWDF5hP6dgJoxfTNjtVVGIS9MksLEcA0xRBkLVg0ckZq45nYIPgChRWhaoG1A8xa0Mxcntpk8m65FbGZioBE8TOh7DmU2WIv9Z7MdXL58GU3TIMaI8XiM6XSKqqr6809ZJ3JGEgkZOFF22DSpuasyFYuunmaN+O4qUZ4bC691tsaIkYZNhg1BJZY12FcinazFzVCaJndg14C7WgCj73qDkRB6ABaDOD2CEaEy5ijiQVq4QvUiPCys6uI5vVsCKL2TnArTtOnZFPVfgNjWz+Zz7OzsiJOqfm6Myb2/nKtQVQK+rLVwVZWXlRm3ov4og6zl9U21VVwwS3q95IAMiogYZBkcGMbItZm97wGXtyrzDMAoAKECJct2lgch9syltRDDin6fC9ubAH8Pqvqm0VJvFXyH0LWYNQ22t7dw+dIlXDp/Ec32DPPNbXSzOeq2g/MeBMaochg5i43JCAcmYzgLcOeBnRmMZ7CtUNUTTMYbqN0YyL0RrfSjM0bt8bXdh3OgugaNROLK4zHYOUTn1BZe+pyJG6Qk68wAuIYY4prHALiGGGI5ShlRwVxJ4fzi80KZh36PdFB4xYbHmin23iNog9M0YLG0l+x7qnEo1pUg7lSGtABaB4HJmTANJMo6ruE+O8QuIUN6cd8U+ZYCAI5gZWaoa4D5HNS0oJ0ZaHumUsJGwIX3MKHrkxI6wKXUHFyZhG7eYHt7Gzs7O4gxwjmH6XSKyXTa1xem8yJZjWcLca1FTGytHv8CwmQMvWACsJfkwp60wApKNNNB2kicg0GMFqR1Q+S9mBN4kbiJvLIWhqtT2/wQRJLoPTgEkPd5ezMHad7MEcmwxBQAhLK0efF6tMzilb2cyvfW/rQrsN5EhLqqMZ1O4b1HLK5jjUoTjbEwRgDcaDTCvn37MJ1O8+ql+aaeY8vvp2Dw6u7q8Y0mufIfmRFD6ASMByvNlJ0CLu/FpKVykjirAlB3oKoCB3HpM7nxrwNVNYL3YjlvCMuJgshA23pc3tzEhQsXcfr0aZw58zrOnTuHN86exaXNy5jN5ujaDqENiG0HhIjKR1QMWEdwjlA5g3FtsX9c4+DGBqajGkfHGzg83cDhAwdxdN8UcbwP3lhY3eeA6WWDTtt8WJUJ1sLomaoSgwxnYZLKQXssggS2v8P0wxBDDPE7xgC4hhhit9CsOEMHNZH7WgLuBz5XqG1fG2ngk2okEsNlrdWeOO9A7gTkkRenbKXVwWhyqrJW2S2X3QpT0f9aydQQQwCwKXsflZUKyjKFAOo8uO2AroGZid077cyA7dmCfI5jAAUvIIs5oRPk84oI0Qdsbm1ia2sr1wxNp1Ps27cP9WgkYAQkzWsBATbaoDv1aYKtQEYb4SYTAANJbJQA7F1MMFD6FQSw0cyHMWCjUrjIMN6Ck5Q39TnyXmq5OnUjbVug84itvEfKdHEnLA1FD2IjtUBBrz9JNsklK//eBBmDyXSCeiRW+t773PurbVut7eIsSRyNRqiqaqV2znuPqAyaVaATtX8YUICy4uKqnOXiCiX2MnBmQgmsRhhBpIbRIEYPEwRwxa4S0O8rkK+BygtgqZ2wjFWaH2DrCTgyYogARWWyIs69fR5n3jiLl156GY89/jhOnXoVFy5exPasQ4gMOIfRZIp6Moa1G6hMhXqjQmUsnALmLnps+zk6P4e/vIPuzfNwfA4VAfst4fB0ipPHjuHjd9+JO06cwC0HD+LgeIyROhTG2oGdACvUSUroVDJZqWPjSB0LSaTlmTKkzJYOMcQQ1z4GwDXEEOuiqMdKz8zSZDTJCA0vDgT2Blt6sFUWnRsjvVWMMXsHQEuAi2RG8r41IH0krX5iuMgYGbzS3td6iA9jFG0NQuzlbr5DbFr4Zg4znwHzHdCsAXYa8HyujX/bbHGN4JFaISBCM+wAQPAhYHNTwFbXdbDWYmNjQ1zxRiMAmqAgQiQn3zPpGNbsvnFap2gLNlctsg1yNl+W+G5vHxbWKRlsQH8fSAxGoI50ZMQhz1kgenCoBFj5AG4qoIugWlwb0XUgH9Rkw4N8C8MGHL3KOMUsgiIrA8YCiGO40sq+iz+bs9QwyRDrus7yaO89vA9oW+kDNp1ORVJYXNfm8zk2t7Yyu1/WfxFRni+DEZeus6sKgCJpFHR/JLCldXDMBgxGUFks63ZD50FVAFUOMVZArMBVFPc/KyCaYysmE8y4eOk8Xnnlt3jiiafx5NPP4dSp13Dh4jZCMJhM9+HwkZO48+7bsP/IcRw4cgTTffsx2phiNJ6icjVqW8NCWnAwGE1oMW+3MW93sL11ATuXLmLn0gVcfvscLl54FS9tX8DzL76Ex06/juOHDuCjJ07gk/fcjY/d/hEc3LeBqh7BuErq00a1NDOuKqCy8mwtKDUFL1jezGspM7golRhiiCGuRQyAa4ghgN5psKCriCWzz8myNzJMAcKQzTG0fit/P8+xHwgkcMQyRZLgkMo6Ki1cJ9BCjdcV8VCWEqp0ioQFgPZfgRWJiRRGu94og5ZmMdRvffiC038FaF/+PFLhyhkFOLUNuG3B80bMMGY7Uq/VNOB5KzLCrtM+U8o0JKlbPjW0DgZA6ztsbW+jbVsAwHg8xsbGBurxWEBVOhcyntF6H5KkAalRBVtlkkx5nBdNvK9B9GIsNVVI/cnU+Ia0VxWlRuPRAtGCWVgUrgTAknFAra99UNAlxg9iKe/EPt4Hfc9L/7/AYuEXQi8RK6XMuQk78jMX+7tvp9b/T8UhsfsPN7Am1WIFAUVgkCVYZ2GcwQiEaZTkktW2FsmcgTmiaRrMZzP4EGQfG4NKDR+SCYcYcTiYWt6zSapNsu2ZUdR49b+Tgb5OUGuw2BLE7KUSpYJRptBJo24TLIiLGjoGYhUAZ9A1HpfP7eCpZ57FLx97BE8+9yxefvk0GDXGG4dx8p7P4NaTd+CWYydx8NAR7Nt/K8bTQyDnEJjlOCVZf7m+cz6ma2JsGAZT1OV7cNdi8+J5vH35NN5++3WcfvkULr7xGl44fwlnLj6P35x+Dfd99A58/rOfxt133I2N6QTROdjpRHqSGQNWy/csu031xP2e7l8ufDbEEENcqxgaHw8xBES2ktwFwREmWfrmxsYsvV0YavObpCtBzQRkAJLkL6lPTi4v0P85BnRtk9ktgthYVzrQkGlYarCAfsCbBxToZ2x1IErSDBQ66CQnTUrZVoAbCdOl9SXpu5wL1jHcbD+MERQB6UC9r6GBDFIjRPrGURgZ3wK+Ac9nwGwGalrwbAazvQ00DeK8QWzbHjCo3bscWmahDjItKMaI2c4OttQGHgAOHDiA/fv3S1Pb0l2PgIgIJgNjK23gOgI2NoDpBDQZw0w3EKf7YSZjoK6BkUisIiVzmPf4OGestHRgrWVLbBDFAKumGdF7Yba0fos7D/adOjw24M4jturMGAKMV3AQFCiEqLWlcVHCmZZXCMioZDY4gpWBJABGAeRCQgflpYcz2JT9gv61AmPLBpb7Rskym15KOJvN0DQtus7nOrC8TUj6nRkjzY3HkzH27dsv7Fcxv5hMQIjkWpxe69953QlgEwUAk4ByNg7RVeDKAnWlNVoGNJkiOkKcjBGnI1xqWjzxzPN45NHH8etfP4mX3zoPHk1w9MSduOPOe3H01rtx5Oht2H/oFow39iOCQNHBZGOLjMEX1p360yDjHWFE++FYhw7zZgfzzUs4+9pvcebUM3jj1WfRbL6JiWtx9x234qHPPIgH7v88bj52DGY0EpMkAsiK9BPpN/8ObQWGGGKIdzcGhmuIIZYiu5opY8VcFGNrgTqKQcdVQ0FcjBEhyAAj5TmstdLouGC0VowKqahbSCrAhOSIRJtvqGhuXD6roUBpGEAoBp8D2PpQBhFyZ2MAmRdhykkFimpvHjoE3wDNXNis+Qw0b8E7M2A2B7cNQtuCOw+jUls5N2I/Gi+Xq2GIMJlMUNd1rvep61psrdeusw7aDRUGMFZ7y1Uqo1XpbKrZwnU8wtclM4zUV4KFLaeoLRtChHUB8CrdjAq+Oq9uhWpA0nmpn1PQhS6xMsqIsUgLKejzkgS67McFsLj7EQAmMahYVpphcfutI8AW1JSJ5Fuz1VMNlzEG0+kU0+kUMUo/r6ZpivovuVYm1rOua4AZwXtY5zIrzyEgKDtmdpOMssoCGYiRQSQJBBjW7WylYbc6/AVm0MYU87bFS6+fxg9/8Sj+649+htNvnYehCsfu+Djuue9+3HvfZ3HoyAlUowNgM4KPBB+0MTaw9s6w/B4tf7B0rFhTYTLah/3jDRw9dAT33HkHTr98J37z9C9x5rXn8dQLr+Pi+R2cu7CJP/mzP8PRY8dkH7iqvz/w6nyHGGKI6xMD4BpiCA3iPvMo8pqeXepBlwxUco+bPc47ZW9j0cvLWisSGlo25V0z1yU76sxSacNOY7SZcTLIcEleVTi3LTNay2nXIT480eORLNdLBhkIUeRtMUjdUCcSQlLARbM5aNYK+Gq1l1QMmqQQCa4p67+Wh5pFTZWxwsZWJSuxLMPNoUAqG8FIk/DoHFBZMQzI9YqkMtv3V3XKivufMUBI52UUgwfWfeCCuOjFAPBI67kUYDWdMFvKiHHoENtWTH282O8nm3nSXmngKIAj7eeUONIGV0RGew0uQ4P+b9mnwoMlWWLiTmKW+63f3qSsZm+cYWAtoaoqjCcTSUip1Do1YGZmTDc2UFWVfDdGkLXo2jYzo9ZaVFWVHy713wKK6zUhADDp2AwBxloAAWCRekZEoHJ446238JOnn8N3f/4r/Pql1zCLDnd97LO47xP34557H8DBI7fC1RuIwSDAIgaSsln09493IywI1jgQR9hqivrQCXxs4wCO3HIcTz/9KJ57+ld49ewZbP/0Z9hsWvzFX/wFjt92UuktDEBriCHeZzEAriGGQFnPgF7Kl+pcWAvUs3lG8dle568yGQFqNv9tjYFJReALA83lQerin0wAG9K2MTbXasFadWpLmf6S3UL/2gw34yGgYIu1DjFZtksfo9hJPVZo5oizHZj5HGY2E/v3pkWczcTxTftFGXUzJI7KcLCABWv0NOKFh1XZYO4PZQrp4ZrBoshgtTZL67agtSrJxlvcOCkbV6zOBO8t+lo6z5abnAuzZEBGkQsXgCgq2IoMsNQ6ceiEvRp1YqDhPaL2OEPX6rNay7e+Z8G8F9aMvexrZcCkPpVAbJBEhyumPUvtL2Tli5cKtAwAlJMuX7MKh8LyvVTLaq2FsxbMjPF4LAALYiiUPmdmxBAwm82wvb2Nruvytkx1X8nEI/3tnANXTpQAkUUunoxgWOrLOEbMEfH6hYv4hx//DD/41TN4dbODPXQcDz34Ndz3qQdw/LY74UYHELgGs8k1eumnUnnovgvHWPQMaw0M2dQCEnZ0CDffNsVn998ENzmMF379Q1y69CZ++shjGG3sw7/58z/H8WPH1IX23VmPIYYY4t2JAXB9SGJdqd6HvdltL68pMs9pwJEeWkPFelPuv7cIyNKYJIOqhe2tbBgRnLNFIp9zD5osiCHo/GL/zazzL/ZXISFMdu/ktA+LUZlS6eaVwFbBai0AzCE+VJGURpr/V6AVlBnpZJDeNeCmATUN3LwRoDWbgeYzcNPCBmnySlFZEo7FGE/ss2EV8CvIapom99qq6xrj8VgkY2V7gpKBBfL7ZIQNg7Y1SE1tY+Wkz5ATtpcNaTsEk2sVqXfduK6xcs0lgA0yYqFU9xQTGJCRduRkB18JUKiFteIEtoIYbFAI4Nb3tXTZgENqwTi0ymR6cTtUYJfcV1lliKkmlVKCiRbZf85XrMWLSbq8cFEXeKXeXwlwZ3a1YACttSvAO9WApf5eiTVLEsS2bUEkrFkC9OPxGOMDB2BNtXh9lys2Igg7jcfzb7yJ//TwT/CLZ17E236EW+78BD7z5W/hnk9+HhsHbgZTBY8CzKsiwqZDixjiPUgKvNJvWcwhZKFB8btEdZ4knsr+kgGC+KUQATAOXQQAg32HTuIPP13DosFTjz6MzcsX8MtfPY6jx47hj7/zHUymGyCSQ8UultINMcQQ1ykGwDXEhzp6aWBhUpHwVEwmGusBa56HzAjF01KUjBWtAboKuQrNPaX6mmI8w+V0RLnPVmK3eKGpsQUlsc8aecn7YOw5xHUO5uJFIU9D2/aP+Rxm3gjQms2A+RxoG1DXATHAhJDPD2IGaaPk8gjjGEBk0XUdLl++jO3tbcQYMRqN+mbfS016F0Jd/0CmdyBUCS07B7YCuOT41/Mr9d56t+iG3zH2cp7lpIo+E6MfxbOsP8NqAshk9kts4ZUFy+ArgOrCbS/t084DoQNiqwYdndrLa62e9viS2i+vCSbWayD3jarTvk1Nn3XVOcSFv9MLztfFHkjka67s1Hec+HPO5TYaMUZ0XZcliOk5Aa80XVonylAnIjChi0AL4MU3zuE//Pgn+OFTz2JupvjIfQ/gC9/8N7j17k+g3jiMCKc5hGQwktY9/RAGEMAUwWyB/5+9d/uWJLnO+347IjOr6lz6MvcLBsCAAImrQIIXUbYl0k+ivGw/2C/+E+0HP3gtWcuWbYleMiUKpEhChEgQAoEZENcZ9kyfPn1OVV4ith92RGRmnTrdZy7AzHTnXtNTp6qyMrOyIiP2t/e3v42bfecbDYISX0if03k6VlMrPFOJdJzcepZf++pvc3H5kO986z/w9r0z/v03/5TXP/sZvvoPvoan5oqC/mKLLfaR2QK4nlBbxCffo+1ntSY1W5rUu27kPE1oMzHzQOCxoO2KTYvAxRS5clYi123Nmxrbo7oEuLI4hsoIthIFZuoOL9mtp9TysEwqhDJEJGe2ug7aDtmZQAa7FtmOghkMHTpYvZCoK1LkErO8oc4OIlITQuDhw4ecn58TQqCqKjabDZvNpqhzXj3HadokAymP+NR/q66tjqs2yhi1Hxt6c7P79eNg01LKfL/bzW7zh5Jox5ZCBw12X0dFokOiN2AUkkfepOxViEXBsDRQDgM6ZLn51NcrGvAiRnsvDPZ3SDVTEes5mFQQlYBKSNkvkhplpoMm9UCmCcqrVMLJt33PlvdXpTqt1WqVMkQj+MoiLCLC8fGxbZsySAgMQ+Ddyx1n0fHGO2f8qz/5M/7td3/AWXXK137rn/Cb//gPeOVzXyP6Y7rBZPA9TEBnxDh7bvzN+HDH3LTNAOkYBYdHqKua289+ii98+Xd466dv8/bf/Q0/eONN/uRPv8lnf+Uz3LpzG8WztDZebLGPhy2A6wm1R9E4FjtgBWhRQNYUhL0XsCRivbRCCIRhsGVZXKlFeE+WFlhxiRrlk8rZJKMlvpo0fDUajiaVtlHd8KoTuoCup9iScyyqaJ8EFoZQwJb11drB5c6eb3ewG3tsxZQFqVIWJlMKRzg/jrQQBh48OOfBgwfEGKmqipOTE27dulWc5oPnBxMarMyVCatMo63RJBIjVW3BhkQr1JTW+KjH96Nmjqv5t5xBGoGrZVUy6MQ4iNnpFxMSkdRQGq9oNKEFJjTBkglL4NoPwRpTD4NRCIecJUtgLGXM3GD0QqLaNjECA6J9mi+jUUolnUM0UJb7r9lPMKl9/RDMpWyo7u3XOcdqtaJJVMMwDACmbKhCjAOI0bV3bcfZtuWv37rHH37rr/mT7/wtZ+tTXv/67/KN//oPeO3zv862rxH1+bIiMQ9Fq7tDk3CIgKoAVSIUflimTNHcjKiQ+kNGqXnx5V/hc5//Kmdv/4ihP+M73/kOP/rxD/nVW19EXMTcvCXVtdhiH7UtgOtJtEzZ2F/fPmrP4+NkmRUzpVUllTXImam5k2BOZfpw2TYtsKlmwaXoetQRcEUdaTAy1VBOu7pG0svelswqsug+uYbFe/D1hGLlQKxxcj6XrCR26ACy97jYk2m696xU3iQnOjvlhGCiC11qXrzdIRcXaGtAK7Yt0ndFalyi5nLDRCEEc+oCMxihyuXlBefn5wzJAW6ahpOTE+qmsWxFaox79aQz6FKrm/GW3dKqRpoxw2VqhTUiKcNbUisp6PARDvKbQIwJaezqqyW1PvkSTkD9KDICqXeapMx8ZR9KYCs3bldN9V5RRzphmErRRyT00HcmupEVESMmpJIBV+yx5s0Z0KWar5BBnrXTKE2Yc4FrmPYI0PncW762jHNs2m7/GmrUKbPaQGf6jEgSs0hzbqGUioFAVSFGR6uOS1X+6u/e5FtvvsF953n+9a/w2//4v+Wl177MEGqqqiGGUcvEkQKXOlGj0MlXEWzM7S28j8aZh97cn51tkdCotvvUo1HS4lBVa1559TX+5uiEi/v3efvtt/nRj37E57/weaqmunKUg7fDdee4v/FelG7/ux3c96EXbxLte1ykYrHFPmG2AK4n0dTajOS/r6M7PJVZsEIJgZE2SIkoK0OJHlpNSo7UKmgon8kUFgNZbrIAmfz7kOSNwSiA47XNUV+KMuLsqhc8lmKlqamxJmDlfGWqhK6Cqin0QtzUCRD8zCOZ7f7g34s9QZZ98Ew/IkOgNPaiKdNl5TqGDvoW6TrIdVqXl7B9iHQt2nXmfOuAhsGU3rLvPJF4t50nECAO1Ui723F+/pBhGIoQwu3bt9lsNqUfVRFLmAEt+xedIl6gclA36GqNblbIZgObDbpqcPUaV62wprY1RdCAfN9Nz++Xa+8trzB1tOcgRPa3KZPI+HJ0Ot3CKM1UKQsEogEJltHSmCigweqzCpgKgwGqREMk1YVp1EJPjDEQw5Ak6GOpAZOgSKotU41Gg9ZY6sByTawmhOLiRBUxZ1yntUsJYEQZgZrohII5weOzWr2YN5pcfZfAICukbqiqFT/7+U/55nf/ip+0F6xf+hV+47/6Az7zud9E3AoNFpTwE2AQ8rGwg5e3pmstWJxrsh7AGIiz15isOdNfX5iOmOlw1fRbm8hIXkUE7wSJA8898wynp6ecvxNpu4G3fvIWfRupfTXKR+ZxMQW76TgS8sWU8cCqY7BPBInT96Z36Wh+8pWmbPZxXdvDo/sA7tA2h+y6QOVii32MbQFcT4MpqOhjIm3vzz7xIG2yWGYa4SwqO8l0yfQClsLv6UJqamLDMBAGU/5ygPeuUKdi1NKTdYaJ9y5jBltIalzsLcMlbtLU2HmL5ubGxrlua7rKLfbU2tRtz4CrZLXCWK8Te6MPut0OtlvcrkN3KdvV9wxJ/U5CnI+oQ07PJBvTdyaScXm5BSwwcevWLU5OTgxskYIWqqY+uIczNNEIJbc9qPLYT1mtatIOobRAcHv3wCfVbnL+Mvtz/xMu1cZl2p0giAei4lKdqmXGMviKFlQKjT0fjIKYs1a5tktCwMUM0FKT5URNtH3kmrAwAmpVqy/TLESUwJmGcZ5VtSxZfi6KehBfzQFWFjPKX3yOH+zV2e+vNo7qmqgN0TWcPdzyzf/4bX78zhmhusWvfu23+MIXv85qdUTfD3h/uIGxHnz2UYw1O2ZUqyJr1htOb9/GVzWhB4w9AAAgAElEQVQhbDk7e0B32XK8ykBzvnZNg606A5bjQIr5MKX+zjNrlp6Th0ymAjc+GXGbzvQ/RPeu1yQwVF7aZ4IsttgTYAvgelrsBhGh96Sq9AE+87G0pMSlyQEZ67gYM2F7tg+2NEZCtGLtGGOJ6Gd5YjAH87G/A6BJkU186h8jucdWBlvVKLm9NDVebN8miRCB5NiOTrPGiMYeHQY01W3pdodsW9h1uLYltj0xCSvEEPDTzPnkGPPjyiRjoUWWu+97jo6OuHPnziigMHH85kwsmYxrh3qrz5KmQZoamnp8rOt0P+TgBOUeOCzU8PTYtMlyBl0x9/wS7PfxJJ0TLfNers0qdNOYgVhIgCi9H1J2KzdZLttnxcS+NI9XVbQfynyqKISAy2AsATENsYhx2HbRxCMYx4cJd6RsFxZMvDIWr6iyGrVb/JouCt/7yU/50+98j4ex5s7Lv8JXf/P3ODp9hhAizjmckzQ2P97jx5J5tk4062NbI4JnaDuGbYecBDR2JPgEjHNCsX2wlQN309dwqA6zT6pjpO+Sg4RzQGZrWXq/HMeX/ZSgo1KalOdzfNSl/3j/KostdtgWwPW0WAYPj7CRzvGI3ewHp54UhyZOU132kOWtNV5/Ta5kuFJPGAS889YPJi8uqqlZpl6J6E1Ngegsuu+cFGU2cVkgI6mx+UQjLF51OpelqfFiTJ2SVGuYneMQ0b4jppotaS2zxcVFUibsTDAjmhKdJGd45qgdCv/DOAZjpKprbt++XRTjnHNUTWPOOCPdyrJdySFMNDAVQcWlDJY1NdZ6VCSUVLuFr0aZ+Amt9mkEW9d93zGbkUBsvkbTFHvJ5jsTgEgNrHVC+9NMI8zbxkiMKfOZGzTHkJQNTYY+99cSVegGm/mSOJHGVD82oXhrqhnbr6nVdJ4CYxasnHpWx3zEtXANISpSrTl7uOMvvv993rrcEZpTXn79yzz30hfw9TFEo//F+MkIJKqCeKFrA0MMxBCpFWoE3W3R7RZiNwYMJTM59vbjRrCl07UkPZdCzxz7q4kzEadxVwIHej86J3MgNV2f9uaRcX55tGv68YfCiy121RbA9STbNEPjPrg0rE1yVzMnN6kF+zjUi2XK4Nisc8xklbPJi3qJ7GZxgKvqU5JpfDqqZRXOvji89yaUkfa7dzLlnKbqhSJCFEGq2hQIXZUyXRlkJQc09y2agq1ZtHF8e7Gn0FL9SxGAmYAthgEZOmizAuEW2V7Cbme9ttrO+mxpSLU+o2pnrr8pEWjVMas1O7xtX9e19UFKWRabi1y5r0ivC9mtVoREDcz0QV9B3RDrCmks00WTBTM8mrO+4ll4SFetzLXi5nVBIgnQMKGGOVSdqR1iQaeYs6NaWU2WkhQJFZOoV2IISKp7tXkzycun5xrVsmAZrCVGAWHMcKEYzXWyDRontEMLVZWeYCU4FhLomn3p2VOV1JC4OuLeuw/49ptvch4UuXXKr/za19kcPwtq4yeDrRvEHw/a2Gcsz+lGJc+vXbf0zddIma05162XIkoItt3l5QVh6PE+crpqWGtELi4htuT7ohxBx5tYyIArgSvEsld5WyeAKw2fJWW9NG1XghvixuxVWpPyGplVdu1G78s2Uo45/g1ijb5lz99QxtduaB8Hv2OxxbItgGux0W6yunzSJ6xHhcZKfcHVTd11l2ZyzXKjTTBefaES7i+kMlXeSgtKBsQiqU7LqIQmcW1Ay01VCnNocBqNTLtbXM7FjJ+VM7Qm+S4hmqx710PXGuDatbjt1vpsdV3qz9SXTIVlehmzIPvmfKoRMQt9n172RX1wnsk6YPsRdycmEuO9KRJWDdQNsmpgvbLHpoa62qvfkkI/W+yq7YsyAETNRTf5/6PTCxTKmGqwz6pLW/kxAxUV0aH0LURNdIhc55X7GibxDBIlsAQBpoHBMK3pwrJsWQ02MgL+vA9VIEzyLum77q9TolRS0UbPW5eX/PzhGa3A0dEJd24/T+VWoBlkfThjaKTbX5cOftwOEsB8xJrrDM3x8PwBDx/cR3TguPE8f3LEZhjg/AFKmBz/wHUqQIcSuBMHuR7SRFukUHwzbTc/al73REDqMfgn+Xunz+ZtfAZlI+hib59BXBJDSeN2kqXdFySZfZfFFvsY2wK4nhb7ENaQvBg9aS6NlAV+zHhpcjRn0vHX2LQPTJW4/6KM2a1Dx8wLG9MIoRTn0VUJaLnc4LhKSoWp705GVns0wunpLsvP02p5BMSUqc2iCAHtB2LXI601M5Zdi+xa67HVtSYNH9qiZGjS01ORgmuO5T39bsfZ/ful19Zms2G9Xt8gSKPF2ZfsgHmXemw1UK+QZoXUBrIypVATvVa9G522xR5te5xwmYCr8tps8/zLmOqkyb2bkI9lLB34gGiV1FtHgaGxl2FqnAwjWMrALM5FM7IgRp5DlamSIYXeOo7Jw2PzEOBSX0M38NblOWf9jsHB8ckJp8cn1Cr7ObJPhgXFE7j31k+4OHsHHzvuHN3hxdunVO0W7RSq8Q4zy8E90gDIQIcCrlJHhZR1ymtMZT5AylYpFkQx2nvKcLmQP1gA1bzO2EFVX31/+twZDXE8N8mnPQ5OIY3Hybd6CmnEi32ybAFci432uMheWl/fD+D62E+EmdKSFvdDIhmHP6ZjJFOsAayIjAXeXPUDNZMzJ06iilgGIAEs9RlsVamGy1tNS6Ifzvabo9CzY6S33ut1WOwJsJTZUpPlltwbKQzEfiB0Hb5tE9jqJmDLslsx9OZYB0/OiFw7joJJuoe+5/zBAx48eEAIgbquAeu5VaLfN7EUdBCXlAhry25RNyaaUZtaoXqHeGfKhc4nuhMJUDxpIaFfnB2iiM/fn1xNmT0kxzykOiJX5k3rdzVhreX/5zk2AzK0ZMWmQa5x20w7HcezRK7295p54vnk9l6TpNJYB3YaGQQCkcoJjYCPirj9SrBPgGlge/mQH735A7YXDzipHJ955UWev3UE2wskgA4H7r98fQrISuZk/nyagXIDM5ogpAbjUtRy1YUxeFjqv2QUeBKxFgSZoigY3bBQ5G1/WmHZtNk5TgEa1uR88rUOZSY/9n7HYk+VLYDrqbFHcune036uRhSvRhOnr41w4GMy+U2irapjr61c75LY/nuf2XvEePmq+bMyBuzSwjCN8M4tL0Yu1WyBNezMlEFP9CYBr84nIOYplAum6+fVayrXvrPY02Eyjrvc1HjorV5r1+J2O+Ryh25ba3K8a6EbkGDqcjq9B1QPYiUlZb+cEEPk4vychw+t35b3ntVqxWq1MmrhdadZHGwp3rnkLK83dUIqD02VKIRrpFlBvYKqQaskmCGuJHutpGwZ+R/I5smQArqE7PSm3z7NWwVZTVQ4RAWXZ8McVAoxia+kbBWTz+jktdk5xPJ0mt2afmaWBSknPR8DKmLBATfgqopIACLD0DGEnqgRwRugI/1L/bxmgPMKoD801mybDFuui92pXq3nyuPXLmk6VqZaSL4ORim3dwfeeecn/PSH38e3O164fcQXX/kUd1dHaN9bhDSEUic1nuLkGk3B1zVUPwTUafl73D6978TGQt6G8fM5I1YEWyotx5ecySoZsPRPx/NSGbeZAzBfjpWB3QgVy0q8F4ic+CH71+QR9jgPaZlxFruJLYDrqbED3LjsocDjs1vJ3H4IUMr/xiPNNZ7L4WV/gv8obUJ/sUiqLcDjv73rJZCQEaZGGBiGoWS3nAOnztaNQpDKTBkdnRUnOHHmzjoh4mxBch6qCucr1Hu09mjaFpeVoNJ+pgsd81M89PdiT5AdSF1O77SINSUWFSRgjWl7oxByucVvTZFQL3dI2xN3HdINSIjoYCIZGgURtfqQYjLJJpA9Q1Rht91yfn5O27aAZbVOT0/ZbDa2XY5ezzyfcS6wv1LUG8tY2T1QEdcNbFbIZo1WK6TaGCXJ17adZOc2H2oZ+Y+0m1we2X9SoMP4WtlmmmWYzpdXpQ1U2Gc0XrErq1AWapmczVXVWLny1O3VC4YQcU2Dk5Znnn+WVV2DBs4fPuCivSQ4kAguc+nI/eGEmGqZylH10e2sp1fsSnowWUyvHZrKMyQQFQRT8IwSUYkIjso56+M8KGcPfsZf/uUf8eDnb/KsRH791df40guvchQEovWFLDjITe7d2RcSxl6O43vWbHlkYsTUoHy+jiegk/wAKZTC9LzQfSUly8XmpJz1zr9TAV4OcRBCD+LsnF0GXRMmiDhcrMd9TCnF5bnNJ9O+XzHXCExYIbMp4zpwfIP7Zpl5FnucLYBrsQ9mWv43e+3KkpiASum/c4Os2i8vUp0zUWNUPztxBXcVX0MgWnPjmJq2ZnMJGF31VyZRt7wQuMybz2IYrmS3xp5CcgVULfaU24HhkKO4haIVGTNb/WCR7l1roCtntPo+NT4OVkcTQ1Ggu/7YUu6TPC77tuXs7IzLy0sA6rrm+PiYo+Njc1tjxMsBB3U/9JyzuJUFHqznVgOrGm1qXFMTq2pGty1R8mlEfbFfoD3u+j76/ffz++TM2syuVTCaHWz+kcq48M16xQsvvMTJ6Snurbe5vDznrZ/9iE+/vsP5avxcDgqqzKb+98IF+SCmJICKAB7FMonOC0M3UHtP157z/e9+i+//1Z+zjjtevH3Kr372M6ydJ+xanLPvE6PivRhQzPfu7Eafrlp2Y46J53mEp1RbXtlH+twQRln5RLFPUUgL5OBSQ+UcTJRZdkucBSLVxSKek8FWyYSl9TErJOLGGk51DnExAcgIfjx3xIZODtKQMqNXxDfyJSkvfHCF58UWgwVwLfYh2BXutMIVuYi8TQEgo9P20ZtY9koFTY8yK1bLIMyU23Jj4yzp7pwrDY5jHOZ1AJNIWlGEcnmRMNl4q0OpRrW1XIj8sbk+i32cragApjoYQig0Qu16XNshnfXcomuJXYt2HZpAl4QBF3NT2ySMcCgLvTceu7bl/v37bLdbRISmadhsNpyenuJErPeW99ef+HR3Rf69hqZBawNaWtVQ1UhV45MUvHgPlSuOnJ3acq88iXbQIX4fv3UB5Qgvv/IKv/bFL/O9N3/I9uIB3//Pf80Xv/QPufP85wj4CZ0tU/gOJ/F+0RbcFAqltSlC7ZQ4nPHd736T7/zZH6LnP+fuyRFf+8Lr3F43bM8fMKhQVyt8XVOtKlabFX5ab3zF9qKkObayt1VRDJzjs/I8pv1bM+oEVqOMaSRR8w2cZdFRwVT/tQQicYLzJKn6mGpAKYDMfpAIXiaAzRWgN6spC3EMXJYADWNGTATEz+aiaSJ/fGWZXxb74LYArsV+IXZtAes0YvY4GqP/JWa4mPTRyg7sgS3DMDAMg30qbVdVlWW3VJnKLs9oCDI2lFSXgFaSvqaqJ9LWLhURjx++fpFc7Km3VN5h4xdcVIjWA0mGAdcnsLXdWRPUXUtskxrhYM1pJQwzeW7rzX1gvKla5sw5NEYuLy+5vLxEVfHes9lsuHXrFlVVlWDEwVGbXpwdwlt2S+oKbSriKsnAr1bIagVNYzLwdcoGZwoUE4rT4hd9rO19ZbgOzH3vbz+52bbnuede5B/97j/i3/7xv2P79kN+8J//kje++y2+evs5dHVrHFsJcHhlrD2jcB9+4RalyCvh1JI1HiV0F3zvr/+Yv/jm/83259/n1dOab/za63zp9U9xWtVUwXpI7i4v8U3D2q1pVrVli7IQyd7amzGm5tqzCaWQyfY5cDiyVSiZMJlkgly+Whl0lXtTrT1FoufjbEsBq1dQZ1TI0CVA5CYZMMbMtnOojzOQVgQ/ptswMFITx6z4LGNWcQVvTucmy8s9InC02GI3tAVwPYl209qs6XtXKAKP+pjO/r6yAO5z7GUvMqZYhCqTRQ4soNedyfuJdsbUJ+hQo+J8LM3Tfo6CIbbg5F5EAhq1ZLeAktUq5yVj0W4+S02Tem78mDnost/M2DlUsiM5vyTT77gAr6fbst+iOfysE+prjGgIyDBAP0A7qhDq5Q62u6JGqH1noCxnw6Li0DEogN03DpnPDbnfVbp/VqsVIQS89xwdHbFar0fnTDXtY4xQJ5bWeB9LUhv0HuoGbVboagXrNWw2yGaTANfKGh3vOVcjevul/QSL/RLtw5vvrP4JgWaz4utf/wZf+9rX+Ps//CPO//7HfPs//H+88MqneelzXybgEWlQ8cSQhi5q2RLnHl+HdmAddbMA2nzoTl+b4RuNVJWz3tQBKiLdxbv83d/+GX/+7/4lD976Hp/aOP7RV36V3/7q13jh6Ajf9vghErqe4JWqblivV2Oz8XSAYRho2xYRoaoqxFUm8e59yRwJ431eQBawL78uE5qikwRMrmTLbL5SwfqvlXllbLxtyhemWjLOGXEGkGLJUDm0CuWiTddZLQIe3tROXQZtGYjJ+KhSMvpjJiydUH7c+02vG5NLX7DFHmcL4HqCbdqpPr3woe77pu8V8AKUcNekqeL1Mk584Ij1PiAs9Kt03JgXFO9AUtcXFWJMilr5o1GJIU5EMlz5N35PyIppQJG8VSdEN3LWRSbZLecST90eM1/8sY08F3tqrYwvq+xIYEuRIRJDQPrBgNUugaxdmyiFPQwDLg7E0BvYitFaGeS5QrJCWgqHTL1AsGBFjDjvuXXnDifDQAiWPWhWKxvX6fn0M6MDM34HFcF5SaqcFS7RCGPToKskA9/UUNcjjXDBWIu9XxNFo+Kd49Of/gz/7A/+Kd/56+/w05/e52+/86e8+KnXOLlzwsndF+n7AVcfWRAsmjPunb+ReAJcjWW+l8+k5AzOgYaOxlcwDJy/8xbf+/Y3+faf/Wt293/IK3cafu9rX+F3v/IVXrh9Fx8iTb2CEIl9MIDlnGWGJxZDoG3bkp12ziG+xntPVddUdYVLQZCqqkawlecFHRUYx5NPwMklwCUU+X7Zmz/GqCuTCBLlc5Rs4iRIW/5lymIsLb/KHBXZy2YFk5ePkyyZcyPFUQWiM1ZAueiSU/ymjZKQsca8BqcTLOe7rMuL3dwWwPW02IcIth5nss/9Vr0yMSmjspjMIkppH+lzH+SsSwYrgaoYjTYV+oEYgmWrhkCIgaCDzblqPbS8CLXzptSm1kBWJpky730BW/OI38gRd46xXmvCNRef5GzF6FEqObuVMgCwv5wtttgVm2a2CGqS7v1g/bRSvRa5qXHbJRphhyYaocSYGs0q+Y41uW+Z1RwC8/kj/e2dwzcN9fSk4iM6GeWBnem12TGqPFLV1uB4tULWK3S9NtBVN0a5raaRaikNea89xmKLzSwCrszTm6M1v/97v8/fvfkG/8v//L/yzjv3+OM//OdEev6L3/9n3H7hM7Shw7s1RVMJDtT3fMhnmRM+ArUOiLYMu/v88G+/w/f/6s/54Xe/hWvf5Qsv3OGf/O5v8tuf/zzPrI/QfsBFBxoRcfjGAaamu29lLUx/D8OAw2ouu763pdg5fF3hq4qmaWiapnxxjVZDVah7wJWFehpjydhp+uYURLH3d96mBGpyaiwDvfQYtKyZJWOVwVBI/bwSWC7N0WciHTnjNRHhSQFSvIOQ1u9CnXQUusvktBfQtdhNbQFcT4lpIVJfbx9aFmU/s8bVNUrJPPD87h5KkwSU3uP5qY60v/zYti1939N1HUM/mGMaDUTFEIkaaWNvmSsRPAl0ITS+oq4rahFWCg4tNVv70sNMKYmZluFcUl2SEnkTX5VtNdVtgZSm0iVrsdhijzW1psbRsltxCMjQ44YO7Xrosjphh3YdhL7UeBXFwRFvXclm5ceY+nORggsCFoTIkeGcqb5pYCfvx7sUha9NlbBpkNUKtzJ6oTQJcPnKilgkt1NgrP1YbLFH2pgTxuJnKMLdZ+7y3/93/w2XD874F//8X/L399/mT/7N/8luu+Ub/+U/5eVPf5khOCq3AhIYsqn6wz/DOWMXjZFhd8n5uz/he9/9j/zNt/+YBz9/k7sr+PUvv87v/fZv8iuvvMpt8dAPSBSqqjZFUgwQ4UwSXktWKR/DsV6vqeu6gK9t29vfWBYQVYJGZBjIgjjzqcECPJLrNB/T3LxgpvwECsjKILa4AjBHnmrZ8CnalcxNztsIiVIiY/dqEatuEEGiAa5COczKhiQ1Q0m9/xLY0hht3U5ZsxwkKnXockC5cJmMFnuMLYDrqbGxZuk6uymgefyRmDleh6VXJ/GutCDMDp96ec2nNXuukwabWaQiJqew7Tp2ux3trqXtOsIQ6PtQAF4OUNk55Yk0OX0oQ4j00RYTQkR1hyBUIqw10FQV69WKo1S/UjtPaRCpWK+U1KS49AzJfbZydK0ot0lxPMfrsthi11sJQaT0sKhaVDsG3BBgCNDt0N0WbXcmA9+1yNDDECyrFRTiPmC5ZuSl7HAIwe6rtqWqqtLYONeGXFczWu4NAKcWdQaLJHuHVg5qjzYeGm8qhXWNNg1SZ1XCOql4jpwrmxcOiHIsN9DTZ7NgohwYA4JIZQGCklwxBPCZV1/jf/of/kdOqjX/2//xf/Gje/f482/+Ie+88y5f+63f5/UvfJ07d1/C+5VRX2cHlSt/5rk8wkjfEOuPV85NE27TcV8eRSQiRLYXF9y79xY/e+M/8eb3/pKf/eg/s/IdX3z9JX73H3yF3/rSr/HS7bs0KrjLDqkrcL3des6jqYeYYD2tTC9kfu9UdUXV1CVQstpYzWY/DAxhYEjNkqu6pmmaiSiUzUFjPbNREn1l7U1cNU1ZTX6blKgyyr0eisCmJV9Tht3Ov+wrAaeyeaEdjr+xJTHnVEUhZARr+1UDX9asMGfw1bJcGi0oqqMCqqkdprVbRsVDkT2AecB3GiVPlsT7YmaiN/GgF/tkWaIZ5QUGQDU3873e3osAxaM+J+ERtKJ8ivvDbgo8MldaxSLbQpqtdRZhVCJDCAyJk35xsaXreoYhEAYjeFsvkhXeeVzlcd4bPz13vc+nnupOMtXQ9tHTdT193zH0HfRb0ypSZV1XHK83nKzXnBwfsaobK1+RgKsqIoL4Cu8rVPyYySqTOMwoW4st9hizCHQ0xwQgRCREXD9A20M7oNsdsnsXLh/CtoNtohR2nQlphCEJwQRm84FOwFwySU5OjJGL83POzs7ouq5EyO/evWsiGY8771QIb45U6q3jHdp4ZNXgVg3D5hZ+cwybNXp0hBydoKs1Uq9wVZNqHcc6s6WmcbFiiSpe1g0wQJ/eVlISI0JR2owRhh5ij/Y9P3rzDf7Fv/p/+N//9b/mB2/8iBBr7j7/Gq//6q/z9d/5fZ57+XOsju8gvsG5ChFX2BkuZTuGGPEp41tqgxOd3GjtID4xO4LgE5XXyYCXlt3lfd5+60f86Id/yw++/ze8+7PvIf0lr7zwHP/g177AP/6Hv8Prr7zMrc0KabvU8sFqMWMY0BRQIQars0r7j3GAXEuV6bxQwKCIINFPkt1KiNEyXKnliUsNiUUcMUTa1gKbIUScs1qvum7wtUe83Z/O+3TbJ1ofIJUnHoAeBciU3yzVjk0pg+nNmH7l0o6t0AkpwZzpPtnfx8TP0ETtl9KSZbL9lGboqyTGkbZlElDNNdkTxkvuNJqzYhk+LrPW020L4HoS7UMEXO9neLwvwDU9fp4kVUZxiclaqhoYwkDXdZxfXtK2LV07pGhbRV3X1HVN5WuLutVrm+4m0cY4dS/V4lBZ5lY1lqxcPwz0fU/se7rLh2wvH7K7uEBDwBNpKuHW8QnP3L7N8ekRvhJcXQEu1W5VFtUTD4k2mAN3+2pPiy32KDOKbRq5ChoG3DBAO+B2HbQ94XKLa8+Q7aWBr7aHXWd1XX2fnE0F9gAXB+7JaE7a9vKSd999l91uR4yRuq65e/cup7du3SwrniPDZHqtI1QebSrcukHWKzi5g1sfoUmdkKNjtG6QaoV4k7Q2D0uX+2axuWWkMH1JMm19jNdJUAs4hAGGQNxtEY1o10IYeHD/jD/7i7/g//03f8SffOsv+en9C4b6hKPnPsWrX/gKn/r8l/js61/i2edeYr0+QtVqeYOC91UqKXJUOKPQqZJFHpxYsFIEoka8DMRhy257zt+//WN++uM3+PlP3+Ttt37M/Xs/p6qET7/8LL/x1S/xO7/xDb74+c9x2jRUiean2y0SI9pZHz0NA9obnTj2PU41ga90rxcanxQwMG0YrjHBAcFo8GD0OsZ5wUqYJGW7W7quIxpnzwCZOFQU8VIUfJ1zNE1DVRmZSlGkboiT+mrnMsOEkiEvgMtNfYI5+9nnP3JdJ5PnHPAnDoAuFSGm2r6xxsvN/sYJMbFSTPUwKxr7kZqY/ZR8fpIfx+NJeXO0ZR57umwBXE+iHQBc86nqhrvRx9MQ4UPKcO3vK6f/vR+jVwIhBLa7HRcXl2zbHYkdRVXVrFcbqqrB+4qqqm0BiFpYTjHTKtMEnZ+rAsGaDRvQmpxfjvwrEAOh69ltL3h4fsblxRl9u8Vp4Ohoza3TY55//llOTk5wVZXCW26MlIkzJ0BG8Y1lwl3spmZj1YCShmCKg32Arke2VqcVLra47Rlx+xBtO4uAdz0yBGtynNXE9HAx/cyiMvQ9Z2dnnJ+fE2Okqipu377NrVu3JnUQj7M40nKcRytvTY1XFW6zRtZr9NYdZLWB1QrWGxPNSA2PcU1KeC+Aa7Grdt1aoklRUxW8qgGuIQUecuuE7QW0LbHr0UvrU3fvwRn/4T99m3//7b/iz7/3fX560fIgQnVylzvPfZoXXvwMr772aZ574SXuPPscm5PbVKs16iucVKypqXGoRjQGVAdiDMTQ0+4ueXB+xjvvvsG9ez/m3Xtv8c47b/Pg3Xs0Fdy5dcLnPvsa3/jNb/CVL36Jz332dU42azwQtpf4aFR3E8AxcMUwoP2A9r3VXA0DMsSiQmorZFr/S9pPC+goa+0EmERMwRfJYEqIOpQ8TYyRGLX8G4aBYQioWBY+m3OOo6Mj1ptNAYuaEWgAACAASURBVFVRpAAunwWk9tWEP0zANf38FACl94O6lE2jAE5krPOKTogewI8ZLcnb+L2/ZZ4ly5m90sZibss89nTZArieRDsEuK5T9Zp97mrEe59CeKjXxL54xPsFXKV5Yok+OZsggRiVtu+53G5pu54hGDe7ao6MZ17XiT7oKMLqCTC6TOkgpfolL0H2/TSCk7EoOJekZHr37BIqCJG23bK7POfi4RkPzt4hJPneu7ePeeXVV7h1+7adj12k2eIWdQFci713MypSwFQzB7TrkaG3Xlupz1a43CLbc3R3aZSjroduQGIwsZhUt+X06j26f0+GzsDWw4cPCSHgnOPk5IRbt2/TpIJ72bv3rznxMQLsK7SpYdXAeoUcWUZLT24h67U1OF6tYbVCXWoKLik6vgQqFjtgOWOTTTQW6qAmuqGEgPQhCcl0SNej20tT7+w6tG1x6TVF2YWen7x7jzfffotv/e0P+O7f/Zifnz3krQctndZU6zXN0Sn15oR6c8Lm9l3WR7dYrTespKHCAZEYB4ahY7t9yG57wW63Zbe7YAj3CXHLZtXw0osv8uILz/O5z36aL33pi3z206/x7LPPsl4f470nhoBTTc3Mg4HGYUCHgRhNBComZVLXB/uX6znDADoAsSxsmh4LgU8k1TBhoERHOlwGJiPg8um5S9feNowxMgyRoAORmABZxDnHZrOhrusCQgJCn9pJTBV/8z8Rh6bjfFDANWsL46R8p7JPJLFP0ljK77sJAHVCSNTAKcDKwVSZqB1KphnOqIn5OBOaTh6r7uprC+/wybVFNONJtStOiV4BVIciLld3M99m1jA4PeaJtVAUJtu+V5s1I9ZIFGEIA7tdy7bt6fsBRajqFavVmmp9ZM0WU5QsnXX6M03E+XXBFhmB3OfDZfpEPHw5pgnCKCS1JUe1PuKkWbHaHOGahgf377NrL3n7/hmdwqfUcffundIYGUzYQ5YI/WLvwQ7eQyEgwdoUaN9btLtr078d0rVGOxpCAWg2wDGHi+JbHTYRwjBwcXnB5eUlXdfhvWez2XByelqcp2vHsE4oS5LVvawRKVWF+gqqBpo1rCzDxWoNtakUUleoz5lhmNafLPfNYlctiSwU1U3rLWf3iSnSSteX1gi6y4DrwrK/bWfNwoce6GHoaOLAZ+4c8dLpp/jqKy9x7/whP/zJz/juz37G2w8fcu/snPsX93l49jbnP++58DVRatR5xNUgHiUgAr5y+EpYrRs2mzXPv3yLO3c/x4svPM9nP/NZPvv667z6yis8c/cuTbPCOwsa5gbh3nsDj+qhliK8JHUDoUPDkBT2HPgBqgB9+jd4QxHR+nJpVCQeYK5Mno732jQhNjY/zkIYY7NgZy0ivKBSW51prmFLgGq6uKoqfd/Tti0AVVUVCuJYL9ZMwFc6/gQEHaoBH/mjcsUXycdNzWgm84iW7Jpi63s0GctUEuCMWk1SVI6aQJYv86ll8B3iE3sGR1FMFCl/yyQzNp7z5OLnQPMh4aHFnghbANfTYu8jj3noRp+pFd2AcjhrNPyIfU+3M055JDro+o7trmW7awkB6mZFs9pQ1w3iPCLVvAh4cjqPPLOpx5mCTLPtp4tNfknH101Y0eObDbefeQHxK+6/e492e593Hzwk8hPUOZ595m6a0LGeXrNuyost9mjLTo4msE5UoxSFYJSoroN2B90W2hbXtdAHZIhFlRAyrVZBUj7gQAfXfKwwDGy3Wy4vLul7a5dwfHzM6empKRN6X1oruElAYbavcaepNYJDKg9NhTQNcb02gYz1GrfeEGvruSVVrtfK0eMchz/QbHWxxZIJ1sqDmGqXhlyrNVgrhF1rtYxdj3QmIqOXl0iX2ifEQCQwRNvea6COSh2Vk6bi+eee43N37vC7X/kCD0LHuw8ecv/8gvOu52E3cDlEtt1AF5XWV9CsaFY166MN65Mjjk6OOL1zh9Pbp9y9+wzPPvM8p8e3qWurb6qqahKpZPxDJsyPykP0FriQYN+1ElyorHG4r3B1QLoBKvung0cCBriCiYXE9FgiL0VgY+/w10QgNYOPdOVnv4NIqYfeZ6zkfYZhAMyXmLZvGYZh7G3p7O+qqambxuaQKejL55fnxmkQOI7R05uAFYlq6vAT0GXTZQbw4BJDSNQoqqmTy4SKmRkxyUGYUArRnAHTkn2bB4gnzxff4Im2BXAt9p5sRvmbAK7HTWyPFMmYvJ8n1Bgju7Zj27W0bY/iWW/WrFZHVHWDuMpYIweAUqYBJmX5G34xytpRgk4z0DU2XZxG+CKOuj7izt0V4iru/X3H9uKce/fvI96zTiqGs8Xzhqe02GIw3meqik+1Www92rVo2yY6VAd9i/SpwXE/WHYrJEpVIl7ZfXFNfiuBm6mzlKPPx8fHbI6OStPuUih+yKYRXIHosEailTNAtVrB0Zq4SbVaqxXSrNC6groCb6qeJSKsLI7IYsUOZQAkJRrIY37IDcBbpO9hu4XtzjJbfYf2LbJr0T4JymgkitUIV6qmNhhjun8iTmAtnsY7jmvPS5tj9BUDOoMI0VfgK6Sq2a4adHPE6uiI1fERzckxfmOKm1EwBdvok9ohVyODEzAj+XlmbFTphhKfgJIgbjA6m6+Qvjfa21ARqx4dPK5XJPTWczIEyxQFV8CJRus5OUYS30d0du/3OAi2Ju83TUNd14SkCpzntxgtO+YwANbHgALNapXod5MxcCCIm0HT+zrvcUfji9kvSdkzkTiC0/zjZMXKXB8edU4pzOeqDk3ZsFmWLf++eTAsU90TawvgWux92T7QmoKwR21/3fO8j9zzp+06LneXdDEgzrNeb1hvTnCuTuugUQxyTVbawwwoaQrk+xvMwEruamngagRfeXIdZXYzOssBsBgUJxWnp3eIumMIgTB03D8746c//zmf/cxr1D5F7pbZdLH3YVkAwA0BGQKxH4i9NTN2fYf2HTJ0MHSpxiOMzmfKbJkr8oj6ygzqvLdC92ZFTO0Smv2eW7l+6zqa8iQKLZUJZUiu3VqtkLX9i6smAa4Gqbxtm3vW5Yz1ArYWm9iVtSRLvqdghNEDB+hatN0Rug5/cYls2wS2OnQw2i19b5/TiJcKF1JD+zCw2+4YQkQqkwSvGk+lFW7Izn4FeOrKIa7G1Stk1XBydIweH+FWa6jXIA1x8Ih4tK6ScENqLExOoig+i0pgK8woIy6jUw7Wy86LrUfRIygu3d3GYfRGM+wdOjioIgSH9ANucFZjHXUElGGa7RoBxfsBLvkz+3XdU7Ns3nhPZ5CV675MHdgENXxlqsMu04sT+8VoiZ1dHedwXhHv5yBvP4v0CJuIOKY/Jl8mVXxL7schTBozW+NkzZ2doyBOJ5RCJoArBbtkbOosMvos48ks892TagvgetJteu9eSQW9P9uv4XrU5DqjAEz3kRy5sVm80YdCjHTDwK7r6BXE1TT1itVqg/MVIDg/wpaozOgQ+184Z/lnFKqSttKRAjB9I0+SZXeTrBYjCMtNHwXjmVdVza2TZ9hebLn3zlvE0PP2vb/nheef5fTkCNFHX6uPhV0bbV3sIzFVGzdR0RCL+AVDjyRKoe4syyVtitiHYNvFUIKwOb8lTGg4e1Sf7PTkuovKVzCt/SyOgxI1Wm+ja8aHZm9RgLrB1bXVaW1WyGYD6w2yXuNXa1y9RivLbOH82KcORockfY/FFssmae6OmUY29JbN6nuj2bbWAJx2ZzLquxbte0IKSkhUJFpgQlQRAi6tE303cH6+Zdvu0KqiWq858bepfJ3EkwSNYuIK0SFBzI+OggSQAaTOsMnjXE1ATLsi++I5oZHiFlEDwzBYzVOuBRq/bWJI5PXMgJdz1m5EJFpmK0bwEQkV6gOECgYDkFIlINob1djmkQguoFHHnee+ZsXGG1BkPJeyNub1NatKTU6ZlFvfBxQlA+YcVaqjzvOSqlI3SWK9ACi1ei4dG7F32y0igqtS7Zf3iLe6q1JTLvMQ52wK0Yx09h5nCS4DW266gzwdokiCxxbglVJzJrMarjxRioHb/J0k/fhueollpDRObZn7nghbANeTaDnDMwmeiMqB7Mre8wO9uq58pgSw9xy2/LaME5ZMtpsBL434lJ3K/bDEWWeg3dCz7Tq6IaBuzWq9Yb3eGN+bEcDlXbms5Tr9GhgIU9V0DdzVkhUVmyYTkHLq5ngr7ahEGAHFp0BgFgXIkcCknqbC2h9z9/RFLs8v2e0esNtueeedexwfr6l8Vep6PzG2OLu/VJu5LEpxCiXLWA+DZbLaFrfdpabGPXQ92nVo7HExi2SM2d/cLwfsnlaNaQwnZ2FC6ylKW9kh2af+CtaIGLW+OxnIpe0imLpYZdkt8d4EMtZHJvm+2aD1Cqk3+GYNviZ4E8qQrPQ1vSjL2Ht6bTL/ZNYC4qwlWwQdIioBjQP0LW7XIu0OLi6h2+HaHa5r0W6L9i0MScEvRiQqzgYrhUrnoO97zh8+ZLtriVERHVivhCMET0BdRMTjvDnNmhoEl96LiV6Id+AiyIA4j3eW3XAigEc0gZEI7eWWswdnvPPOO7z80ks888yzRd1uamV5LRFHSQqDzhx4l6TwXST4iMbaApVhIHrLfEs9GNAKo5JhHAJoSMjPREdENbW+S35BdONxS40SpV0DJKABZKVDY9KNzZaLuEn5fRPNOc07OSDp9mXhyxpstM+u68oucg2Y9r0BFj82ay5gbBLolDKQxnFlQviU2OqUByCJNqiIfb+UfRfJ30gn+DTab8JEPj6kC+XVPO7Ui9Bo2RME7lz6Pd0koKwjdXsyDy9T4ifTFsD1BNss7/NRpqkT4MogqHCYVfEkB02EYQi0XU/f9zjvqFcbqmZVGjHO7XokMAlCjZse/Po5VHjgrUcyEa4cobzsK+Foc8TJ8Qld95Dd5SX377/Liy8+T7WpUoLg/ZA13rvd+Dd/3Okss/sv1yYZWFVTIyRENAxWi5Gj+KnvjgkDjE5khm3XBUUAXF0XBwVgu91ycXGB957VasVms5kpbF5nxSUskW/BeYe6ChqP1DU0ltFivTIp+PUKVjVSZad00qtuscUOWKk/LFlaUvY3pH5ULbQtst2iuxYuLpFuB11L7Fur2QqD9cUaTDTCpYxTFkZAjN52cXFRWiEAnBydcHx0RJWDEDmzA1jWJ4siSGmUW8Z0EowZ2RGUv9OneXD+gB/84Ac8ePCAvu+pq5rT01usVqsbXJmcJstRztQ/KiZhjOgQp0h0JnBTpeBNNda6SahTQ+ho801IbSfCMMl6TYUyMsfDvvuh4IiMZ1boepmR9/5MU4Ldsu+rZgU+BYnS+YQYiarEVBcG4Cqroy6A6xHCFHMFxA9A9chjJCO4bFFSI2pMRbM0UE4BrjjJhKVDSqFF5izf+69RW+yjtwVwPU32uDnjF+XvTCiIeTIrPS7SAhqi0vUdXdehCHW9olmtcL56bH3YB7cP74vHCL6qLCuHZRV32x2hH2AVjb//wVaeG9ujHO7Zdo/ZZHGDf4lW2HtqUeYMtobempt2HTGprEnqJ+QK6IpYJ3Cd3GvXWAzmmDnH9uKCs7MzttstMUY2mw0iwtHR0WPHT9HfiOl+Tj108KmHVr1C1xtktbKmxqsVrBtktTIwVtXgHc67kWqz2GLZZAK2Un+tGBOdtQ9oP+D7Hte36LZFtjujDu52qV1CByHRb8NQghIS09wYtYA3dXD+8Jzz8/OSNdlsNkWdE5HMbaBUWIlY0MC7lKFN7Q/KozeamYxBwyJUm8Z60zRGp099qd555x2ef/75mwGuvJ99ICEO58QyX1Gt1sunrFblS70b3hn1ePAGqkLq3RU9LlSgiXqosShU5T5e4wlMbQ5WZvo8Ont4T1Z2o1r6dfm6tvGQ9hhiJGgCXanOK1+TAlQmtMWS0feVATKdMHQ+FFdjEszN1ELVksXSKAVEFul4580jSsCrMKoT6FJutqYv9vG0BXA9BWb0wgNyDb/gTEvZewFX04iNJjqBsaCHEOiHgKrg66pIwU7tkzDRZJDTNDWV92j0dG3L0HawiSapTfiQJvTHmZVTz155H9fw2gThYh+qldtRldI7K0YDR0O0vlp9h3QWsadkuqwWQ4Lax5j3yjv4myeHs29bzs/P2e12gDl/6/W6OIE3O3EZ6TO5WXFdI80KVib9ztHGMltr67sVa+u3Jd6jsoCtxQ6bjeNE8EoOqww9DJqEMQakNRqhbndwae0RZLcz8ZiU2SpCEWV3c7CFKu2uY7fb0fc9AOv1mtPTU5r1Op9MkfUuc6JIamPgS3Nv9fYobkIr00y8zfOxlHrJuq65e/cuZ2dniAh3796laZr3dqEOCUTkjA2+ZODEGTgkRqiqktkiMLabCElIJKplBNM2RXZfrZ7U8ETOdZVfjD1uDZmaLzAvmX6PVkBS9mUSDa8orXuPR4kTMOWqRCec+D9Zin4YBqIqzqc+ot6Vxw8j2z7DwPm3yYooxEn5RQJcbt4/FGfjJl+39C1LrdhinzxbANcTbLlnlvW10qsT8p4Z02860eiVyVFSRGZak3W1CWF+tMkBUhSqsB/SYpeiOCFE2n6gG6KpQdUNdd1c4bBPjzNmvW54Ma77ztfsZz+rdshxdS4rFY588CiCUyvwdc6h0RazoesgKKrBrnPhfdvS/Z6n95HHtffaaIozJwVJ/5nCU/qCJXqWi7DTWc3q1g5dk8V+MTYLUIM1KA0DmiXeh2Fsctx2I9jqrSbDItE6OiOzfdvzOPn9h2Hg8vKSi4sLYoz41Mbg9PSUqqqu3Nf7Ms+lgD/vv/JoVUPdEBuTenebDWyODHRtDHBpVaNVZXUMLtGSlrG12EHTNKZ1EnxIvaa6JJJxeQm7S5N9zzWNCXBpGKwH1VQIYur8xgjeE4eBi4cWeFBVmqbh6OiI4+PjklkpZF1JDq8zRU0lUwpNtAHvbZsJVdaEYLJSbapTSgHFqqp47rnnUFWOjo64c+cO3ntCCHjvxzX8cYyF/N5etkudx4Tfc4bF2zXxFcTKaMiRsa4r1inTFVL/rjAqGkaFEFAfx1ootYbKGRwXNb+yrk0XGMWVTg/jOV5hsVxZ2mTM5s2GhxZgmd/xE7+H3Cx5ck2m2a0YIyFar0HxbnzMNWATdcQRO+l4Tq40iynfYXR/Jqm9nOyKmIphTDV3ZR03MK5OIQbUJRVKnVAIE31TGX2vZd78ZNkCuJ5wm9708VFz9fTeH199JKK5UVPBktCaTKRKKQxVhKCRIeQifo/3lU0uEzD0YdIJDwUC31/YTfZqsnIWb3owqL2nSouyqNrCBhOZ+fGz7+3w+5/Zc5CRkj2Ygq4SMsugS6efuToEcjj3phTFxd6nKSCKiBW+Z2dHhvw4IH2HGwbiYFRCmThDkutRSo31VYXQ3Gw0qnJxccH5+XlRRmuaxiL6TUOM8Yqi5n6mUyQVw7vkbFY1NI1ltVZWr8VmY5TCBMCoV6ivkvR7VhL7BV7TxT6RVsZtbmRMLAIP0nWjWEzbweUFbC9h16JtZxmwvh9rGxNouzLHVx4G0Bhpu5YQbF723rPZbDg6Pk5UszGLo3mGlDF7pd6PlELv7XmuSZT5Y1Gv2xv0m82G1157bQas9u+/g3PvoXtnf7uY250IRRlPkuOfxaICJuAQIxqrCcgaCtDNWS9TQc3gTdNvZNc4xn5+WjnOm3yAWSXbBDTsf7crgd6DYGvv6cTHeFRPrtJcWQQfI0Oqq9K0jxhMCVacK30I2U8oqRZhRp29PAap3V7AOANUiWLiJow/h5b3rB+cRJsXNU7W7Un9YKYiLmvyJ8sWwPW02CFK4ex9m5CnjYJvhEEOAaH96FQhIk9eS+qCihJCTIud4KsqAa6ri9InwfLCMDZwhEq8KVP1g22U1aCuyxDe8EBXJtpDz2W6WE2c28lzN3tvzwFOtJH4Pib2ZSF4r6Zk2pTmCHMwSo8MA7HvcdNmrkOqS8mRaJ1CovmY0lT7IGlstrsdDx8+pOu6IpRx+/ZtNkdHtvAf+u32ayJUoXIGnnwFdU1sLIvFZk1crWG9xq2PkVVjPbiaxuq1nIB4JFU6LrZYtimrwOXsS4xJqTOBre3OwNZuh24fQrtF2xba3gIUQygiEIlWcWWcaRhsuvOO1WaNescqWP3iarU6SOuzKTIHChKYSlmt/E98hfrc5sCCXkXo4zFjPQOFnH3ebDbUdX0wAHJTG+9lKQ188cmBzwwIn2q9NEBIYiQZdMVggCpYywnNghxBR6Ge1NfLlrbc10tLIFdVZ4I+H5ml6+u9J0sCVQloB039wNAiwHEdoFFV4hALuGMC4uzRzQNUJfuVvn8JcMvISohW462Ss6jpYy5LzUdQh0hMpQLLvPlJswVwPSV2o2zUFWf7AKUQ5vPlASB3SIThyvE1TXep2WEfrMGx9xVurzHiJ82GIdC2LTEEnHNUlUeA0PWIRrytQNdTMm9q+7Sx6YKcwJO6kVJIdjkKsDKgFZFE7TocfcVpWgh0sqDcYDx9gn/Dj8I0UX40xlQ7kfvlDJbV6ofUZ6hDU4bLQNleBP+a4RRjxHlvstfn57Rti6pSVRXHx8ejSIZMFEX3z3EalXYO9cnZqCtrbJyaG8tmg65W6GqNNAa0qJoil+3yWFvGyGITm82J+V+WLu9MBMO1rVEGd+mx3aHdDk1tE6xfXQJbGg8GkhSsb1UyqTzrasOax81bObOV9ue87ScDLJ9phZlOOG1Il/4+IJo0BVrvvvsub731FhcXF7z88su8+uqrH2gunX2y0A4TpS1fD7EgiKhHXAStwIcEtpKiYSUGyIYJ4Aq5zjQJkUQx4KCaXk9XLc9PGkdq46Psl4HJ0rXwlbnBWdYkqOLUTtw5d1CtNYTAEE0l0Rovm/z8mK0bfadSb+W4/nvn6yNiPQwRu77O4STtK12//brsxT45tgCuxYpZUe+UX3ZN7HkvA3LQaXrE+iCTz6gKgTGS5F1yxj4kGwkMk9fk8fP9tbZPY5jsVFFwQt/1dN0WjYHKCUerFbUIElOBsmiK/qVPHzqZx52fHHIMrjoVmmgVkiO8meZQsl5ZbSvLGE8A1yRZIn7qKGRnOV/fAz3ervkJ92lp78k+APvyY2szPkrKGiWxDAkRCcEU1voeCaluK1hmS7MzlNWvHoG4iiObAhzihDpF8DebDSenp6X9gnhnfXlKPd90P8yphOJL36FY1+iqQZIwhluvkXpFTOIYMnVC3ZP0Iy72oVrUQr/SEJC+J/adNffe7aBtYbuF3Y6YGhxL3yfAFdBgtNzcJzFTp0sdTT5Mug/yvWE1z5ahKXWF+b5J+4EMn2wO1JQh0ySYgavsn6S+XAmcTYXgrzNVZbvd8sYbb3BxcYFzjnv37hXFwg+S5bpqU1CQvkv+juItm5KWAhMFCYgkJUOfa7liAVxWIx7x0aMaU+3yCMZGgZJooG0sGp5k2sbrMwvayvxPOfD6mDLae63833ybXDctE+CrkybFkpZISX3AMgtzf9+ZehgTDXDaNN45n8afQ8ThPHbtYGQhZMck73xSIyhRRwpjynqV+vqZ77TQCT9ptgCuJ9RuJAe+5+hbkOWAEz/d5tFv38g0ZXjEOUKIRNQUgkRwInhSc2M5BJZy4+PD3ve+sMZUEGJ8fQRd7wl4lUXBolaSxJ5yVihoRFygGy7o2ktcHFh75ZnjIyqNMPSJ657pXzrSCfZRbHzMiRXA9OhNvNu7iNOsQlpcHSmj6HLU1qVArIyLTjBQJamJZV6cNWXGBJeiphNQptM437jwTTG6zN+0P6eYf7rR7Hs8+vJ87K1go+wFZulrQSK4oEaNaltod6mJ6xbtd8hgPXI0DEb9IYF4CeM1nmSipg4lwGq1wjnH0XFAMYEAV/kUjFbLmuWGrpb/zGX+9rN6Qbw1NVapcNUK1hviZoMcH6ObI1htcKsN1DX9ukHqCuesFsLJ4igsliz7m+lviTJmbAerIdJgQjG+7QxoXV5YVqvdon2Hb3voBrzqTNBwRAzjumbH0Vnz3KqqTCQmBY5sLsNARBZgcLnfFpRaGieotxouqWtc1Vgdo3ggAa9Uq6guz7uPHvubzYbVasWDBw9QVR48eMDl5WW5Z9+XHTqcALhyZ6tOVn5J18tbQ2ULAtVWu+WwBr6qaMjZ+ASwNOJoEDVFVUIKGhXKYa7H6+waJqA2WwPKk1CmyPLLxXH9BZuH8sdIgaCcXbLvlHoQlxV2EpAsy2AKNuajKLhS91x2NS5KKXDpnYdm9EXMl5D0tYKdvyree2pqvM9fbhJkFSm1W9PvKpozg7l2rHSfY1S8zD7MOM8v9vG3BXAtVuyXedOWrIvLmRI79tg/g70J+KO3K6n8tChnhTfnHMPQ8vDsPt3uktoLt09POFqvccIY9SMUtcBrOeJ7i0veNtuBnNJVO7DBFbUn8eBCAWKaF6wJlxxJdTrk5xiNxk3Ut0QphP0CupwtCvnY4kqSbHr2c+Avs/OeDYGP0Vj40E0BkgMSkkDAMEweB3QYrLYrj6Ny3RJ4z84gV+v7poXp1ragQVZXwrbzp+W3gpwJzcpr4iuoRrDFeo1srGaLVYOsGqMYVpbdytnTkba62GLk4H4BQjY0MmXN6hVju4PtDt116dGyWrHdEYce6SMuizhcQ4W13SvOe4ZEqc3qnKvVipOTE6PUuqv0MZgkFnJgygl4V1QJJf2zLJcfpcVlwhnJa9o165qIUFUVzz77LJeXlzRNw61btzg6OvpAl/gD2eRelaqaBYhwBqAK/VgjEnoLGjmXhHx0FPPJtV86PhfN2a9p+tFUD8vfGes4GcW9yruPOF8mbsQj5pz8k+x/jr3XpubrKpXBGViKqoQw7++VVQ7Lsa8bl/vHygrOoqnELl0joQQUFlbhJ9MWwLXYR2JT5y9nUaZSre4Ab/qjtb2IV35VBVEHETQOtLsLLs4foEPHelVx6/SYVV2ngmGM59mCBQAAIABJREFUblEicJPmi9MFIS1Cs4VF93KPuRj8UXbg7dIGJNNsMAna4qSnyK1tksGPx7nadlkitYNFeFPkV1O0tzgkUDJlJGCtuOJwW3PHQ6d4oBj4afHPI0n+fQRZ9D3a99B1xD4JAmR55uzIHLCpDHy8Qnlxs3GXpeL3nRJPBvbOnskEbNUmkqHrDbJeJ0XCNbpu0FUNTQW1T02NDXB9eHSoxZ4UK6U9ah0ZNcbUZyugSRTD7VoTxNjt0vMOTfeCm9wPGbQdPo69PvQ9FxcXXFxc0HVdcYrrur7S9/Gg5YBBAlZUFVJVltmqK1M+rLOAxhhkiPL4aSzfj8899xyr1YqjoyPW63W5Rw/VEv0ibaqCZ3T5nO1SRok+SVkZ7PXAuH6pjrTD9Jpq7ueV+wzquM/J38L0WHmQ5Os0Oce9891HToLl8cYt805k3OAGNsu2SX5lDB555/DelXk2X7dDapOPPtB8/Aq6dx20BNUW++TZArgWK/ZLzXDtUf+uZLg+jrY/0WsKdHqxItp2y4N33qbbnrOpPbdPjjlarxANaBRcLqrdK5qeUyQz5pn/Fld6IoFFDh97vnufm1AjbMEYjMKTXhMR65nGNCviQUJ5v1CA8nPnTK2ursiLWKEj5qyGT0pdExCmUNSdptej0FwKxt3L1jzma39SzaUIsGaVtX5IPbb6kuFiCrhmUWGz7AcVnj/QJyczxkhVVWw2m1lj4+wQHOy7ZUUqGBfQHMlYVbi6gbpBNxtImS3NGa7GMlzUdQJo/z97b9osyZFdiZ3r7rHkW6rqVRXWBoiF6J3NZi8kpRE1JoqcEfVBX/RRJtFM+n36MDLaaIwSR0Pa0FrqZi9kE92NZgMNNNANoIHa3poZEe5+9eFe9/DIl6/qVaFWIG5Z1nuZLzMiMjb3c8+55xqQZnof22t7joceeQ7NLDIqRMB7xKEH9R68WoGWS9BSgFZubtwPoMHDDF7GiyCOcmVsGsuICMvlEgcHBxiGAcyMtm2xvb0tgGtzBmiyvUj3O0MCrqwFVxZwVhigyk3AVnKdy9tw1rKLMaCua1y5ciXXbMU7qCEeZJSgKyiLrulCvY2PYILAYOOE6UoHN473Kk6/w4zP9R5GrKyWvkacGi8reClBRmK5QjjH9iPfC3OGLylokBZHp2vG1nN+JU5Dca9M46Hed5MDYrn/Uv3CeY4f53XJDhyfY9z2+R76xMYMuD7D8Sh1v2nd1lpUVYWV6cERUtMVIyxK5cHoGPTgtifdy6Y3xfJ3poLJLwYUYwDvexzt38Ty4BZqMHYXLS5sL+DA8H0HAwMOViUOrIlSyo910DXRkHMck2rpz+mmnD6jmvC1LzPuxDJKIJZHRgVJuqzJmENOerQgvahSQpMAlJFeLz5kMAWCyGwoydCK9yYWjAicgBywBr5GUEpmVFIkNfv9NFZ5ZFFKAtPx0rqH3OTYiyV86H3O5psEtlJtRHFiZFATo9RIeo+joyMcHh4ihICqqnJGv4zJea7bFYlgUu1KavLqKqBpEKsatGjAiy1w24C2WiD13qobaWxsDcg4bR5Kp9Yzx2c80qnLqc+TmsN0ndQurlZSs7VcSkPjrpceXF0n/biiXAubQDwZgxjC5Hzr+x4nJye5FYK1FltbW2iaZgRb5flJ47VAeo+KBLBL1u9W3DmtSGfZ2Sy15iy3pkyE3E4EXkp+yzEoxojlconj42Nsb29je3v7gdTt3G5ZZT8rRhpnBGFMdj3rPR6FJXos7m1J8hmMLCmDLYz3MzXcoGRFn8BWAm06NjFL3Xcey9Z+ljJEJGFhOr7Twe1cGTyy07GJgSyvBwpQtGmflsdrXcmyab/n8U/PofTevJzxXCrPmzke/5gB1xyPNJJu3VmHIXrEGKQRqw5e0hTw4WbGE15Zfw0YMQxBsrKGAsIw4PDWDRzc/Ag2emy1Fa5c2MWWs4AfECMjwgDwAhayvH9aVzPeoCGTkIylxo3J+vDM+5Tpr7Shmh3jKAzFOihbz5KlQUOXYfLAlSKMg1L5M2V79WcalMSsZB1opcywVbBlxhqw/DwqmyLLHiWNMryUxGDavE/FYFNmgkMYe2sN+ruPMNqMMxefa1YYp47VOGHzw4CjoyOsVqucLW/bdpxgrn0mRZ74gQV0WQMYB3YOqFtpZlxXIiFcLICmATUN0DTgqgKcBRuDSEZx9afgGM1xX0P6Mo2TbQ7K6K5WwGopboSrFejkBFgqAOv7UW6r90e5PZweH1INLKkMLniPw8NDnJyc5KTEzs4OFouF2IJvAm2Q2pxchyNyBlAlDb6prkBVjehsZrsS+5Wk16mv8CmwVRA2p9ar10sIAR9//DE+/vhjHB4e4sUXX8RisQCALAsu3/8gY7ztp/EKk8TdyACNSVEGRJdcJP4YLB4Vet8S9moc1zikPoS2GAPHzxMDHGX8Q/R63Eb3QWBcFqBywgTo8pdYp6+mR+csEDMqLngEbul1PuNwblhXuUNp03tkw8ekpBFwZzKATyB+vq8+aTEDrjkeSZSDhXMOTdsghAjvPYZhABlC3VQKUGjdoOiRBIMzy+WIEXmAHzrs37yOW7duALHDTuvw9OU9XNpewAYP9mJPPNYLR/0u0/ot59zIOmT5hGYA8yCm+yxvUdC3S5qwTNpN2JNToGwEYNk2HsWYFGl8LwPaeXTcETqGlTd/5BowygMYaePPEVAp4Eq24JZyc1DkInMH1Wbo+2V7iKAOiVJPEPn2mb0najBS3b8JySRDJ5/eA73PLBeFiKj9bkab5eloz8VAvFwucXR0JNcTSTPX3d1dNE1z2wRGArqR1O5as/hc1aN0sGlAiwXQbolBRtMAdQVKE09aKxifYw6M9/3MbkSI+93gBVAtldVadaDlElgtxaWz68GDlxrGqPWrOoHfdC6nBAPHiL7vcXxyguVymVnexWKBCxcuoG6a225vnnyrWQyU2SJrpHar1kdVCavrtAeXVWdCFMmhu9xXXdfh17/+NU5OThBjxM2bN3HlyhXs7u5Oxo6HFcJLSVD6nzCxTad1eR4SQNHxkyEOp5zYK/1cqllWB8QYfKHigLw3KmCLiekyRfKwGK/0uYCzmIFdilOGQueQoyYnwrSKJJXP35VUfj1d0O2fp8+NWy8AyyZ2S0ymWF0uY0pqzvfUJzZmwDXHI4uyhqRtW/ghSC2U98qgVHBaa/I4TNwYUTN7EUPw6JdHOD64hZvXryH4HruLBZ6+dAFXLl2AjR4EK85KkbW1khbVIiDGsNGsIGdSI4QdW5c4yptG0KMVV6NMUbfVMIAoNssp86fv4fwJWWIsC5+BbL87yiSKAS3N7xX4ZMaPAVP0MwEg7oclw0UFw5VAVsoGJzaMHIhqndwYAWWE0azDGq2LMJMJx1k1G499cKpTiNpzaFqzRd6rPXZybhPJjSlB+YZIMqSgsqq6rrGzs4PmnBNMMgR2AKyDqTSTXzW5z5a4Ei5g6laBVgW4CsYJSMt9jOaYQ6MEW8ws0lgfgWFA7DthtrpOJIUrAVnoemn0HQYxlGEW+SFS0mfz+V/K82KURF66DtK1UFWV3FNSNu+se0gCXDbJBdUIxkrDY6oqBVyjU2Fql5FbLdxDtG2Lvb09dF0HIkLXdTg6OsLOzg6SC97DDsI6cKT1F6aJP4xjhdzIGQQrx61grWB48hljC2YqAyeVFzLAHGU8UfOoCTgDMqBDiCODlha/JutLhla3DZUyJtOppOKYfv3zAazJW9P4lVZTjodE+tyMQMxqvfu9nVJzPOKYAdccjyTW9epVZdE0FYa+h/cefhgAWgKG4ZwWNJMZ1QmY3qgmy00DO9RGVlNw6dXi9pY+dWruuia/lqVpM82h77A6OsDxwS2sjg/gKOLK5QvYu3ARe1tbcAQY0h4aEdK+SPEF2IDJIEaDqPVq4pSlg1Ea4DlgUHmlCvVAJLVLJhtPcLGh0O9Io8Y99U0qvu1EiJi+MxfdsnTgKkq7MHmiuy8Xcud1EaaNkQEeYpEdToCrBFkkJgz6uxgrBJEWWgNEK7VhhBGgsQEZCza6bDYZJDxZYxBjPCKpQWgAolq/JwlhCNIwO7t6Bc306hlNIzPJEKA+DAOOjo5xcrIEg+Gsk/qPnR1YazFpu7C+VaRMojGgbARQi5SwboCFWsC3C1C7BTS1/l0c2uQYpqWdnozN8VkKLu4JI6suLnWQc9oPYD+Au17qtFRKCP2d+06aGueWCGPDeNZ7vVwLxYmWTzsBJU1Tw9iL6Lou28DXdZ1rHfN996wwJPdy7T1nnAAs6INcJVbwxoHIiqxuujlr6oPz7T1jDJ5++mkcHBxga2sLzzzzDHZ3d8f73UNmuPKa7uFGm49P/v7yC0PAmNTk0nRnFYCLCqYLSIDKZ4ZLhq0ikajvNSbI59PnJtsg7+FwB/lMwcTltpYFUBLDjCLROPnia6+ZYj8AMibS9O+ck5IWSVrPWv9Ma5B3Tmo9WTEDrjkeSeS+8sUNo2krcGxxcnKMVdchDD0CejTtAlXdALDSEzNZhxNQMSuUKtySiMYaXQKMGTX+pb26ClIASJ2KzwOBLkf/Y82oxdhj6JY4ORSwFfsVGgtcungBly9eQFvXcPoB5gQGkNcmvt8AQQCWSVm+tC6GqASJEThi4IgQQ/6b1G6NUwtrRIporNEMnEy4E9jK7I8yUUmCk2RoadJuU3YxSTOSPLHc9lJ2wRhZsPQoBsNx/ykgZBKZIhFAViZK2kA5EsQy3Bqt2RsA0yv75fSn/G383WhRuoGxLtsVc5Y0Gj0nkgykGKTK5CZOvXR6UnG/xrNigI9ggKIA+MhA9AKqEBERNZuvJhlebOEJAcwBuRENi7xVrJQh+ycGhMHj6PAYy1UHH6LIp7a2sdjagbWS0Q/Ra3mAmqOw1txZi0hA0ImlrVrA1YhVLc2Mt7YQmwWoWYCaFtFVCE0LdgbGWBiama05NJLroF57432XBDQNAYgDopeeWqbvQF2SE66Abgn2vVjEDwNMjFkVMDI7432LMTVVGiVkwurXVYW6riebmM/TfL6W90HNLVU1uLKIlmAqI7WLdQWua3BVg5w8YBzIyBiVBw0wLBX3nrzi8+1CYwx2dnbwpS99CU3TSHPm20iBH1rc4+Ute6JIwqzVTpURc/+SM1bNDIpVBmSAuByW+8cgAsbn45mlg+n96Tjb6T4t68Hkc5gQqbT2Mz87x32PDZBrsNJnClm+MFlW7qPGjKYZaQzTBMb4+hxPUsyAa45HFutzWmstmqZGDB4cI4Y4YBhWCDGg8QGuakC2hjUk/gI+Su+nNe105g5KlmbztHr8TEjuR1EmsAVjErzHMHQ46Q5xfHiAfnkCwwE729t4au8iLu5sCxZIc4wYJCMFlh5dI7wcARaNjBuVO6L43VgDYrlEYwjaDzTmjFwkiMGIOj3K/XpqvjGpmQBgNKOWe3us8V+TbPRdxWRn60u6jsRmEoEVdIJSY2X93UoGT+RoqXnoACbp+8SGRL5jTK6TYGMRbVT5hc3MTKYTTdLHJ0BO5eacOgvozCf3O1K2VgvEeWS4OAZ16YoCsDiZn4js8FTQ2OdFiCvKDmxVVWFnZwc7Ozt5spYmvuND/yfZh7AEozbXqGqgWcA0DbC1AG9twdYNqGmlZstWiM6ObOUMtObIUaS10jw3SqNc+KgmGYM0NV6tYFe9mGMsV9kgg4ceFHxmoYDNGf1kIJH6zAE4zf6c59TkfHPWe2mqNTVga8HWAa4a+245pwYxwuxiE7j6BBFCgHNOGjIX0ukQwme2PjIPj1m6LmMWMUv3kuK9xLEoPFtPGhZuh+sgljNPNq70PuHcBLhSrRuVzB7SfVSSkmzM5PuOx/uzd9w/LTEDrjkeURRMU2JMGHDWYntrC1VV4eD4ANz38L4D+whXebjKo6pbGOtEhoc1vFUksdLrZoIrcp4V44wfYARYIlibLNpF979arbBcLrHqVlj2hzDM2NnZxt6FXVzYWmC7rWEBhKEHE4srLhE4MVPZ7aNI2aXBM9V+F/si3XiNtaiNAayCK63diSEg+iCMWxgzvut1YLkB4xlNbbNpyXkO1SeIEdilZORYbCxWy4KA2Icx25eshY3IL03u5+RFZuEMUCnrpUYcZEXKI456VvZr2i9EEAtjoy1gTMJ8jzAkI0shgoLWcSUHthDAwav1tQCwlN2ngqEFkI9zkpqaSrLiTdvmvlvOudzPp5yUSgpfa+VIa+OM1cbGNWLTghYtqG3AbQs00l+LapVTWSv7W9f9WZwAznFGEACmLDmGNjU2IQI+IA4e1HUwqw5Y9WKM0a+k91bfI/Y9YhiAEGB4szHGqVVqE+MYAk5OTgBIEk+ugfqOrAATj6xDlkBrnZZzoKoGVbVIa9Pv6sqZ2Pf7eUN1bjo9G4YBBwcHuHnzJp5++umJvPDTFnf6TgSoqCWxicqWTeqzaMy8ludPKjtYu5eOn1sDYecGXOtvWsugAkj+V6cs4nW7iAiWrNya18b0vO1zPLExA645HknkCX/BQJECD2MM2roGsI2Vc1h1HbwP8KsVhq6HrztUVQPrKpDRZrv6OI8N9QZ+C4QIjgzvPfq+R9/36LoOXddlE4/d7S3sbG3j4u42ttoWlSFQDEAMsK4ScJPMDRLrkL5jBJKkMA8SRLnOiyc3/8LWVrO31kk9E6tTVoxRmEBmWKsZVozfPYaAwQ/w/ZAHZSomxun3PPg8gCjteZMrmUnZPQBgguFYUE6kSWJSe2FhXtiHbKJBZMGVQRxIJIgJYFk7To6sBVtlzcz4ILLgSJlhO2WnleIBjmnJVBCMsRFojCItDNJni0Mcf8YIcFDmNZ5m5XLN35idd1UF61yuswPGjH9mw8DaJygZmWhPoaqSpsWNgqytLfm9qcUwo2kku185ZRWn1u+fxsnfHPcWGWwlJj1GOce9Bw0DqO9AJwqyuhWw7MQ0Rt0ITWAgMiKPjX/PXJee3zEEHB8fY39/PzNEOzs72N62sOcwmYjEIMNZtixMuhN3QucAVwOuHmu4nBvt4DPBdf/up+k7n5yc4L333sPBwQGOj48BADs7O4/EOONhxF3dR84awzJ7lCT+nEFNSXidXhefPoTnOaR3GEcT/tsMtvQ/SrVaaZGc1TDzvfXJjxlwzfFIYmKGGlnZDiQaBGBGW9WoiFAZi74f0HuPwXsMK4+hW4GMgataGONURlVleRmAotxlvIHm54DOAYQp6vojAVlq2hFDQIgBhgwu7m5ha3sLF/d2UTsHZ630wSrNJqKsLGu04ygv4agbw1JrNfoDykQkMVys3z/Z6I47i9TJSR2KSIrB2Y6DbZndY+bs9hhCOL3vSWRnYtahRoAkYAikvbHCuq59KunZePNfl2wU25M2Lx3jxCtOHJcUoDGifk+jD58n9zAG5AlwmAAuslLvRVaYF3JJeuiK+i8dvKwBcaq1oHFf09q4ujaQf6IBL4+g5VOSk0Pd2ihoP6KC3UIMkgzgdI0UssA0h8AIbkkBbbm9m9hPYYB1f1oHrhy4aoC2RmxqmLaVuq1FC2oFgKGqAVeBrRv3u6E56TrHqeDiFhZZGtmaGMXWfZC6LGlmrD23+h7oO3AvdVukfTRONYQ/IxLwWHUdDg8PMQwDvPeZ4aUNwGQiO0zJr5SHUUlXhNQ2squkVkuvAfnpkG6gUlMq0mVKJcb3+cI4PDzMYCsBrwsXLtzXdTyxcda+prFjJQAZ83Ntsb50h8Mk99c75+GmXNbZGI3Xx5n8ORoBYXptvrl+qmIGXHM8kkiJwHwjU0mheDboHzjCkcFWXaOxDv3Qo/MDBgUT3jNWfa+MjRSaCohwMFrTY8ggcMzrAhgxMkIQMOKDWLSHsEIIQRgjY7BoGywWF7C9vY2trQWqyonbYKkHZ2EJmOUPpBKHzOpg/eYbRnlCAmtpoGeA43jLPl1+wCk9Nr5OZgQERb1UYgmtsYAd+31lmSELkwcAxjCcIVRVhUobgObKp2JCkhqIps+PdUMlABilGqeOdwLUp7Tx0+cEdeMjApFaPIIgXVK1psIzyPNopmGs9saxgB0k4+ysuOxZW2ShEwtmxLKeHLKFZIFg0nFJZsYleLxfQcBo/ph7a0WVGIY84QTHfM5RtlIed1+SvfphgDEGdVWhaVt1Cyw407VjQtZmtpQUbHHTAosWsa6lqbG6EHLTgGpp8MoKYE1yI5znA3OsxZjQIpDKCNkHAVtq905dD6xOgNUSvFoC/aCNjUVGeDdgK72n73scHh6i6zowM9q2xfb2NpqmOTcTxMRyn7FiXpDAFdUNqG5BdQ12NWArYb0Sg05qPEOJRbnn3Tf5XukabpoGV69excnJSU6kbUqmfabijvuYAJjJ23hCbZ1vNazvPS9vea/8ZkrD3inmW+6TGzPgmuOhxPrAmaUmadK9/hPIrJEhkkaTVKFyFhEMHzz6waPvB8QYBUD5CB+BPIlWDimkRfMUfABQcwGLRdOgcg5t26JpW7iqglPzAdlercFS6j/7K7EwLaISZBB5Yb4Iys6ELJOTCX3ugCy4AulGO0oH7v2WrUEEq3U7HKpcu5MeabBOD3IGVSXW+zHGnPEr+4Slm7zRQt7Sfl930B03a/0dBIC1p86k5xfFcZQDg0PCmQkcqbNiKjC2BDIy+SFtuouqBiqVGqZMdFVrPYb21AGEDU19T/JWkky8Jhr8+xzpPI/lQ5iABLqQjDKKn2VzzWEYsDw5weHhIfwwiHxqaxt105w5KCc5S6gg9VrOguoG3DRAuxBWq6nBiwam2QbVWrPlnPTYIpF5isnGPPTPMY2cgNFEAjKrpY2Nu07MMVYdsDwBVieIfQfqPTD0oBC0L935wFYK7z2Ojo5wdHSEGCOstVPDmPMshJAb2pLR+0ayfq+E3WLX6O8uJ3JYa04pJ27uadedvVkkbrSXL1/GcrnE7u4u9vb20Lbt/V3RpzJOH4wnnTUqE7lzPFkxA645HnhsHDwTm1MM0KzsljAmnDR2me0iZlhD0hLFONTOIDROMUxEDMJepQdHRmBgKJyB0p3KWovKOVR1Decc2srqQJsmk3njIWAIU7oqg6MEPpIBhE4yiAAKGUmMAC3pwKbyMAAieWPKTNw97mxdHzL7YxVolSxXAlvMAZWlLLsxkGOQmoUm1i+ZMqR6sanikSbrPjNIlZYYnRlLRd9Y8CaPqHVvBsmJUoDYhOkhBkUCG2UbgwKuGMHBaU1XEHlhiGDnQEHqvGBYgJU1IMPSWNJQxkIAQPd4GO6wGzKzNQFdIdUABq3vktqu5KTFHJEaA4QQsNLmxt5LLZ9zDk3TbJRPpXNbtaMwFcm+cCIXNMpu8aJBaGrQYgumaicTyzwZTZqpfMzu/z6a48mK9abGFCGy5MDAEARQ9V4NMnpg1YG7DuyV1dJznoPXW/54H7jT6RXUJGO5XIKZUVUV2rbFYrGAdW4iH7ttjFmlojbUTR5j7ValjY+tJiEKlvw+RSnJZmbs7u7itddey/fhx8Ii/gmLJwFsFSKGjfH4f4M5zooZcM3xUCNPYCdSuPSTM9jgyGLrKhQXCBYEqasKyooYAiqtI9Glo5wIpg5dvQGQ5Yb6sFZdDgliRrDm9qSgKDFa6T35S3DpijS+T/qwQI0ztE4IIUtOcgPbvBwIEBi1hrp+ZXfW91vekWvP8+4cl5HqoxIjlYqFrTFwxiBaC4Bz70XpYyLvEQ+HiL4fwBy1MeXIkLhcA6YPKoHX2qYSFZOD4o+bssFpblTg7Uw05Vq8qMBW9xFBrCgV5BIRovdgV4GNh3EG0TnADuDUuNQ5sIvSQDkq48VG3MgMQNlcY20fnznaTf+4acAcj8raeQbtJ8DpoW+OJG0FolXbeGH3GBHeD1itlui6JQCgdg5bbY2mqWBIgWTepzJ55AS6rAU1FVBbAVXtQhobLxbghdjAU9OCbaUyTe17pr1hJl9wHv0/0zE563nMl4gsXGoQEQLYD6CuE4ZrtQSvCvt3PwA+AsHLfR+aeDtHtoOZ0XUdjo+P0fd9diXc3d1VaW1ispGTfBs4j/xIiQm2VhISdQXUtfTfasQshp2TmtFJM9oHM5lft7d3zk2eD8OQ63Hn2BBPGia9C+niHE9ezIBrjvseEesyMW2wnjL6CjIATIDXJGOn8g5mzm2spJcmwbAd33LGKUxmtB+3thZMpHUtnAesMmO/voC1p+vvmdwYefxBUEc8fYOFsC0xIoYIRA9jCBQZkZUNgx0BZ5SJCjFJxlfRT56mU9qWiMh+lN8Z5T50wpP3JRmZ/BCN+x+ANF8WpBXAedOJxOEwkpXGw0YZFz0IiSkbBnE/NMZIYbo1qJta7ce97FceJyEEnTxog+p0bmTTDI4qMx2lapRAXDx9jozSutSkWesZtB+USS5/1oCCgfEKGioL4xJrMwCukcmTcyAnzYNNqvMiab7MpgSueqBJGbfJucJ5ixLYj6nWjwjM8u1FOqqsafQAD0DsAN+DfZDt9gCCAWIjgHCw0pur6tD7DgeH+zhZHgEIcJaws9NgZ6eFqVhAJzR5YVK/MnF5NE7srH3bgJsKrmlB7Za4ENYt0LTiUmgduG7ku68Vcm+6Pub4LIUy0BgvTSM8NADKzbw59tq8uEPsT2C7FbA6BlYrBV9iAU/ei1lMBEzpxBkB1gbpZ4XUMHZqDOtQVTV2d3exWGyPLLJKuRmsW1km5mhsLWEIZAG2Fdg1iOrOSW0NtI1cFyqvtepMSKDxXpTWdR+vjXXjmyT7Xq1WuHHjBvb39/H000/jypUr2dH2SWBxHlo8gbtihs6f3pgB1xwPJso0jRoRjGqxtRzOHaQRm6QTd9N/JBFJDzwSE5Odr9JzMRgwNvWfkuxtBkJGQBUz542l1LYrptf09WJ1BgAzac+QaWps457JTNHtv4Y1FqYysGRQuQoxesQwnKoDS78bY6QBaIyjvAaAD2HMHZcgF8AEwSRmk5X/hxQIAAAgAElEQVTTu5cJQ677010Rg9hJRwMEmVRFA9BgwFUy2IjgKoKdBan7HirNXDs12HAAQWVJBuPOYwY2AfW0OdoZIDk/JhDMYMQYgOhBiMKyqiwJBmATwSYATuyzY/Qw5OU5C7Pqj3r0Rz0QDAwZLLZ2sLW7K1l5GGWGZd+SkYy8cbVm7MUAwGy1QF3D1C3QtqC6kjquVJ9inGxTcTznidwcEumqlos2wy82ozQ2erAfEP0AGnpwNyB0wmqZvgMPnbgRBnXp3DQuFGspowQWyfa9bRfoui43Ct4UvP5kzGDlthOwJM2NqwomGWZUtboUVmKkYVMtaXp80v15d7FcLvGLX/wC169fz+qBS5cu3dWYOMccczz8mAHXHPc/Ysr0I9er0Jp08Exma0OsG11M+kg9bmEoA7wMqNR3nVidDCPEhU7rdzhGkAIwpihZV5J6LmGwxn3HuaYHKrMcQdpUppkppNOxaRZTRDLLEKkgCbBgpw14R8CVnA4rNRhhjogALEmNUbda5Wa91lqVcRrY1AssSzRV6hbFnZDvhAjPivJ7g2TXJamhCWqlr4yTYcD2gGctjg8CSGKF6CwAB9iYJzQiP1U3MmCsPVub4KRWBFb3MWf2LoBDgOeIGD3C4MGDh1918MsOw/EJ6GQfcXmE2PWoYoAJAS54OPYwiEKWHg84OVwiDIyqauCaGtvbF+GaBSJHPXWkozZZC9QycQxVBa4qdRxsYBYLcSOs1fK9rkG1Wl47aSI9g605bhdUPhgiIQxRG3cP4GEA9z14NQCrDtSJHTynmq0grpzJJGPkrEcstOlOULZAMNaiJoOmMVgsFgAAY+2ZSbxy2elLsCGQJcA5cGXkOqgbbYWg8uPcXkLbU1hz6tpHudwHFKnvIoA8Bt64cQNHR0fY29t7sCufY445PlHMgGuO+x7MABVD5YTZ4ik4OG/hbznIAuNgUzZ3fRwiy8VQNCtkyAw8fXeVSwrAEGkZG8kMMxntuSUAB2RUVsnKFMoEhZhgSzaIeTOQogT+CvItzzrODpkApWJwFQtZeZ7qJKqqGkGwAhKRQUoh++AH+MEDLFb7pA6HlbVw1hXAC+O6zrFtZ2xw3u48GYPIMgFhnGAiEAwoEMgEMEWQ8SCnzFZlEUONWDmALYyt5BjZSnp3xWQpTwDspMZkkjBXgwsQwfc9To6PsFwucXh4iA8+/C0++OgjXLt+E9c+vobjg2N0J0v4VQ/TL8H9CpYDFs6gcQYX2xoXtxZ4+sol7O3uYts71IFgmwqLtkG7vQW7aBDBY2PXZI7h3BRMVRWobYGmBhZbMLUaAJxyXRMn0FQaOYOtOU5Fmc9RQyMxf5E+cuQ9qB9EMth3iN1Smht3q1y3Rd7L/SK5tkIVfoUi4SzAFdWYKNWUkiaHOI5JkjOjuAeGBLas9O3jxG7VlVjAa1KCtMkxrTNcKT1E2Ii/7ncwM5qmwZUrV3BwcADnHC5duvR4Jh/nmGOOScyAa467ilP9fIpRpmxwmwuoITKoEWhtXmYaPEu3q8R+rbscrr/3dkGgXNdD9zn9uGkiKoNvAoVYAxAJvOiLxkDRiUxWjLBc0oMpaP2UgtQQRxkbRZDWVmWThTzbx4Tp4WQqkRmv8j3pI5S2Tj6TXssmJjHL1DYBXjl+ssxszGEt6qqGIYPovbgeDmrhry5bRkFWZQW8WWt14iLriDEqSFNWqtzvJdAsf+rfx4kgsv+JfLEABBL/CQogG3T/D0Bwsk+jA7ETGV+MgAk64WIAFmQqBfoEYwkRARFez3mC9wOuX7uOa9eu4Tfvvoe33noLv3rnfVy7dgs39g9w3HVY9gP8wCoJJZFCMgEcQMEDoQdCBxM9GkfYXdRY1BX22gqfu7KHl557Di9cfQqvXtxC5YAtInAIoKqRCaGrhLHbWiA6J8xWAltNA2oXYOdEOumcAkmDmCZuaSL7JBZBzPFgI99KRgqKYgS8B7xKYbulgKvlClguYdQKnnplvsIgrQ9C6jOHXKtV1myl5FXp2Nf3fTbIqOsaxsi9ZD0hNy5Em8lzwUwbHRe0thHOIDgLNDVsU4/XicpsM/tr3HgP1XtuZuOKetUHFel7Xbp0CS+99BLatsXe3t4k+bU+ns4JkznmeDxiBlxzfKIoQc9oaJBfUSdvxsRw6i5ZLWA60S8H302fmQwwa4PiQ0lDogAtKXWbtyUNzJTxESB9n0yuQwraPMyMksI0uYlalxSDfFid60pDEiZtpKsIV0AnssdDsZUbM8hFy9/0tjNj3NdFHzGWxshN06CuazHh0CbTQX+XptPaRLldoK5rba5cbCQzYgiwRfo49/9KzOZZCYAEKDHul1PwIaGxKPUnFKRWDd4BvgKqAbAeZGsBZU6y3HEIsE2rrpMASAxMDg6O8NZbv8RPf/oGfv4vv8DPfvpz3Lq1j2EIQNxC217EzsUruHr1IpqtbWxtX0BTL1BXDYyx8KgQQIhDj355jG51hOODmzg+uIUbNz7GrVvXEK9dg3n3XVz455/i+QsX8JUXX8DXX34Z3/r85/HC1auoAISmgdnaRrQGZrEAZ2arUQlhDa5qbQSt9WoERBKWUqSEWN9bc8wxRkFB5QRR8AK6BmG1uOtgVh1o1YucsB8A7yWhEIMkcYpESs7NYQRdJjH8ep0Pw4AbN26g6zoQEXZ2drC7ewFVZabX/qbtTSApJWys2r87A3YWsaqynJAVZHFVa48/pyZCG5oam4dznZRj4c7Ojtjeq7wwMX7AWOOW3jvHHHM8HjEDrjnuS0yya2vSwVNg63x4awKyzjuAJECWWZBHMOCksX2zOo60UeYo84Ml6QOV9hfJH0WmY4TFikYytdHoBIdkVqK1YBwZrABmtFSOMCyMGkeALDazjOsTFBqn2uVk6G7DOr296E/plRYQvIf3HtFLj6+6qXO/HNb6v+TE5YcBTi39bbL2J5Jm2OUxXpeWCsWF0ib/1HeIicEiIFpx5AsWCA4UAqi3oCqCrPbHqvRR1wjLDmhq9H7ABx+9j39+4yf4/vd/iH/5xdt4/8NrCGyxtb2HZ196Bc88+wIuX3oBly4+gwuX99Du7KDZ2hJ2iywoAiFGeFODbQXDrDVfHr5f4eT4ALdu3MD1Gx/h42tv4/1fv4mP3n0HP7t1DW99+DN89/Vf4Gsvv4Fvf/UL+PbXv46nLl7A9u62FP8vFqC2AazaWzsrGXtXZVtrmTAmX8XsNXf3B3yOz1YwAFZJoPeAH0DDAO47xE6bG3cdTK9gq+/lfXFQsFWw6hjvmROGK73PGPR9j/39ffR9nwFGckm9YyjQSvcMJoCsNkqvHFA7mLoCN6mmUQ1kbAV22ndLG9yPoA15fClvqw/qylnvy2WtzaZFzIyjoyM0TYO2bZHcDGep4RxzPD4xA645PnGUTBSvga1RukZrz8+37LOK9u8oJ3wEgIuLx/pEYhImMUEJF2jFV9pniY2KDKQ+UepkaLQOCValhNGMDXINCUumAIxAar+fJtMYmbDbZIOFDUxyobs4WKd2yHTZqWeXcw51jBlcmcT4ZXaS4b1H13UY+l5kR0RwRkw3nDatzv3UaJOBioDO5KEmZNYaG5b2eRQpH4yFUZBmoppOBIiUUJsTszqqecP44P338b3vfx/f+f4P8Kv33seNW0dY7FzCCy9+DS+89AX8zqtfwvbuHhbbF9HWF0FUIxAjEoOtG3dPlENeG4NIpO0PZPud3UXTXsGVK6/gd/yAVXeI5ck+PvrgXbz9xj/i7Tf+Ee9/+A5+85M38b1338E3fv0b/MWf/mt842u/jysXLyDWYpJBCrKCNdKHzFanpVGF4cgnOexzfIZCARf7IIDL94i+R+g7UN+B+h6m70F9Dwxe2iBomwliUhZ/BFt5seknMwwZeO9xdHSEk5MTSdLUNdq2xfb2tgKOO20oTYFSkhM6K+0gnIOtK8SmESfPyknNo9Y2srFSx0nl1o1ga/3nw5AVpkTktWvXcO3aNRweHuL555/Hc889l5mvWVI4xxyPT8yAa45PFonB0gktQefzJbjS940j6vmGpKk0cAoQJjVd5VKz5DCBLaP6+rVB/QGMQWn5p3KKxYq5nMvSuM2p0XEGOspyJVkhMyvoMmL2wCr7iyyAIXJmwRBZei6HAPAw3aj0OxfH4BTDhXQQMw3HoLEm79TXo6JWDCqZLI5P+ZE8WTDiFKjsFMeYgV46ttZaUF0jDloDFgJ4GNBBJIvWSj8cZwy2t7fXJhaU6zbSfs+1Ilwe/nE/UNBzNgTAsoBaz0DFYmjCEZ0fcP3aDfzop2/gOz/4If7lrXdw49hj59Jz+Oo3/hAvvfIFPP/CK9i+eBVVewGgGj7I9gSm3BfbK4gEAwaUPVQSYpdcAYEjyXG1YtFv7QIXLz6Lp66+glde+Sp++7U/ws9e/x7eeP27eO+3v8QHP/wJfvnBh/gf/uIm/vzP/w1+56WXpJGxrQBbgciANzmssR74eW42x3kjG2VEUJTaLRrELMP0PdB3MEMP+E7khtFrf64o9zC9NwNrd5XyNmjEav74+BgHBwcAhP12zmF7ext1XZ9jOwFtgKf3VaPsrrgOshXLd1Q1TAJZlcuALBnlFLkJbLpQTqkCHmAksHV0dIR3330Xh4eHCCHg1q1buHLlSnZsnGOOOR6fmAHXHLeN0yYZxaw1db1E8uTjPGEsNRY5y5ZILmxu7lcyZcZondL4x8n7sl13ZmtInfLSw+iDEI2uW00A6AFq7k+DLV1X8cOuvUX6M6EYsY1awkO+t0VmB7OZCCKYrTBbIQIxCisToX1wWCcW+lk1t0j1XtmKmUksz7PdfCiAFo/7naxMgHi0pUcJrI0aUZh0zhSsVcku5e1XFzw9fumYcAw5g105J7VeXY/oxYbee48QAzwYg+/hooU3Fk2MqCpxFcwTtUFcy1K2d6qPVBawQOAEAixJtj6xWhCXxeg9Og54/Vfv4u9+9GN85x9/guvHHbYvXMHvfvOP8PIXvoWXX34FTbsNYw2ILLwifTYFvmU5JJUxmeEDkpw0gdFiY7VPq7RtZQQHeGYYW2Nr93m8+sUreP751/C7v/t7+O7/9zf4+Rs/wj+9/SE++t//Cu/tH+N/+1//Er/z4guwVYXI0n9s0B5hk6tgBlpzpJgSOGvME2suSDIEMXhgGGCGQeq0TjrYZQd7cgJ0J0DXAV0PcEAMPYijnMus5Y9r6xjHG0pKVxwfH+Pk5AQhyL2haRrs7OygaRp5Z1HXe+o76O9EJPkoIpC1IFuDTQ3UC3EibFtgsQCaSh4qv6XaIrVipnxbm67rYQKtyXqJsFgs0DQNDg4OQEQ4PDzEwcEBmqaR8XGWFM4xx2MTM+Ca4+4isRx5Ap3/Q5bE3ctieepGyMzSy+i8sT57JJ2pFhr7MxKTj2lQZsCAAr9mBohBMGKQQcqCqOwNCqDApOYbDKkDGzPSZXYaMYotPUdEpeCknxSP9RQxsZcKUjKLpe+HASFM5jmJpEPxMzF8k0ldCUZUHkREgLoZ1lUNxIjgtdkyRyz7Dn3XwxmDtm1HCQ0g/cJ8wGq5hPde2TArjFlR45dKmGRf6T4JDOMsOETEGMB1hcgeH9y4ge+/8Qv8zfd+hF9dO0BsL+ALX/06vvy1b+Jzr/4Bmp2nABBCEADJdzjR1iVUt31v4TZGCGAiMFs5A0yL3b1n8NU/+C/wzOeexd/+pyt4/Yd/iw8+/g3+3V/9B9jK4S//l/8JL7/yCqJeU/McbI7bBp1+qikKeSFC7hnBi0zQD+CuBzqREaLrskEGvPSfo0zfjnHW+Z9AQggBfd/j+PgYK+3p1zQN9vb2sLW1JXWf5xlvDGn+zUgdlhUJITVikEFNCzRtbnCc2iPAjmNIIscet/GjqipcvXoV+/v7WCwWuHz5Mi5cuLAZhM4xxxyPNGbANcddxsiyZHZgTE9mxuKul7oGuACcfznrb0u1W4buaVsei0jSO4yMXjnxTpMfMollgjgTlqAqRpk08AaQleq8YlRb9AixUVenQOb8EyzgTn4mBJU2VCkbhOlh4DVCaS1YMaHJX3L8KV0ENJOu35WIYJ2FYSlcd02NuCV2+ql4PktaIW5mXdeh7/v896hsV1VVcM7COQNjGQYWFibtTGEMjQUZiwM/4O3fvo//90f/jO/8089wvSdsXfkc/uCP/xRf+Oo3sX3xCqJZjFnw+3y+TdouJBiXkhIEBAZCNAA12Hv2Zfw3f/E/4uLuAv/5P/4Vjo9u4N/9H/8eW4sF/vIv/2c8+/wLWSn6uE0c53jMg8eECyLLPcMLuwVtaCzPPTgMgJfXYvBACMK+l4vD2adgec6nJutEhKZpsLW1ld35UiN2Y+zp6y4xUdmRkGCcBRknZhiuBuoKqCtwXY01W64CbA1YBxgx0sliwsfwmjHGYG9vD1/84hexs7MD50RmncaJEKTh+wy+5pjj0ccMuOa4q8iNZQuZWOrZdK/sFnB6onruAWIT2DJUDLj3vEmPNqj4hXQf6zSFObFb42tiSjiCKo4EsBndDUMCWYWrYXoeLChKjRJiFFlhPp4stU1ZYogRwOVQ+KeOiNPzoNhuYsQCfW0EXUb6UsUo0iPDCjQzJcS57s06J5JKlWRmV66iqDwBMe89QrKj914ArGVYBzTOoXE1nHEAGQQYmMrhuO/w5s1r+L9+8AP8+I1f4iBUeO61r+Kr3/qv8dpXvg1y2+ijgYXT6yLtNoYx68LRezwNKOUwRnmm1Lew2LiLfhJkWkRTYfdyjW/+8X+Lo4ND/OB7f4ebBx/ir//v/4jPf+Hz+Iu/uILFYgv2Cb4s5njIodf7yG6zOAwGtXhXYEX9AHQ9uO/B/YA4DDBDEHluEIOc1IHwTpEAVmotsbOzk+VxTdtmBmxsen/6bB4VDToeGCsP56QlgsoIqW2F6crOhKkBuAOMkUb0ELb/cR1PqqrClStXJlL70iJ+BltzzPF4xAy45shxVl+rMnJTWagLXikjLJ0I03OMLE25jLzsDcxWGmxR9mTasD2p79PEJGMj25USnY+nzOK225TBljzJrA8TGCFL15gAGJkc5LotBVBgBlndx3FspkwMbVgax/ezSIU4SrNj5ggCwyC5IkawgqB87FlpKQRh2Uw6nqVwjgGK+RQZZYvItWHIQEKxm/Zwy2yZ1ujl8ykBfiIBlJDtMUSo6wbO2gyyks18yph77xEGD7IMals0rsrFdYEMOma889E1/M0Pvo/v/fJtrGKNV37v2/iDP/4zPPviF8F2G4EcYIRlAo821cAGl3oaL4vx8hivg3F/TWNK+BYtqpM0U9FqJIvIUju2u/ci/tW//u/x8bVr+PEPP8Y77/0G/+Gv/xpf+cpX8cUvfhmp1PIxvBTmeFwjMaOBc78tGnpluDpgtQJ1HUK3QuyXgPdgbWyM5EhauOeQ1tOiuBZKoMUAYghwzmFnZ2ciBQamrD/p9q3XnEUCQHI/iERg40BWAVVTg9oGtFCg1SQbeKv9tqRHndQem/Prfx9yJHv8clzsug5HR0fY3t5G27YA7j/zPsccc9x9zIBrjruLrCgblf2TKGeW51zcOoi6q8FBsdb4+xq7RdNp/5MSd9xeAiieQpej+QZBUUtAlv2xNEQmBUpZHmSCAjAFwNGCYlA2TCzn4ROAY2WVYrZJZ2YYmMx0CljTDHSisUi3b03PxgUjxmqmwXr8qEiJc7HNZ7UIGAEJxC7eUK7zSEYcmeUKAZ3vAQpo2xauqgAAwRIG4/DL336M//SDH+LH77yPo7DAa1/5Jv7wv/q3uPzcq0C1g8A2402D0dr+vKf+ZrvmO2v9qDjG+QpMAJYIgIVxF7H31Cv4/W/9Cd5771+wf/0d/OhHP8IPf/gDvPzSK2iaduNaNiVX5vjsxamzMDHbkQVAhaiSwR6UJIW9gC8BYV762IUoAC0yTDq19Npm4lOAK8l+Qwiw1ma2OrWTkE05nbjbtOFstNcWkdi5WweqGnBTAU0DbhuEuoJpahhtmUB2BFpM2pcvpbse00Ek7Rciwmq1wocffoibN2/i8PAQL774Il566aX5Op5jjsckZsA1x13GODlOA/H9up2vZzHvbouQN4QmoOvuAOCTEwSiO7kfcFb5qXE7THIiSTV4UeqVUNRtkfb2Yg4qH2Lt+8VjP6oQMrgSaWJQNaH0A5M+UtLbSQw5ZOoieItHrB5llpSdGo24kzEnCZ32vsIZYCABl1PYRSRAZc+a2jlxVtNHy1tgRNTqEB1iREeED48O8J3XX8f33/olrvc1Xv3aH+EP/8s/w/MvfAkDGgQ26RCAwEX/qgcdwjXmuesaK0bKqkV2MNVFvPaFr+GF3/ldHO6/j2s3buB7//A9/Js/++/QPNWqOnO63XfsbXevWz1P+J64mJxZp8CWBw+D9NZaCbuFrtdarh4IvdR4hTjWl95uXXreGSP9tlarFaqqyj377tZpT9h+yr22yNlco8W1gC1etOC6Btc1oqtgKwe4SvptGWG1NI3zOKoIJ5HqtLquw0cffYSjoyMAwI0bN/DUU09hZ2fnEW/hHHPMAcyAa467DBkbE9hKgrZPPiSVcqy72p71tSeglQbcJxhwrW91mWQtcq+n31Q8SYwIUWmBjtHS32pTZaj0kKOCqQjDRliuDLYKOWIwGRDFyNJjR+vEKMkYC+misGBBQEEB1plIjS/kdVYZ0FgvRiCOSL2+QIWsEoUsbhPgWpe6qs4v14eYSpg69rJnrUEfI17/xZv4xzffxD4De8+9gq9/41/j2edeg49Vlm1Kxt6DEUAwOG32/6CCck8x8ULUmjYeZU8RQECF7d3LePGlV/EvP/su+pNbePPNN3H9+jVcvXoVPDmbJGbANcfGKBMtUVwH4XsFXcNo/T504GFA9B5G67YolmPE2vmmsvQkiRuGAfv7+zg5OYExBnVd4+LFi9n+/fbbiFFmC0hbCEMwVl0JrQAqqsTy3TQNYlWB6hqwFeAqeQ8ZMe2hcXsjUneGOzPQDzvKuq22bXHx4sVsob9cLjEMw6PexDnmmENjBlxznB1pvsrlSzxahN+n1ZTM1u0mfZv/knSDCYKYEXSlz9GTN+nb9F3ven+rFiZPePICWPcPj9LLVDQVDcgmxkvlhNmtsARcMUsSiSMoOiAGyWgnYw6vUsWobAwbKawo66+0Z1g+7jGCEZAnaIQsPaIM9BUcUOpxxflw53oOY4rvnE7kJL9JrBqASDCuBlNAHwd8cPM6/vHnP8dHR0egrT18+et/iBde/AKM2wIbgxBlHQbQ7xCVdSq1rec4NPd8PgprWPa9k7Zp2ki2+PqmXuCZ5z6HqmrAtsHh/gFuXb8ODAHkzMg0YryuJ2tK5jPn2KYzX2K684lLgExr115k2vC+M4LP8Z7irZvEnOdZzWch9OpYe4Xl+g5BbOC9B/sBrLJC8upMGEROCJUVrx8XuRxHQTrUDCOEgNVqhZOTEwzDkF0JnXO44xFZO784JdysBVsLcm6s06obUPrppKaLrNrAq4SRqNjOfAnEYjMenzOklCYn84zj4+NsEb+9vf2It3COOeZIMQOuz3iUfa9KnXxyIswTyywNGUe3UwxLnmStraSUCRbOAevywXWwxZskc6dmSrJFhgw4O9RRXh4B98ScPeo41xafZ9wvcYDWcZVHUObsaQpqR6KGY/6bCepUyCyGGABgY2Y7mRmBxQ6aVH5kWD4zsarnAcxe1H6phiyMZh7MDIp+dElUAJAbBKcaM1mAylqRZUtg1o8wTGbS9PsxwHbyzfX8jWBbISBgZYCf/OptvHvjI3SmwosvfQWvfOkboHYbVFlZR4wwebpoATKIbMQxsNztiVjVn7c/VGWy4fasU/ZMKwg8IOGaCIBgQTAkctKt7QvY2tnDcHQL8ISTazfAyxVMZaHIVZiGTduoJidjQkP3c5Lqpi+aCsrSz8w66vu8m4KnNWzKYMD6ggmhPMcXkJwknKdNdE7da7jo6HwG0GM6De/KMLjT8fo0RwLzEVHZamJoTy0v/bW6LrsS0tCBfQ8aVsDQwfoeJni9fVA2dZFDUcphx/XFGLFcLnHr1q1snLFYLLC9vQ1rHYhMca7T+Nl87klyCGRyj61gxRgDroKta5jFtgCutgXqFrAOrmoAU4FsBZAVh1RTJFQm8XiOIeXYRkS4dOkStra20DTN2PAd431k3cVwjjnmeHgxA645zhf3g87ikcm4b7f7DNrU9eoxte59XOLUYTyLqiSTgRinBsElwEkgRifrllVWp6YcVMiQUuE8ogPYZ9MOYrGrJ3UxS4DLxDA9V1INV0zrjLreIhGgy8yggNPnxtdp7XsSB7BzgKkQEfHxxx/jjbffwY2TFZoLL+DVz/8eLl99BmScNDRGwhlrSOchnnAJyN0uUREBhBDRVA7WVbCmkqsjRHDfIx4fwtROvwWf+vwYyYI//YdMD6VrjSk5uSWwRdP+d2SAGMaNB6S3kRmBEQFgDsJEgzC6wulPRYMcT1/bZyZ98oI37EM8zCP25IUcDwLKxEcMgA8ZdMW+RxwUeA0elOu1xprG7KB6u/UAODk5wcHBAbz3UlvZtrh46RK2FovzbSyUrTUGcMJoUVUDldi8U92KDXxdA1Ul1u9q+z4+Pvl+exzCWotWrfNTm4xkn597Fc5ga445HknMgGuOhxPFBPp+3vQzS2bGSV85wPOMv+4YdzwWFjoJntIqVBxPAECkkW2KxU+rn4sGYDtlTLMsUR/R6wS9cFP06rQYdV0qd5zIC1ny6Bl4pc+mn6e+FEtmnAwiO3gOeO/jG3j/2j7YLnDp6ou4+sxLcG4BBiEmQHgH2evDiPFwbd4W2aUGDIPVsoMferAf0FpgURF4dQwM0nYhsZTpc9P1ZKqqWKm6yxHknDDaD04fZKiYwCobBwvA5LrK6fWqD6ugigxImbpRHwoIOxIm27jJLOW2AGyOc0U2RIpI6F0ZrqJKXZEAACAASURBVB489OChUxlhkHrNqHWfPkhy5ZyXR6rbWi6X6LoORATnnDQ3zqBhw/m9Rq4igXRrpHFxVcEkgFWL/TsWCrqaRl6rHGJlBaBp3danCYcwM0IIuHHjBg4ODnD58mVcunQpN3+fY445Hn7MgGuOBx9rYCvV39yXIIw1Wpql1CT8DLbOGZsA16kmmrqfweNrrHo5VjYi27gnSSpoZLliKj13E0AEYKwLixFgqQWbgLugMicFaMmuPmXfCcjGHDJHH5dPnEwlToMuNgGwFr5nDN7ig5v72F95RNPi4t6zuHTleURYJW7uXGP4MKJU5p7pB0OSzQ4+YP/WTQzLJSoAl7YWuNhUwMkRIoexDcAZX4mTuC4lNdI1rMYlTARYp65uumHq8AajfweBbSX7T40MMkDLTBcBzk4lwWRAJubfAQLcCKdYv2euDSon4ae+x/rume8Kt4sxaZGaHIfcewtDJ723+i5bwUvtVhDpb75u77yPQwg4OjrCyclJvqfs7u5id3e3YGNOU0/r93dOjY2dBTsHdjW4rqTXljY4RtuAK31eV+DKga0D7Niq4nxb/XhHuk8dHx/j3XffxY0bNzAMA/q+x87ODqy1M8s1xxyPKGbANUeOEhSN9S+QgfdeFpgkRDxtbnzWpLWc0J5rUKAka0ojr8pKUICweWCZxHkH2sn7KNVgUDHJpXHSk2V14/HL8j0tFZJJWGpOjHHy7r28nM8JBVO6DAbUhGN8D8UpwzXWFxbLKQBbOjVoberNJsKDQa3D8uYBri87eOMA02Jr9zKqevuUjO10D7DpJG3Tqb0OjNbLGe8mJnVbfPb2GMtYHR3h5kcfInYn2HEGn7u8h0uVgz+4BQMea+OAyfWpWwkii+RyOfkLqVMipG6yBFAgEtMVSu8jtdo2IH0I0EpMl0q6KgdhwVS/aqw4aFIyM7CgMO48mgC2gu2KQJ6SJ+y2duSZx95Fc0hM+lsxj0kOn8DWoGCrF7DV6aPv5W8+ZGZaueY7rtN7j2EYcvPeuq5x4cIFVHU9uXbHusHxPOSUaDOESAZwTtgtV4ObCpzYrYWALaiskCsHVA7sLCj13NLv/Gk5H9K1fHx8jL7vAQC3bt3C4eEhLl269Ii3bo45PrsxA645JpEBjz7/RD2GzmCy7sfAlpbB5UBcWtXNYOu+RN7P5WvFZCrJy0S6N1IOyZwuKX5STQ4jZjAmfyPkGiwADG2qXK40uRhmNkYgQDLeyOxWudwNjNak7gkArDBpBjW6/WMc+wEDCLau0S62ZEJ2m/P3UbBdmwFdybzJz+g7HB9cw6/eegNYneDiwuLLL34OC+/hTk7UDGG81k8d5dRrbO0vCnf08pK+YASMzJWCoATCiAAYqZdJbBYZA7KjxBBkZQJMRifBCrZMAl76eTLjda09lpAljDS95hMA0wa4UJAIkFjop3NyvkXkyNdQSoBEFlYr+MxkkT7keS+/h5ibnRMI8QxNYZZ/awYi2b5vbW2BmdE0DaqqOp1VwHhMU5IngvP5w8bAuAZUV8Js1Q1osQC3zchu1RXY1YAz4PJ8nOwAfGrOh62tLVy+fBn7+/sAxMEwJTFTY+k55pjj4cYMuOZ4sJEswosM4icBXFROqNJPKn8i6/E/RePnI4877UcCbXaVLBYgboE0SoEYakFfvm30TBxZK4wsFjOYpJkyq2QwTxBPzfNOi8kmf7WC9ChWiM5hYEZEhLUGxkjfsMfvLLrTtjAMeoRwhLfffB3XP/gVWgx49dnn8PXPv4Z61cHaKPU4k0XRFFvy+Hr6P7k9puuNmQoAJgc1EiFmdktYMLHdN3ptKiAzRm3nC8BkjYCr0tAg2XUbI/2StFZHnhegK7NhdrpMBV3I61OmkwvEtQnFmsfpmD/kYCoMb4KAq6HXxyglpGG0gE8JkNsuVscAAsQBkcSNsG1blC65d9q0BKBhpIWFsQ5w0tgYdSW2720LbmoFWzVQ1SBb6zmWDFtGx0N63C7zewwuxtqrV6+i6zrs7u5m90LgyXTtnWOOT0PMgGuO+x+aweRUb5NfLjKcxev3tPwM3nQSV9YZoZCe4OG1pP1UxznInEltzBmTFy7elUFX0Q8KymKIzGcN7ijwEqfwqJMLfa2UFW7aHmwwzlDnRbIVXN2iWSxABvBhhW51hBA6ONuC+ck5gwRf9Pjot+/gxz/4DvzJPp7dafGt3/sKPre3h2oIoIEBDqdr2taXtTYvkzq4ZJqhe7eQ+cFQNntjAoxKCs0Q9ZgqW6aSQjY0slZG5MBsS4bLrgGuOk+ypeaLQJa0sa082FTje3QdkQCyiVUziJqZOVNyTOvnzmcolOHiyMJchQAaPDAIy8VDYrl6Yb5C1J5bJQe6ed8lJra0KE9NyG9rSLMOhvReT9ZIPzljgVqMMrgZjTHEHKMCVxWoqkHGZdMWpvGOMPYL26zIeJKiZN93dnbw2muvwRiTa7eSc+Ecc8zx8GMGXHNM6l6oQCrrNS/3stwxK14yUvc4qK1/lkZJYf67rPizOl16fGJjxphO/YmSm92meRbpZCiZcQBZGsZkFdcnqWHWJOb3nVr72rljCOAghfntTovdizsgS/B9h5OjWwjdEar6QrFpRfNT0bCOyjQa66c2XTWbXl+v7doY5QWp20A8NlouiSgBrxH7+x/jRz/8e7z3y5+iiSu89vzz+Nqrr2DBgI3qLKc9h3JsMhXxEVR0rMq1mCnBAQChACdZtlf+Tvk7cGIvidTogIDMfDFARl83CprGhrRkDAJJk1pjLVBp/Zg1ynAkwFWDjAU7YTKiIUSjdWVWgBgZNWNQpiQbd5RggctGt5j+LR8Pvs3fH884H5EjqgSKARwi2HtQ8CDvxTFUZYQJbIFDsfwMY04tdRiGXLPlnMtNjU1uXn7GlhUvc3qujCUZA6obcNsCTTs6ErYtTJIXVrWwpmrmgjRkZClzOpZPPhApGS5ApIQpYozw3sM5N0sK55jjEcQMuD4rscletyyUBsSRis8YLicTzTuEzp+jKlOMNWNTZf2/zMSVGc9JUXyIYzF8WX+jcxsmlUcUG2voyZj4PHFxH3bp2mFcp6NybJz2rJFn47x+M4DfmClfex+xgAquInYvbuGp567CNRX6E+Dg+oc4vvFr7G4/hWAc2AB9CCDK/AgMW0ysMNOGMZ0CUvGs0zLJJQE1Hxk3LkMsYoiFO8OyB8GAUSPAZp+YGEVVtVoe4Wc//wf804/+Dnz4IT5/ZQd/8toreBoR4dYNrIyDMw7GOlhnYbVmhqOyUMo8E6nFP41tnimZ55RYY4KVJbmyvu/JyIQ8H1ci3SHFfjPCgJkEttKfs4mGgaVKQJM60qUaL7YW5KTWyzg3kSJaZyW7r6wYrEWwABkDayuVIJoC/CXXxGJbcx1jArkEIMJMukWLxHJ6IuBsEPEIgotHuaUZeDC06fgg7RmGHqYfAB+B3gPdIH23+gD4VIsZEQlg9gqw0/hhkBxNjTEIIWC5XOLg4CADrt3dC9ja2oaxDoYEEJjc5Fr3ITHSPwJl9tLqsURdgRcteNFK3VZdIzYtqG7FldDUI0Nt4qiyAMax5VM0XpTfL0UIAavVCvv7+/j444/xwgsvYG9v775I/OeYY47zxwy45hjjExJa65HkIp/k83mWnk0y9Hmqz5hjjg1xXgt3yfRGWGfx2uc/j2efeQ5vvvVr3Lp1He+98yaeevZLQN2CI2CNQySWJAKANFNdgxdn01z3EkwwnCz4IyJXIBhEJKc9AMyw3CN2x3j9B3+P7/3t/4mT93+FFy/t4F/9/lfxe6++ChoGHA0DTqKYT1hr0LZtznanZqnl5IuMmSZgzrlPT30FXpMPb6QAkyFGLACOrDjJDqPptf5L3eX0dzIKuHQyztaCrPyNFYiRc4BTIKbvjU4YMyQXxSRfJALFtD2FMQeV9Ige5Mzey99S64T8te56bz3YKIV/k9cTUxyjNAzPdvCpB5f+HiIoxFzjtW6yNK6FESNnANB1Hfb39+G9z9emc07OubRNqfA2he5nYu3vpvVXVEtDYzirfbYWQLsQKWFTgxqxfjeu0uNrpO7zvu/NJyOOjo7w1ltv4fDwEDFGNE2D3d1d1HUN4A7s4hxzzHHfYgZcc9z3mDBWnyRS4boCrlFOopk50Frh/xxzjHGe888Y8dyw1uLll17Gl7/0ZfzqnfexPDrEr95+Cy++8is89eI2OEptEcFkPwGiCCAo43Ef5EhUTAmTIUVZlMhGWGOMPYMMR1TGI/ib+PEP/jO++//8exy8/VO8slPjz//4W/jTr30Fe4ZhuxW4H5R1jvC9R9/3YGbs7u6iaZqJcUGMcWwPgcQk0zk0kKdDmtfe6XPCPsg1Ltd7AnlSKAbY7H5YMFImORsKIGJrpT7M6u/Wga3ahlsHWANT6URcwRhbA3Y2vx/GgF3hjGiNSikhjZkTi5Cbf42SxFR3eD7p3sON9bN0ZCvlDB5BVwD5oM2M1ZXQD9mxkGPIZhmszOt6MOScMcag6zrcvHkTIchxdM5he3sbi8UC6322zmxqbNTsonKITswxpG6rEdv3tgaaWowzKgeqpc+WOBHShH37rEVVVTDGZLC7v7+Pw8NDXLlyJVvyzzHHHA8+ZsA1xwOL+9IstpSMGRS/b5aSzTHHuaPED0y4sLOLb3/zm/j5z97EO2+/j48//DV+8vo/4Fu7F7F78TmEaMWAgaFF9zQ1/PiEsYl9KF3UIo8sr8xHIwwvcXDtPfzi9e/iH/7+r3Hwm7fwuxdr/NtvfwN/8s0/wMtXLoGWJzBbCwz9gCEwuv7/Z+/NYiW77vPe33+tPVTVGfv06W72wLE5STJJzZJlS4oI27KufW1kgGHYBgzDBmIYyGPeHAhBkLcgQBLAzgAHeQqc4Pra10AGIxqiSLIkSpQskaI4NIfm0E32ePpMNey91roPa9i76lRPZDdJN/cHnK7qGnbtqXatb33f//tXiKkxlR+AlWXpB8daJ1uhMYbxaJSK7PM8J8vzYNm9Psgc29bsNUFFb6KL3rY5SqHUYSAuSX0SYuhGvI22s1bEfFCvJAtqVp77mp5MY7VXwVyWQa69L1NpJCuaOPpoSVTW14WJQsfPItQFOZ/y2C5XnTqoV9xB17tH3zraZCvVQIY/sZ50JWWrqnFVW+UyuCuQrfQZIkwmE7a2tlI/KK01i4uLDAYDf761LKgi4tMLaRHWqB4qf2xcnuPKHpS+3xa9Xkvhyn3j4yL3TbSVeDvuu476vr3o9Xrs37+f7e1tAJaXl0P9XIcOHd5OdN+6WxTz055mzE8tMuRtBTQDhPZr24EX82YzL/OjO3fmc0b9Sj+q7eCD+LEtO6JrDdqmSl3mfnKHDtcICfUmgNYZDz7wIJ/4+Me5dPFLXLq0w7NPPc7yyirvf+iTlIuHweWY+DWILjPbqB3xFG5/VdxlxnzNa6X1mE9ejOVBKizH2tDxSvvXKAxid7nw+gs88d3/zY++/SV2L7zCXQdW+JWPfoRHP/hBDq0uI+MxWVEgLqcs+ziEylrseIyrDUopP/hKqR+ezEQLmDEmEa74l2UZeZ57O2Z432wCXXu7rG1fQvZOwAj4+tG0E1o7p81YxLRG4tH+qNL/0w5rWQCdhDj4mH6oNEoXQfXyJMxl2pOtPPeDeq0h74WAjjzZEJ0SJMtRWoegjZDmopU/YG1LZnQeupltiCfHO4R0ibcu1eV5Z6zzZMfa0OjYJxC62t+Pj7u6pmk6vvdYNwdIMLVhZ2eHnZ2d9LrBYMDi4qI/56xL3DppoDFsRSSEsyifLhjIli1yKHu4fon0ez7yvTfwKle0GYZjGNsONMLx3vqm9wJEhH379uGcYzAYsLKyklILY0Jkhw4dbj46wvVewbv1oipN0tvsOiYLYesv1XB16HAD0JxKvsh/0B/w6Gc/w/bGBl//xl+zuXORH333q5jJhAcf+hSL+47iKEK+gsXikoITJy3e+lctkjeLdZ5oZUoQDJWrKZRha+MMJ37yfZ783jc4deJHlPUmH3vwOF/47Kf4xB13sL8o0DZEDYjQTt1TWsjLEina+yFMehhDXdcMh0Pquk7JZnVdMxqNABLhivVfRVFQFMWeGjC/DdGmeIWdEknJlfabhAF+jK2MShgO36TZNMuKUfXB/ueDMUxjRdSVJ0yZTy5UOsNmGpdnqEz7GrF8gtIZknkShvaJiOQ5kuWhKfZshL1qFLVYYxp3R9wvkai8k6RrKtWz5YEMUfAYg0T7YF2F+HevbInxzcITJ96zGf5qbo1hd3fEzs5OIu29Xo+FhYVUu5U+m9AmgBAQIz5B0wmIVr4Wq4hx7zn0+0gIyZA8PJ6XPpky1Oq1J/TmKazvNSwsLFCW5ZSy1YVmdOjw9qIjXB3eFWjsIw18A+NoH2JPBHz3Q9HhrSCN71uR8koU+9f28X994fNoHN/45jfZ2jrHj3/wf9javMj7PvRJDh49DpRgBS0ah7pxGRnE2iUfyS4YsCakuNVMRuc4dfp5/uZ73+b5n/yIavMshxZLPvuRz/ILP/PTHF3bxz5qZDyC2qLKXtO81jnAolwTZtDsAh+YoJQiLwpWVlZYGAwS0ZpMJtR1DcBkMkn1X1rrZFGaDchpev7Y9Bnt2/TZ0Yp3tb3YHji3BZWkqjioLU5i7LsFFE4sEtQuANFVsB9qT6K0RmmFDTH0ojTocVBLAuEKygl55u2HOm9shzExMcbYZxLIWLvWLKz0lOIl7wwPcO2PDfsthmBYi1SVV7KiohUbHKcY+Kt/hDGG8Xic6rbyPGd5eTmFs1hrkahSth0USaVUKO1r6UyRI0XuwzDKEukPoOz7+q08Rr97JdJlnrxFa+LeEI73HowxaK2nvu9VVTEajSjLkqIout/SDh3eBnSEq8O7A7FIfvaxGJihmsf8jTRelA4d3jRcY7Gy4KwfnBxaX+fnHv0sg1zzre88xqmzZ3n+ucc4e+k17rn/g9xx/CH27TuKzgY3NJSwvV64GudqcBUXNy7wyssv8uIL3+WVkz/mjVOvsLbQ4+MffT8/88GH+dTDD3Ogv0BmHTLeClYtg6tqnHGovPC9lEKynMxawqDVj4pkHyTYkOq6TkTLGJP6KWmtyfN8yiooIimKGkApQWvffDWqYNOky0ssTq68F5um2VEtasvfhFh9l8SyRjknBIsb/6A1nhBJlSLkRWu01D4FUUL6ofYEizxrbIXBtuayHMn7iM6Q3P/fp+hlYPzynNJY5e2HMe6+2ZgW63k7B7vzdnF4zFqLMj4sw5oaKoOra5ypUXWdUgqvRcLNAsEqiiIlEpZliQpWNiBcv6MS6K/1Wvv0Scl87ZwJzYylLJGyhyr8rU8q7HnCFW2fSrW+i46Z1P73LLIsS5MjxhguXLjAhQsX2N7e5vDhwxw5cuSdXsUOHd4T6AhXh3cPZgceyc8P3n8fBlLtWdEOHa4HU6WJsTG3n92XYKlyxqeyHdy3ys//nU+z2i/49vcf5+mXTnLm5CZnXz/Nq6+8wrHbH+To7feyb/0IKuv5wToSlJSQJOgiGZiuPXRz7gku9MKrcbaimuxw/swpXjv5AidfOsErJ19gZ/NFFgeWT37kfXzqIx/hk488wu3rB+gZB2MDkwpMGQIjJjgqXwNjahIxwYAzrZWKA18/XHXO4rR4hUyELNRr5WXJAmDqmqqqqOsarRWDwYIPPAjWMQeMx2M2NjbSa7JMp9n0VP9FY2ey/j/NLpktCQIczb6EaEVuyJfgmtQ7CcehuYA0FjblySxIqE2yjeVQJJAu8eSp1lBlocmyhiIQLp1BUYPW6LzwdUOZD+CQLMTQ69wTsdgrLJGuZl83F7Urnaw34VonhJ0ebZkm7QsXiJWzNc5YJCQTYs1Ur8bLL9grxWWZJTIe63EbG1uogbNN3aC3EGZIFuyemUaVvseWKntI2UdK39SY3Dc69mTL19CllniuOUcav2Tb3/nexc7ODi+99BKj0YiqqsiyjAMHDqSI+A4dOtw8iOsqJm9ZTAViXMNRnvoxbc9C7l3w3ELbRnXa+9ysnWhercf0csCKTrbCy/nNOytEh/loDbSmotVbLxELrvID7pDAZseTkM5W4Yxv/jra3ebkK6/xgyef4qnnXuC1cxtsW6C3wMrBQ+w/dJz1g3exfvgI/aUV8t4AYxW5KilUgTiFxWFxOBFcvB8sXITBrLPbbG2d4eL5s5w99QpvvPYyF8+c4vyZUyhbc2D/Pu67/04e+eAH+PAjH+TooYMslD3fF2kywY4n2GqCHo+QaoKbVLhxhdQ1UlVQWW8tNBW4Idja1z8Z5YmF8/vEZJaRdvSsQ4fveluVSMTRgXLTNkLwlsPNzU12d3e9DdGZ1OsnKmJZlpFlGUVRoLWmLAu0zrDW+ICQYDtzzqKUntsraE/zdOfIZO/6XPVMidekSIaUeJVFQt2W9tZAl7XthxqT9ZAsR2d5Ct2QItgMtYK8wOgcUTmSNc2ZY8Nm/yfY8LFxp8ZuGM1F2/dda2996+VzHrzSxtJMMmADyXL+nB9PYDLGDbexu7vIcITb3kGNhshkjJuMsdXEN8AOzkIlgo3NspXCmJosy7GmRmlfp2WtRVSGczJDuBw2LEgkWDmL0icRFr6Xlgm1WqookaJAyr4nWnkJeeHJbMaergzd78I04jGqqoqnn36a8+fPp+/j+9//ftbX19/hNezQ4dZHp3B1eFcg2oxSlDyEiWCZek2HDteGFtFKCIpODFxwNdjaz+hXNVIbVDXxMdiTCa6qUXXFQg0PHjrC4YV9PHLXfTz94kmeOHGCM5tbbJ58nmdfeIHnikWKxUUGq2ssrq6xtv8Qy8trrCysUBYlOtierEBlDZWpGY9HbF3aZHNjg4tnz3Lh4mtsb59lc+Mith6RK1goct7/4B186JEP8LGPfoQ777qL5RVv1aKqvCqnvFolAioLgQ2Zt8SJ1l71Usq/TimoFa422CzDonEGtBK08YkTIo48GvhiP7BovYSrTt5orVlYWKAoCuq6ZjzaTcEb0ZoYrYVKKRYXF4MSYolKNsSJFl970u4XNFt71hzyN3d9SMuLNj/rwOItjs7irE/Mc7WAFmxouGwzE/p5NTVennB5S2Gyvek81X5JTEHMdIqtl0wnlUdEkQJOkuoo88nWnv9cO5Ko5vw2+tosB7HxsfWPSXzOWsQ11YpxAO9aFtFxqPXzhFoH4iiIFRyBOLeSAl04vijxKqzOfCPjokT6vreW9Po+JKMofD1d2Wvq6vKw31Q3Z3wltNMIi6Lg4MGD7OzskGUZt912G0tLS+/0Knbo8J5Ap3DdwvjbpHBNLSN8rm3VlFz19R06tOBwTZmMaw8u8T2ErEW52qs9de1JSW1gNIbKz/bbSY2YCqkq7KTy5Sui2JmMeePCBV47e5ZX3nid1y9e4Oz2Jhe3ttmpa2rxYQtZ1vex4k5QOgOVUWGZmJrKGowz2NqAddSTCXnhWFgoWV1d4sih2zh27DDH776Lu+64g/X9aywsLKCywkdlh8GwWJcivP22WKjCNkwq3GSCTGoIBNJNJri6xpiasbMMsVgHvRr6tSWvK5SrcZgUGc7Md/daYa31KpWt99SAWWsT8dq/fz+9Xg8gKVvGGCaTCdbapIhdLgWx/Zh+C79me7cvKu2eaLkUOS80TZZDrZf2ARySFw3ZzUtc3oc8Q+VFqAfLQwx9HsI2NFY3tjtfR8e0ze5GXuNiPZtzCDY0NrZhkqHyYSu7O9jhDrI7xu3sIMMhUo1b6qjDGE+44vEajUZsb28zGo18kMriAouDBVSW+89Vmf/waCVEcNEGqJUPICkKXFn6mq1BH+mXuLKH9HpezdKZTyTUGWRFsBLOPy+734UG8TsSJy0mkwk7Ozv0er2p712HDh1uLjqFq8O7Bm2y5UM0pKnZolHBOnS4GlyyTqVH/NnUmrF31SSREzepkEC0PEEJQQHVxKcEolBYqCcoLEsH1rh9bZlH7rmdrdE2F7Y2OLdxiXObm5zf2ubS7pCdScXuaEhV1dQTn1aeKxjkGdLLKPsDlhaXWFlaYd/aPlb3LbN+YI2jR4+yvr4/qURFXiIS2haJwqEQLTgrgEHyDLT11sDcN+clq5K1zeXGD/CrCTbX2MpQG8f2ZMLFeozRjoVMsVIZFsVR1oHIpWIYP4kSyevUfr7MTE57YkWHGPl+v5/IVKwBU0qlxsveQugtaMPhkK2tLeq6TvHzZVlOWRLbARzJdvwWrw8ukEwVemw5B0oczkWiRbg+GUQMaGkaLGtBVVXTMDmvsLoK0eXeIufyHJeH5suF9mmHyvpltNMOVSB4XKHE6wZwinbDY9euZYwqV0wmjI/F9WnZvKuqYmtri52dnWTvVLQaT8d3tcmWktATLUS5FyWu9KqWLQtUvw+9EtfzpEuFhtTkGQRVLIU+drgiZpXhsiwpy7I5Vh3Z6tDhbUFHuG5hvCVy0rbZzD4+L1Gw+dDLLO7yNVvznk/pzzM/Ft3MZYdrgaR/fSKft0bFaOs6KEETZDzBVRNkXAdlK6hDlYG68gpHSPfzA/qKTGBne5PKVOSZ5mCv4OjSUezRYwyrmqEx7NaGoTFMrMWivFqb+Xhr3euRDXoU/QUGCwMG/QUWl5YoBn1Ee/VEKU3rSxAsti6OeZuGvhLSD6zy8o4LA1udgar9IL42kFW4KsNlOa6uqSawWVkuqQqjoca/PFdCobXfX4rGguna910cdQdBu6Wkt64PjVXPpPsxqTDLsilFvG17quua8Xic+oCNx+NEwuJ7i6JIBCwm4MXlzFPap+u0mFLp99iWhfTeGFUvLqRYhuMBLjS9VoiqccH66HQd1EwFVY1SBvIJVDk2zzzpyjIoC6TKkKyE3IVgk1DjlTtvNQzJe1NMN9V3vfXrYNp+wMZ9BzjrsMb62kDXImAOT8ha9lJjfHPjqEZmWcbi4iL9wYJX/mJfLuf3jkeXEQAAIABJREFUfSRaohSifdCI77Hl1S0GfSgK6JdezerFJMKsSYFs1RHG49FRhqtjXg2kc47hcMjOzk5KlYR2S4cOHTrcKHSE6xbFVKE7s1UAl3vTdXxA++J9HcTuqoTpKpahDh2uBhc6sioLMYHQk60QbR2aucp47IMCgv2OKqhcKQLb4LSjVgaF9XwGw2Q8Yme4xWgyQmnNQtanv5CjioJSF6z2MqxS1KGPELlGlX1Ur4/0CihKVLBJ+ca6eZj9p/lryxrhviCoqVn9YG1zIMorEk7wCXmicaJ9jY223oJVV0heIbVht9piB0uV5dRiyIyhDgl7rqqCgmaS6pGSHEO/LqE99m9Upjhob+OKQTczYTmReA0GA8qypKqqKfIV1bFIvrTWLC0tpT5DudINKYyK+Azx8qVFe6+I0+u5t99U6Mnb1ABGFTAkJDpRPnbf+JAIaodooM68Mppl2LHG5RqZ5EhZQjaBvA5EK9gM65B6qEPaYbRWp/NDptStVFvHVRDttC2SrER5lTJYzpwxKIJiqH1ao1OBYjkLuPDx/vXb29tcunQJESHLMgaDAUtLS6g8a+yLSrDK2zJjDL/Oc6zOvcWyLIJ9sIR+DxeshaoocXmBDcqf6IakJ/fDtWx3hynEY19VFadOneL1119nMplwxx13cOzYsTQp0qFDhxuLjnB1eFdgTwPM7me0w5tAssk4fOy1cV7RikQr/Ll6ght5hUtqg6urhmhZ68MSxGKdQcQiCpyxVPWE4Xjsa1iURmU5ea/vbWMoX/dUGbQOQ0INEpoj4wTlJMRRSEipCxF1s6PHWcHXj+u96DT1dCtoQYl/kdagHKKMV0kCeZQwiNfGYja3ccrhnAFboyXEtmcaMxziCvHkM9S7YbzN0FnrzZnWomgISJt0vRlEdUtEUnS8MSZZDJ1z7O7uTtkRTYihjzHzSqlke4sqmXMu9RRT2ocsuGApjefLbBPoqZ2+5wRrnnPW+h1gJREWrPPkV/AhIMp4ZabWIeUw84mFkxwmk6B6Vp5057lXd4y3gEqegQvqjsqa+jG/4p7QqPb5cA37XppQEpxXqMQYfywDsTI+QxNxFmsNGUEwxKGUP0mttezu7rK1tZX2Y6/XY2VlhbLX8/V7QYF1yqc6SuZ7k6kswxU5ZCWuKJB+Dxn0UWWB6/XQWeFr3rLMT0ho3xttth1I9wvx5hDP9dFoxJkzZ9jZ2UFrzblz5zh48GBSjjt06HBj0RGuDu8I9loIZwhXnOXv0OEaMBXKEuxfYkhx75jaF/1XPtraVhVqMoGJJ1m+15DFGuPJFhaffW3RziIOzGTCeGfIeDjCOSjLPr3BgLwoQ01Jq+ZJrK8DUoCEQbh2PlFNgdPgxHgrWhigt4MVVevkT7a28Ezs7dUoYNFCp5Aow9jQ80k0KOv9glKjReGMYf+hdRhk5NvbbG9vM9AFywuLZM5HdddWUQQ1zBmLrU3qU4YyYAJJdJbQ0Ck48d7al7adUtqOfQffjDlaDuOf1joV/seGzsYYhsMhm5ub1HXt6+Ba/b+KoiAmJMKca1GqXbvytphE1Jpc9xj6J1hEHGJNIP4KV7cIV208oc0qbFUjeY6UBc6UvkWAycGWPrZdGyRzSR0ikJ6225NWuuPlMW2j9D3jhLqqcJMKO55Qj4a40RA73EWPJ2hrMHVFZg2ez3qFsK4qdnZ2GI/HiAhlWbK4uEhRlv6jUvS98turfKCIaI0qvBpM0cMWPaRXJguh6vU8udR5IJnhve3JiHmHpWNf1wXnHP1+n5WVFXZ2dlKIzWg0YjAYvNOr16HDLYmOcHV4ZzBjiwmeqUbd6n5AO1wB82xULli9HBblZMZK6AmXq711kMkk2AiDimMMzpmg4NhQpeL7UCnrrVj1pGYymiAWMp1T5D16RR+dC8YZdLA64Qj2KRoSJg6nCGEInnT55LugpBE5V6h5Sf+PUl3cyFaD0j0DT8/YXKytUoJYFchgsHMZg1hDv1DcNihYXl1l8+IGfadYzHJPQnOFNWPcZAKVwRmDaIOrrVfNxODEeGJrKi+z4JrVnJf2N/foTR87TxgE52xwBMZqIUkqmlIarTPy3CT74RRhUorJaMRwOPSkzBjq3V12h0Nf76V1Ct4oy3JK/WrP8TjZa8NuC14uTQ5BDIKISqVAiJSPNjzxt1aFIAoVFFffQNlVlVe2bI2rDa6usUWO1JXvPZUXvqZOa3A+ERE0ooOySVgHN3PdbO9mAVMbhrs77I522d7eYbS7w8b5C1w8e46ti5fY3dpivL2NHQ9x4xE9BwOBpSxjud9jud9jYVBSisKOK6rJGFUWKGCwtMjC0pKvPXQ2KFMxTMQ3M47R7lLmUOTQ66N6C+G+j4MnyxuyJoIo4fLutkiKO0fE9cI5R5ZlrK2tcenSJRYWFjh06FCKiO+s/B063Hh0hOsWRLRVTfer8f77NuYGVaQRx2Vmd68UF38dMC3vlLTIl7T+v4eTdeiAH9dPjyUdOK9M2dBI2EXVqq6xoTbLTSa+AfBkEsiXt1P5QbCPZ/fD7lgH5Ad+ztYMxxN2x2PGDlCKssjo9XsUucbhyZq1oFQeLH7BOigZSAFSIFKAKiA0gW2iB5znX2gkmQYvg8t+75oasMBb/K2WMCbX4ARrtd9f1RgtigXJWDhYInUISahqXF0hpsYUQ6T2cfKE2jZlLFIbqP0+tk57Fcd50irWoWL/Jp9ogDUqrRO4MK8St9Gm26i+2MhaWuEIIIhplCSl947CPTW1qEzTWxig8ozJZOLthzFqflxjnUUHopbneag7WqYsC0ywL6qQqDfdkH36ODSx+fHTmyTHuHnWeSLqr2kWpcQf49r3RBOl0Xnpm1LXNZJVvqZpopGyQEwPTO5JWlZA0QdbYk2GKgrETHzQSruxcMwFsZbaGC5euMj5C+c5/drLvHDiGZ579jleOvkKr556ndHumMnEhOBOR1UbnAhKHBmQiSVzjl6myLSwb2WZu9b3c/faPo4c3M/a0gKHlpfZv7qM1YIzNVlReP4dVCqVl2Qh7t2WGaZXhFrGARQLqCxD8tg8OiQ0xlqteQFN0r7T/UJcL9o22n379jEYDFLyZ3w+WnmjCtylGXbo8NbREa4O7wySmsX0b2b3G9rhKmjPC0ioNQHCANjXHDlThQTCGhfIlaqqRBTEWG/XChbEy/aps46qrhlPJn4wim8eOlhYSAMUTyba1jLxdSdKhUG1b5QrKgYgBLsfjVXK53w0kxA3fIcB40lFVVX0+z2yIofQ7NgZBcoHYZDnZHXum0HXCuoCG/t51TViTCJcGIM2VajxqhFlUr0YViW/W0NUbHJcAv558Y/7XRhCM6I9j7aq5AItvcqmKkVRluRFMWU/rKoq1X6Nx+PUCwwR8qJAaeXtci1L43B3d6oGLG5Isq227HnX0rJCAGd9lZTvoSY4sTjrkFqDLbCZwZkal2dQ12hjkKrAliWSKZytfS1epnDUTdNgZ70K6RyTSc3p02/w7LMn+MnTz/Dccyd4+tlnOXdug51RRV07lM4YLCyzsLbM8sISZTmgKEpUlvvz1lpMNaaajJjs7rC7s8mlrU3euLDLiTMv07fPUggc3rfMg3cd5cHbb+cDx+/iztsOsVRkKJ2j8h5K50jRw6kMWVxEFxmuVyBljit6oHsQatvIVCDZzWzbrGjX4a2jfa7GlgttQhWJVvt87shWhw5vHR3h6vCOoF0APVur0aHD1RCH5BICLsR6O2BsAiyVgapGqhpVBUVmUiOm9s/VxtsNYwLfZRCfieEMeZ5PNQz1CYEN2ZJg3XPiU9W8pSpEuIeUNgl2KSeCoMP7bt6ARkQwxnDmzBnOnDnDwQMHWFtdZtDvo7QgtYJC/D7RFjLl1a7agcl8yEGeBaJVQ22w1QRqg641YqxXElUdgjpi/H4IkZBIbKW1r4MMFIlmsCUmqhWfnlGVZjF7zXDWTv0/y7IUGx9n7qPqVdd16g/Wruey1rK1tcXm5mYiXEVRkIV+YrEW7M20qtgTod+suL+1vibOWa+8OudwtQOrfcNkV2OKyqtZ2vcu0wIWw/b2RU48/yI//NGTfPux7/Ps8yd59dQbVAaKss/y2jHufuA+Dh85xuq+dZaWlynKPoPBEmVvgNYZOs/9uescpp5QjYZUkyHj4ZDx7jbnzp7h7Bsvce715zl3+jWe2DzP048/w4GnX+TOHz3JQ/ffzcc++DDvO34vi2VOUfTIyh7SH/jmxXnh0xmLPDSJLkIYSLS+EhQufzZ0w/ybg0i62t+fyWTC1tYWGxsbrK2tsbq6ek0TCR06dLg2dISrwzuC2abGHTpcD7xlzQWyZaHy9kBbV7g6BGRMKqTyCYQSHpM6WA2NJwM+7jra3GSPmy/azkQpbEjNS8pWTKZz+KGhCKm5q1JYaTV/1RoR3QQJKOVJlgSLWUwuvEkYDodcvHiRzc1Ntre3Obe0wMED+zm4fsD33onERztvX3POEy6b+TqiFKlvQnx+0bIaBnIbFDCMVxFj3zOxdSBfvu4rJgQ28Xph8sW1tUv2KI8+Ra/99N6BYHvyZm7DdOfIFxaw1qbQDa01xpj0vqqqGI1GjMdjwMdn7+7upp5fkXCVZTn1/2tSuVrr519rEdMios74wA2jkwortYNaoIgNiC3OWawyOK04v3GBZ144wbe+912+893v8+Nnnmdza8JgeT+H7niIO+66jzvvPs7i6lH6K8dYWl6lKHqB9IdG2uJjWkJHBRSCUi4QvholoJVw93jEzugiG5dOcfHM65x++XlefvoJLrxxklMnz/DUG2d5/OXX+JkPPcJnPvox7r/vPnTZ90Sr6AXSFXprZZnvBE449C0bqWurnFfcox2uF+2SgzjRMBwOeemll7h48WJqwRAbr7/VBNIOHTp4iOumL245zM5cedi9peszr1Hzit5nL7JXem7ea2YRrSJhln/+S7oLe4fLw6fR2WbwbjwJoK5xVY2tK/R4Emq1/P8xtSdbscYr2gn9Ar2aMmstjP2WhGQ9jAPAtu0mBmwIkiK8XZZh8wJVlkhZQNlDen0oc8gz3wQ39wEBIj6C+Wad9s45XnvtNZ5//nnAR4EjjkOHDnD8nuNerWsrfeG+M3VSDiORwoQI/ar2PZvGJhEuH63f9DtzIR1SmUkgX6aprwvKZPxMZ1tkKzbZjfs0bsecnTR9DYshFXufn3dNmUrsaw0o67pOCXzGmGRJjIivi02YV1ZWkko2S7ray22HfKRrtPPkBu0Jj1XK997SIWwi177/VF7682Wxjy1L6rxgojNePH2aL//vr/G//s+3eOrF0+yODQdvu4N7H3yYn3rkYxw4dCcLy+v0FpZxlFgpfXJ+LJAV3zlBhbmC2FosnujifKp9/ArgwGmLlQpchRlus33+dZ76wV9z4qnv8coLTzHevcDh5T6feOj9/L1f/RU+9KEPsry2Bmi/HTqEY2SB4DdHHkTaETFE7bjDjcXsebmzs8NTTz3F7u4uAL1ejwcffJDV1dWObHXocIPQKVzvEVzb5dIxO8N/5ZdfZ4BGq0YlKlzTT3cX9Q5XhnNuerAeVZdJ7XtsVYEMtJoYq9o0/aQC0ZIrnOrtZrnSqjV01k4Ntv3zYQIhRLMLyjeKDUqW08o3s80ynFK+0axqFC2HNKVMN+n0H4/HXLhwAWNMUnSUEg6sH6IoevhSplZYhw61U0rh+3S5oFiF/WdyXBFsg3m4jYQr9HVytWkIWzUCU6XHsAZlwjE0fiLIGRNshC40WKZFiP0xcKaGmYHiNPbuwCtdU9rPte9nWcby8nJSway1U/Vf0ZIYEfdpe31in7C4vLYCNq0uRJLvcM760BZT+2VZi7IZMIFsBEVObXao+gNe29rha4//Df/jq1/nx08/z1AW2X/Hwzz6kU9w/wMPcejoXahsALqP6JLKy0ZkIcEyCLs48YOASKZ0u+YuXt6DvTOKUNYpoERsQVb0GRxa4cjn7+KRRz7JT558jL/5/l/zynM/4svffZKT5zf5e7+6wS//8hfYf/AgSA6ifZiLkOrlLncUO7J1czB77vf7fdbX13nhhReSamuMSefwnjTQDh06XDc6wtWhhZtYoZwCMoRrJmgdOrTQqAK+ZgtjU01RVLhi3ZZUjaKSVJWY1GmjErL3fHf4Woa68mEQWaYpihAbHs/dPQN91TCm0PtKtMZpbyV0WoU6rtBHSQIZwwdnhHfeNP9UURTcfvvtlGXJ+fPnmUwm7Nu3n9WVVcAP/K21U3VkvnZK4ZxGlPXKnY2kKwvKF7jchhouA6aC2gdoxCbSzhhcpcHUvsdZ7SP6Y3BJJHLKVF5Vs+H4WOf7fqUkwPlEa+8g8Oo78FpNHUqpZKnqhWa+cRBqjGE0Gvlm0UWRXi8i1HXNcDhkN4RuZFk2VQMWX+dJF4gORMyaxltnLGK1nyhQGoujxjHWwmPf+z7/81vf439//wnObtccOHofn/jw3+Hehz/L0dvvoigGOJWDyjFOYQKx0uIJbVRxXThnXXTShpNQOZf2oq8znD4xxUEWlDkRjdJ9bJVx4PADDFb2c/D2e/n6l/6CV5/7IU+ceIXN//JnmFzxf//SF1g/dFvTqm6vg7fLTHqHICIcOHCA0WjE6uoqy8vLDAaDqZTCDh06vDV0hKtDg5kSihu3XJkhXDfhMzrcstjT1Ng5H+AQlBWCskJI0HN1eKyucck+aEN8vAtdrizthrURJgyWJ6MRgCdbSiiUas7jmcGHJHlKhYQ1hWgdlK1WeEZIKJTQZygOa+UmEa1m/YTV1VUWFxdZX1/n3LlzHDxwkDzLPcEJSsNUGwliPU/wmvl0EBw1ErfBOVwgC17ZysNxsL5mLjacrlVSvqhrpK5wVbQcxtRIlWq+MC4FbrT/RElQJ10Kx7iZhCsuv61qRhIWG8e2Z/5jlPZkMkmEq/3eWAMWmy/neY7OFDoXMp3hxOFsjVLa72NnIeySiS65uDvmK9/4Nv/jO9/lRy+/wahc5X2f+iSPfPQzHH/gwxSDgyjt+1/VtQunqcVOqbSt45tK51wKJxHxkxHJXRoVsdZ+Vs6gnUPIIDoVdI6RjN7yYe79qX30+iXf+nKfp370GC+++jr/5f/5c1ZWl/n85z/PwuIyuDmR7/MOS/db8bZARFhYWODuu++m1+slNbYdDd+hQ4e3ho5wvWdwDWxqnvL0Jme22uliMfo6TWt2P6IdrhfJ5hdCMkItlo0x5VVo0ltNsJVXUaSV9IZrAjKgKcqXqY9wjCbeMmasJcu9IpHluVd4WjVHs5BwbjsRnAKJipbKkFZEfGpCHD/Z3WS21YJSin379rG8vEymszTgddb6db0MHCBKEKdAshC/H4JGnITD4hUr3+DXNtZCUyMmaxEuA3XlAzdq07Ih6lD7Zaf/bLh1rrn1Dc8Qa2lXAHmbaGQOrn0zhb125r0vUsH26ZzFWhe4tiJW7CFCludTg9J4idNZRn/QT8rhpJpQV95iOJlMgrIVmjhnisFSn4XQZkC8bkRUnsBRiePVS5t884dP8Kd/9SVe3BiSHTjGR3/m83zkM7/A+uF7QHqIFNS18xZR3di9tbNYZ7FWIZK16qUIAmvzWclVLu0XhecTKyPUUFosvv7Q4tUwVI51jjvvfYhCLKPxmOee+h4vnnyVP/vz/5c77jjKhz70UbK8j7UOpefIXLOH5Zq+Hlf6nep+cK4V/X4/qN3NJIIxpiNdHTrcAHSE670C1xrkpcemf6Ss2MS50jBQTVtJ9nSdhVBp3Vqs1qF/ShiExs9qz6J3vKvDZRDVFYn2P0wa5NsQfkFV+f5QdYXUNiTn+UG8CrY1nPE9jsK556wLg20/cFZRMVEKYwzD8Yjd8QirgEyjy4KyP0DpLJzzMT3AzqxxUL+UQjLteyhpjS5yrNY+4VDrcD+oFwQ1IRbU3MCJiKjgmFaqYlupif+PkDlNhGdEjfBgVPFaRCZa1JSCjNADrcbpDBd6oinrmyPbqEKaXrCDGmzo52UmQ29TjMTMGKSKjam9fVEsnkCnx0KD5aBgOgfG2UAIfLBKDEcR1wwihTy458JxTEJno/RgxaswqKaRsHMh2d4XPLnITJRuBT0IOi9YzAsWlwxV5e2p48mYuqqp6gpT+8exNaXuoaREqwJjYh8wqEKzZlGaN8ZD/vx7f81//z+P89JFx/o9H+Njj/4qD3/8swyW1hDRXqnER8RHG6ZKnj3lgzmUP9fCUBpakSTxDFBOUE7PnAvTpEjQTWPiwNASbzIOLRmOPrfd+Qg//RnL1uaY0ye/z09+8jT//b//fxw9epgjR477Qfy18KSrzfmJv0bMf3OEmp4FvNLnvQfRvh4YYxgOh5w/f56LFy9y2223cfDgwXdw7Tp0uDXQEa4OU3Az96cUgGsZE4Yf3jgWmSJwnUG/w1WQrGwE6yC2UVRi0l2s26prqLxtLSomyV44R4mSlh2wHRkeQxEmk4mf0bXW99rq91FzyMhlofBKVrtuS4tXuZQOUfBy0wtVbLDbnT59mq2tLQ4dOsTS0pJv3ss8G971I4kdM7tZlELIcKqpt1OIt3QmxcoHn7jaomqDswYp80CubOsYR1ui8fVclX9eAumKiZPpz4FyIabfNRH0Ep5L8k2Kn5dgUQ3PERVMQZzGRZUsbRxJ2fOvap6f64ZTin6/jytLFkwPY2yqAxuPx76HVp7TH/TRSqNsjRLBKcXWeJczly6xWxu++qMf8j9/+ENevTDi2P2f4Gd+8e9x/KGfZmF1nXHlAsniKufUPPbSvCkex3mn5vzFtpYnM69zoRlzNuD4/T/Fxz7xs/yvs8+zvXuJb33nMT720Z/m0KG70Fr59mtXgruGr4qXYK/2qo5vXQHtJMLJZMIzzzzD1tZWap2wb9++VKvYoUOHN4eOcHW4fsyd+e7Q4QYgDYw90RLrUv8mH8DgI8iZ+D5bVFUKz/AhDNa/Z85ITWZVJOewzqa+SzF5LjY3LssSlWYPWm+bOd9js2OUj/AmhGX4+76mRjJf/0P8m8UN/Aoppbh06RKvv/46ly5dYnNzk5WVFY4cOcLS0lKzzjcC85Q5USHVzgEarPLHU4KlU4eGyNpCHlInbdFEx5sWsU5x8tYf72A19KEdkaD5EA5nHSr2qbKG1KMtplpONbl26VyTJNsrPOkCZDqSHvz2REuhNObF8NycXeMAK4gTRHJU69e2V/Q8Ic00NlO4mNyooBqP2di8xKW64us//CFf/psnOLVjWTl6H5/5hV/lfR/6BLq/D+O8NTHT0jhu3yVwKGpjKHqL3H3v+zl49E5OvXyWM+c2eOLHT/OzP/sLLK3mmKsQRcXVt+ty/fOm1wdmdemp1195NW55tBM024mbSik2NjbY3d3tCFeHDm8RHeHqcH2YN53bEa4ONwyhRodW/HsIUJC6Dg2M69DUONw3FhWCFsQ1DGnuOK1VqB/rb2LUt3/aF4+XZZmWsXd+YWYwJ96u5VMIVSJc/s/Hwku8r6YJSlJ+byCMMZw9e5bhcEhRFAyHQ8bjMWVZMhgMUkT5DcHsclKriPQPLlgyRYXnYhCGDizBOaBuiFJIMGz37sI631fN2anGys74kBQbSJmOgRvGNOpWIl1hOXXTNLs53yLp0oHv22Yz0raFcyeqYPMKxKZ3DiGxIu0nZ4yv4ZLMUzelMYSQCiWJFGb9ASffeIlvPvsML22PYeVuPvrZX+J9H/4UeX8FqwtwgWxZEw7FNJGf2xh6lphcZQveLIwFnedgNQeP3MHd976f06eeYjje4MSJF7h44RJLS8spj+VyuCYO6UBm5avZOY2rbKjbc+cyuMV/6pRS5HnOgQMH2N3dRSnF8vJyV8PVocMNQEe43sOYNwt4bW+88v8lFGhdrs9Nhw5XgkCyEWJdqvdxdd3Ev9chgCEoHs7GZrqxvsY1ekQKymjqConpa6H0Iw4o8jynKIpWU2NmVLHwT/t81hJshNo3rc0alcvlmSdbSvYqW60EuKs6wq4Dw+GQjY0NRqMR/X4fgLIsWVpaIsuytxTxvOd7PNdLJ1P3Z/s6JW4TI98Biw/jiH2/YmKhWOOL+K1DenUiZBgzdT89VpnmnLG+h5YY01quRQVynZRTZ1MIRGxGHNMw4/+bvmDN83ObubVTLBMJaF0HdZZeI87zMYtDq9B1WBxSlNTW8e2f/ITnzm8w7O/noY9+jg9+6hfIB+vULg+NopvzR2RPKe384zdzzOZdyq9+rZY5PHvaqqtEUALGOrK8zx333M/3HltmNNni/NkLnD9zltuPHEUK8cf9Sp+Wau8g1mI2NsbWc+1ts7Mb59L72xMu/qcqkOFWvWf44L0rcyO/qO8itC2FIsLa2hrWWgaDAWtraykAJl4XZ5uFd+jQ4eroCFeHFi5XjXCdS5ljM+ouzB2uhhhGIMFSmBLqQr2WVDUq9NkiECwfnBCj382UcjGXWKTBsAPlk+YGgwG9Xi+tg28M7AcYe6bfW8pNanqsWmRLa59oGO77SHjfmyv6luISJQTS3GgnWK/X4/Dhwzjn2N3dBWBtbY21tbWbP0iaXfYc350Lzr32ax06EAYdrIAaySzW+uAPrCWj8I4/44lXUsGsRZkaZy12Unty1kqy9M2WW9bUycTfWpvqwGwkXDFkIwS2ONfc7mnKHAjX3vPMpdNQ9jD2aVhA6QznDM76lMuhE7734+f5wfMvc8nmHLj9fn7qw59hZf1OyPpgNDFpMcW8X4MnLjYwvtzhufKatl4jV76ex/RLa0JAiy1YXFqlP1ig2s6ZjMdceOMMVBUqJSPOIa9xu+JnhskSZ21DDFNh8JwtCWTU37e4aBMN31s/sSOkvgzta0MkznMUXMeVt/9vI9rbo5RicXGRxcVFYJqMdf24OnR48+gIV4frQqo3D9jze/ReN8N3eFOIaoIQrV+xga5NDY2palxtEBOa6lrrk/BwfkDlmLJ5pXRAdmGqAAAgAElEQVQ1ucxAIQyutdZo3SSztWd6557LcSCmhKbnVpbULck1rq10hTh4CbHxzUCQFDBzI78yWZZx5MgRVldXef311xkOhxw4cACtdQrUuGF4syuu2sdDvF0vXlskpEGKQpwKaqfFORUi6ItgFTQtYhXIU+HPH2edP49MeDycU85aXFUHsuUVNVeHOPpA8tM5Za1XPYLNT2wkXzSTAkn5IpA2krrafu7yu0+RIRhXYXVBpYU3Lm3x3edOcHpriB7s4/73fZg773kQJMfYkLYZlRqBUOm0d9mztYbsPVxvhjgk5W/OcmLKosITLgAliiLr0St67CCIqZlsbyLVOFkoJe2v6fNTIDRfJn1nVPz+xXUPEf7tyZB0P5IrEZ/a2E7KZfq7mPZQOg8JdtPWttOaMLkMCbkVyFg8xrHPXFVVDIdDyrKkLMu/lerWiRMnePLJJwFYXFzk537u597yMp999lmeeuopAJaXl3n00Uff8jI73LroCFeH68LshK2f7XuHVqbD33pMNTUOqkKM/nYx4n3qr/Kky1qsM2FwHAZFEm+DeXCP8NBYC+Oddly6C/1npgZQau/J7cL7UgBG1rISZj4oQ/I22fKx8TFsY6pdAs0gbm8b5reGhYUF7rrrLuq6piiKqf46by9mBtF7VsGhQv2Rc5IuKn6s7MmEQ2ONJ2Yoh7gsKFahbi/U/VljElmSSMJcIF/WIBZcHePkW8mXpm6Im3NYZ1pKWbQoOpQjkLmGcElQtCTJTS79ibsywRUUymqgwpWOMTXPvXCGn5w6zdBl7Nt/lHuPv5/FhWXffkwETeACcc8GcjHbXexyhGtKdNwr4FwD9loKG8JFIs5CKKWyDmsNZlIjztLLNP1cwWgX7+mN6pbbswIuECIXFt5woYZMORGsUoioRPiajQsESmmcyqYJ3NQKA+IblzetS+Z8V+L6tNZzbq3c3/Ifxbj+VVVx6dIlzp07x87ODkeOHOHQoUPJCRCxs7PDK6+8wrlz57hw4QJFUbC6usp9993H/v3736nNmMJf/MVf8I//8T8G4Pjx45w4ceItL/O//tf/yj/5J/8EgA984AOJ0HXoMA8d4boFsWfQ2KHDuxgN6SJZueLg1wWlK/Zoova1ODGhTlzonRTJVhj8evIiPto7EivAWBOa0PoI7iLPUVr7wZxSfsCeJtCvbJtCYupgsBGmvxCQoZWv71KqIVvtAV5c1g3cj1PqHN4eVBTF1ONv/7XBXVHGa+cBikRC3JbSxQ+mY0R/sMYJoe6p1ZBauaBQOU+mUlqi8eQc51A22MWCqiUtshUTDZvAFq9sOWMRE0lUIAYxbj4oNBKscQIt0lVzpY0Xp8BkKGWwJdSTIa9cuMCr585Tq4Ijx45z+PBdiGg0GUoJzsS9QlNGFp1xs8ufuX+1c61dgnal1zQkZf5nqfCnAWNrxuMhVTVGA4O8YLnfw2xvop0nXC4QrtnvXGyoHIlU09i6OZ+tEozSqPAdniVMIoLTOU7VvrWJ+IxJCapzImZK40Jj8liHvCduXgnY+P2aYzm8hewdIsLu7i4vvvgim5ubgFfP19bWKMuS06dP8+/+3b/jS1/6Eo899hhVVc1dzh133MEv/dIv8du//dt84hOfeDs3oUOHdxU6wnWLoj2w8latq/8QyJ5oJ/Y6VeYtZnYA+bd8dq/DTUQzhg5jUm8jdHGAGsIwpDJIVUFlcZMqPBasX6ZGbI0O9RRecWiGk34sFMiaCKI1zlqMcwzHY8bjMc5aH1SAUCod3wmiwqDTYUO8vIgNrWP990NUCD7QGvIMshynC8hzXJ5j8wyXZajM2w0l2A9lJjRDZm7f9C51jrquOX36NHmes7a2liKcZwnY7P23B3pmI2eUGOZdP2TmtdKIjeHWpVCKlh3UteLanY/9t9YiWeutxrTsg42qkgIysIipiI2b43nghbMQsmEt2ngCF8NVnPMKmyiV6owULtk4lRLsrP0s9qxy/vwYXTjHq2+cZ2wtutdnef9hVvYfRbnSVzeGMIhI7FTYTkH2HteZa7dMGeKaR+O2zwZfTB+PBlYk9c+K5U8irnGJOpBaKBTU1uAYcubsS9T1iBzh4NIK62UfNjYRMa212AvlAiGfsRW2b1VoKJ7ULBFUpqfVK62xOgtfcW/xtZF0KU/oUSrYDuNESkPE4rLEuNYyFE58fz1Ho+OqRLQFv6Mk9UxPh0bmbPO1/Na+zej3+/R6Pba2toBGyfo3/+bf8O///b9nNBpddRkvv/wyf/zHf8wf//Ef8+ijj/JHf/RHPPDAAzd71d8WrK+vp22555575r5mMpnwn//zfwbgV37lV1hbW3vb1q/Duwsd4erQocPbjpg5kArmg9rgjI9+t3Xta2tqgxiXrGHSSraDvcPy9jNTapJzjEcjqqrCGOPjj7OcvCh8DVaMAW9NVEzVeqTFhmWqEPuuYq+toGxlXolxwUborYQ3b+wUB8rb29ucPHkS5xyrq6scOHCA9fV1suzdeIm/nr1x5dfOpoGH4LnwVgGJg/HWC1SQ0axNqlRjaQOHRVzuLYmBkEUzqqQADYsyJi3TOZpY9yB+jEdDqrqibEXxu/h5rQ0QFXqVKc343Dm2dsdYBJ1plpZX5oaq+I9oyOW1qFdXwlXV3Kn/NyGA0+d2Y+N1ApXz3GXr0gVOvvAcbjxkpSw4fvQIPWdwwx3qKNdd/sOnFKekPE2RsAyrYihN+H7q8P0LipWJtkMl6buptMJGVSzUYzrl++U5UYgEohXsit4a7DmUSz31YjCOPwKBvnpyK+AwgAKrpgNArqD4vlvgnCPLMg4cOMDm5ib9fp/NzU1++Zd/mWeeeWbqtUVR8MlPfpJjx46xf/9+tre3eeONN/jOd77D+fPn0+u+8pWv8Mgjj/Cf/tN/4td//dff7k264fj93/99fv/3f/+Kr3n88cf5nd/5HQB+8IMfdITrPYx3469xhw4dbmE05RoxjttbBJ21Pnku9l4KKXTOhpCDZB27Pkucs7658Xg8pq5rRIQsy8iLAp1lV1Rog1ENYs0IqqnNyrKgcPmgDLIM0Tk2CyEcOvMz4TcxSUZEqOuaM2fOUFUVSinOnTvH1tYWWmvW19dv2R46c0nCzENq3mtSxoQO6hDpNile1rZOs5BM2Lr1hK0hXO3b3d1dxuMxlzY2GY13OXTgIPuWV5Llc+ZsA9FQA7qgVjmj2mJEITojL/JAKuZOKVxx/1wv4nmyNwRi5nPFEcNp/I3ySl2bRypwGnAVZ069zKmXTpBXYw6s9Ljv8CEWnYXxblN/eTlISPiMK5LqIAkBNIKj9upz6nHXIlxtEqamSRiZJ8HRhuiUBqWxSjzZUsqTYVFB9fLLlUC4ksqlav//oI45fCJiDNXx1DgWtenGOn0V3Ojj+2YgIiwvL3P//fdz9uxZPv/5z3Pu3Ln0/D333MM//af/lL/7d/8uCwsLe95vreWb3/wmX/ziF/nqV78KwHg85jd+4zcwxvCbv/mbb9u2vFP49re//U6vQod3CTrC1aFDh7cNcbxKi2xJ6KUl1sz02GpULussKvbJuVbCFQpS6qpiNBphgiKRZRllWZLn4fIXB5gzg+HpPj3SGngpXGxmnIIyYmhGmPHWWZhJj96rt7zrLoutrS0uXLiQ1llrTVmW9Hq9W97eu6eX4Ay3dOmEa0GpKVWmXUOUbIW+eGhGQm3OE+8vNOEzXHq6qiacPHOW7e1tqmqCw6J2d1k5csQrJ7Pr7xzglVEkJ1tcQvf7OKVw4hgOt1Bi8eESs0maN+7YToVNXHW5DiLJQYU6udY7nSdbVgyXzp3m6R9/n8nGOQ7kwkfuO87xA+v06gkiFquu9l1WuOTHaynWrVtP9lpEKlj+YuCGJ2eebDX2QQmqVrD6ini1WmWt/yv/WCRbSuEU2FiXqVqkTKugpvq6URtth6KCgubtjClpPpxC7V2911F4DTE6N/HrHdX+eB35whe+MEW2fuu3fos/+ZM/SfbleVBK8elPf5qvfOUr/NEf/RH/6B/9I2yw8v7e7/0eDz/8MA899NDN24h3Ab7zne+806vQ4V2CjnDdomjPUkpTiX7duJZZ5Ft9UNfhrWFqxjwNzlpKQuy3FXtuVSGNsPLJhM6a0BTXV0rMmx3eE9EcyJYxhqqqqOs6xRzneU6e535Gf07scyRgMcHQSUxJaxEu7dUtyTXkPqkwNjv2xffBhuRag8QbtC9nm44qpVhYWGA8HmOtr1laX19naWlpz2tvdext5r7Xu5WOZ3pGQruLxg6YbIdThIuZAbIOdWT+SWu9h26ntmxPanSWY23N+Z1dDlU1S0tLfoKhvY7O+nNE+VqgfHGRhX37QCvqesxwewNnhqh8JVgfBaV0sJK2t2DPZob9MfW/a9pn806VKdFLLBJMhbFmTiCpf3kmGDGMJhu8/OKPefW5JymrIXccXOaT738fBwc9tKk86WH6+uCs9aTFhQE/1u/jQAjTb1mLHPr2D426lYhWeNghId5cB7ITbL4t229DuHQ4FkGtCgpXSiXV4sNblITX+veJ9qRKtCfKToFI5kNzRIO2vkZM2aR6NTvOr7trNsmbEp26vBL2Nn2f4zXwX/yLf8Hjjz+eHv/7f//v8x/+w3+gKIrL1v7N4g/+4A8oy5Lf+73fA2A0GvEHf/AHfP3rX795G3CNsNby8ssvc/r0aYwx3HbbbRw/fvyGXDc7hatDxK3pNXmP46amkL03xm0dbjCcczjbkKZEtoyP5RZjUKZOPbaUtahQQyOhZibZD+csPw4M0g9kCDCoqorJZIK1NpGtoiiCfUqmB1zhfc1CaWLdQ72GazU2dnmGy3RqfEwWyVYkaa0o+Bv0vYmzwzGIwTnHysoKDz74IA888AD79u1jfX2d/fv3p33xXiFb89A+L2JNX9RIY9CBjf8P5Bole12gM/93Eqi/NO9zImRlwf4DB1F5gXFgRBiOx2xsbfkAdK2xSjV/IcnSaoEMltf2cdvRwxSlhnrM+VMnuXj2FKIsWgtK+7V2obl33JD534m9/5/dH1P2WTdDrFqPTy3HCYIKVMcrXNY4f/orh7UTXHWJ1174G578zpfZPv0Ct/U1H7n/OAcWBlS7O9TjMWZSYavKq9vOh25opVCi0SIh5VDIRNAi6PSpNE2cnUu9vGJipbimp9pUc+zYKsAYVG2QukbqqvmrJqhqgpqMkfEIxiNk5P8Yj2A0gtEQGQ1RwyEyHMJwiNvZgZ0d2N3B7Wwju0PU7ggZDpHdEcTXDUfY0Qg3HsFkApMKqqjmW5SJ6+hQrevdZf/gTU+kXg92d3f51//6X6f/Hz16lN/5nd/hjTfeSBNZ14rf/d3f5R/8g3+Q/v+Nb3wjWQ3b+OIXv8j6+jrr6+v84i/+4jUt+9ixY+k9f/7nf37F18bzfmtriz/8wz/kzjvv5O677+ZTn/oUn/70p7nvvvs4duwYf/iHf8hwOLzscv7lv/yX6TM//elPp8f/5E/+JD1+8uTJ9PjnPve59PjHP/7xa9quDrcOOoWrQ4cObxPC6DDGvpumB5IzvqmxqkxDwlr9jmK891VrPmYgIqlfTJZlFEVBnuf+B9deXilLa5wImQr2oSw0NdZNDZfOksLlQmCGRDWMGzsZrbVOSl1qFh1q0g4dOsTy8jLW2rn1FO8FXMvQ72qHIyqw7UAOmZGQplWd8Jjyqsr+tTVeP30aY4XeYIF9a2usre1Hh2CHqXV0fiEq80RwYXnAAw/ez/r+VcbDs1x442Vefek5lg/dT14OABVqqPZaCucRrDcDO/O92EvYBYUGF0kX6Eyw1iCqwrkxZ06d4MePfZVzJ3/CWm555J47ePCOY0g1YXNjwkTnoBR5r6Tf73tbmhIfv68aBula7gx/PJz/bs1izjrGrQi7mMRM49xK7YLSFRUvP7Hjr1Jh/6poFQyWxNr56HgVQlCibVhprKr867ROdkKiGqaDehbTE3UWlm2DChYUOtWyOIqFtp2y2RraZ9EeK+INnmD50z/90ykr4a/92q/R7/fZ2NhgbW2NpaWlNAl0LfWi/+yf/TP+7M/+LBG1f/tv/y2f+9znpl6zs7OTwjY2NjauaT3PnTvHeDwGSLeXQ5ZlnDt3js9+9rOpcfEsTp06xT//5/+cv/zLv+RrX/sa+/bt2/Oa3d3dtJ4XL15Mjw+Hw6mwkIj2tqyurl59ozrcUugIV4cOHd4mePLkRS7fV0tqr2q52hMul1SuMEsdLYgS6r3CYq4FSmvyQLisc75pbBwMpTi7qwxOwqBKJNRhZBrJNS5vSJa06rgkDNCmyNZeV9sNwewARynFYDAInyvp+feSpfBacG17YpbYTw9yCWpLe2ECOOtYXOhx5+3HEAVLq8v0e71AtmaXgX/MWRCXFNF77z/OIw9/gDde+zLDrQuceOYJDj/wCQ4fvRNTh0E4VydYV7UGXgZXP1eE1CIhrI2znk84al599QW+/80v8dKTj9MzOzx87x387Icf4ejqMrmpURZGxmKrmr5oeqV4+10rmMZa41dWgSeZrdTRPZJbS6WL/CxajNvr7JrH/J//YvpgSUGMxYnxxArlj4e1oB3BI9jwIIkWQcGJxolt1YTFuq9QK6YVVhuc0kgd670M7SAOF8hW6t8nCifWx86HOrOWi5J4PrqZ3XEzvudf/vKX0/1er8fP//zPA55sDIdDFhcXr5lsATz44IN87nOf4ytf+QoAf/VXf0Vd129romqv1+N3f/d3eeqppzh27Bi//du/zSOPPEK/3+e5557jP/7H/5iaGD/xxBP81m/9Fv/tv/23a17+xz/+cb74xS+ysbHBv/pX/yo9/g//4T/ktttuA+jSCt+D6AhXhw4dbiLaBq5wY50fyDhv9XHGIrXFBWsNqcEs/jVhQNQs4OrwYxLfo0fFJELjB3ExiU5mBsxzl9O2Xum2rTD+tSLhlaTGqc1K3FjEWeHJZMLGxgYLCwsMBoNErNqva9e1vVcI19XOjqQLXemFc18wjzXPYzR+4HnkiB9UiYoDe9s6h6eX6wSss4holIIjt93GZz/9aR776++yeWHIC8/9hNW/eYz9+/dRFIuAtypeywk2bysu/zbnYzBmyIrdIypL829YjUw5rBvz6sln+c63v8qJH3yLlXqLD957N7/8mZ/hfbcdoqwmmPGYujaMqxqF0OuV5L2+D5kxBpSmNobReMxkPEFrTZYXaO2TP1WIbZ9el1QYipWpR/12xOdaG+4tpKq1DHDOEFoig/K31jnExV5hvr+a73wcEwwFlK9ni7ZSkRoRby2WKeuov3aI0iilU3iHD+AQXCZgfO8+tMKiccqi4utCAMfc49DazvY2tp9/s/ja176W7n/4wx9m//79DAYDDh8+7OsS4ZrJVsSjjz6aCNelS5d48skn+f/Ze/egSbKzvPP3npOZVfXd+/L19LQ0aDSSGDTSCEYgCWm1gnAs65AslkUQ8rLhRWGvHeBdb+yaAJuV/Q92BBCxAYsx1v6BzSVk1hZYNiJ25V0wFwMhYQSLxFWjGV1Gc+me7un7d6nKzHPe/eNcMqu+6suM+jbd+UTU91VlZWVlZWWeOs/7Pu/zft3Xfd1XuKfXj8997nN8+tOf5t3vfje/+Iu/yNra2tzzf+fv/B2+67u+i49+9KMAfPzjH+e3fuu3+OZv/ubr2v5b3/pW3vrWt/KlL31pjnB97/d+7y39nAPuLAyE6x7B4mC8DMsmZTdbrjDgLsLcL7zH5R47ikqczKFBLth6aKOssAlGGaZtkehOSCZFJpkqx/+CkeRW2Hs7JJMoga5nTuqvBUH+04dPNvMLnyH1+hIJcyuR4DxYlGhV4MsSX5aYcoRUFa4ogyW8sRhrsAdSDV/ZYV2EqnLhwgWeeOIJiqLg2LFj3HfffUwmk6UTn7vVFn4ZrvuTXjOJY5esNJ/hWrYNKWz3PIkgp/sdYe7q6yyCzeeMqrAy2uDt3/iXePd7vsDHfvlX2N19jj/7/Y9y36bna7/+WzDlEVRLJHq+FDZs1/UJRUoG5UVxPxY+QvdcCoj4WAsVPp+oUFobSWFcxYQeW8Z6rCjIPvu7Z/ncn/4+n/793+G5Lz3B/abmXW/8av7S297Oa47fz4oKtiyhmODxtKpYCTcIEmIFMIbpdJ/d6S6zpkG9YjGUZUFRlBTWUkZZcCBfsUVD/KBzzZeTNC8u0J4jopnLNobrPUgVbVjswgEKxjrpGLnQMDmw6DB2Qc5smZihU2vwxgX2pxITmAZcyHal7xw6wiVWkCI2US5iRs+WIYMuUa5sJLotJkv6mN6SRMZsbOjcq0vU4Okzd6ouLfhbsgzY2dnh2WefzY/f/va38+ijjzIajXIgynv/os153va2t809/ou/+ItbSkT29vY4evQoH/nIRw6QLYCyLPnn//yf86u/+qu56fPP/dzPXTfhGjBgGQbCNWDAgBuDhd/a0Ac20CRVH2YBjl4Nl+ZeW6kJ7fXlKPTgBEHAOUfbttlQwlpLURRdvdPVd3d+YXIli+5xWepjbZhUF2VXh2FMjGxf6wB95RAR6rrm1KlTzGYzmqbhmWee4cKFC7zuda9jbW1tCIrcECw7hi/tuKoq+/v77OzsYIzhyJEjYWsSMygy79ZnjHDfsWO879u/nZPPPcfv/aff59zpZ/md3/x/KKsNvvqRd1CtHMZpgRowhdC083uXAhKmT6aQmMOCXM/Uz0DHlFWyUE/ZsNZ3CjkBPEpVeFw7Q2g49dyTPP7Hv8cTf/Ipds+e4sTGhP/izV/PO7/mtTx0/ASjVjFtdCGVQGJK0Y7cpT2UcAxUCMTEdQYZyfwGQpPdlPGqqopqNMEU1QETkHjwSf2x0vbTd7KsNm3uKF7vdZSYTeTgydgm1WVJJkbEBsiOMPWyXf2WN+E7MyaQM5GgonZRiuhtlitrbN4sqV+YELJsWU9psg/Q9QRar4bUbiLhxIkT2Sa+b9yz9NhfBUlWl3Dq1KmvbEdfAr7ne74nZ+iWYWtri/e97338/M//PMCLkhQOGLAMA+G6C5GiTQMG3G4IZHdCdQpOg3TIuVC75RziU71Wisu+eKTmxsmREMhR8H4Udu41LJlCZ5MM6Yrc0//SImUBZWyYHHtumWwDf/OJjveec+fOcfHiRYqiCJmNGGm/Wj+cAbceqpp7pF24cIHLly+zsbHB2toa4/E4rQQiJKsG1OOdpygKvvo1r+a/ef93oM7xB//fn/DCqS/zG7/6US5cvsjr3/Q2Ng6/ArErzHzIqlmS9A3S2S1+/hzPV9eylIeCF6E1XX2WAIUQrl0f88x+H+NnXDp/mqe/+Dn+4o9/n+efepyy3eNrX/MAb3nTG3jn1z7CkbLAeEVdE1KPPudduvdckN8aYxiNRhRFwYpzeOfxjcN5j4vBFOd9OOfjdW3L8VxWuU8GuvfQA8nsA9erSDTLWHKIFo9ff1mvVQMQaryIhMvE1KAJj0PGXWIC3SE+ZKrUC/hoM+9M7CPmwrjSbzXRs61XI0hRoBLIF8ZnW3uTjX7Cvlw7jLV87FokXMnoQVWp65rLly9z+fJljhw5wubm5jXepcOiAUXKIt1KvOc977nmOu9617sy4XrhhRc4derUAbI4YMD1YiBcAwYMuCmQFDj30dY9ZrTEObxzMbPlul5cL5VsAU3b0rQtrQvCKlsUObt1lT2c304vu5XcxnJ9VmpubAukKINRRi/DxYuM8L5UqGouMJ9OpxhjskPhQLjuLHjvOXPmDF/+8peB8N3t7Oxw4cKFPGkTI/jUWy7KaK0A3lEZ4e3f8PWUTlivVvnEH/wBLzz7OL/7G+c5f+4ZHvm6d3DigTdQVofwamLT5yQdlFyjGPo5zdGc+DzxEgjXSHje4A3ZfVHQ4IpoHFaUtpmye+kkzz/zWZ54/M958vE/pdk9zyuObPCWN7yFv/T2t/DaB16BqaeUzlH4KGndrwlyvdgsOhGSnpFFOGaKiTVOZRmIgGiXvXbOUTcN3rnQlHcyoRpVGGuyZNN7HwMvQaZorcWWRa7/mjPgmMNLu4b7MlGNsmaTauw0fQcSk4rpW/BBwqg+mHn44NCICXWnoWYrGmvY0A8sjEmdMY9YCeNmHoMMGNdzSUx1pRxQky5mvmyvqfayz5bQti0QXPieeuopLly4kJvKr62tZUfYayEFiRLKsryu191IvPGNb7zmOq997WvnHn/uc58bCNeAl4yBcN2FuFJ263p+TAY50oCvFOH8C6YXgWwp4jTWbbUQe+DgglMh3sUJp1+oMYl1LnOL4iPvcw2Da1uapsHFSZhJUqOqyutba+ej3nn7Ju9zUONIR7iSlDC5EGY3QpvtorM99E04jstgjOH48eOsr6/z9NNPc/nyZVZWVjh8+PB1NyAdcGuQGlJDlwVpmoZz586xvb2dJ6dCcO4UDX2Y8B4ah7QNZdvyDY+8ng074vihNX7nk7/DMy88xR/99hme/vxnec3Db+V1r38LJx54HTKexKbIBmOLmOmJUtc4N0/qt1yC1gsUKHF+Lx7nHaU1WFrEN0z3LnHh7PM8/vhf8NxTf8apL/85bbPP0a11Hvv6b+Bdb3kzb3ztqzk0mVD4BrUKrcPPGtpWKCaj0HfKW1RdaHCsoLJw5WjHg7L8T0IAxZZhurIqgnMuZLesxRTRFVQV3wZidunypTypL4qCoiyCgU4MUKSbsXaOeKVa0TTyyFx2rJNmHmwWLfl/ljD2n4+ZzJxJStEo1VDrlb6PVCwnEiSDxoIzuXEyLhEsC05QZ1AbnRFtJGLOdesYg/SKuBLRyvvfM9aZWx6xWN+UrM+dc1y4cIH9/X2KouD8+fPs7u6ysbHB9WDR6n2Z5frNxNbW1nXt6yK5ul6L+gEDlmEgXHchlkkKB7I14GYjzElib6hexF6chp5aPjX5dIh3qA//DzTz7GZcc9vvzs88OwnR7KbJtVvGGoqypCiK6we4DXQAACAASURBVLK37rRMqRdPqI/w0WFMbZASmtxzy0ZXsTiZEZOd0eb38cahX3eiqlhr2draYmVlhb29PUQkF7EPuHMgImxubnL06NHcxygRf+dcnpxrlNSGJr0emgaaFmlqpK0ZtfD6E/dx+C9/C19z4jCf+NSn+PMnv8jzT/05f3LqFM/8+Z9w7IGv5sTrXs9XveohVtc2qKoVpBiBKRFb4BMh0DAPhyD1NbY7r4yAaINv9rG+Zbazz5nTz3Lquac49eyXOX3qWc6fe4FKppzYXueNb3gLX/91b+JrH32Ew2urVOpDS4eZCaYQ1iGmxRclvm4IEsdUs6mhBUSs8cyqxl4riOwiKguSOAFT2NALjOjwmPpVxeBHURakus6mbXHex5qnUEOWasBGo1FohJ6Il3TyuoPjjeThov/7mrLoiyQmY1G7nJ/3+XlRgkQw+bwLkXxFgqUpwOMikQrZL7HBcAPrwRcgLtBFYxEbg0YUwZ4+1plqyiya7nNdab7wyle+cm4+8cwzzwAwmUy47777ePrpp3PWK/2/Hjz33HNzj48dO3bdr70RWGaUsQyTyWTu8c7Ozs3YnQH3CAbCdZdimHwNuJVIkeEUHZZY70FqXuw6SSEuWMEnl0DR8F+zcfN1eM0JuNZR1zV1U4dJmxGKsmQ0HlHY4iqErbfTeVInIUje64Ujpuu3pWW/31bqsRPNMrieKomXhn59SJ6gR9lUURS5buJesn5/OWE0GrG+vs7Ozg5bW1scOnSI1dVVqqrK7QmM6wUj2hbqGTQ1zGqkqaFx2GnNtrX8569/Aw9ubPH4a57ijx//PE98+TkunP4sX3z+Czz1+B/yp1uHObJ9P0eOv4JD28eZrB+iHK9SVGOqssQawdoCUNq2QSRIVGf1lNlsSrN/mUvnT3H2hdOcP3uay5fPs7dzCWjY3FjjbV//Ol7/2lfz2Bu+hgceeCWHjx4OZY7OI20TyKJYKBzMWrBNJAgl3tQxs+3BteF89Q5RDaTJE1wHITY6By/+oPHDklpM1WCfbqyhlJKNcpO2bbMMMWW/0/2maeay34FwxW1LID3B0ISYBexZ/S1RkCwlWz2+pguLNH3A+AEiryR/eJWQ8RcXyJY3IG2s5fI52JOf850pSZAW+pgZiz0HbXRsNL2bCqm/WEjAmbnxBkK/qq/6qq/iqaeeAuD3fu/38jE7dOgQdV2zsrLCkSNHDpCTq+FTn/rU3OM3v/nN1/3aG4HrlTBeKZM5YMBLwUC47lIcMAgYTDQG3FR0/a1SLYWkSYD3nTNhrtmKjxPZyv+vVL59EC4aZaRzu6xKRtUoNtCUaxOuFOnNEsIQ/RVjgg28NZiiwBehbivLCW0wyyC7ud28aytNgPb395nNZqysrFCW5RUnAgPxunOQzsvjx4+zubnJ2tpabu4qURaH81jnA9lqGrRpoJ4hdY3OpuhshjQNZtZQNS1FCw8fvZ+v2jzKYw+9js89/UU++8Un+eLJFzh54Qznn/oS05MTvvxnFa0dUa5uMl7fYnXjECvjCVVhsCa0WvDO0bqapqnZ2dnh8s4lmukuxtcInqI0HDq8wUNffZzXvOZVPPzw63j4a76a+w4fY2W8mkmIqsOLYmyJFIpvamRWIxrIlopFTRP1iqEFBBL7UWmL+iClDFnw2H8v8RcgulBkHAycSCRd4dy31uZM8Gg0wkfZsfce730mYSISHA9Tn75ISBIha9s29/5KDdMXpYMHiFbSb8adXxwZfFQxL5LIPtdbOInCGGnC2IiEzCRE+SCRrDuDmjYGgopg0mEDIVOv0VQjBpJsyOKHRsua3/hK49g73/nOTLg+/elP8/zzz3Ps2DE2NjZYX19/SW0nfuu3fivfP3bsGA8++OCL3sYiXswcZ29v77rW29/fn3t8NVfDAQOuhYFwDRgw4IYglTnkHlmpYCRLCn2PZLluchXdCVPBeYZwcMaS3ksku8wnh8CiGlFUVXhb56+dJ8vFLP0bcWIiPXJVZvcvomMYEpqcLuF1NxRpYn769Gmef/55NjY2OHbsGFtbW9nufrEfzoA7A+m7qKqK8XiMj5ldMYJPcjrv8HUNbR3IVV0jdQ31DJ1NcbMZtp4hdYM4sN4grWfNFEw2Nzm8+joee/hVnDp/nudeuMjzZ89x5txFTp2/xNndKRemz7O3c5LdkxYFytwiQUk+CSphHw9vbnLo+BGOHzvK/fffx333HeOBV72S7fu2OXR4i7IqGFUVQoWv4yRdAFOgXmmjlNgjFBjEFEhTYE2Bi2Yzpm3RukFbh7Sz0JsqBmbEOTxugV+ZRWubJYETku1IvIwlmm+EccGoYqzBSDDJ95FwGWOwRTShyO0rFOdaptN9ptNZJltFYaMMsasFSyQsE46ljKkjV7rwdB42FpWLeVmPvCWPkV5iDHx0PTQhY+YFFZ9lh+LjZ4sZMYrYZwxLkDOa8N8YxERil+tmJe/ze9/7Xn7hF34BCLLBf/Ev/gUf/OAHATK5VdXrJl5PPvkkv/mbv5kff+d3fud1ve5qqOs6tw24Hpw7dy6bD10Np0+fnnt8+PDhl7R/AwbAQLjuGQwTsQE3A+nHFgQryU46yGC0aUJz0GiOoW2DuKaTERrQNjQ3FiHYH0eSlmvU4/KcPQPEGwRhVE0oixHOeYxJcjsJ922XPUv7uYjQH4cg4TEeLxbKAi3CfylKqCZINe5JCYPkMESqPSrBkez683IvHvv7+7zwwgvs7Oyws7PD+fPn2d7e5lWvetWcM+G91OD4jsCCTkzzYs3nm8GEuhwXkg7qPdQt6lvaWU1pDVLv4/f2KVoHsyns7wdJYT3DNLMgv3WCtm3MbgBOsSqMG7AtvGb9KK89cgKA3d0pu3v7TJ1jv23ZrWv2mpp955h5QQuLjkqKtTVWNjcZra2xvrXF2vom4/GY1ZUV1tfXWVmdANI7r7oPbEpZIAjxmrWSmxGrVGAbfNFgXIM2M7Q1+ELwrsG1IM6irkUbh7QO63zIyKS6NrX5vcMx9fEYxMKnyERs9v8LGXaxgfol1bCRQDQEsKXFlgvZ4FDAhtOG1teoeGwJbdugvsU1BmkFkYLClrkGrIz1oiY1WY5jVj5S/SxY7xCqmGzN0Y1Ngu+tJ9FeUJIUMC5TBHGSDBBRPIb4OK4rJga4JH7fqb+Xt6gzoaYvZfKNQaSNmf5eUMmE4/Xt3/btc3WIP/ETP8Hf/O//Jse2t0MtnvdMp1POnT3L2QvnOX78OMeOHcM5t5TQ/KN/9I/mxuPv/d7vPbBO3+3werJRTz755DXX6aNpGj7/+c/z8MMPX3W9L3zhC3OPr7X+gAFXw0C4BgwY8BUj1SBoambqXJQNak8+mCvj479rpIZiLYH2Gmym/wYQY7HGYgtwsWBbYj1C2qf5zR1YEmVEscGxlVi/VWBsmTNcof9NtF1Oc6qY4brZYQzvPWfPnuXy5cuUZYmqMp1Oqet6CKLcbiyRhS2e0SKhDgkVvHM0dc3+zmXOnztLPZuxvbnBViEhm1U3MN1HpjXSNmg7wzdNyA5rrMWJGR4xhno24/LFi8xmMzBCNR6zsb7OkdU1Dq2ugS1wBpwIvrD4ooTRBK0KdFRhV9ewqyvIaEQxGlOUFcldL2WHUjDlwAdecur1aw0RQcqw20YIRMwKOIuUFuMKaNtAIhsHtkHaFmncASmypjrQmJURS8yKJ2j2pZC41qL54bLM06IcUASsMVRVRVEU2dwk/XcuuEm20RU1ZZjLspzfvglNjJPzqaSN98Y7730mXHP7Mrd/JmbRD8oVsyQxZbz65DcpC5KTq9PQ50ttCFpJdDC0AD4qEqKsWhe2YQxVVfKDf/8H+f4f+H4g9KP6G3/jb/Arv/IrWGPY2dnhS1/4AhcuXsSpp6oqDh06tLRNxUc/+lE+/OEP58fvf//7efTRRw+s1ze1SETvavi1X/u1a66ziF//9V+/JoH63d/93Xz/xIkTuWn5gAEvBQPhGjBgwA2A5noDdW3PjSzKXhLxWnDcOzDNiLOHueW9yYr3vpvApOULcpYrErllNVzEfltFKJzXKppjlGW2gZfUFye6egUb+E56c7NoTyryn06nWS7Yti2TyYRjx47lxscD8bpzIEDX8ErxGswhnG+5tHOZk88+x+7ODtP9KSJCCayNS4q2RaczZFajTRPNJZLktgs6JFLjnGNvb4/9/X2895RlSWkMhbFYMVgRfDw7bVFgqgqtKmS8gowqdFxhVtdgNELLAjE2nsnxPOfF1QP211PVIMk1EkqNTJC74QAfnfVc7HFnWtS0qLWIbVFpOwMR76IcmTCuREdTTbLC3nXeNWYQktn+/JciB8038n4naXCw/DGmICRY0nHwsf5LcU7xTjPhKpIksW+20bY03uU6sSBJLHrZLum995IsWDqO/eOa5Js9leE1EeXcScuokYSpGLCKeBubMhvUmGDVb20gi0a7/l7G8j/9D/8j//JffphPf+YzAHz833+c7/zO7+Bf/Z//KgSCoqTZo1y4cIHd3V2qqgrOsXFs/qVf+iX+2l/7a3n3tra2+Cf/5J8s3fUHHngg3z958iTPPvssr3jFK5auu7e3x0/+5E9e50Hp8NM//dP87b/9t694ju/v7/Pv/t2/y4/f+973vuj3WNz29daODbg7MWhQBgwY8JUjTgzFRZLlWlRdiETHBsedMcZ1FD0tTEZSw9+maWiamrZp8G0ouFfVuYL2bhthrqEwP1nJN4HCzt2kKAPZKns28NmVULrXycHqkhsNEaEoCo4fP86rX/3qbLpw5MgRDh06NBjh3GnoKd0k1jKKOlxT49tw3u7s7nB5dw8vBoewc2mX5tJl2N9H9qcwa5A69qpzivVgtbsWkkPl/t4ee3t7qCqj0YiVyQor4xUKYxEfVbIiGDFYMeG+gnjFRPlvInNpf/HBkME7/6KJ/ME+VII3gtqQXdPCxGuqhKqC0TjfZDzBjOP/yQqMV2AyRseTuM4IyhFSVl0DctP7b0yQ6PUzQtK70JcxrbTP0r+m+0Qo3A+1WgVlNWI0HjOZTFhZXWVtY52VtVVGk/FcMAYJcrXpdJoJ8f7+fr5f13WQKWp3jK92izuUb4nLZ05/pVMxZdg09EE0qhivSKyVS46S0jikCZlG4k2dA5f+h9YdVVHwS//qI3P27b/8sY/xhkffyMd+5VdYX1+nGo0YjUasrq7OWeX/2Z/9GX/1r/5V3v/+9+c6q8lkwi//8i9fsYnwW9/61rnHP/qjP7p0vbqu+cAHPsBTTz3F1tbWVY7IfCBORPj0pz/ND/3QD11x/Q9+8IOcOXMmP/7ABz5w1e0vw8rKytzjz0TCOuDexJDhGjBgwA1ATzY450roY7brINnSZLscXx4QhVn99aKzWJisBLOBMjZ2tUUxR3vyJEXjJkVic1XpucDHyYvYEFkvwk2LAkmZrWgHP2ennLQ7vfe5kZQrZbHStlOj5s3NTdbX1zl06BCXL19mfX09F6sPuEOg8/8TmQEPbY14WC0t6+Mx+5cuUxU2EJt6inchyyqtR1J2K0nmkhOE6c602WzG7u5uuBZEKMuSyWTCeDyOGsbwQvGKBJ1v5BQS63UkZy9ksUGvSDRXCOhnKK6FvqQw11MJmChhUy+hdtMGaRvWQREdGl0bbk2835aoc0jT9e5TF+zPvWsxmqRwwb1P4/HKGcY8DqQvRBYu1h7ZovufenvNrZe2qUC0njfYHOjpQ4lOhJEgOe9x3qNNHeq+2mC4YWyJiXVgqQYsHb9kQJEzXOlm8ujYnW55POs+c34ufva+vFLiY401tBKPlWgMKqWMarSW11RXa5TXPvhqfuPf/yrvfd9/zZee+hIQapy+67/9LtbW1vjGt72NV73qQe4/cT97e3s8//zzfOITn+CLX/zi3DE6fPgw//pf/2u+6Zu+ael5BPDII4/w2GOP8Ud/9EcA/NRP/RRnzpzh/e9/PydOnKBpGv7wD/+QD33oQzzxxBN8//d/P//xP/7HbDe/bGzsN75/85vfzKFDh/ihH/ohPvWpT/E93/M9vPGNb6SqKh5//HH+2T/7Z3PZrfe973284x3vuOL+Xgnb29scOXKEs2fPAvAP/sE/4Ny5czzwwAM8++yzfPd3f/cVM3cD7j4MhGvAgAEvCXM/aplo+dxXi1z8rt0tvi5NALveM/0Nz79PsnJOzY3LOEmx1nbSooXopfZERlkaRH8CEyeBhUGiSQY2SAh9EZqGirGoDYXrSUoY3+CGHL9FpIltnijlGprw3NbWFuvr63MR8IF03T6k+hxV7REsmW+B4Gps0+K9o5g1bBUFe3hsM8Maw2ZlqaIE1zji63rvEDO0RDI+m83Y2dnJZKsoClZWVkKmJUUZEomywUFPTRc0mJO/wXx2p7884sUasfSzYj673gBqwzWppkcCbXDQsx5cEY5XEclV24R+fVWo61LX4lsXsjO+6Gq8iFn0/new+N9rJ8mb+3CLC+aDKQclyITG6Mxn8rQ3kQcoqhIKSzEqYw2Yxsl+6O3lokmIsZbxeJzlhnkoTGSYbuxJgaLQFzmOo4EJze9rHA/7o4Lm0VDy+iGj6TPRTN9JuFnUaMzQAj7uky14w9e8nj/6T7/PD3zwf+Vnf/7nQmsDQkPg//Drv77kjOgdPhG+7du+jQ996EPcf//9V10X4EMf+hDf/M3fHGoUgY985CN85CMfObDee97zHn74h3+Yb/mWb8nLmqY5sF7fxXBzc5Of/dmf5Zu+6Zv4+Mc/zsc//vEr7seb3vQmfuZnfuaa+3slfOADH+DHf/zHATh//jz/8B/+w/zcu9/97oFw3UMYJIUDBgx40egbWCQHwSQdDE04XS+zFW9XFcH0kCLwcRKSMlupt05ZVqEXVZo8XmEbV5TpRHmgFCbXaWELtCjQ0vb6bQWjDI2SoWCBvRgpv7FIx7Wua6bTaV6WPn8imgPuDPh+aku1IwKtD9maqUNmDWZ/RrG/x5YoJyYj7isN95XCkVKoUKRp0KYOr+9dJ166QEHbtuzu7uaJo7WW1dVVJisrXSAh1k2F81TQKOsTa+ZrEbMMTvL5neb3NwqdMC8+EoOIRSVJAksoR1BWUI2givLB8RiZrCArE5hM0MkYnUxgZQwrY/xohI5H6KjClxValmhZ4EuLFhZvI8lMN2uj9fn8rS+764IcJu9r9wm621zVaeY4MkfArLWhJ+B4zMrqKqtrq6ysrjCeTKjGI8qqwpbFfGYLAmmMBLeN0um6bWidC5kyjdmymDkMMuolx31uvAMk1mQlV8d0y8S0r0bQMHYnZ1nnkJR9jJnGrbUNfvqn/g/+/DN/wt//gb/HI488ckX5aVEUPPbYY3zf930fn/3sZ/m3//bfXhfZAvjGb/xGfvu3f/uKmaUHHniAH/mRH+FjH/sYZVnOGW3s7u4eWH9nZyffP3ToEK985Sv5gz/4A/76X//rrK6uHlh/Y2ODv/t3/y6f+MQncoP5l4J//I//Md/xHd9xYHlVVUuNRQbcvRAdQqQDBgx4kVicqBjXInVnA9//gQ6TUAfq5swyVBWztBghZqRiVisZA6SI/qgaUSRZUrdDC5vwKPOR525SGolaEY0EooRQiwKpqpDVioRLxeaMwc01f08fI0TDn376aS5evMj29jaHDx9mNBrl59NnGcwybi8y2fKhRgan2RxGW4c0DdQ11FNoZuh0LzgPTvehnYUsTttStBps0T1zZ5iK4CUu8Y79vT12dnaCw50q4/GYjY0NirLEeRcMDxCEGCSwQTJLVWJGidRMYFwF8jKeZLIiRRkswZPU7itE7PQFdJK2kI0mc9P8Ljmz4kMrCe2Z7cQJv7o2HFPnguSyDeOK9y3iHRAeq/OxTo2QKczZ74PTnMXMVGegceVjoEJnv858FjrBx8DMYh2WxsbLIUAliIQM5GL9aVPXzGYzXJT52WjoE0hjyFKGXmCC1agSMN379OWTiqLG98ihITFr6WW8EGImNOyPl9QcOTSoFiNgg4ul2NBAOZxjYTw9f+kiX/jCF/jwhz88Z2Dxb/7Nv+F973tf/nzOuZcUMHruuef4zGc+w/nz59nY2OCBBx7g0UcfvWGtMHZ3d/njP/5jTp48iXOOEydO8A3f8A153L0R+PKXv8zjjz9OURQcPXqUhx9+eCBc9xgGwjVgwIAXjWRWoXH2ZFoXGrZGwwzSxChOmkgOY9dLuFRp48SjaZuY3SoYj0aURdGTcJFlNPObUPodVDW6r0mSE4pEh7ZRj3BZpKriZMLkYvxFqtVNFBcX3BhcvnyZP/3TP83W7+vr67zyla/k0KFDua9Nn3gNuPUISivNUjZJ8lkXslvaxgDE3jQSrik63cPPdrFuhtYz8NFq3AcDC+s19OxK77FAuFyU1CaJ1Xg8DpbkkHvDGSRkkaCTx1YlZjSCaoQfjcP9SLh8CjQUZeifdcNOZs11VWByrdDcAaR3CWt8jW97MuTYID1mWnChnkvSmJKIlzrQNhz71I6i9fFLigOMd53T45V3Oe7MEklhIjCqBwnXwkbz4/TdEUmZBCOTlClbdIWEMK62TUPdtCFOJd1uJUMQa23oJWYso6IM2+zv81y9muKMj7wqkLxwrCPJU5O+rcjDbM7qe+mygaFtRpkJl8baVjWClDZkTxEe/9zneOQNj+R6qW/91m/lF3/xF+eIyzBmDbhXMRCuAQMGXBNh2hLrsvChJsBpT0IYit81ulsFa3gNbleRbOUIN2GCmmtfYKGWS2nrhjq6EbbOUVhLWVVUZRUaLC/UhR1AkjIa6WyPTZgoGBskg1qO8MUIUxSYMjQ2VmvwJk5uTHB5u9luhH0453jyySc5efLknGzzwQcf5MEHHxyaG98qLJBpPfCUYryg0fpdXYtVReoGrWeBbO03sNdAO8X5KVpPkekU27aoQo1nZgxTtZhpwzowcgptEySsKN5EG3X1uV4xtUaQBUKgkkh4AaYMhjBlGQjVeIxOVmhHY2RUYSZjGFUwKlFj0ZjFuNlNvBcx5xynHMgWoW0vcKPdWNO7qWtR3+SMGN5hemNTDg7FthTqPIIPxhuhMiruAN14kv6bLgMUlndZoZTt0v5ThAbXgUpdJVto7II8savJ1Dg2tt7h4/cd+naRA1wiIdtlq4pyVOZeYOr7qcOUgSOal8RgU6+urTPkkMS98v5kJQBJplp0dYDWQjIdyi6ulsYp3/pt/xX/76/9ajx8ho//X/833/KX/8v8eMCAexWDacaAAQOuG7EkgDlt0Bz5STJDzY5aLwoaIuOp146xlkKCE1tVVeEHu2fgtjS7RZrnpGxWrF2xNjb8TLdolGGjbLA3wUivv9Wx2Ol0ys7ODs45yrKkbVtWVlbY3t7OE7IhQnwLIAcfdmdZrH+ZO/89vmmhniKzGpnVMK2hrvFtjfehx5ZpHHjBoewpXFJlB6Uw0KqyYZSqEIqYOWnVIV4p0w7Ea2JpsEGkIwS5XlF6E2IT5WE21DCZTkIXkiJy8IPfQvTJS4JgoZDYLyoaiogLrMYGwiXeImoDsXIuWJ9rkjIHG3TvOiMfbO95unEr6BwXxhOd+9eNCDJ/pBYNOQ6QrQMGHBJNMXrPxx5YYiJx1oI0niYpYiJf4SWCKeJ3CWHsjKQx1XwaYyhsufDdLux8NtTofVbV7AIpIoGfqUM1OBmKJ5xbPm1LQByFKfnBH/h7/Iff+PXcNPq/+8B389GPfpR3vvOdDBhwL2MgXAMGDLgu9O2FDxCtXHzd+58ENf0A8vW8T5TNpJqtRD6sDVIplU6QwxW3GaU6EmqxvJFg/25iry0bDDNMdCRMBhlEuVAnG7q10f7xeMyJEycoioJLly4hIhw9epS1tbWBbN0J6AUWXHLjdA7qJtZsNcisgbqFpsY3e7Rtjbg2ELHWgxqcgX1VLopysSyojImZF2HNJ2lZS902IctaVlgjoZYGQs+s/qkQJWxANsNIQQW1RW59YIp4PxrHaFxXbjvdCljWSw9MyLB4k0nn/FhjwBnEe8R58C2ojfJmB94GB0glZNtjqwr1becomb7LTKT7//vHZd5ZZPErCJ8hErj+d7JotiEHDTgkSTDj8ymzrihGbfe6VAeGQGGy0UbKDqYWGt57rLU0xiFighTRhvVNHOtyBmvJFz+XbRTB+yjz7HYY1EfldiT6xvOfveMdfN///L/wv/34jwFw5swZ3vWud/H2t7+dt7zlLRRFwTPPPMMP/uAP8thjjx184wED7lIMhGvAgAHXRCZLWT9DN0FZJu9TQIJkMFOvF5HuMsZk+UkiXyny2pvZ9KLS868PfWSinFAErEGSE6ENNQeSmh1nN7Muem06UdAtQ3JhPH78OFtbW5w9e5adnR2OHj06mGTcbmg6l0PkP2Qb2lxLJFFGKNNZzmzpbIpzU7RtsK3Dtg00RKJjcaJMBfatxVuh1IYVhIkxNLN99vf2qKczjAh1UbASe20Fd86DZ6fGrIrG2pt0nneZ3EC26NXgJCOZO+X8WtwHJSa1IARG0niTn1TAgLfZaQ9f0G+47r0PSTEXSE1Husq4jnavTdmu2MuMBWMNkonkAn9aHCi6/lhXOqYHSc7Susy8HbLML/f+MiaqAbpjl2tk4/cZMmLhsfMO40weW9NNsgX9AuLYGrYJqj5IGUVD0Mv7rGOQSL5UlbKq+NEf/hGmTc0//af/NG/uk5/8JJ/85Cfz47/1t/7WFY7NgAF3JwbCNWDAgOuCJNqVJj0p4ukVjQ5tmqyFoUe2pCNssFQCmJ9aWEdEQi+hK9Rr5SULoWbFoNFBS6wJdSpFbGZclLnhcXAilNy6KMurbsHkMzeJ7WWu0oQpZboW7ffvlInxPQXtbgJx0u0x3uHbBqkbTJYRzmA6hbqBpkZ9g7gmZF40paVibaBAIYp1ikExceIvIrT7NX5/hqmbkO2IGV5EcM7l8yBneeNkXJFItkJNjbexx1xZQBGWxEgglgAAIABJREFU54xuCkbc8ZB4TYdr01vTZc0tgAUtY2YrjUnBJEOjO6rEdl0565V6d/loyOE94rrxLI1vqj4b9AQJsz8YOJrLBAVSTo/IxpW61eN6i4yrS4alXKMelCWmcbAfbKJH1KIqIDVG995H88xYFxbNR8LpYiiKkrIsolnLchKYxihDL5Pmkw+lJ6gLQ4ZLib8BRvjJ//0n+Cvv+Sv82I/9GL/zu7+T21yICA899BCHDx++xvc+YMDdhcE0Y8CAAXNYNiQIPRmPd2Fy45NRhsv3g01zmECSJpk+1UqAi5MD08uUaYwu+1hTIdZkU4Bl5CL94M/t35xLF3gRnJXgvBb7akkRMlxBVhWkVsH2PfWrCS5etyqtlazuU4+lOXLJUGB+O5GSGAohgNDP5rZBtqZ+hptNMXWDmc5gVsdbIFzq25DhUo9xLbZVaAEpaMuSiwbOiXLJw8QY1vCsti3VdEp7eYdmd59SDXZcUW2sMpqMD2QxIGY2jIAUYc5sg1FGcCWsYDzCjEfoaIRWY0xVIlWJL2ItIzaSty7DeyfhwGiUgjEHsu0xH6aKqssZF+89BsGohjEmtqkI1vFp/HLdeOXC6yQGkFC6ZapdfWhM+avrpICi4HGAv+L4FdYtOEi4FrJ7S+SV820DWNK8eX47CjjVTLjS2JLqwIqiCD0No4ya3jiqqnn7agSL7epmjcEbi0iQaxsbrOudrYJMu7DMplNOnznD82fOsLe/x2Qy4cSJE2xvbw926APuSQwZrgEDBlw/tD/5JE5uYoG10vXWXKw2v0JYJxRkK23T0jYNoBhrKIoiW6AvxcJEQ+kivKF+RRBrsyuhpkh/6k0U+8iopKhukle95CPzopEmRtPplJMnTwJw5MgRVldXc4R6yGbdPmQJazJU6GdI2hbaWTTIaIKMcDaDeobWdch8eY91Bi+KFwPWY70HbbFeWIktB1YFxkYovUIzo9ndwTcN6hUpSyar69hxGZv1+rnMSTh1hTnTFzHRHKboZLRFbHuQMlwLZF4WZHJ3EhZ3K9U+pRq27kiEDxFqPA1KIFCi6TEhoxVruEKCxoU+XurxkXip1y7LFft65cfq8b3xDtVO6kh4bDTnnK7yoZa4QS4x1jiwid46+XMvW6eXYYvWG1mcQI+AzVnK051XmVhBJ+fuHWUIQTOVWNWWMo6JqMVs2nPPPcfedBocMI1hY2NjIFsD7lkMhGvAgAHXxpVMMrJZBgvkS7kSyZrfrOKcw7nQFDmZVpiFZqB99CcAeVl4IrqxhYirL2KtVnQllKIMRK2w2Sa+H9F98ZaKXzlEhEuXLnHq1ClmsxkXL15kY2OD48ePM5lMbv0ODQDiBBXy+Z0n3a4jXKZuIuFqg4RwVkPb4JsGFzO9pbOIBWcUV4RamMIroi1jZylNkPeJb6j399jfvcxsNgUPMq4wK2vIyhg1wYHOeZ2XvEoXKAjBg1SfWEBpo4TWImUgXxS2I2bJpfBOxou5JrMRhXayvliNmUiaqAk90zTWbmms/yLWJKkP5hU+fud9wuVjXRj9x/EI9k08Qj5tqVIg76rOm2+ETSxm7WEpCZt7fK11kvCPbLgiYrC99ws0db5Jc96CJKVB2sg86cr+IHGBMQYXSW41GrGxscGsqXGxf1xd11c8JgMG3O0YCNeAAQOujbkJBXkiOleZoBocq3xsDgq9X+f+z3SHrsdMiBRbYyjLAhv7yuDclfepx5E8YHKPmGgYYCwSo/zBNMPmnlzZyQ06OdX8PCW/x82Ec47Tp0+zv7+PiHDhwgXOnz/PJBkkDBmuW44uSaud2YuSm3hL69C2xU+jhLBuQnarjc13Qyos1MWEmW6sFVS0ULRVxIX6oUIdOMV7RzvbZ9o0NAJaGCaTCeX6SsjIaoMYi+nJwpJkLUvBEonq9UXCpmsg3FdjY31X55In0F2vdyL6w0aU7R0YSeLwkshVMvHLa5q4DAM2pGaUFiHI4gCkSMGjWMflNaybautUARc263xvPR97gGnPWML2Ak9L0oee+Q+hS47/9Vz7V1snjqv9wFK/VrR/v8uKdduUvN+dY2K0bwUWGj7Hl3p12dijEOH48ePs7O2xurbK8ePHWVtbu/ZnGjDgLsVAuAYMGDCHRQOHMCFLE0kX5Dg9e2XRIN1RcWGCEpmW92HSKWIjOfIYuiJs5xx12+DUoRLcCG1RYqyNSi4FORgpDo1FNekIcQTpVTeZNGBL1FZIESWERSBhuamxXKOp8S2afV68eJELFy4AXU3XxsYGGxsbQw3XzcICmV6Y9wbyr4KqhAmktljvQwPe6QyZ1kgzg9l+cCOsZ4iLtUCuxTowXsL5axQDjNqQ0ZD0k2s6iRraMnWG0zrm8miCn1gmhWF9XFIZMFrTlkJDi40vDd4N0Wkw1tN4ohlGWUJVIVWFjEdQVqFW0RQ4UyBiMWIQCS51i6rfO4p4LUvCXYMchpekF3ZGDzkLnleKz6XXpaxW1AQmaZz3itdAqow6BN81bvfxuk1ZLwg1XSkglcaxLLmOr7PhNek9RDNjIe5w3MdFtnmNbydHuZjLVGXyF5elJtqk+2LJESxd3KB0752kigg+PWUFKaLLa2EAg4uEbnVjnUff9Ghu65H6iaXvZBjjBtxLGAjXgAEDroowAe3f70kGc6ZLF17Tuy/9O5rJVtM0tK4FCNmtssBYe7C2Ycke5ZC8SKwPCNF7ojubpsxWsnyX29/UeO4TxEnHaDRie3ub8+fPs7+/jzGGEydOMB6Pb+Pe3eVYosrqZ2pzHWJ0uRPn8W2DqWuknkFdQxMyWuqaMMH2HlXXNYvNAYE4qY3pgJydQmIdlaBeqUuoi5K2HNGKYNQzK8DhER+yYyae86KSEw0q6dwO572kRt5FERwJjc0ZB02W4hImxYu4IwnXTcW8NDkQjx79TMTOaMwsegw298tK42BotBzIlUQlgPgwIppIzDRlyGKwSEiNwTQ6/vUScj7p9BYs6ZmXHS5+T+EUOziuhSxot1SXmnn05NXzL+797ykDhCBRTI6XfdfLHqktiiKTqkSwkkFQqlMdiNeAewUD4RowYMA1of3JQdLs9w0FltQryIEf/9TPZb5uK9gTF/HH2R5wIFyK/KNvgpSwKEOE1UT5oIn1KzEDQJx03K6mxlfCysoKDz30EBcvXuTs2bPMZjO2traGCcjtQD6fifLBICFU14amxm0bb+G+NjXatKhrI+lKduN+LtGw9K3S02LwZUmtMEXZrQRvDN4pu96zJsJYDBBrt5BuUh2zVMkS3hQFFMWchJC4DFuEfktzJgn3NpbKdW3M/KgEOiaC5Iy6ARwaI0ip/YUpCCQr6FCj22HfSKhnspHIFKFeLKwX37tXCxvWWZBTLxlnl9aJvUjzjXAyJiK+BFmu2jVfxkQX1R7ZYuH8mnNLVKVpGnZ2djh37hzb29tsbGyE4zeMdQPuEQyEa8CAAddGz6lLUxS/X9e1jCMt/vBr9ziZYlhr8y3LXK4xH9TehBNrw0QgOrBh0uNeditHZcPEI8kIb+e0sy+rLIqCo0ePsrW1xWw2YzKZzNXpDLjJ0PmmxiG54PDOYSK5krpB6tDQ2DcNNA00Lb5tUZdktiEjZtPFEI1YdO4r7E1Ck3OcGkxhQT0NHicC6pl5T2sMYDHiojy3q6FBBJ+aexuDFLFeK/WbizWLJPJlTQ4+BOOZ6whs3MW4smV7ktv1x6N4vNMiVXwch4wxHZHyxBqxHjlK4yR0skNSX7ZOup3JV75v47jay2rNESzJ24hvtJRsLfuW5xQIBNm3LoyIWQmQSJY1eQxVkUjquwbzGCG7QfZIl6qys7PDc889x5kzZ2jbFlXNbqwDBtwrGAjXgAEDDmBOuuI1B/7zT/JcbyJgyc96kMj05DJRu5VcCMuyDOulCaAqXlITzQNb6r2HoBJlUtkMIEmqbJ5gaoq49giXyFUmWjcRixbvzjmMMXnC4b3HWsvq6mr4hAPRuunQXgYC4lkWTV/woXeWbxqkqXOPLZ1N0bpG2waTTDKcy+52krt9x2tGYka4d/6l3lBt2+Jbhy1HlLZkRWDqlVqVsYcJlkoNhQQ5G/1amngNaLaADzbwwZUw/NeyjJnfRL6KYBCxJANxtyPblfceX+MFHWHqrStighoz8jBJ45uRvDAHhCAs812vrkTsvXa9CZMcMZOnRLq8IizICpdluBY42GIo6XparWrKXvWX9Y8FEs6hdCyMhPHV2oWA1sExNo33ly9fpq5rjDGcPXuW++67j/X19dAnbchyDbgHMBCuAQMGzKHfIDM34YWutkU19qohky45EMmP2yKuk3+MJcsIFydBCX7RJCPVAOSIc+itRfzBV2tyby2iDbzaILVSkTxHuNV9tvrof9a6rjl16hSTyYTDhw9jrR0mHLcQc2dXzkTEc8spqAPXQBuzWrM6SAqbBpoaXIPEnk1GFaeBoAmhr1HOKQjhokiELk5MtXXM6hnT/SmuaSltjVHYGFVYEXxhGBclGwpj7xHf9mpwhFSPqKn3Vq7ZslFWaKEoQ6bL9jJcfRVt77q4V3BtksUCeVkivxRQbKfSkzgWSv/5fmiI2OU9Xt8pCaUexfdMLQgy1v6mkvlGDweykt4fUHMvjqjX9TX3W2QsvjYFCkwxR9aTlDUfjFQbtrAZ7z3j8ZhDhw6xs7ODqjIej3HRgfZeIv4D7m0MhGvAgAHXROqvpb5Xc5CfvMJr6H6w40ZI9SdXa+p7YHPpRx6CJMr0o/o2Zra6bBfWBrKVmiNfYSJwK5E+r/ees2fP8vTTT2Ot5dy5c5w4cYLV1dWr9h4bcJORMrbR+h2XCFYTyFZdQ1MjbYu0LjbMDRNiE2fJubNS/ytUogU7efLctA370yl1U4NTLC0TlLExbJjg8GYVSjzGu/AeYrprKZleGIn95ULfLbVFr2YrZrxyKwTJ196Aq+CaB+hg9l1kfkxUIXv6BEWiosk8JQ1JJrq3pi1GwjU3tppF7/glu+eXkLIlxhoHxuxFLPZkS1mqbodDRgvTkau8bjfOXun4GWPY3t6mrmvW1tbY2tpidXV1GO8G3FMYCNeAAQOuDk2ywl6tQZoIXO2HvJclc1F2ZaSTmLwY5B9/kSidKro+QzHKL70eQ3MR21hLczuRJIPT6ZQzZ84Eh8a25eTJk1y6dImHH36Yzc3N27uT9yp6Ei6ivbu2bSBYTZ3JVqrbwrfRJEEjGQqbkbSxPOHVOHE1oIpXxTUN09mUuq5RoKwKyvGIshCMc5StC6eqBbGCFuCRkCRRCPbdnR28GBNrtlLdVgFFGW8p6xulhwPhuiHoj1w5FNTnKv3zId23Mkd60pDUS4wFWTR0Y1X+0iOi2+EcCpv3J2fVljkZXmv8O8AjZYFIpV6FXTZrrnb3KsQpjfWrq6s89NBDlGU5JyMPLx/OzAF3PwbCNWDAgAPI0dkYoYV+bfb1sxeFbAHvvcOaYJRBJF3X+pnVNGuRHpFK0ft035j4OFjEa3Juo/dD3v9Bn9P73BokC+SLFy9y8eLFPOFwzjGZTKiq6tbtzD2OxYlumDh2TWxxDtomkK62BdeGHlzRICOs2/Va6no+xS13of8gg42Ta6/K3mzKdDbDoZRlSTUeM16dBFfNVuN5EbIIzggzE2RmlTcYkTi57oIP0s9kWduRrML0yJaNWTGd++yLGKa814e543SFobC/jiyyK+bLX3OGK4603enj540shBBkmnv/TmR4QFGQll3PcH0FC/p+lkshs830Pop2n+8KSKSqL51O2f5kGjRgwL2A4UwfMGBAh0iy+rUEuSRF51brIrgmzEFDkTdzOn/nPV7AGwkVC4Vgy0C4vPowb+wFcvPdJBsU8CKosTGib8GWwf56rmi7J3URwfb24wBu48zSWstkMmF3dxfnHGVZcuzYMUaj0e3bqXsAc3WJ0UnNJKIlobkxbYNvZtC0mOkUmjpav9fgXGzwHZrdhklydE8ADva1CleIiXe990x3p9TTGm0Vi2VcjlkZr1DaKszAbdiOE8OeMVxQ5Xwr4JWjpmBzVDLyMwrvQnChLMO1IBUUI9yogKpERiWMSrQwIVNmfGidIFn0OIeBaF0/DhyrtKAXxFl6PBcWmqsd9Lyt+YBU/xzutju/oZeayNcFS3hBEDu/7WWahC6gdeVtLxpoOOfY39/nwoULnD17lhMnTuRa1tT8fch4DbgbMRCuAQMGLMeCouWlvFxEMNZSiqDYUHqSnfmiaob5eUNwFgykTJNtcKrZyjJC2zVx7ctc+uYCdyCOHj3KysoKp0+f5oUXXmAymbC1tTVMMG414uQ12Lm7rm7LdX22QnbLxX5JvazWQVu4JYjL48y6nkYZoQ+GMePxmMnKCkVZ4Y0Ey3cNwYkZyrl2yjmE3bIAr4y8p1SPsRZjFGMECoOWBVoWUAYJoRQ2LO/Jaodz6xbgRh7iK8WJrmAydC0sMzN6qftwI7C3t8fnP/95Ll++TNu2FEXB5ubmUMM64K7HQLgGDBhwU5AdDo0JUhLRngRFM0/qu4MlsqVGQjYrkirJtu9xebIozpbELNQc3IYPfA2k47G6usqrXvUqtre3McZQVdVVTUQG3ARoIlqRWDUNvmnwdXInDFJC3zq0dXNkq5N8Xfv7Uu9RoG7b4L4pQhGlhEVZgjW00l0LTqAxwsx5puppjEGMZ9Y6Zl5YqUqcEK6JqsSXBb4qMVWJLU2wg4+NjzUFJLLkcTi/Xu64G8YIa22WmZdlyaVLl9jd3c2Bp5TlGjDgbsNAuAYMGHCLIHN6fyMm2xxrkhYaic00uwljmjx2EsJiTkL4ciBbzrm5Jp/WWtbX14EgNxtw65CaFIvzoY9W6zpDjKZFGoe2TchutQ6N62qu24qn2/VMCmNwYTweZ8lUURRUVYUxBp+JdrgSVAAbzDSKtkFiI2WTyF5RALFG0YbMlpQVpiyQ0nZtEZKbp5hejdmAlzvuBiIymUzY3t5mZ2eHoihYX1+fGxuHFhkD7lYMhGvAgAHz6Nu4w1VkhX3braut11tJu0awmor/09YEsAYpbGxsHOzdxXY28JqzXUsmHlctjLi16Et/6rpmb2+PyWTCaDTK0qB+T7JUn3E3TKjuVOTManISzAYZIctl6rYjXS42q/WaG38nlzahFyCYe4P8J5oZaDhXVakmE6rxKLrMdTI/Q/ArSLIv8Yo6Zc1Y9n2DaxtGtmSzKFi1JZUabMz8ioxQqUJDY9PJbbvMVspumc6YYTi9BtxmqCpHjhwBYG1tLcsJX1Rj6gEDXoYYCNeAAQOugCszqFTK0q+YOjD/XPqjGTJQXV14mnzGzJSJ/bTEoLGOK00iNUsT54kakMnWbTAgXIpEppxznDx5kmeffZaVlRXuv/9+Njc3GY/Heb3+/wE3HnN1L0qQEiY5YR0lhTHLJU3qs6WhCXLsO5cTWmKy7fZiPY3MaWPjYxPXV0+ycp/fOWL9VnitMSBOWbcWtSPWLIxHY9bFUlmLDX7xwSzDVoitQqZLTKgFi8YyXkwkhcnO+yYd3AEDXiSMMaysrDCZTPKy/jj4UurUBgx4OWAgXAMGDHhpmGNZ1y7O116LIknZqB6BkmSSEZ0Hk8U7psiW8B7BLPYTSkmFG/fJvmKkbNX+/j5nz56lbVvOnTvHdDpla2uLBx98cG7CMeDmIdWFaOy1ZVqHeBdIVttJCWldIFvOR7LlMV4PnFc5u7XsfM9Eu8U5n+sXjTFz/ZH66wd7Qk/ISCnGKSMDh6sRrRTYwmI0uiSakNGiqOKtyHbwYk3MBqcedMtdCQcMuJ3w3s8ZZKgqTdMwnU4ZjUZDi4wBdy0GwjVgwIAbg+vI0oRMQWd2oSnDFWWCUgRplESrd5HQzDhJEFUEVekaLzNPtFI11J0w1fTec/r0aS5evJgJ2HQ6BRh6z9wGaO63FWu3Yi2Xtg3SNNBEEuZdOJF86rO1ZFtLarhCKyXBtY696ZTpdIq1lvF4zGg0ynUqBzJjJgUQhPDGYT8LDQb26h1SBrMYbwWpSmQ8Cs2NKwuxdivUPhbhGhETbesHDLiz0JcPOueyPfzly5e5//77uf/++4c6rgF3JYZf/QEDBlwHruERH+tjeguWrCKdjXuMxIv3gXSlOi3Ti9JnW2tLKpzRtOnraDh6OyEitG2bbY+TI5cxhmPHjg2E61ZCFVUf7N29Q5s2kKqm7cwy2mQNHx0Jo5RwednTlc+ytmnY398PFvALfZOWSaVUwFlFVDDEJsrGxjSaYAqLN9CUBm8Mu3u7lCKsra0hVQFlEQmXwRibAxlBmnVDjt6AATcUKdssIuzu7vLEE0/QNE0eIw8fPjxk/wfclRh+9QcMGNBB0sQwWLEpCkYR9aiJsiyjGKJESgRcMAZIzoFpnpfJUXQOFC+dFEskpKHKokewQoPj7E5IN3lMm8lxz34zzfndvy1IToN9WWVRFLz61a9mc3OTM2fOcO7cOY4dO8bW1tZgkHGz0CcZsX+W4hHvERcyWMZ5qB3ULZqyWq4FbVDfBrlhTJWaZLABHDjTUpAhygjVe5pZw2x/hqpSlSVVNWJcjYPRxRW+b6saCVb6OY7XkSnwCJfVc3rWsrO/T9u0jBvHA1ubrFUTjDHYsgzhEFtk4w5D/2IZMODOQmpuPB6PWV1d5YUXXsAYw+XLl9nd3WU8Hg/j44C7DgPhGjBgwAEkspQj/Ca6Cvo40RTtzUPnJ6S50aZIll6FH9i44dSU1RAzXRLJVpAMZkHgy+QHd9FpEDriVZYlx44dY2Njg2PHjjEejwe5zK1AChqoRzTaujuHuigZVIdXh8b7giM6WKDx1AxkiqtniiRIAtV5Zm3NrK3D643FViXFuMKUVyZb+Vox6eqJ0lkjaCE06tltas7s7dOqYhHcbMbudMra5mYIVniPWBsvzZfHNTPg3kYaA6uqYnt7m93dXcqyZHt7O2Rv++61Q3BqwF2CgXANGDDg6hAQMRjpykLCj6CC+GDVLgTpVs/AQqzt+hXlH8yufgsbiZcQ6k4MyQouR0BfTkgTg0WnreTKNR6PDxCyATcYQqi9gq4Oyyu0PhhitC3aNqhztK5GfQO+xajH4GPwQFFL4GvR6eVKDvDh+3Q0vmHazmh8A4VQVCXlqKIclYgxoZkr5GxYgvZiGNG8HedduKaKAmMthYVyFvbZiODUc/HyJQ4fPUI5HoXPN5xOA14mSGNfanB8+PBhRqMRk8mE8XjcGdz0MJCuAXcDBsI1YMCAa8BkeVIv7hha/fiYAoiT3FxeJSAmNmiN2S1NJMok0hW2G8wwNPq0vfzI1uK+7u3toapMJpMDPbb6zlwvp8/4coEPedggd01ky3loPabx+KaNzoQN0tahfsu1GOdCvy0C58p9tInn7dI0V3iv1rU0sxmuaRCgKCzjqorNjXt5KwkXUf979ymhm98NTGlxMTBRVCWroxFrLZy9cAEH2CpICFvvQq+vlCUeMOBlgMVWGFVVUZZlft5aS9u2iMicm+GAAS93DIRrwIABB9BvzisAKogY1IQZohiNii2Peh/IV/ohTRuJDoSa6rqMoPEHVJP8SQLZQjuntpfbD2yfPDnnePbZZzl79ixHjx7l2LFjrK6uZoe6/msG3BwoyVkwul70Ml3GK9Qt0rbQeLR1iAPxocYwnKxJ39c7Lw+ckvEdvENbxbfB+KKwBaNyRFVUGGyuBRNNvpnzji+JHMZuWYGU2RIrgheLEUtZlExWlNWmYWNzk42tTdbW15isrobsmc7XD77crp8B9x4WA079QNTu7i67u7usr69nVcBwTg+4GyA6/PIPGDCghwNDgup8hF8JZgQ+GAVotM420tUmacxwpftAZwFPb8q5EJmXPPV8+UFVuXTpEp/97GfZ29vDGMPa2hr3338/99133wHSNeDGQyGSqyAhVNcibYNvWnzdIG2Lne4HaWHToi6aaXjfZcViLdcchAOywtBYLgQdnHPUTYMxwqgaYazpXni1/RWlNeG8t2KR6NSp1iJlCVWJryp2i5LGe1bW1yirquu5JYKPhM2Y4fwa8PJD6su1t7fH888/z4ULF9jb2+MVr3gFDzzwwJDlGnDXYMhwDRgw4OqQFJlPjwmRe0uowcq9iubXUem6ZfUzWnNrHpzXvizrUVSVtm05deoU0+k0F4VfunSJI0eO3Oa9u3cQSgmDhFPxeO/wPphjODyKoxQleBfGFxgTM02Sa7iw0D85Q7zhYF2JMSYEGgSkbVGgToGG64jMa+xFh4KRQJpsUYaGxlWFlAValIyqkklZBpMZtHP/JOz/EDUd8HJFXx1w9uxZLl26hIhw7tw5tre3WV1dHbJcA+4KDIRrwIAB18bij12cVPYbEM/N+hJzSrUwuSZmYTt+GeN6+SE1Nb548eJc0ff6+jqHDh0aslu3Ctoj9tYCPshfrcE4A77AlzbIYF3X2Fg84END7WCxPp/lCj25Fs/10ArBR5WgJFfD/v5cY5IY+J6gXhFCOwS1BViDLwooLCKWoihCTSSE5uDWoCh7synVaIwAtpdhHjDg5YIkXx+Px2xubnLp0qWQMa5r9vb2WFlZGcjWgLsCA+EaMGDAi4eR/5+9M4+Sqrr2//feW/Nc1V09MzTQ3QyKASUqiihinGJQoy+saPRl+Z6+FWMSk5g4/nj6fOZFE4cYNUYTjRqNAi6jOKCoiIIoMqRFZuh57hq75rrD7w88h1tFF1QzNTT7sxYLqLrDueeeund/z95n769Xowh8ZYre0hSE3KKxgxaQHWHT8jabDRMmTEB/fz+CwSCSySRfw0UztEcIlgXy66LZBoMIwMS+/PpvVV+74OuvBF3sqwZIKvYesfmhttAJKi1vwkHI22c/x2ITD6wsAk8ms7vencDWgkGDosiIRMIIR6MIRsOoHTcOHqd7774giGMERVFgMBjg8XgQiUTgdDpRWloKp9MJgJIMESMDWsNFEAQxBFjIGsu9VGPXAAAgAElEQVRAyGZo2aNUVVVEo1GEw2EuuABKZjB85L/i9nLFfv2xPiT2QF6Lg04rFLmf/r97Qm93O9K+9sQJuwvDtrW1IRQOQVEUZBUZtWNrMWbM6N3FlQniGIQ9R7PZLFKpFKxWa05UAFvnJQgCFEWhdV3EMQl5uAiCIIaAXmyxWjL6lO+SJMHj8cDtdpNhcFSQ3/8F7odQxDZDOs8B7pe3XFJfx06Dhlg8hkwmw2uEBQMBlOuEPUEcS6jqniybBoMBdrs9J0tuvneLwrOJYxUK+iYIgigS5sXSe7my2Syy2WyOh0vTNEiStFcRZII4ENgYstvtcLlc3AA1GAyIx+OIxWLD2TyCOGBEUeRJhljtLWD3czQYDKKtrQ0DAwM5z1Im0gjiWII8XARBEEWSX7g4k8lg165dEAQB5eXlcDqdXGipqso9YOTpIg4GZmwy72kgEICiKDAajXC73bBYLMPdRII4aJigSiQSaGpqQjgchqIoqK6u5vUMaQKLOFYhwUUQBDFEmHgKh8MIBoPIZDLo7+9HSUkJqqqq4HK5uMgioUUcSnw+H2KxGCwWCzweD2w2G/cKEMSxiF5EscmFeDwORVGgKAp6enpQVlbGk2gc7HgfShKOQqGNBDFU6ClNEAQxBJiISqfTCAQCSKfT/P99fX1IJBL8xUwvaOJQwcaSyWTCmDFjUFlZCYfDsZfxqU/gQhDHAvnrYC0WC3w+HxRFgSRJsFgsOc/SoY5vfSiiPhxxX8fJT4REEAcLebgIgiAOgHg8jkgkAmCPweByueB2U4pu4vBiNBpzkrYQxEhCkiSUlZVBlmXYbDZ4vd4DSgqj90ox8cSe1YU8VoU+Jy8XcbBQWniCIIghwGY+M5kMurq6EAwGEQqFYDAYUF9fj4qKCgrxIo4osiwjGo3CaDTC4XAAIO8qcezCPEqyLMNoNOaU3hjKs1U/IcHEEjuWqqqDZjzUC7P8c1JKeuJgIMFFEAQxBPQx/aqqIplMoq+vD6lUCmPGjIHVaqUXMnHY0TQNyWQS/f39iEQiiEQicLlcaGhogMlkojFIHLPke5JYHa6hoKoqOjs7EY1GYTAYIAgC7HY7/H4/jEZjTkkPPeFwGH19fchmszCZdhdNr6ys5AXshyr6CIJBIYUEQRBFoI/pZwaBKIpwOBywWq08axwZusThhnkA2tra0NfXB0VRoGkaBgYGEI/HYTKZKPyJOGbJH7cHInAymQzuuecerFq1imc3/M53voP/+Z//2eearNWrV+O2226DLMsQBAF+vx9/+tOfMGHCBFobSRwUJLgIgiD2g15sKYoCg2H3o5PNvLKinQRxJBBFEaqqwmazIZvNcgM1k8kgEonA4/HQLDxxXKOqKlpbW7F161YusE477TT+faEMsuFwGNu3b0cymYSmaaipqeETGpR1ljgY6IlMEARRBKIoQpZltLS0oKenB5lMBqIo7rUYmyAON8yA9Pl8MJvNAHJrGMmyPGxtI4ijBf06LGDvxBmF0O/DaiqyfxPEgUJTsgRBEEWgqir6+vrQ2dkJRVHg8XhQUVGBkpISvkYAGFqNF4I4EPLTZwcCAdjtdpSWlsLj8QyaDIAgjlfyi8/v7/msF2TMU0zPdOJgIcFFEASxD9hMZzKZRG9vL7LZLAwGAwKBALLZLOx2Oy/ISRBHAjZzL0kSRo8ejbKyMjgcDh7WSuGExwf5BYP1nzPPDAs/HWxMDDY5pN9X/12hFOpDDbXTJx3SJ6AoZqJqf0WIWd0uPfoER/lp4ln/sUgFvSDTh5Drr6+YBB5671gx3x3MJF3+Pc7vg321hTiykOAiCILYD6qqIhQKIRKJ5LzwbTbbXhnh6MVGHAnYOLPZbLDZbHsZsnqjkWoIjUwGExAs/M1gMEBRFAC777+iKJBledCEKsxYZ/szb5D+//n7sBTpbH8ARXtWZVnO2Tf/GvLHqV7kFArvY/tqmsavlYksfZvzz68/B9uXbSdJEj9O/rEK1fhiE3LsfMy7xs6p71d2Dv01FRLGg/WhwWDgbdaHPrL2A3uLSWL4IMFFEASxD9jsptVqhdfrRTQaRTqdhtVqRWlpKV9DQxDDSf7sfCaTgSRJ5O0awbBaUqqqIhKJcE8HC3kG9oyLVCqFzs5OtLa2IhAIQJIklJaWorq6GpWVlTnlLPSCXZZl9PX1obm5GcFgELFYDDabDSUlJRg1ahTKy8thNBqLFlvMM8van0ql0NPTg6amJvT29iIej0MQBHi9Xvh8PpSVlcHv9+dcT6ExraoqwuEwJElCIpHIEWGCIECWZQQCAb69yWSCw+FAIBDg3qFEIpFTd0sQBF52gR3L5XLBaDTudX6WqZbdA0VREI1GsXPnTl6+wWAwwO/3o6KiAtXV1XA4HPvtO/2ESSaTQSwW495BTdPgdrv5/2VZRnd3N3bu3Im2tjYIgoC5c+eisrKyqPtDHD6oDhdBEMQ+0Bsf6XQa/f396O3thcPhwKhRo2C1Woe7iQTBjcF0Oo1gMIhUKoWqqipYrVY+G06MLJh3qLOzE/fddx+am5shyzIsFgtuvvlmzJo1C7IsY8OGDVi0aBGWLl2Kvr4+JJNJiKLIhdNll12G7373u5g8eTKA3V4XRVGwfft2LFmyBK+99hpaW1sRj8e5B8disWD8+PE477zz8L3vfQ/19fVFeVGYdyccDmP16tV49dVXsW7dOnR3dyOZTCKdTkMURVitVlgsFthsNowZMwaXXXYZzj//fIwePRqiKO4lUlRVxfr16/Gb3/wG0WgUoihiw4YN6Ovr4+etqanBiSeeyJ/nZ511Fm688UYsWLAAW7duRTabRSAQwIYNGwDsFlBWqxUzZszgBcW9Xi9uv/12TJo0CcCepBr6osqyLGPLli147bXXsHTpUrS2tiKdTiObzUJVVVitVjidTnzzm9/E3Llzce6556KqqmpQMZnvrd60aRN+85vfIBwOQ9M01NbW4q677oLP50M8Hsc//vEPLFq0CFu2bMHAwAAkScKLL76Ib33rWzT5MtxoBEEQRFEoiqIpiqKlUiktkUhoqqoOd5MIQtM0TYvFYtrWrVu11atXax988IG2YsUKraOjQ1NVVVMUZbibRxwG2L1tamrSJk2apImiqImiqNntdu21117T+vv7td/+9rfahAkTNEmSNEEQNIPBwLeTJEkTRVEzmUzaKaecoi1evFiTZVlLJpPawoULtVmzZmlms5lvJwiCJgiCBoAfx2Qyaaeddpq2YsWKop6H6XRa++STT7Qrr7xS83g8vC2sPZIkaQA0AJogCDltHDdunHbnnXdqbW1tg/bFu+++qzmdzpz9WJvZ9bP2C4Kgff/739cGBga0WbNm8fMLgpDTJvaHtam6ulr76KOPNFmW+e+K3YdsNqu1tLRoCxYs0MaNG6dJkqSZzeacPmdtYOexWCzaGWecob388staJBLZ67ryz/HRRx9pFRUVvD0nn3yytnPnTq27u1u79dZbNUmS+PnYdb/11lv0rjoKoCkvgiCIAmh5axiA3THx+eu2CGI40TQNiUQCwWAQ8XiceyjC4TD8fj95t0YoWt56Pe3rcD0WBvfggw/iL3/5CwKBAN+Ohcmx/Vmo3fr163HfffdhzJgx2Lp1K+69915s27aNb8dC7ljYor4NX3zxBRYsWIA///nPGD9+PP9Ov56JPT8//fRT3HLLLdi4cSMymQyAPaGRJpMJRqORh8QyjxDzIjU3N+PRRx9FV1cXfvvb38Lr9fJr1ye30CePYP3Czj/Y+jB2Dv02+nVV+UlBWH8AyOmT1tZW3HnnnVi6dCnC4TA/jv4a8tdsZTIZrF69Grt27cJ1112HH//4xygtLR30GvRhw/okHqFQCM888wyefPLJQa9FX0eMGD7oKUwQBJEHe1nFYjGEw2G4XC44HI6i0woTxJGErTG0WCxIpVJ8oiASiSCRSMDtdg93E4nDRP6ziCWMeOWVV/DFF18gHA7DaDRi1KhROPnkk1FVVYVMJoONGzdi06ZNCAaDXKx89dVXuOOOO9DZ2Ynt27dDkiQYjUaMGTMG48ePh9/vRyqVws6dO7Fp0ybE43G+78qVK7Fw4UL87Gc/g8ViyRF/wO5nan9/Px588EH861//4rXiDAYDvvGNb+C0007DxIkT4Xa7eQmOjo4OfPbZZ9iwYQMvRByLxbBw4UKceeaZuPrqq3loIVuT9p3vfAeJRAKqquLTTz9Fb28vnzAbM2YMpk+fDlmWIUkSTjnlFEiShNmzZ8Pv90OSJLS1tWHt2rVctJjNZpx55pmw2+0AgJKSEpSVleWsoVJVFT09Pbjrrrvw+uuv87aKooiysjJMnz4dkydPhtfrRSqVQkdHB9avX4+tW7fy8M7u7m48/fTTsFgsuOmmm/a7tosJOEVR8Oqrr+Ivf/kLn2xhzwOz2QxBEGjC5SiB7gJBEMTX6GcBmYHQ1tYGs9mMiooKniSDZYcCSHwRRwc2mw0+nw/BYBCiKMJsNsNut9P4PI5gz690Oo33338fiqKgpKQE8+fPxzXXXIOxY8fCYrFw7+eSJUuwYMEC9Pb28v0++OADnuWuuroa3//+93HVVVehtLQUVqsVqqqio6MDr7zyCp566in09PRwj827776LH/zgB6ipqeGCi3lnVFXF559/jg8//JC312w248orr8RPfvITTJkyBQaDge8DAJlMBk1NTXj11Vfx8MMPIxQKcdH1+uuvY968eTyZhiiKmDhxIh566CEAuwuA/8d//AeWLVvG+2X27Nm4//77uVAym82wWq345S9/yZPMLF68mItJYLfAWrBgASZOnAhgt6D1+Xw5XrB4PI7nnnsOixcv5gLUaDTi5JNPxq9//WvMmDEDXq8XJpMJqqoikUigq6sLr7/+Ov70pz+hpaUFANDX14enn34aEydOxGWXXQYgN0V9/r0GgM7OTrz44osIBAIQBAENDQ0466yzMHnyZPj9fgiCgKlTp9Jz4CiABBdBEIQO9nKORqMIBAJQVRXxeBy7du1CKBTiC8tJcBFHC2zMer1e+P1+WCwWlJSUwOFw8BAtgMbqSEc/WZTNZlFaWooFCxbg6quvhsVigSRJyGazPBnFtddei61bt+Kxxx5DNpvlWe4A4IQTTsA999yDuXPnwm6383A4RVEwceJE/OIXv0AgEMBTTz3FU6bv3LkT27ZtQ01NDW8TEyWqqmL58uU8eYQgCDjppJNwzz33YPTo0Tn1pIDdHiuLxYKJEyfi5ptvRmtrK5577jme/W/btm3o6+uD2+3m1200GrkYYsmM9IkiJEmC3+/PSUXPfjfs/E6nE9lslnuXNE2Dx+OBz+fbq3YY2//jjz/Gn/70Jx4+KIoiLrzwQtx3331oaGjIuUeSJMHhcGDChAm46aabUFdXh5tvvhnt7e3QNA3t7e147rnncM4553AxqUc/KSiKIgKBAEKhECRJwhVXXIG77roLtbW1MJlMvH35NdWI4YFSlhAEQXwNeynJsoz+/n7EYjFugLCX+GBx9AQxnLBxaLfbUVdXh9raWng8nhyji8bqyEe/zlRVVVx//fW46qqrYLFYeFiZ0WjkHiyTyYQ5c+bA7XbnFCC22+244YYbcP755/PwQP2aIiZMLrroIvh8Pn68/v5+tLe3A9hj6LPjJpNJbNiwgYfzWa1WXHrppVycMYEjiiL3QLHrsVqtuPDCC7l3DgDC4TAGBgZyrj//2ay/JnZs/Zos/e9CL2LYteprkrFt9GJL0zSEQiEsWrQIHR0dfJ9p06bhjjvuQH19PT8mgx1TFEVYLBbMnTsXP/zhD2EwGLhwXbFiBdavX1/Qs5UvoERRxAUXXIAFCxagrq6O32t9Onli+CHBRRAEoYO9pIxGI2w2G4xGIxdbrOYM245eZMTRAjMGzWYzX8eRnzCAOD7Qvk6Bfskll8DhcOQY4IIg8LA9SZJQWVkJl8uVM07q6upwzjnn5Iwltp/+OOXl5bDZbAD2rB2Lx+P8OPqkQywd+qhRozBq1CjU1dVh+vTpe4mr/DHL/l1eXs69Vuy4zCuXL5YY+nA8/W9AL7z02+qvTX/ufFHGtlFVFRs3bsTKlSu5CHI4HJg/fz6mTp2aU+hYLwJZW1RVhc1mw7x58zBq1Cie/GNgYACff/45stnsXvc2v20AUF5ejmuvvRYTJkzIub786yGGFwopJAiC+Br2AjMajaioqIDNZkMwGERvby98Ph+vxUIQRyP5s9nMKEsmkzAYDDCbzTTjPcJhBv4JJ5xQsDaW3vC32+05QgYAJk+ejKqqKh5GWGjMOBwOOBwOvp+iKIjFYlAUBQaDIUccOJ1O/O///i9SqRQMBgNEUUR9fT3fVi+0mBhk+wqCgGAwCFmWc74bLpjgMxgMWLlyJTo6Ovh31dXVmDVrVs46X2DwcF72WUNDA6ZPn46mpibuJVu1ahWuv/567mHM30d/T84++2zMnj0bQK7YIo4uSHARBEEMgslkQmlpKV8XY7PZqHAkcdSin41ns//xeBz9/f0IBoOorKxETU1Nzgw7GWYjCya2JEnCuHHjuPepEMyTn+8Bq62t5d4tJroG23ewkLx0Op2T9pwJKlVVc4oOK4rCowX0x9QLKrZtV1cXFi5ciGg0CgA8zHs4YRMZjY2NvFizoigYN24camtr9/IqDyZa2TYmkwlTpkzB66+/zkMm29raEA6H4fP5Bt2H/Y5FUcQpp5wCl8sFAAXvFzH8kOAiCILQoX8psjARtniZQrOIoxX92Eyn09i5cyf6+/shCLvrLLGaXDabjRbRj1CYAW40GlFbW1twDQ8TROy7/PTt+Ua+fi0WQx9WN1h4nl4YsCQZ+rYYDAbIsgxBEJDNZhGJRBAKhRCLxfhasPb2dmzbtg1btmzBpk2beD2p4Z74Ytfb39+P5uZmnplQkiQ4nU50dnYiFArt9zfG+iObzcLhcMBkMiGVSgEAIpEIF5j72t/tdqO6uprfQ33iDuLoggQXQRDHLfkCKh6PI5lMwu127xUSk1/wkyCOJvQGlsVigclkgizL3HsRjUYRiURgtVpz1s2Q8BpZMIPb6XQWXL+j93IONgaMRmOOl2lfxrv+GVkIdizWNla3avPmzVi7di0aGxu5SIlEIohEIshkMtwTxv7Wrz87GmBtZX2kqio++ugjbN26tai1U8wrxrLiJhIJAHu8Z9FoNEe86mGfWSwWnpkRAHm3jmJIcBEEcdzDvACdnZ3o7++Hz+eD3++H0+mEyWQaNB0wQRytCIIAt9sNq9XKU1yz+j8sxIttR4wsmKGvnzAqtN2+hAs7zv7ETaEwufzz6NdivfPOO/jb3/6GLVu2IBKJIJlM8n31ZQxY6KDJZILf70dvby8URRn25zBrXzqdzhFJANDb28vrmhXj4dKHZupDfTOZDC9ivj/yz0O/66MTElwEQRy36I2BgYEBBAIBJBIJpNNpBINBVFdXo6qqihsB9CIjjhVcLhesVisymQzcbjdcLhf8fn+O54IYeTBvCxPVw90W5sHRNA3Nzc34v//7PyxZsoQnwcgfj2xtl9Vqhd/vR319Pb7xjW+grKwMd9xxB+LxOF/nNJywSbpMJlMwbXwxv7H8LIasv9h3xYhe4thg+H+RBEEQw4wsy+jp6UEymeR1alKpVE4IYaH1EARxNGI2mzF69GhkMhn4fD6YzWYANI5HOvlJFYb7XrNiyT09Pbj99tvx2muvcS8VEyijR49GbW0t6uvrMW7cOIwaNQpVVVUoLy/nkQYff/wx99TmJ9s40rA+liQpx1usqipmz56Ns846q6jjDCao2D0zGAyoq6sjsTWCIMFFEMRxid4QURSFh17JsgxVVXlYIXm3iGMRQRD42o58kUVjeeRypGuv7e88qqpClmX84x//wFtvvZWTsGXy5Mm4/vrrMXv2bIwePRpms5mnjNenN9fvw0TX0YDJZOIp9VnR4ilTpuCmm26C3W7f7++MebT0/2f7sPWXlABj5ECCiyCI4x6TyYSxY8fC5XKhr68PyWQSPp8PdrsdAMhQJY5JBjPU8teNECOL/DpNh/se7+v4rA39/f14//33kUgkcuqE3X333fj2t7+9X4+VKIrIZDJQVTUn5G64EEURsizD7XbzDLbs86amJgC7E48U0878JCBMYBUSW8N97cSBQ4KLIIjjEr1BIggCnE4n7HY7PB4PYrEYvF4vvdyIY5bB6gBls1kEg0Fomoby8nIa38RhhYmr9vZ2bNmyhWfyMxqNuPDCC3HhhRcWPQZbW1tzMisON6IooqysDFVVVVi/fj3/vK+vD7FYLEeIFUI/+dHe3o6enh5eVNnpdKKurm4vwXU0XDtxYJDgIgjiuET/ItOH4LhcLjidTr4GgoxS4lhEP77j8Tj6+voQCoUQjUZhNBphs9ngdruHsYXE8YCiKAiFQkgkEtybY7PZ0NDQALPZXPTzdePGjUin04e5tcUjiiLMZjMmTZqEpUuXIpPJQBRFtLS0oLGxEaNGjdrvMZi4EgQBDzzwAN5++22kUilIkoTzzz8fDz74YE6NNOLYhgJDCYI4LtE0DfF4HOl0mgsrZqRSCCFxrMNqF6mqimAwiKamJgSDQQC701mHw+GjZi0MMXLR15qSZTnHQ8PG5/7YsmUL3nvvPWSz2cPZ1CHBhNJ5552HsrIy7r3r6+vDyy+/zH9r+0MQBKxfvx5Lly7Fjh070Nvbi/b2dkyePLnosETi2IAEF0EQxxXMm5XNZrFz505s2bIFbW1tSCaT/CVKqXiJkQCbHXe5XLBYLDlJCCKRCJ9sIIgDZV/jh33ncDhgNBr5mqREIoEtW7bkCDD2t6IoXIhls1m0trbigQcewLZt2wDsHtMs+oAlqmDFlPNh450l4GDnK7RPfjFo9vthQo9NYrB/i6KIE088ETNnzoQoijzB0vLly/HRRx9BURR+Tv252LkVRUFfXx8eeughNDU1cdE2fvx4nH/++TmJQ4hjHxJcBEEcl4TDYUSjUfT19aGtrQ3bt29HMBjkL3ESXcSxDhu/FosFLpcLwJ46R8ybm5+SmiAOFSwL35gxY3K8QNlsFq+//jo+/PDDHEGiL2ocj8exatUq3HXXXVi4cCGy2WyOwMpkMvwzYO8EMaIowufz8eQTmqZh165daGlp4aKJnRPYI7KcTidsNhv/bGBgABs2bOBJO1j6d/a9z+fDv/3bv6GsrIyfp7OzEw8++CBWrFiBbDabI+QUReETfq2trbwuGSvybLFYcPXVV2PUqFFcWBIjA1rDRRDEcQF7UUuShFQqha6uLl54U5ZlhMNh+P3+nCxftIaLOJZh49doNMLr9SKZTMJms6GkpAQOhwMmk4nGN3FQFDN+SktLccEFF2Djxo3QNA2yLKOpqQm/+tWv8KMf/QizZs1CTU0ND3/dsmULli5divfff597tqqqqhCLxRCNRiEIAmKxGD777DNUVFTAZrOhrKyM15oDdnvCqquruTgSBAFr167F7bffjrPPPhtmsxljx47FqaeeyosvA4Df7885TiwWw+9//3t0dHSgvLwcLpcLM2fOREVFBRdD55xzDv793/8dDz/8MGRZRjabxWeffYYbb7wR1157LU4//XSMHTsWHo8HmUwGLS0tWLNmDRYuXIhPP/0UmUyGt2HWrFmYP38+7HY7ia0RBgkugiCOC/RCKpFIIJlMcsGlaRrcbjfPTEgvOmIkoE8L7vf74fV6YTQaYTAYyLNFHHaYx8pms+G73/0uPvjgA6xZs4aPt82bN+PnP/85FzKapiEWiyEYDCIej/Ox29DQgHvuuQfPP/883njjDe4peuCBB/D000+jvr4ef/jDHzBu3Dh+bkmScOqpp8LhcCASiXCv2Msvv4xXXnkFmqZh/vz5mDZtGiwWC2/TqFGjMHnyZHR3d0NRFEiShM2bN+POO++EqqoYPXo0nnnmGVRWVvJ3hdfrxU9+8hO0tbVh0aJFyGQyUBQF27Ztwx133IHKykq43W4YDAZks1nEYjH09/cjlUpBEAQYDAbIsoxTTjkFd955J78OFrZIv8+RAQkugiCOC9jLi4WNjB07Fj09PYhGo9A0DWVlZTkvXrY9QYwEDAYDDAZDzoRC/uQCebuOTfRrT4tZg6p/xumLCjOKNfL1BbXZcQo9P6dMmYK7774bt9xyC7766ivIsgxBEJBKpdDa2ppzPIbb7cacOXPwk5/8BKeffjpaWlqwYsUKRKNRqKqKQCCASCSS46HSX8Ppp5+O0047De+99x73rBkMBh7Wx/pOj8/nwxVXXIE1a9ZgYGAg53tJkrgIYxEQLCmI3+/H/fffj8rKSjz33HPo6enhERXt7e3o6OjY6xpZyKXZbMYVV1yBn/3sZzjppJNykjfl34f8Qub52XbZNsTRBwkugiCOC/Sx90ajEX6/Hx6PB4FAALIso7S0NOdFRS8t4lim0FjWG3CyLCOTycBkMnGvF437Yw9RFDF27FhkMhkIggCr1ZozeZSPfo2q2WxGTU0NFy7ZbBYOh4NvqzfuBztvdXU1EokE/4zVn8oX8kajEbNmzcKDDz6Ixx9/HJ988gkCgQD37jARI4oi/H4/GhoaMG/ePFx++eWorKyE0WjElVdeifb2dixatAjBYBCZTIaHyw42OVZWVoZbb70VJpMJ69atQzwehyzLPKW73++HwWDgbQR2i6rvfve7aG1txT//+U/09PQgnU7zYsQshJHto/cil5WV4Ze//CVOPPFEvPjii1i/fj36+/tzRBL7YzQa4fF4UF9fj0suuQRXXXUVKisrc8RjvqAFALPZjNGjR8PhcPB1ajabLae0Cf2Oj04EjXyVBEEcB+S/hPIXMouiOOhMKUGMJNhM/8DAAEKhEJLJJPx+P8rLy8lQO8bQZ/br7OzkXiNVVVFWVga73Z4jCBjMS6MoCrLZLHp7e3kdqUwmg8rKSp5kpZDgYuOou7sbmUyGf5fOoC4AACAASURBVO7xeODz+XhGQrYt+zc73+eff46PP/4YO3fuRDweh9FohM/nQ0VFBc4880xMnz4d5eXl3DPLPGj9/f34/PPPsW7dOiiKApvNhilTpmDOnDmwWq17XSdL1b5p0ya0trZiYGAAVqsVZWVlOOGEEzB27NicyQZ2Xel0Gtu3b8e2bdvQ1dUFi8UCh8OB2tpaTJ06FU6nM6df9B6vTCaDvr4+rF27FqtWrcpJyOR0OuHz+VBVVYXp06fjlFNOQVVVFUwmE4C9k3/k37NEIoHu7m7ev4IgwO/3w2azcY8Z1e46OiHBRRDEcQF7+erTCgMUOkgcP7D1ix0dHejv7+dp4auqqlBfXz+ocU4cveiz+rEMeQD28pLkw4SCfv/87/RCq5Dg0gs3Ft6Wv49+P3Y+vVCMxWLIZrOQJAkmkwkWiyVHYLFz6cPsWEigJEk52+VfC/uOhRKyc7L+0R9X70liYYKsL/UeOH2NxnzBpb9W5pGSZRmxWAyyLEOWZRiNRjgcDhgMhhyvHtvWaDQOcqdzvZL5IcHsb5YFkt5nRycUUkgQxHFBJpNBU1MTjEYjysvLYbfbc168ZGgSIx02xqPRKFKpFDd+g8EgYrEYnE7nMLeQGAr5HqT8sLV9Gd5MhOifffnrsPRrs/JhdaqY8GFpzfXtyS+voRcEbD+3280nwvRt0V8bE1b66x5sDdNgaJqWc516wafvL/0xmShjIjZf2A3WV+yzfB8GC3nU95s+rTw7L2vnYO1nwpWdU7+Pvt2sb0l0HZ2Q4CIIYkSS/0Ls7e1Fd3c3RFFEJBKBz+dDdXU1T42tn/kkiJGIpmmwWq3w+XyIxWLcaGMhhiS4ji303hb9Z/ubPGJiKX9fvRcp/7P9nb+QZyb/ePnP2HzRlN/2Qt6rQtvryd+nUN/k96O+H/Rru/Z37sG8gPs632D9va9zFOqn/PbT5OHRCUlggiBGHPlhJqlUCr29vRBFEaIoIhqNoqenB8lkkmfqIrFFjHTY78Lr9fKMhQ6Hg68BIY4fDpVRXqxYGOy7/QmWAz3vwW5fjHAp5niFtjlUobv7Oj5x9EEeLoIgRhzshcYWkbPkAMyLJYoiXC4XrFYr1TkhjhtY2Jndbkd1dTVEUYTX64Xdbs8JTSIIgiAOLZQ0gyCIEQt7vMXjcXR0dCAYDCKVSsFsNqOhoaFgOmGCGMmwtSZMZOkznpHgIgiCOPSQ4CIIYkSSv2BbURREo1F0d3fDZDJhzJgxfN0BFYwkjhf0RXIB7JVAoFBWOoIgCOLAIcFFEMSIhGWCyjcss9ksL/hJRiVxPKNPLJPNZpFIJCAIAlwuF3m7CIIgDiEkuAiCGHGwx5o+BbE+la4+jTJBHM8kk0kEg0EEg0GEw2G43W7U19fDbDZTjTqCIIhDBCXNIAhixCEIAgYGBtDX1we32w2Xy5XzPWUkJIjdtena29vR0dEBg8GATCaDWCyGSCSC8vJympAgCII4RJDgIghixKEoCjo6OtDV1QWTyQSv14uKigp4PJ69il0SxPGKwWCA0+nkdehEUUQ6nUY0GoXX64XJZBruJhIEQYwIyNogCOKYh4UQMiEVj8cxMDAAYPcsfm9vL5qbm5HJZPjaFBJbxPEOq8Ol9wAz0cUyGRIEQRAHD3m4CII45mFZ1QRBQCaTQV9fHwYGBnjooKqqcDqdFEpIEDoEQYDFYoHT6UQ8HofX64Xb7YbP54PJZKKC4ARBEIcIElwEQRzziKLIE2SIogiz2Qy73Y5kMglZluFwOFBeXg6DgR55BKFHkiTU1NTA5XLB7XbnlEogsUUQBHFooCyFBEGMCPLrCcViMfT39yMYDMLj8aC2tpZnKqRkAASxG/3vIb9GlyzLkCSJfi8EQRAHCQkugiCOefILtjLDUVVVJJNJGI3GnAQAR0Nx12KKzOY/nvU1xfRFnfM/P1IUKpo7WJsPFnZP9cekQr0Hh75sgj5xBvu3qqrcK0z9TBAEceCQ4CIIghgG9AYtewwrioJ0Og1Zlrkx7HQ6c+qI6Q1kveBRFOWIeyP0dc1YO/Tr6dhnhwJZliGKIhRF4UlPFEXh/UchcEMnX0BpmgZZlpFMJhGJRJBIJFBTUwObzUaCiyAI4iCgBQ0EQRBHGGa4Mu9BIpHA+vXrsXHjRmzatAmBQADZbBY1NTX42c9+hlGjRvHscWvXrkVPTw9EUYTRaERtbS0mTpzI17EdadEhCAKSySTWrFmDcDjMzz9x4kSMHz/+kBrogiBAlmWsWbMGO3fu5B6ZqVOn4qSTTiLBNUTyxVYymURHRwfC4TASiQRUVYXD4YDVaqUyCgRBEAcBCS6CIIgjDAt3VBQFXV1d+MMf/oBFixahs7MT2WyWb1dbW4vrr7+ei6lIJIL7778fH374Id/mlltuwe233z6sHp5wOIxbb70VW7ZsgaZpcDgcuPvuuzF+/PhDdg52bclkEi+88AKefvppLljvvvtuTJs27ZCd63glk8mgp6cHyWQSBoMBkiQhFAqhtLSUh+SSl4sgCGLokOAiCII4wjBvQSaTwSOPPIInn3wSyWRyL2OWhdGpqso/i0ajSCQS0DSNh9OxfVhY4ZFGVVUMDAwgGo3ykMdsNntYDHNJkiDLMoDd12symXiYITE09GNHEATY7XZ4vV4e7irLMqLRKAYGBlBaWpqzjo4gCIIoHooPIAiCOMIwo3X79u146623uNhiCQtsNht8Ph9KS0sBgAsu/dot9pmiKMPmdWBrtfSFpPXrug53mzRNg6IovC3E0MjvM4PBAI/Hwz2wNpuNp4rPT9BCEARBFA95uAiCII4wTJDs2LEDLS0tOcLljDPOwOWXX47KykrY7XZUVFRwr1W+R4J5epgIG841TMwgPxKGef7aI32SDuLAEQQBDocDpaWlMBgM8Pv9sNlsORk+CYIgiKFDgosgCGIYUFUVPT09PCOhpmmoqKjA//t//w+zZ8/mRZyZqNI0DRaLBeeddx78fj8EQYDRaMSUKVO4tyu/jhJBDBWHw4G6ujo+/hg0rgiCIA4cElwEQRBHGOaR6urq4iLJZDKhtLSUZ/Zjn7NU75qmwe124xe/+AVfJwWAhyHKskxGMXHQSJKUM77yxxMlzSAIghg6tIaLIIbIvkrX6devDPZnKMfSH6/Y7fXbHEiJvWL3Kabd+/tusH7Jb3uhvtvfNR5IXw+2/aEqU1joevRp3DOZDEpKSmCxWPiaqMHWbjEBxvZj3jF9MeD9tWOwf+fvp0/UcTjZXz8P9t2Ratvxhn5tIBPvmqYhnU5jYGAA8XicxBZBEMQBQB4ugigSljGOwRbrS5KUk71LbxzrEyGwQrb6NSeyLMNoNO51LpYMQJKkvRIQ6P+vL36bXwx3MNg2zEjXH5edqxiDSn8OWZa58a+fGR9sH73Q0Lef9Y0+yx7bJj8zmr4v2XaF6gPpjUd9u1n9Jv0x8mtY7eu4B4L++tk15yd9kCQJZrO5qPvA2qvffzAPFzsvG2uDjRf2b+YlY9fNxvyhLGI82LlYG/T3IL+d+nFL9bYOD/n3N5VKIRQKIRwOIx6Pw+VyYcKECTnPMYIgCGL/kOAiiCLRCytN05DJZBAIBBAKhXiB0NLSUjgcDgC54kNvXLN03oWK1LJ9WMpvYLdACAQCaGtrQygUQjqd5hnFvF4vSkpK4HQ6YTKZIMsyr080mPHN2ibLMjeoWdvYfsXA0kbrs+WZTKaC18Xaou9DAIjFYgiHw4hGo1AUBR6PBz6fDxaLJUcU6b1D+SF1g52LCSa9YS/LMhRFQXd3N3p6enh6dZfLBZ/Ph4qKChiNxoIG/YEamXqxoL9+fdiWfh2WXmyycceumX3PrqcY45eFLLJzZrNZ9PT0oK+vD+FwGIIgwOPxoKSkBF6vFw6Hgx8vXwgfLExsMYHPrkGW5ZyxYDAY4PP54HK5YLVa+T0UBIGnnD9UHkhiD2wsZbNZNDU18SLc7LeTTCZhs9ly+p+EF0EQxL4hwUUQRcIM3e7ubnz44Yd48803sXXrVoTDYaiqCrvdDo/HgxkzZuDyyy/HtGnT4HQ6EY1GsXjxYgSDQRgMBrhcLlx++eXwer2DhkYxQ1tVVQQCAaxcuRKvv/46Nm7ciM7OTiQSCaTTaZhMJthsNtjtdrhcLkyfPh3z5s3DzJkz4fF4Br0GfZjawoULsWTJEmQyGYiiiAkTJuDmm2/mqcj3hSAIWLduHZ555hn09vZCEASUlpbipptuQn19/aACgHmVmJG2a9cuLFmyBB9++CF27NiBRCIBALBarSgvL8cZZ5yBK664ApMmTYLJZEJrayvefvttJBIJiKKI0aNH44ILLoDVai0ouvQexu7ubrz99ttYunQpNm7ciGg0ing8Dk3T+L2bNGkSrrjiCsyYMQNjxowpKB6HCrv2lpYWPP/88wiFQgCA1atX53jhtm3bhv/+7/8GAJhMJng8Hlx//fUoKyuDqqqIxWL4+9//jq1bt/J2nXfeefjWt74FAIO2l40nWZbR09ODZcuW4Z133sHmzZsRDAaRSqUgyzJsNhu8Xi+mTJmCyy67DKeeeipqampyPK2HysNlMBi4EI7H4/joo4/w9ttvY/369QiFQkilUpAkCTabDbW1tZgzZw4uueQSjB07Fqqqwmw2U02owwD7vQDgEw9MHIuiiFQqhXA4DIvFwsfEofQCEwRBjFg0giCKIplMakuWLNEuvPBCzeVyaQaDQQOgiaKoCYKgiaKoGQwGzWQyadXV1dqNN96oNTY2ajt37tSmT5+umc1mzWw2axMnTtQ2bdqkqaqqqaq613lUVdWSyaS2bNkybd68eVpJSYlmMBg0URQ1URQ1SZI0URQ1APz8kiRpBoNBKykp0ebMmaMtXLhQi0ajgx5bURRN0zTt9ttv12w2m2YwGDSDwaCddtppWltbW1F9oSiK9vbbb2vV1dWa0WjUJEnSxo4dq61cuVJTFIWfI//cqqpq4XBYe+aZZ7RvfvObmtVq5e03mUz8Gk0mk2az2bS6ujrt3nvv1drb27Xly5drtbW1msVi0SwWi3bxxRdrHR0d+zyXoihaJBLRXn75ZW3u3Lma0+nUzGYz70N279j9M5lMmsPh0GbNmqU999xzWigU0mRZLqpP9gVry7p167Ta2lrNZDLlXC8Afo+NRiP/M27cOG3Tpk2apmmaLMtaT0+Pdt5552kWi0UzGo2axWLR7r77bk1RlJx7m3/uSCSiLVq0SJs7d67mdrs1k8mkCYLA+4GNHzaGHQ6HduaZZ2rPPvusFgqFBh2netra2rQpU6bwvnQ4HNrjjz9esC9UVdUymYy2Zs0a7fvf/75WWlqqGY1Gfv0Gg4GPK0EQNJvNpp166qna3//+d62jo0P74Q9/yM9lMBi0e++996DvEbHn3rAx39fXp33yySfasmXLtA8++ED74IMPtB07dmjpdJpvTxAEQewf8nARRAE0XchXMpnE4sWLce+996K5uXmvdTOaLlRMURR0dnbi2WefRWtrK/7rv/4LqVQK2Ww2J4RKH1am93TJsoxly5bh9ttvx9atW6Gqas56MUmSYDAYoCgKD/Nh7Y1EIli+fDmam5sRDodx1VVXwWKx5Hgn9F4BdgwWQlSsN4ddN9sfyA2FY9/pw91UVUV/fz+eeeYZ/PGPf0RnZ2fOsVi/sGOqqoodO3bgt7/9Lbq7uzFjxgxks1lkMhkA4O1l/Zi/zkvTNIRCITz//PN49NFH0dramhOql7/ejLU5kUhg1apV2L59O7744gvccsstqK6uzllLNFT09zmdTueEBrLQUeZJYv3AvFL54YeKouQcQ9+H7Fzs+lRVRTQaxd/+9jc8/PDD6OjoyNmPHZcdm+2TSCSwevVq7Nq1C+vWrcOtt94Kv9+fM26L7Qv974KFiGazWaxcuRK33XYb1q1bh2w2y8+vDzFkJJNJrFmzBnfddRd++tOfIpVKDfkeEPtHH0YKAB6PB263G4qiwOl0wuFwoKSkJMfjeajXOhIEQYxESHARRAGYAZzJZPDWW2/hnnvuwa5du7iRL4oiSkpKUF1djfLychgMBvT39/N1D4lEAsuWLcPAwAD6+vr4Yv/BjHz9OqXt27fjgQcewObNm/l3ZrMZDQ0NmDZtGurq6mCz2ZBOp9HT04Pm5masXbuWCxhVVdHa2oo//vGPmDJlCk4//fSCay3Y54W+L4R+u3wxp0/CoTe2ZVnGU089hcceewy9vb18e6PRiIqKCtTU1PBwxpaWFrS0tCAWiyGRSOCFF17Axo0bEY/HuSjLP69eOGiahlQqhb/97W946KGHctKvm81m1NXVoaGhAWVlZRAEAV1dXdi6dSt27NiBdDrNa2Q9++yzsFgs+PWvfw2Xy5WTQGIosPtrt9sxc+ZMdHd38+vs6Ojg1+D1ejFx4kS+T0lJCU+iwY6Rv3ZJ3w9MuBmNRmQyGSiKgj//+c949NFH0dHRwQW1zWZDXV0d6uvrUV5eDlmWEQgEsGnTJuzcuROZTAaqqqK3txd//etfYbFYcNttt/FQ1aGsn9KPBzaeGxsbce+992LdunU5wspqtaKmpgYTJ06E3W5HLBZDc3Mzdu7ciWQyiebmZjz44INcpFJI4eGB9avBYEBlZSVKSkrgdrthMplyEvkQBEEQxUGCiyAKwAzcxsZGPPDAA2hqauJGhtPpxEUXXYSrr74akyZNgsvlgsFgQDQaxY4dO/D0009j6dKlCIfD+Oijj3KSNuSjFybZbBZLlizB559/zj0wdrsd11xzDW644QbU19fn1MkRBAHRaBTr1q3DE088gTfeeIMb3Zs3b8ayZcswffr0YVnzwkQCmwF/88038fTTT6O7u5sb/uXl5bjyyivxve99DzU1NXA6nQCAaDSKjRs34rHHHsPy5csRjUaxatUq7s0rdD694Hvvvffw0EMPcXEDALW1tbj22mtx2WWXYfz48TyRRCqVQldXF9599138/ve/R1tbG1RVRTKZxBNPPIG6ujr84Ac/OOD+Y+OmtrYWDz/8MERRRCaTwe9+9zs88cQTvJ+mTZuGxx9/nK+RURQFlZWVQ/IiGI1GngBlyZIlePTRR3mfK4qCuro6XHfddZg3bx6qq6tht9u5VysYDOKNN97A73//e3R0dPAkCX/+859RV1eHq6++GiaTaUjCU58QRBAERCIRPPLII/jkk0+QzWb5sRoaGnDDDTdg7ty5qKyshMlkQjqdRigUwvvvv4+HHnoIO3fuRFtb2wHdA+LA8Hq9APZ4P9lzhDIVEgRBFA8JLoLYB+FwGM888wz+9a9/AdhtdHi9Xvz4xz/Gj3/8Y7hcrpysgxaLBVVVVTjxxBPxl7/8Bb/73e8QCoW4mBosCyAL8ZIkCZFIBKtWreIZBCVJwrx583DnnXfC7/fniBgmLlwuF84++2xUV1ejr68Pq1atArA75O7LL79ELBaDyWQ64oaRPmyvo6MDjz32GNra2rgBXlNTg/vuuw+XX345jEYjjEYjD6FzOp2oqanBKaecgv/+7//Giy++yDPXDSa69B46VVWxa9cu3H///eju7uZ9NWnSJDzwwAOYM2cOzGYz7w9FUWC321FbW4vrr78edXV1+NWvfoUvv/ySZ/R78skncfrpp2PKlCkH3B/Mu1ZVVcUNV5fLxftKVVWYTCZUVVVxUcPuNzNsi/EqsH127dqF3/zmN+ju7uZj5sQTT8T999+Ps88+m5cjYP3gdDphNptx4403oq6uDr/85S+xfft2ZDIZRKNR/PWvf8Wpp56KE088Mef+DuX6RVHE66+/jmXLlvHQUEmSMGvWLNx3332YOnUqD5kVBAFWqxUejwc//OEPMXnyZNx666347LPPqA7XEUSftl8vtPSeeYIgCGLf0NOSIAogyzI2bdqEpUuXciNfFEXMmzcP//mf/wmv18vXVDEjlxmKbrcb1113Ha655pocL08hscCMmN7eXuzYsQPAbkPU5/Ph0ksvRWlpKQRhT7Fb/doxxpgxYzBnzpycc/T09PD1PsMBExKrV6/G6tWr+edmsxk33HADLr/8cu7NYaJTEATej36/H7/4xS9w1llncc/NvoSjqqrIZDJ488030djYyPvW6/XiV7/6Fc4991zeh/p1eAC4p+Wss87Cj370Iz6zn8lksG3bNnz44YeDeiiLgZ2DCQX9+jF2L/V/9OGDbPtiYevElixZgo0bN/I1gKWlpbjllltwzjnnwGw28/VUrI9YKCIAnHPOObjxxhvhdDp5fzU2NmLlypV8LWKx6NerDQwM4KWXXkJfXx//7VRVVeHOO+/EN77xDR6yBiDnN2c0GjFjxgzcdtttGDNmzAGvpSOGjr6MAfOEdnV1ob29HZlMhkILCYIgioAEF0Hsg3feeQddXV0AdhuOVVVVmD9/PsrKygDsmbVnxjr722AwoKSkBNdccw1qa2v58QYzEvUGSyaTgcFggNvths/nw4QJEzBx4sS91ijp/8/+zbwjRqORG/asfs6Brj06GNg54/E43njjDaRSKd7eSZMmYf78+Tyle34fsv1FUeRhgGx9V6HrYN6tUCiEN954gxuDgiBg9uzZuOSSS3IM+vxkG+zcRqMRF1xwAaZNm5aTNGXNmjWIxWKHpE/yr0HvsckXYvp/F3MPRVFEf38//vnPfyKdTvOJgDlz5uDiiy/Oqe+mPzYTu4Kwu2bXhRdeiKlTp/I+SiaT+Oyzz5BIJHLCBPeHfox++eWXWLduXU7CkPnz52PGjBkwGo05QpOFzjJMJhPOOussXHzxxTwUlDj86BOptLa2YvPmzdi1axfa29sP+vdAEARxvECCiyAGQdM0DAwM4LPPPuOhTwAwbdo0nHzyyXtluCtEfX095syZkyMo8tF/Xltbiz/84Q946aWX8PLLL+ORRx7BuHHj+HasbayIrr4YLstep88GN5ww472npwerV6/mgoYZ/7W1tUWLwJkzZ+KEE04oaOizxBySJOGrr77Chg0buDfK4XDg0ksvhc/ng6Io+xUKqqqioqICZ5xxBkRR5GufvvzyS/T19Q29I44wmqbhq6++QmNjI+8vm82Gb3/72/B6vUWL74qKipzQQwDYtGkT74Oh1CdjWSiXL1/OE6YAgN/vx2WXXbZXId1COBwOnH/++QXrzBGHB03TkEgk0NLSglAohEwmA1mWEQwGSfgSBEEUAQkughgEQRDQ1taG9vZ27kkSRREzZ86ExWIBUFyYl8FgwMyZM7nRPphxok/j7XA4MHv2bMydOxezZ8/GtGnTYLFY9im2mFG9efNmvPnmm1AUhf8ZTlg7t23bhmAwyI18t9uNk08+uWixpaoqfD4fpk+fXnCRPvtcURRs3LgRkUiE90tFRQWmTp3KPSr64s/6tOh6j6HBYMDUqVPhcDj4dXR3d6O1tfXQddBhQlEUbNq0CeFwmF9PdXU1Tj755H1ed/4fk8mEE088ETabje/T3t6OlpaWnHG4P9j9SqfT+OKLL3KyFp5wwgloaGjg90rv4RzsOKqq4oQTTsDo0aOHfULheIFlV7XZbLDZbDkFkQOBAKXoJwiCKAJKmkEQg6BpGrq6utDd3c2NSkmSMH36dBiNxqKzc4miiPHjx8Nms0FRFF5vSA87DvPI6I8tSRLP5JbNZjEwMIBYLIZkMolQKISOjg60tbVhx44dWL9+PRobG/kxh3uNiz6BRTwe5x4oh8OBE044oeg+ZGt9amtrYbfbEY/H99qGHSsWi2HTpk38XKqqwm63I5FI8LT5xaCqKsxmM6xWKyKRCIDd4ZkshfvRTCKR4OOACXOHw4FwOIz29vZ9iho9THg6HA4MDAxA0zSk02l0dnbyCYJi7h/7/QwMDGDr1q05972+vh42m20v4TZYQg62n8vlQm1tLdasWVNUfxAHj6ZpMJvN8Pl8aGlpgSiKMJlMcDgcw900giCIYwISXARRgGAwiHQ6zf/vdDrhdDpzPCT7g2Xcc7lc3HAfDJYwgoW8sRTygUAA27dvR2NjI7Zs2YL29nb09vYiHA4jFAohlUrx9OX6tT+FEnQcSphHggmbwVAUBeFwOEdoejwe2O32IZ+vvLwcVqsViURiLwOdhaOlUikuklk/Njc345ZbboHZbN7vOfTrjeLxOKLRKD9XOp3GwMDAkNt9pEmlUujp6cnx+m3fvh233HILTCYTgOLqaImiyMeZvmzBwMDAXuvf9gXbtru7G7FYjHtmWf01liAlf5/BjsMyOZaVlVEo2xGC3T+DwQCPx4OBgQFYLBb4fD44nU5Yrda91gQSBEEQuZDgIogCRCKRHCFhs9lgtVoBDG39Ckt5XkgAMWOGeWVkWUYoFMKbb76JZ555Bjt37kQoFOLJCli4Fwv9Yh4wo9EIk8mEWCzGj3W40BtYhQxftm5HL1pYKnSj0Vi0Yca8dSyV+2Dn02cBjEaj/P+apiEQCGDVqlVD8sbo18axkCpVVY+J8Kn8Pgd2Tx588sknvP+KDcdjfcBEvCzLPOvlUO4fE7DZbJb/ppgBr99usH/nwzx2xJFFEAR4PB7YbDaefEb/O9PfM6rPRRAEkQsJLoIoQCKR4P9mBr/VauXeqGKMCrbNvrZjXghgt7Hc2NiIRx55BG+88QYP5dJnqWNpvyVJgsViQU1NDSZMmIDTTz8d0WgUDz30EPeWHS6Y0GMeuULXxwrnMq+gpu0u5Mw8LUOBXU+hfmf9GI/Hc7x9+jYXg6ZpvB4YAH6vVVU94LTwRxKWUU6/LgrILSUwlCLY+n3YfWd9UiyapiGZTPL+Y4KPFeQuZnKACUVBEIYU1kscPPqxxDxa+jWPwODZNQmCIIjdkOAiiALow970tYSGYkywtOjJZHKf6cyZINm0aRN+/etfY8WKFbzmFFs/UVlZierqajQ0NGD06NGoqalBdXU1qqqqUFVVBafTiaeeeoqLrcGKLB8qBEFANBpFOp3eZ39IksRFqt7LNVRjLGUi3wAAIABJREFUHQCi0Sgymcw+k2awlOZ6QVBfX49zzz03J9teIZgQYOKOzeIrigKTyYQZM2YU3e7hQhAEWCyWnAQZkydPxrnnnguz2Vx0wov8yQImeKZNm8Z/C3ovx/6OwxKWMOM9m80iEAgM+foURcmZDCEOL+z+5XtF2X1n2VFNJlNOyQESXQRBEHsgwUUQBXC5XDlGBgun0nsMCqFfCxSNRhGLxQp6nZiBkkql8OSTT+LTTz/NSe1+8sknY/78+Zg5cybGjh0Lq9UKo9EIg8GQs/5FX6B0XyGM+vbp/+jbUmh7PbFYjHuCCmVflCQJTqeTfyaKItLpNC+eW6xRpmkaIpEI7/9CSRZYuBkTnJqmoaamBj//+c9RXl7Oj6XP8Kg/B9uPiRUWFsmOdThF7KGCJSYB9oRGjh07Fj/96U9RUVFRlNeVwfpZvx6Mibli+4Lta7Vac/bJZrPo6ekZ8vVlMhmehZI4/BT6fWcyGQwMDCAYDCIWi6GiogLl5eVDWt9HEARxvHD0Ww8EMUy43e4cwRWNRvdaG5NvVOi9OMzYbW1t5Vn6CgkTQRDQ1NSE5cuXI5lM8mPMnDkTCxYswFlnnbVfA5eJAxYSty/yBZe+6O3+YMIkEAjw4sL7ahPzFLK+DAQCSCaTXFTuD0EQkEql0NraWvB8rK9NJhO8Xi+APV4qlkBCn958MMHF9tG3iQmMYuuuHQ2wPtAbym1tbRBFka9BLKbf2X3Wh88yIco8ssXeP03T4PF4uLeTHauvr4+vQWTbsnMXujeZTAbNzc1F9wdx8OTfi2QyiZaWFgQCAciyDFmWYTKZUFJSwj2ZBEEQxB7oqUgQgyAIAsrKyuDxePj6klQqhV27duV4P/LRf8fSaH/wwQdcbA22DzNOvvzyS566nImH6667DmeeeWZRBkw6nUZPT88+M9CxdRcAcooAy7K8z9pd+YZwNBrFjh07cozlwfYxGo0YNWoULBYLF3T9/f05xW/3h6Io6O/vx5o1awomA2HHttvtaGhoyBFIoVAIwWBwL7FQKDSRnTOdTqOtrQ27du1CU1MTmpqajok1XHa7HePHj88R0KFQCP39/XybYsSjpmnIZDJoaWlBc3Mzmpqa0NbWxr2axa4RZH1dWlqKyspKHl4IAE1NTYhGoznbFvqdsBIJgUAAzc3NZNQPI4Ig5HiqDQYDYrEYEonEMTU5QRAEcaSgNxZBFKCqqgpjxozhhmUmk8H777/PvTODwYxctv6qtbUVq1atykn4kA/zJHR1dUGWZe5t8vl8mDx5MoxGY1HGZTwex5YtW/a5jd6rxVLcMwM3Ho8XrHGVbwh3d3dj/fr13FOxr/ZNmDABZWVl/BiRSATvvfde0VkUJUlCY2Mjvvzyy4KGPmub0WjElClTYLVauWEfCoWwcuVKAHsM+kL3j4UOapqGV199FZdeeikuuugifOc738HPf/5zdHd3F9Xm4cRsNmPy5Mm8vhUTyKxuVbGeTFVVsXjxYlx66aW44IILcMkll+CnP/0p+vv7oShKUWviAPASBQ6HAyeddBL3xAJAY2MjVq9eneNxLWSsszDGFStWoK+vb9gLex+vsDWlJSUl/LckyzLi8TjC4TB/9hEEQRB7IMFFEIOgaRpKS0sxefLknHC7lStX4l//+ldBw5B9LkkSIpEIXnzxRbS2tvKwvX3BPE7MkBRFkaeJL2bG+IsvvsDatWv3e13sj9/vz2lTf38/D78b7LqYuEqlUnj77bfR1NRUVIrx0aNHo66ujm+XSqXw7rvvor29fb/XBAC9vb144YUXEA6H95kdj3lSTjrpJIwbNy4no+PixYvR3d29X0OQecF6e3uxePFifPnll9ixYwc2b94Mr9cLl8tVVJuHm1NOOQVjx47lYzcej+OVV14ZUvHnzs5OLFq0CI2Njdi1axe2bt2K0tJSWK3WIdV5Y31uNptx9tlnczEsCLsLVb/yyis5mSULIYoiurq68M477/BaYMSRh/W7y+WCw+GA0WiEx+PBqFGj4Ha76b4QBEEMAgkugiiAJEk4//zz4ff7Aez2frS0tODZZ59FR0dHjqck3wuUyWTw9ttv4+WXX+bFk5kgGCxBRX5tIUmSEAwGuVjTJy8AcsVZNpvFli1b8MQTT6Cjo4Mnj9CnYmdt1e9fXV2d46WIRqNYsWIFkskkz0Knvz5ZlqGqKjZs2ICXXnoJ8Xg8J8NiPmxfj8eDiy++mIs7VVWxceNGPP3004hGo7yNzOvB2qlpu2s3vfDCC1i2bBmv4bSvUEBBEFBdXY2LLrqIC1ZN0/DVV1/hzTffRDabhSzLvKZU/jFUVUUmk8FLL72E5cuX86x6Pp8P55577jEhuDRNw6hRozB37lze55qmYcOGDVi2bBmvo5WfNZJdP7B7jc7LL7+Mjz/+mAtlt9uN8847D06nc0hGNTu2KIo444wzMHHixJzvPvroI3z++ec8PI2NPTbRoL8vr732Gj755JOiC48Thx42bqxWK6qrqzF27FjU1dVh9OjRe6171W9PEARxPEOCiyAGgXmpZs6cidNOOw2CIPC6UwsXLsQDDzzA13PpvUasaPGLL76I++67Dzt27ACw/xTJqqqioaGBJ3Zg9av++te/orW1lRstTPSwUEBZlvHJJ5/gtttuw3vvvccXsDPvTiaT4cYrEw/A7mLMY8eOxahRo3j7FEXB888/z0UXC29kwktRFKxduxZ33XUXGhsbeYhXNpsd9PqYUBRFEeeddx6mTJnCBWcikcDjjz/+/9u78+AoyvQP4N+ZyZy5M8kkgSQQroAsK7jIKYRDKVRKcUGgEKVUWE+03EWWrV1+qFAgrgcqJiAr4rGKq6xatR6sLBoQAgJGDHKGM/c1SSaZydz9+4Pq155hQgIkJDDfT5Xl9EzP2z09k5f36fd9nxfr1q1DVVUVPB5PQHZAr9eL8vJy5OTk4KWXXkJtbe152SGDjyk39EwmE+666y707NlTBG82mw05OTn47rvvRKAlfza5YS9f8w8++ABr1qxBfX29SH0+evRoZGdnXxV37yVJgtFoxMyZM9GtWzfxW7HZbFi9ejW2b98uepSUvxX5GjQ2NmLjxo3Izc0Vi0hLkoSJEydi9OjRIohr67WQf6/yvMiZM2eKDKB+vx8VFRVYsWIFfvzxR7jd7oC1uuTvz+12Y/PmzXjllVdgtVrF69Q55OG6FosF3bt3R3R0NPR6vfhOlHXi1fA3Q0TU0TTPPPPMM519EkRdjdwIjY6ORmpqKvbt24eqqipoNBq4XC4UFhbi+++/R01NDWw2GyoqKnDw4EFs2bIFK1aswDvvvIOSkhJoNBqYzWYA59JgA0BCQgJmz54Ns9ksGiNerxfR0dHYu3cvzpw5IwKT06dP48SJE4iLi4PJZILRaITD4UBFRQXy8/ORk5OD559/Hvv27RPDIOXAUC5j6NChiIuLg8fjgV6vF88bjUYUFhYGBE+1tbXYuXOnyMbY1NSE4uJiFBQU4O2338bKlSuxf/9+qFQqZGRkiPWUJElCbGwspk2bhoyMDAC/9uj5/X4kJSUhMjISu3btEmsouVwu5Ofn48cff4TdbofVakVVVRV++uknbN68GatWrcKHH34Im80mMqC5XC4RJPTu3Ru///3vERkZKYIKuTckPT1dBIjywsuVlZXYtWuXKM9kMomersrKSuzduxerV6/Gyy+/jOrqahEsdu/eHStXrsSgQYPEb6M9+Hw+5OXlYefOnSKg7tevH+6+++6AdP9KdrsdmzdvxqlTpwCcCzqys7Mxbtw4AL/eKPB6vUhLS4NarUZ+fj6cTifUajUqKiqwZ88eOJ1O6HQ66PV66PV6uFwulJeXY8+ePXjllVewZs0a1NTUiAZzz549sWLFClx33XUB10D+v81mw/vvv4/q6moA5zIl3nLLLbjxxhsDGt2SJKF///44evQojh49KgL9kpIS7Ny5E263W3wvPp8PDQ0NOHbsGN58802sWLEClZWV0Ov1SExMFMGgWq3GuHHjMHbs2Hb5XujClD3ucvCt/PtTzhOV97/Y9QuJiK41TAtPFIJ8V97v92P48OF49tlnsXTpUhw6dAhqtRrNzc3Yt28fDh48KBb8dDqdItuf3KOUlZWFBx54ACtXrmwx2Ybci5KcnIxZs2bh0KFDKCsrE2tCffHFF9i9ezfS0tIQGxsLl8uFuro6VFdXo76+HsC5Bs+oUaNw//33Y+XKlSgqKoIkSaiursbTTz+NuLg4TJgwAYsXLxbD4qKiojBr1izk5+fj6NGjosF09uxZrFq1Crm5uWLIobx4sxyEZGZm4rHHHsOGDRvwyy+/hLyGcgNL7t24++67UVFRgdzcXJSUlMDr9cLhcGDr1q3Iy8uDTqcDALHWltPphFarhUajwa233oqsrCy88cYbAUMdZcpha3Jjfe7cuaiursY//vEPkaHv9OnTWLVqFd555x10794dBoMBHo8HdXV1KCsrg81mE+nHJUlCSkoKlixZglGjRonvqauTs8b5/X7ce++9KC4uxsaNG1FbWwu1Wo0TJ05g+fLl2LBhAxITExEVFQW/34+mpiacOXMG9fX1AclbLBYL/va3v2H48OEBCxe3tQGtbIBLkgSz2YxFixahtrYWeXl54vs6fPgw/va3vyE5ORlpaWkwGo2w2+0oLS1FTU0NXC4XNBoNJk+ejL59+2LVqlUdfCUplOCeK2Ww5fF4xBIYCQkJF5xzSUQUThhwEYUg33lXq9XQ6XS47bbbEB8fj5UrV+KHH35AY2MjJEmCw+GAy+UKSAev0+nEcMSnnnoKcXFxYh6XRqMJGNonN1zkRssdd9yB8vJyvP7666ioqBDD9aqqqkQqdbmBKr8nISEBkydPxuOPP46srCxs3boVJ06cAHCu56yoqAgajQbp6enieHJAOHr0aDz++ON48cUXcfbsWVGmx+MRQ7fkY8qfMSsrC08//TRGjx6N9evXi0BH2cMU6jPqdDo89NBDSEtLQ25urhhCJs9Hk6+RksFgwKRJk/CXv/wF+/btEz1SwXPhlHPJ5KArNjYWTzzxBIxGoxiaKffIFRcXo6SkRJyv8m68PFxq0KBBeOyxxzBt2jRERER0aLAlByPyZ7nQUKzgHqPg+X3Ar72L8fHxWLhwIWJjY7F+/XqUlZWJ7/f06dM4c+ZMwM0F5XpYarUagwcPxiOPPIIZM2YEzAdTnnPwsYMDLPlclQtzDxo0CMuXL8ezzz6LvLw8Ma/M4/GgrKwMpaWlAfur1WpotVpMmDABixYtwr59+1ocWkodK9TfntPphNVqhdVqhc1mg8FggMlkCsiUSUQUzhhwEbVA2cDU6XQYM2YMevbsiS+++AJffvklDhw4gMbGxoA5QQaDAf369cPNN9+M6dOno3///ti5c6doOPr9fhGQKXsK5N6T2NhYPPjgg4iPj0dOTg6OHTsmgi552J/c8xUTE4M+ffrgvvvuw5133omUlBSo1WosWLAAJSUlKCgoEAkwIiIixBwLOX06cC5z3D333AOLxYLc3FwUFBSIYFJuRMsBTGJiIm688UY8+eSTGDVqFKxWK+Lj42E2m+H3+xEXFyfWV1IGMXIwJgdB06ZNw29/+1t8+umn2LJlC06dOiWuo/z+qKgoZGVlYcqUKZgxYwaSk5ORl5cnroU8JDK40a2cQ6LRaGCxWLBgwQJkZWXh3XffRX5+PhobGwOSgSjfKw9XGzt2LObPn4+RI0e2Of35xZIkCQaDAXFxcSLAlxOntDT/RQ6i5IWNIyIiYDKZRADu9XpFr6AsJSUFCxYswIABA/DWW2+JGwbyvDzlukmSJEGr1SI1NRUTJ07EnDlzMHLkSNH7GHy9lQsjm81mxMfHQ6PRwGg0iu8y1Ny7iIgIDB06FC+88ALeeustfPTRR6ivrxeJUZSfXavVIjo6GnPmzMH8+fPRv39/HD58WKQl12q10Ov1bNh3Avl6l5eXo7i4WHx3AETgFbwvEVE4Ukns7yc6T3CDNziLm9VqRXFxMYqLi1FeXi7mGFksFmRkZCAxMRE6nQ4qlQr//e9/ceedd4qhcMOHD8fHH3+M7t27A/h1jgPwa3Dicrlw/PhxfPXVV9i1axfKy8vhdDphMBhgNpvRo0cPTJw4EUOHDkW3bt0QERERsKDvkSNHsG3bNhQWFgIAEhMTMW7cOGRnZ58XQMi9PrW1tdi3bx927dqFsrIy1NXVQZIkmEwmDBw4EMOHD8ewYcMQFxcneiOOHDkCrVYrhrFlZGTAYDAE9DoFX1eZ2+1GbW0tTp48idLSUtTV1cFoNCI2NhYZGRno1q0bEhMTxTX6+9//jqVLl4o5Y/fffz9eeuklEbC09D3K5DlK27Ztw88//4z6+nq43W4YjUYkJCQgISEBgwcPxuTJk9GvXz+R/rwjGoryb6m6uhrV1dXQaDQi4OrZs6f4HoOvn9vtRnFxMex2u3gtISEBFovlgsks5OQT1dXV2L59O3bs2IFjx46htrYWDocDUVFRiImJgcViwfXXX4/JkycjMzMT0dHRIlhuqVy1Wg2Px4NTp06JhbDl4Zjx8fEhk1soA3q73Y6CggJ88cUX2L9/P2pra+FyuRAdHY2EhAQMGTIEU6ZMwYABA8Rvr66uDiUlJdBqtfB6vUhJSUFSUhIb9Z2kurpa3BwCzvWsp6amol+/fucF3kRE4YgBF1EIwWmn5VTVOp0uYBiaMiBTDsmSG51+vx/vvfce5s+fLxJZTJo0CZs2bUJMTIxozMqU5cjHaG5uRmNjI9xuN/R6PUwmEwwGw3lD3JRlycMGlb1iKpVK9Kwp3yPvL/f6qFTnMjK63W6o1WpERESIJA7KXih5XwDiefkc5Ia4MgOefF2Cr6t8HeVrrGzcy9fB4/Fg4cKFWLNmjfg8ixYtwpIlS2AymUI25pTZHJXPyclAbDabOO/o6GhERkYGXJ+OHrKm/B0pfzvB32Oo98mBjbyPcr+WglzlUFK/34+GhgY4nU44nU5ERUVBr9fDYDCIgFz+HpS9YC2VLQfYyt4pv98fsndQ2fupfOzz+eB0OtHQ0BAQBOr1epFRUj6+MiBVDsNk5sLO4XA4cPToUVitVvG9xMfHo0+fPjAajQCYVZKIwhuHFBKFIDfgmpub4XQ6RYNPzuoWKkhQDqdT3vk/ePBgQI9P9+7dERkZGRAQBM/hUb5mNBrFMZWBWHBjXA505Oc1Gk3Aos3y5wr+nPL5KntI9Ho9dDpdQODp8/lEb5Yy0AQgkjQEz+9RXkeXyyU+k8FggNFoDGiwKwMI5XH9fj/q6+tRWloqeoK0Wi0yMzNbHO6nvI7B801UKpVYtFXZi6QMCpWLT3cESZLEb0T+zBdz70v+3MpslMHBsEwOmuTrJj+XkJAQcD7K36AyUFXOybrQ55H3BX4dhqr8XSnPJ3g4rbxmWlRUVMB6dMFz2pTXSA4eQ31murL0ej2SkpLETSGLxYKYmBgYDIbzbnoQEYUj/ktFFILcQPjoo4+Ql5cH4NxwrgEDBuCJJ55AVFSUaATKQUhwA1WSJNTX12Pv3r1i22AwYMiQIQGNUGUwFNyolY8hNyqVw7uCG7kAzktsoNRSg1luHIfaX56fIz8O9d7g1+Vjy8Foc3MzcnJyUFhYCI/HA61Wi1GjRmHevHnic8mNZ2W58jmo1WqcOnUKR48eFY3zpKQk9OzZUwR6oc4t+HoqG+7BrwfP/+nobITK7zSUCzVQlecp9yq2Vp4c0MiU31VLwVRbgk1lcB/Kha6j/H3In0FZnvLc5HMJTirCQKvrkAN4uffdYDBwCCERkQL/xSJqgSRJKC8vx7///W84HA5IkoRevXph0qRJGDp0KIDA7HLBvTtutxtff/01Dh48KO7my3NSgnu0WhLc6A0OIFoSqifrUrVWVkvbyqCpsLAQmzZtEj0yJ06cwK233irW7JIXUJbn5MhDGP1+PxwOBz7//HOcPHlS9PD17t0bAwYMABC6Ud/S523p+nW1xuHFnE9bhj625XrI2+3527nQMS/U89raubVlf7pyVKpzSWyUiWzkeYMMjImIAA6qJgpB7lkZPnw4oqOjAZwbxnXmzBls2LAB5eXlYgidclicPPTQ6/Vi69atyMnJgc1mE8P7brnlFvzmN78JSCN/rZKvj06nQ3Z2tshYptFoUFhYiA8//BBNTU3i+imDLeBcr5fT6cT777+P999/X6QO12q1mDp1KpKTky96KB4RdQzlvDxlr7fb7ebfKBGFPc0zzzzzTGefBFFXI/euREZG4tChQzh27JgIkk6dOoWioiIxoV8e5uf1elFbW4tDhw7hn//8J1atWoXjx4+LOVI33HADFi9ejF69erWaGOFaIA/1U6vViIqKwtatW2G1WuH1euHxePDLL7+grKwMcXFxYq6ZWq2Gw+FATU0NCgsL8cYbb2DNmjWoqqoS12z8+PFYvHixyE6oTKZARJ1DObdUXtS8srISFRUVYh4qEVG4YpZCohCUE/q//vprLFy4EEePHhU9WFqtFhaLBb169UJycjKio6PhdDpRX1+P48ePo7S0FE6nUwRpKSkpWLZsGWbPnh2wNo3sWgy6lFn4PB4PcnNzsWrVKtTW1orXdDodunfvjl69eiEpKQkmkwmNjY2oq6vDkSNHUFVVJVJNq9VqZGZmYu3atbjppptCZhQkos4hJ4FxOBwoLS2F1WqF2+2G3+9Hjx490KNHD94YIaKwxYCLKARldjuHw4FPPvkEL7zwAo4fPy6Gy/h8PrGfMrObMjmDSqVCeno6Fi1ahOnTpyM+Pj5s5zTYbDasXr0aubm5sFqtooEmJ9cIRU4QEhERgSFDhuCpp57CnXfeKRbiJaKuQ5Ik2O12HDp0CHa7HcC5QMxsNmPAgAEBvVxM409E4YRDColaIAdOGo0GgwYNwu9+9zs0NzejsrISNptN7KdMp65M4GCxWDBhwgSsWLECU6dORXR0dIsZ9cKBTqfDiBEjMGDAANTU1KC6uhoej0ekYJcp1+HS6/Xo0aMH7rrrLixZsgTjx48PSOVORF2DclkFu92OxsZGkeXU6/UiJiYmIKlGa0sNEBFdS9jDRdQCOWue8k/EZrPh2LFj2L59O/bt24eSkhLY7XZIkiQWJU5JScGwYcOQnZ2NzMxMREVFiZ6c4IWHw4nc8FKr1WhoaMBPP/2EHTt24MCBAygvLxeT6yMjI2EwGJCeno4RI0Zg5MiR6N27t1i3i8EWUdejrCerq6tRVFQEt9sNg8GAyMhIpKWlIS4uTuwTrvUgEYUnBlxELVAuKqtM3y5nIXS5XLDb7bDb7fD5fDAajYiMjIRer4dWqw1YZFZeANbr9ba4WG84CF7w1+12w+VyweFwoKmpCR6PBzExMYiMjERERASMRqOYNyf3fDFJBlHXJUkSXC4Xzp49C5VKhcTERPH3rFy4HWDQRUThgwEX0UVoad2s4IVbg/dTZvCic4LXLWvp2rS2VhkRdR3y36vH4xHzL5VBFsBAi4jCDwMuIiIiajfKmyRy7z5vnBBROOO4HCIiImpXyiQa8lBim80mshfyXi8RhZPwzE9NREREHUI5tNrtdqO+vh51dXWw2WyIjY1F7969w3Z5DCIKT6zxiIiIqN3IvVcejwfFxcUoLy8X6xb6/X40NTUFZCwkIrrWcUghERERtRvlGoZqtRper1cs6eB0OmG1Wltc7JyI6FrEgIuIiIjalVqthkajQVJSEvR6vQiwfD4fnE4nvF5vJ58hEdGVwyGFRERE1O4kSYLJZEJMTAx8Ph9MJhPMZjPMZjPncBFRWGFaeCIiImpXkiSJVPA2mw1OpxORkZEwGo1i4XKmiSeicMGAi4jajVyd+Hw+qNXqgEWN2bgiCh/KdbeCHwdrbfFzIqKrHQMuImoXfr8fKpUKTU1NKCsrg8lkQnx8PEwmk7ijTUThSZIkUUcoAysGWUQUDjiImojahUqlgs/nQ2lpKcrKyuD3+xETEwOz2Yxu3brBaDR29ikSUSdRqVTQaDTw+Xxwu92orq6GJEmwWCzQ6/ViHyKiaxEDLiK6bHJHeV1dHaxWK9RqNdRqNWw2G9RqNVJSUjhkiCiMSZKE5uZmVFRUoL6+Hg0NDdBqtdDr9UhOTu7s0yMi6lAc50NE7cLn86GhoQEej0cscqrVapGQkACj0Rhy7gYRhQeVSoXm5maUlZWhoaEBarUaLpcLDQ0NYp0uIqJrFQMuIrpoysaR/FitViMpKSlgiJDRaITFYoFKpeI8LqIwJkkSjEYjTCaT6OlWq9WwWq1wOBwMuIjomsYhhUR00eSsYsphgiqVCtHR0cjKykJ9fT2qq6sRFRXV5rlbW7ZsQXNzMwDg+uuvR2ZmZsDrx44dw6FDhwAAMTExmDBhQjt+IiLqSCqVCgaDAfHx8bBarWJOl8FggM/nuyoDLtZZRNRWzFJIdJWx2+0oLi5GTU0NrFYrdDod4uLi0LdvX5jN5ityDsHzseRqxO/3i3TwXq9X9Gy1Ze5WWloaSktLAQCvv/46Hn/88YDXly9fjiVLlgAABg4ciIMHD7bXxyGiDmS323H27FnU1NSguLgYdXV1SEpKwuDBg5GRkXHVJs1gnUVEbcUeLqKrQHl5OdatW4etW7fihx9+gMfjCblfRkYGbr/9dsydOxfDhw/vsPNRBlxerxc+nw9arRYajUa8HhERAb/fH/I9RHRtu5g667bbbsPcuXMxYsSIK3yWRERXBgMuoi7MZrNhyZIlePPNN+F0Olvd/+zZs8jNzUVubi4mTJiAnJwcZGVltft5KRcxra+vR21tLcxmM2JjYxERESGCq/act5WYmCg+S69evULu43a78cEHHwAA7rjjDiQkJLTb8YmodZdSZ61duxZr164NqLOuhRs0rLOISMYhhURdVFFREe644w4cPnw44HmdTocRI0YgLS0NZrMZTU1NqKysxJ49e1CWEbuEAAALCElEQVRbWxuwr16vx8aNGzFr1qwOOUeXy4UTJ06gsrISOp0OsbGx6NatG+Lj4y+6sdTa8Jy2yM/Px6hRowAABQUFGDx48EWXQUSXpr3qrLfffhszZ87s8ol2WGcRUVuxh4uoCzp9+jRGjhyJmpoa8VyvXr3w7LPP4q677kJkZOR57/H7/di5cyeWLl2Kb7/9FsC5gGj27Nnw+Xy455572vUcJUmCz+eD0WhEWloaVCoV/H4/XC4XvF4vtFptux6vLXbv3n3Fj0lEl15n7dixA//3f/+H7du3AzhXZ91zzz3w+XyYM2fOFTv/zsI6iyg8dO3bR0RhyOl0Yvr06QENlzlz5uDw4cOYM2dOyIYLcC7F8pgxY7Bt2za88cYb4u6wJEmYN28eCgsL2/U8VSoVTCYTMjMz0bdvX/Tp0wf9+vVDampqpwRbALBnz55OOS5ROLucOis7Oxt5eXnn1Vnz589v9zqrK2KdRRQe2MNF1MW8+OKL2L9/v9ieM2cO3n333Ysaovfoo49Cr9dj3rx5AM41iB599FHs2LGj3c+3LSRJwokTJ1BeXg6tVovU1FRkZGS0+xwN3i0muvJYZ1061llE4YE9XERdiMPhwKuvviq2MzMzkZOTc0n/yD/44IOYPn262P7+++/FUEOlpUuXIjExEYmJiZg8eXKbyk5LSxPv+fTTT1vcz+12Y/ny5cjIyEDfvn0xduxYjBw5Ej179kRmZiaee+45uN3uNh3z5ZdfFsccM2aMeP6tt94Sz585c0Y8P378ePH8sGHD2nQMIro4rLNaxjqLiGTs4SLqQjZt2hQwLGfRokWIjo6+5PKWLVuGzZs3i3Wy1q5di/HjxwfsY7fbxcT1+vr6NpVbU1MDl8sFAOL/wZqamjBx4kT88MMPIV8/c+YMli5diq+++gpfffVVqxPkHQ6HOM+6ujrxfHNz83kT74M/S1xc3IU/EBFdEtZZLWOdRUQyBlxEXcj//vc/8dhkMuHee++9rPL69++P8ePHY9u2bQCALVu2wOv1IiKi4//077///oCGy8SJE/GHP/wB/fr1Q3NzM37++WesW7cOu3fvxmOPPSbW8LpYw4YNw9KlS1FfXx9wp/2hhx5CSkoKADDVMlEHYZ118VhnEYUfBlxEXUheXp54fOONN7Y42fxiTJgwQTReGhoacPDgwQ5PPbxz50588sknYvuRRx5BTk5OwD4jR47EvHnzMG/ePGzcuPGyGi/Dhg3D6dOnAxovDz/8MFMsE3Uw1lkXj3UWUfjhHC6iLqKpqUms6QKg3cbwDx8+PGA7eI2cjrB+/XrxOCkpCS+99FLI/TQaDdauXYuMjAz4fL4OPy8iaj+ss1hnEVHbMOAi6iKsVmvAtjy05HIFl1NRUdEu5V7If/7zH/F45syZMBqNLe6r1+vx0EMPdfg5EVH7Yp1FRNQ2DLiIuojgxkt7TZqOj48P2G5sbGyXclty9uzZgAnhN910U6vvmTRpUkeeEhF1ANZZRERtw4CLqIuQs3LJ2mu4SnA5Hb0o8ZEjRwK2+/Tp0+p7BgwY0FGnQ0QdhHUWEVHbMOAi6iKioqICtpVphC9HcNrk4LvH7S043XFycnKr74mMjDzv8xNR18Y6i3UWEbUNAy6iLiItLS1gsdDi4uJ2KbesrCxg22KxtEu5LWlqagrYNhgMbXpfe2Q3I6Irh3UW6ywiahsGXERdhNFoREZGhtjevXt3u5S7d+/egO0bbrihXcptid/vD9hWNsguxOv1dsTpEFEHYZ3FOouI2oYBF1EXMmbMGPH4p59+QlVV1WWX+d1334nHFosFPXv2vOwyg+duKAXf9W1ubm5TmXa7/bLOiYiuPNZZREStY8BF1IVMmTJFPPZ6vQFrw1yKoqIifPvtt2J7+vTpl1UeALjdbrjd7hZfj42NDdhuSwOsqqoKTqfzss+NiK4s1llERK1jwEXUhUydOhWJiYlie/Xq1aisrLzk8p577rmAO7sPP/zweftoNBrx2OFwtFpmUVHRBV8PzvB18uTJVss8ePBgq/sQUdfDOouIqHUMuIi6EL1ej8WLF4vtmpoaPPDAA5eUbnnz5s147733xPaMGTMwaNCg8/ZTZtqqqalptdxvvvnmgq/37ds3YNL5zp07Wy3zyy+/bHUfIup6WGcREbWOARdRF7NgwQIMHjxYbH/55ZeYPn36RQ1f+fjjjzF79myxHRcXh1dffTXkvunp6eJxeXk5SktLWyzX4XDgtddeu+CxIyIiMHHiRLH9r3/964LDeRoaGrBhw4YLltkWwRPd23Lnm4guH+usS8M6iyh8MOAi6mJ0Oh0+/vjjgFTIn332GQYOHIiPPvrogg2BX375BTNnzsSMGTPEfkajEZ999hlSUlJCvmfYsGEB288//3zI/dxuN+bOnYszZ84gLi7ugp9hzpw54nFZWRn+/Oc/h9yvubkZs2fPRl1dHXQ63QXLbI3JZArYPnDgwGWVR0Rtwzrr0rDOIgofEZ19AkR0vj59+mDbtm2YMmUKTp8+DeDcvIJZs2YhOjoa48aNQ0ZGBsxmM5qamlBZWYldu3bh1KlTAeUkJCRg06ZNyM7ObvFY1113HYYMGYKCggIAwJo1a1BdXY0ZM2agW7du8Hg82L9/P3JycnD8+HEsXLgQeXl5InVzqOxfM2bMwAsvvCDKXL16NQoLC/Hggw+iV69ecDgc2L9/P9atW4eioiLcfvvtqKiowP79+1ssszVJSUkwm81iEdO//vWvsFqtSE9PR2lpKe677z507979osslotaxzmKdRUQXIBFRl1VXVyfNmzdP0mg0EoA2/6dSqaSpU6dKZWVlbTpOfn6+pNfrWy33tttuk9xut5SdnS2ee+edd0KWefLkSSk1NbXVMnv37i1VVFRIY8eOFc+9+OKL55W3bNky8frAgQNDHvOPf/xji8cpKCho+4UnokvCOutXrLOISMYhhURdWFxcHNavX4/Dhw9j8eLFuO6661pclDMiIgJDhgzBn/70Jxw5cgSffvopUlNT23ScESNGYPv27Rg1alTI19PT07Fy5Up8/vnn0Gq1AZPWW1qLJjMzEwUFBbjvvvsCJqTLYmNj8fDDD2P37t1ITk5GfHx8q2W2ZtmyZZg2bdp5z+t0usse/kNErWOddXFYZxGFB5UkXUI/OBF1mvr6epw8eRLvvfceVq9eLZ7/9ttvMW7cuMsuv6ysDAcOHEBdXR1iYmKQnp6OQYMGQa2+9PszTU1N2L9/PyorK6HVatGtWzdcf/31IRs17eHs2bM4evQoIiIikJiYiKysLDZeiDoJ66zWsc4iurYx4CK6SpWXlyMtLQ1+vx8AcO+99+Ldd9/t5LMiIgqNdRYRhSsOKSS6SqWmpgYMRfnggw+Qn5/fiWdERNQy1llEFK7Yw0V0FSssLMQNN9wAr9cLALBYLNi8eTNuuummTj4zIqLzsc4ionDEgIvoKrd06VI899xzAc+NHDkSw4YNg0ajQUlJCRYvXowhQ4Z00hkSEf2KdRYRhRsGXERXOUmS8OSTT+L1119vcZ9vvvkGN9988xU8KyKi0FhnEVG44RwuoqucSqXCa6+9hi1btmDy5MkwGo0Br/Xu3RsJCQmdeIZERL9inUVE4YY9XETXGJ/Ph5qaGkiShISEBKYWJqIujXUWEV3rGHARERERERF1EA4pJCIiIiIi6iAMuIiIiIiIiDoIAy4iIiIiIqIOwoCLiIiIiIiogzDgIiIiIiIi6iAMuIiIiIiIiDoIAy4iIiIiIqIO8v8Kq9U8PbrE5wAAAABJRU5ErkJggg==" + } + }, + "cell_type": "markdown", + "id": "c51263ef", + "metadata": {}, + "source": [ + "![2dqed.png](attachment:2dqed.png)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "id": "5274efd5", + "metadata": {}, + "outputs": [], + "source": [ + "qasm = \"\"\"\n", + " DITQASM 2.0;\n", + " \n", + " qreg fields [3][5,5,5];\n", + " qreg matter [2][2,2];\n", + " \n", + " creg meas_matter[2];\n", + " creg meas_fields[3];\n", + " \n", + " h fields[2] ctl matter[0] matter[1] [0,0];\n", + " cx fields[2], matter[0];\n", + " cx fields[2], matter[1];\n", + " rxy (0, 1, pi, pi/2) fields[2];\n", + " \n", + " measure q[0] -> meas[0];\n", + " measure q[1] -> meas[1];\n", + " measure q[2] -> meas[2];\n", + " \"\"\"" + ] + }, + { + "cell_type": "markdown", + "id": "e718e589", + "metadata": {}, + "source": [ + "A new feature is the __control syntax__: _operation_ __ctl__ _quditline_ \\[list of qudit control levels\\]\n", + "
\n", + "We can import the QASM program and construct a quantum circuit.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "id": "356d82c2", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 4, \n", + " Number of qudits in the circuit: 5\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "/home/k3vn/Documents/MQTQUDIT_DEV/MQTQudit/src/mqt/qudits/qudit_circuits/qasm_interface/qasm.py:174: SyntaxWarning: Unsupported operation ignored: creg\n", + " if self.parse_ignore(line, rgxs, warned):\n", + "/home/k3vn/Documents/MQTQUDIT_DEV/MQTQudit/src/mqt/qudits/qudit_circuits/qasm_interface/qasm.py:174: SyntaxWarning: Unsupported operation ignored: measure\n", + " if self.parse_ignore(line, rgxs, warned):\n" + ] + } + ], + "source": [ + "circuit = QuantumCircuit()\n", + "circuit.from_qasm(qasm)\n", + "\n", + "print(f\"\\n Number of operations: {len(circuit.instructions)}, \\n Number of qudits in the circuit: {circuit.num_qudits}\")" + ] + }, + { + "cell_type": "markdown", + "id": "101de68e", + "metadata": {}, + "source": [ + "### Python Interface 🐍\n", + "\n", + "Constructing and manipulating quantum programs becomes a breeze with Python. You have the flexibility to:\n", + "\n", + "1. **Initialize Quantum Circuits:** Start by creating your quantum circuits effortlessly.\n", + "\n", + "2. **Create Quantum Registers:** Build dedicated quantum registers tailored to your needs.\n", + "\n", + "3. **Compose Circuits:** Seamlessly bring together your quantum registers, forming a unified and powerful circuit.\n", + "\n", + "4. **Apply Operations:** Easily apply a variety of qudit operations, without worrying about the right representation. \n", + "\n", + "Feel the comfort of quantum programming with the ease of Python integration. 💻\n" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "9a283781", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 0, \n", + " Number of qudits in the circuit: 2\n" + ] + } + ], + "source": [ + "from mqt.qudits.qudit_circuits.components.registers.quantum_register import QuantumRegister\n", + "\n", + "\n", + "circuit = QuantumCircuit()\n", + "\n", + "field_reg = QuantumRegister(\"fields\", 1, [3])\n", + "ancilla_reg = QuantumRegister(\"ancillas\", 1, [3])\n", + "\n", + "circuit.append(field_reg)\n", + "circuit.append(ancilla_reg)\n", + "\n", + "print(f\"\\n Number of operations: {len(circuit.instructions)}, \\n Number of qudits in the circuit: {circuit.num_qudits}\")" + ] + }, + { + "cell_type": "markdown", + "id": "a23644c5", + "metadata": {}, + "source": [ + "##### No operations were inserted yet, let's take a look at how operations can be applied!" + ] + }, + { + "cell_type": "markdown", + "id": "2dd17aed", + "metadata": {}, + "source": [ + "The size of every line is detected automatically and the right operations are applied to the right qudits" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "id": "0ed0c548", + "metadata": {}, + "outputs": [], + "source": [ + "h = circuit.h(field_reg[0]) " + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "id": "22bd7e9b", + "metadata": {}, + "outputs": [], + "source": [ + "csum = circuit.csum([field_reg[0], ancilla_reg[0]])" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "id": "bc8489ec", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 2, \n", + " Number of qudits in the circuit: 2\n" + ] + } + ], + "source": [ + "print(f\"\\n Number of operations: {len(circuit.instructions)}, \\n Number of qudits in the circuit: {circuit.num_qudits}\")" + ] + }, + { + "cell_type": "markdown", + "id": "52b43bbf", + "metadata": {}, + "source": [ + "\n", + "##### It is possible to export the code as well and share your program in a QASM file.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "id": "b79ad7c3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DITQASM 2.0;\n", + "qreg fields [1][3];\n", + "qreg ancillas [1][3];\n", + "creg meas[2];\n", + "h fields[0];\n", + "csum fields[0], ancillas[0];\n", + "measure fields[0] -> meas[0];\n", + "measure ancillas[0] -> meas[1];\n", + "\n" + ] + } + ], + "source": [ + "print(circuit.to_qasm())" + ] + }, + { + "cell_type": "markdown", + "id": "d67f883c", + "metadata": {}, + "source": [ + "# Simulation 🚀\n", + "\n", + "After crafting your quantum circuit with precision, take it for a spin using two distinct engines, each flaunting its unique set of data structures.\n", + "\n", + "- **External Tensor-Network Simulator:** Delve into the quantum realm with a robust external tensor-network simulator.\n", + "\n", + "- **MiSiM (C++-Powered):** Unleash the power of decision-diagram-based simulation with MiSiM, seamlessly interfaced with Python for a fluid and efficient experience. 🌐💡" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "id": "13be385f", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['tnsim', 'misim']" + ] + }, + "execution_count": 32, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from mqt.qudits.simulation.provider.qudit_provider import MQTQuditProvider\n", + "\n", + "\n", + "provider = MQTQuditProvider()\n", + "provider.backends(\"sim\")" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "id": "ab6d2c80", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from mqt.qudits.visualisation.plot_information import plot_counts, plot_state\n", + "\n", + "backend = provider.get_backend(\"tnsim\")\n", + "\n", + "job = backend.run(circuit)\n", + "result = job.result()\n", + "\n", + "state_vector = result.get_state_vector()\n", + "\n", + "plot_state(state_vector, circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "63baa60f", + "metadata": {}, + "source": [ + "### Extending Engines with Noise Model and Properties for FakeBackend\n", + "\n", + "Enhance your quantum simulation experience by extending the engines with a noise model and incorporating various properties. This process allows you to create a FakeBackend, inspired by the best machines in experimental laboratories.\n", + "\n", + "#### Noise Model Integration\n", + "\n", + "Introduce realism into your simulations by incorporating a noise model. Simulate the effects of environmental factors and imperfections, bringing your quantum algorithms closer to real-world scenarios.\n", + "\n", + "\n", + "#### Creating a FakeBackend\n", + "\n", + "By combining a noise model and carefully tuned properties, you can craft a FakeBackend that closely emulates the performance of the best quantum machines in experimental laboratories. This allows for more realistic and insightful quantum simulations.\n", + "\n", + "Experiment, iterate, and simulate quantum circuits with the sophistication of real-world conditions, all within the controlled environment of your simulation. 🛠️🔬\n" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "id": "3f8d02e3", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'00': 314,\n", + " '01': 0,\n", + " '02': 1,\n", + " '10': 3,\n", + " '11': 332,\n", + " '12': 0,\n", + " '20': 0,\n", + " '21': 3,\n", + " '22': 347}" + ] + }, + "execution_count": 34, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "backend_ion = provider.get_backend(\"faketraps2trits\", shots=1000)\n", + "\n", + "job = backend_ion.run(circuit)\n", + "result = job.result()\n", + "counts = result.get_counts()\n", + "\n", + "plot_counts(counts, circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "0a132d35", + "metadata": {}, + "source": [ + "## Compilation ⚙️\n", + "\n", + "Tailor your quantum compilation process to achieve optimal performance and emulate the intricacies of experimental setups.\n", + "\n", + "#### Compiler Customization with Modern Passes\n", + "\n", + "1. **Optimization Strategies:** Implement specific optimization strategies based on your quantum algorithm's characteristics. Fine-tune compilation for better resource utilization and reduced gate counts.\n", + "\n", + "2. **Gate Decomposition:** Customize gate decomposition techniques to match the capabilities of experimental quantum hardware. Aligning with the native gate set enhances the efficiency of your compiled circuits.\n", + "\n", + "##### Experimental-Inspired Compilation\n", + "\n", + "Emulate the features of the best experimental laboratories in your compilation process. Leverage modern compiler passes to customize optimization, gate decomposition, and noise-aware strategies, creating compiled circuits that closely resemble the challenges and advantages of cutting-edge quantum hardware.\n", + "\n", + "Customize, compile, and push the boundaries of quantum algorithms with a tailored approach to quantum compilation. 🛠️🔧🚀\n" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "id": "8e187e94", + "metadata": {}, + "outputs": [], + "source": [ + "from mqt.qudits.compiler.dit_manager import QuditManager\n" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "id": "58daadf2", + "metadata": {}, + "outputs": [], + "source": [ + "qudit_compiler = QuditManager()\n", + "\n", + "passes = [\"LocQRPass\"]" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "id": "d21fe400", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 10, \n", + " Number of qudits in the circuit: 2\n" + ] + } + ], + "source": [ + "compiled_circuit_qr = qudit_compiler.compile(backend_ion, circuit, passes)\n", + "\n", + "print(f\"\\n Number of operations: {len(compiled_circuit_qr.instructions)}, \\n Number of qudits in the circuit: {compiled_circuit_qr.num_qudits}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "id": "85b295ef", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'00': 311,\n", + " '01': 0,\n", + " '02': 2,\n", + " '10': 4,\n", + " '11': 322,\n", + " '12': 0,\n", + " '20': 0,\n", + " '21': 5,\n", + " '22': 356}" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job = backend_ion.run(compiled_circuit_qr)\n", + "\n", + "result = job.result()\n", + "counts = result.get_counts()\n", + "\n", + "plot_counts(counts, compiled_circuit_qr)" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "id": "a1b22b44", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 5, \n", + " Number of qudits in the circuit: 2\n" + ] + } + ], + "source": [ + "passes = [\"LocAdaPass\", \"ZPropagationPass\", \"ZRemovalPass\"]\n", + "\n", + "compiled_circuit_ada = qudit_compiler.compile(backend_ion, circuit, passes)\n", + "\n", + "print(f\"\\n Number of operations: {len(compiled_circuit_ada.instructions)}, \\n Number of qudits in the circuit: {compiled_circuit_ada.num_qudits}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "id": "5a807930", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'00': 314,\n", + " '01': 0,\n", + " '02': 2,\n", + " '10': 7,\n", + " '11': 349,\n", + " '12': 0,\n", + " '20': 0,\n", + " '21': 3,\n", + " '22': 325}" + ] + }, + "execution_count": 40, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job = backend_ion.run(compiled_circuit_ada)\n", + "\n", + "result = job.result()\n", + "counts = result.get_counts()\n", + "\n", + "plot_counts(counts, compiled_circuit_ada)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "632aca35", + "metadata": {}, + "outputs": [], + "source": [] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "f0304591", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/MQT Qudits in Short.ipynb b/src/MQT Qudits in Short.ipynb new file mode 100644 index 0000000..fd839d1 --- /dev/null +++ b/src/MQT Qudits in Short.ipynb @@ -0,0 +1,391 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "69b78731", + "metadata": {}, + "source": [ + "# MQT Qudits 🌌\n", + "*Discover a New Dimension in Quantum Computing*\n", + "\n", + "Embark on a journey with MQT Qudits, a cutting-edge toolkit for Mixed-Dimensional Quantum Computing.\n", + "\n", + "
\n", + "

Delve into the realm of mixed-dimensional quantum computing with NeQST—a project funded by the European Union and developed at the Chair for Design Automation at the Technical University of Munich, as part of the Munich Quantum Toolkit.

Our team is focused on creating design automation methods and software for quDit-based systems. Explore our Jupyter file to discover the initial tools and contributions we've made to advance Quantum Information Processing for Science and Technology.\n", + "\"Logo \n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "b95c4040", + "metadata": {}, + "source": [ + "# User Inputs 💻\n", + "\n", + "🚀 **New QASM Extension:**\n", + "Dive into a language meticulously designed to express quantum algorithms and circuits. MQT extends the openQASM 2.0 grammar, effortlessly adapting to registers that feature a harmonious mix of qudits and qubits in diverse combinations. \n", + "\n", + "🐍 **Python Interface** \n", + "\n", + "Constructing and manipulating quantum programs becomes a breeze with Python. You have the flexibility to:\n", + "\n", + "1. **Initialize Quantum Circuits:** Start by creating your quantum circuits effortlessly.\n", + "\n", + "2. **Create Quantum Registers:** Build dedicated quantum registers tailored to your needs.\n", + "\n", + "3. **Compose Circuits:** Seamlessly bring together your quantum registers, forming a unified and powerful circuit.\n", + "\n", + "4. **Apply Operations:** Easily apply a variety of qudit operations, without worrying about the right representation. \n", + "\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "id": "7bc57c87", + "metadata": {}, + "source": [ + "\"2dqed.png\"" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "ac47688d", + "metadata": {}, + "outputs": [], + "source": [ + "from mqt.qudits.qudit_circuits.circuit import QuantumCircuit" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "f0157fd8", + "metadata": {}, + "outputs": [], + "source": [ + "qasm = \"\"\"\n", + " DITQASM 2.0;\n", + " \n", + " qreg fields [3][5,5,5];\n", + " qreg matter [2][2,2];\n", + " \n", + " h fields[2] ctl matter[0] matter[1] [0,0];\n", + " cx fields[2], matter[0];\n", + " cx fields[2], matter[1];\n", + " rxy (0, 1, pi, pi/2) fields[2];\n", + " \n", + " measure q[0] -> meas[0];\n", + " measure q[1] -> meas[1];\n", + " measure q[2] -> meas[2];\n", + " \"\"\"" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3c421902", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 4, \n", + " Number of qudits in the circuit: 5\n" + ] + } + ], + "source": [ + "circuit = QuantumCircuit()\n", + "circuit.from_qasm(qasm)\n", + "\n", + "print(f\"\\n Number of operations: {len(circuit.instructions)}, \\n Number of qudits in the circuit: {circuit.num_qudits}\")" + ] + }, + { + "cell_type": "markdown", + "id": "fdd6eef4", + "metadata": {}, + "source": [ + "##### Let's construct a quantum circuit from scratch.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "468735a3", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[[ 0.57735027+0.j 0.57735027+0.j 0.57735027+0.j ]\n", + " [ 0.57735027+0.j -0.28867513+0.5j -0.28867513-0.5j]\n", + " [ 0.57735027+0.j -0.28867513-0.5j -0.28867513+0.5j]]\n", + "\n", + " Number of operations: 2, \n", + " Number of qudits in the circuit: 2\n" + ] + } + ], + "source": [ + "from mqt.qudits.qudit_circuits.components.registers.quantum_register import QuantumRegister\n", + "\n", + "\n", + "circuit = QuantumCircuit()\n", + "\n", + "field_reg = QuantumRegister(\"fields\", 1, [3])\n", + "ancilla_reg = QuantumRegister(\"ancillas\", 1, [3])\n", + "\n", + "circuit.append(field_reg)\n", + "circuit.append(ancilla_reg)\n", + "\n", + "h = circuit.h(field_reg[0])\n", + "csum = circuit.csum([field_reg[0], ancilla_reg[0]])\n", + "\n", + "print(h.to_matrix())\n", + "print(f\"\\n Number of operations: {len(circuit.instructions)}, \\n Number of qudits in the circuit: {circuit.num_qudits}\")" + ] + }, + { + "cell_type": "markdown", + "id": "53329ff9", + "metadata": {}, + "source": [ + "\n", + "##### It is possible to export the code and share your program in a QASM file.\n", + "
" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "32658fe9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "DITQASM 2.0;\n", + "qreg fields [1][3];\n", + "qreg ancillas [1][3];\n", + "creg meas[2];\n", + "h fields[0];\n", + "csum fields[0], ancillas[0];\n", + "measure fields[0] -> meas[0];\n", + "measure ancillas[0] -> meas[1];\n", + "\n" + ] + } + ], + "source": [ + "print(circuit.to_qasm())" + ] + }, + { + "cell_type": "markdown", + "id": "3a6b2672", + "metadata": {}, + "source": [ + "# Simulation 🚀\n", + "\n", + "After crafting your quantum circuit with precision, take it for a spin using two distinct engines, each flaunting its unique set of data structures.\n", + "\n", + "- **External Tensor-Network Simulator:** Delve into the quantum realm with a robust external tensor-network simulator.\n", + "\n", + "- **MiSiM (C++-Powered):** Unleash the power of decision-diagram-based simulation with MiSiM, seamlessly interfaced with Python for a fluid and efficient experience. 🌐💡" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9d2a8eb0", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['tnsim', 'misim']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from mqt.qudits.simulation.provider.qudit_provider import MQTQuditProvider\n", + "\n", + "\n", + "provider = MQTQuditProvider()\n", + "provider.backends(\"sim\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "5b16d935", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "from mqt.qudits.visualisation.plot_information import plot_counts, plot_state\n", + "\n", + "backend = provider.get_backend(\"tnsim\")\n", + "\n", + "job = backend.run(circuit)\n", + "result = job.result()\n", + "\n", + "state_vector = result.get_state_vector()\n", + "\n", + "plot_state(state_vector, circuit)" + ] + }, + { + "cell_type": "markdown", + "id": "cc320e6b", + "metadata": {}, + "source": [ + "# Compilation ⚙️\n", + "\n", + "Emulate the features of the best experimental laboratories in your compilation process. Leverage modern compiler passes to customize optimization, gate decomposition, and noise-aware strategies, creating compiled circuits that closely resemble the challenges and advantages of cutting-edge quantum hardware.\n", + "\n", + "Customize, compile, and push the boundaries of quantum algorithms with a tailored approach to quantum compilation. 🛠️🔧🚀\n" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "dd61551f", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + " Number of operations: 10, \n", + " Number of qudits in the circuit: 2\n" + ] + } + ], + "source": [ + "from mqt.qudits.compiler.dit_manager import QuditManager\n", + "\n", + "backend_ion = provider.get_backend(\"faketraps2trits\", shots=1000)\n", + "\n", + "qudit_compiler = QuditManager()\n", + "\n", + "passes = [\"LocQRPass\"]\n", + "\n", + "compiled_circuit_qr = qudit_compiler.compile(backend_ion, circuit, passes)\n", + "\n", + "print(f\"\\n Number of operations: {len(compiled_circuit_qr.instructions)}, \\n Number of qudits in the circuit: {compiled_circuit_qr.num_qudits}\")" + ] + }, + { + "cell_type": "markdown", + "id": "21a11514", + "metadata": {}, + "source": [ + "### Extending Simulation with Noise Model Integration\n", + "\n", + "Introduce realism into your simulations by incorporating a noise model. Simulate the effects of environmental factors and imperfections, bringing your quantum algorithms closer to real-world scenarios." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "a7fa4150", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + }, + { + "data": { + "text/plain": [ + "{'00': 323,\n", + " '01': 0,\n", + " '02': 4,\n", + " '10': 2,\n", + " '11': 339,\n", + " '12': 0,\n", + " '20': 0,\n", + " '21': 4,\n", + " '22': 328}" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "job = backend_ion.run(compiled_circuit_qr)\n", + "result = job.result()\n", + "counts = result.get_counts()\n", + "\n", + "plot_counts(counts, compiled_circuit_qr)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "91b7145d", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.12" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/src/example.py b/src/example.py new file mode 100644 index 0000000..c43e00c --- /dev/null +++ b/src/example.py @@ -0,0 +1,160 @@ +from mqt.qudits.qudit_circuits.circuit import QuantumCircuit +from mqt.qudits.qudit_circuits.components.registers.quantum_register import QuantumRegister +from mqt.qudits.simulation.provider.qudit_provider import MQTQuditProvider +from mqt.qudits.visualisation.plot_information import plot_counts, plot_state +from mqt.qudits.visualisation.mini_quantum_information import get_density_matrix_from_counts, partial_trace +from mqt.qudits.compiler.dit_manager import QuditManager + +# In[2]: + + +qasm = """ + DITQASM 2.0; + + qreg fields [3][5,5,5]; + qreg matter [2][2,2]; + + creg meas_matter[2]; + creg meas_fields[3]; + + h fields[2] ctl matter[0] matter[1] [0,0]; + cx fields[2], matter[0]; + cx fields[2], matter[1]; + rxy (0, 1, pi, pi/2) fields[2]; + barrier q[0],q[1],q[2]; + + measure q[0] -> meas[0]; + measure q[1] -> meas[1]; + measure q[2] -> meas[2]; + """ +# Control syntax: operation ctl qudit_line [list of qudit control levels] + +circuit = QuantumCircuit() +circuit.from_qasm(qasm) + +print(f"\n Number of operations: {len(circuit.instructions)}, \n Number of qudits in the circuit: {circuit.num_qudits}") + +# In[3]: + + +circuit = QuantumCircuit() + +field_reg = QuantumRegister("fields", 1, [3]) +ancilla_reg = QuantumRegister("ancillas", 1, [3]) + +circuit.append(field_reg) +circuit.append(ancilla_reg) + +print(f"\n Number of operations: {len(circuit.instructions)}, \n Number of qudits in the circuit: {circuit.num_qudits}") + +# In[4]: + + +h = circuit.h(field_reg[0]) + +# Syntax for controlled operations is : + +# h = circuit.h(field_reg[0], ControlData([control_register], [controls_levels])) +# OR +# h = circuit.h(field_reg[0]).control([control_register], [controls_levels]) + + +# In[5]: + + +csum = circuit.csum([field_reg[0], ancilla_reg[0]]) + +# In[6]: + + +print(f"\n Number of operations: {len(circuit.instructions)}, \n Number of qudits in the circuit: {circuit.num_qudits}") + +# In[7]: + + +print(circuit.to_qasm()) + +# In[8]: + + +provider = MQTQuditProvider() +provider.backends("sim") + +# In[9]: + + +backend = provider.get_backend("tnsim") + +job = backend.run(circuit) +result = job.result() + +state_vector = result.get_state_vector() + +plot_state(state_vector, circuit) + +# In[10]: + + +backend_ion = provider.get_backend("faketraps2trits", shots=1000) + +job = backend_ion.run(circuit) +result = job.result() +counts = result.get_counts() + +plot_counts(counts, circuit) + +# In[11]: + + +rho = get_density_matrix_from_counts(counts, circuit) +print(partial_trace(rho, qudits2keep=[0], dims=[3, 3])) + +# In[12]: + + +# the compiler uses energy level graph of the architecture + +qudit_compiler = QuditManager() +passes = ["LocQRPass"] + +# In[13]: + + +compiled_circuit_qr = qudit_compiler.compile(backend_ion, circuit, passes) + +print( + f"\n Number of operations: {len(compiled_circuit_qr.instructions)}, \n Number of qudits in the circuit: {compiled_circuit_qr.num_qudits}") + +# In[18]: + + +job = backend_ion.run(compiled_circuit_qr) + +result = job.result() +counts = result.get_counts() + +plot_counts(counts, compiled_circuit_qr) + +# In[15]: + + +passes = ["LocAdaPass", "ZPropagationPass","ZRemovalPass"] + +compiled_circuit_ada = qudit_compiler.compile(backend_ion, circuit, passes) + +print(f"\n Number of operations: {len(compiled_circuit_ada.instructions)}, \n Number of qudits in the circuit: {compiled_circuit_ada.num_qudits}") + +# In[17]: + + +job = backend_ion.run(compiled_circuit_ada) + +result = job.result() +counts = result.get_counts() + +plot_counts(counts, compiled_circuit_ada) + +# In[ ]: + + +# In[ ]: diff --git a/src/foot.png b/src/foot.png new file mode 100644 index 0000000000000000000000000000000000000000..30d646e51c16db4d02e66219e46ddd0da2c80951 GIT binary patch literal 19695 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 meas[0]; measure q[1] -> meas[1]; measure q[2] -> meas[2]; """ -# c = QuantumCircuit() -# c.from_qasm(qasm) -# print(QASM().parse_ditqasm2_str(qasm)) -qreg_example = QuantumRegister("x", 3, [3, 2, 2]) +c = QuantumCircuit() +c.from_qasm(qasm) +print(c.to_qasm()) + +# Program a quantum algorithm in python + +qreg_example = QuantumRegister("reg", 2, [3, 3]) circ = QuantumCircuit(qreg_example) -# circ.append(QuantumRegister()) -# circ.from_qasm(qasm) + +# x = circ.x(1) +# s = circ.s(0) +# z = circ.z(1, ControlData([0], [1])) +h3 = circ.h(0) # , ControlData([0], [1]))#.control([1], [1]) +h3 = circ.h(0) h3 = circ.h(0) -# x = circ.x(0) -# csum = circ.csum([0, 2]) +for i in range(200): + r = circ.r(1, [0, 1, np.pi, np.pi / 2]) +csum = circ.csum([0, 1]) +# cx = circ.cx([0, 1],[0, 2, 1, 0.]) +# rz = circ.rz(0, [0, 1, np.pi / 2]) +# ls = circ.ls([0, 1], [np.pi / 4]) +# ms = circ.ms([0, 1], [np.pi / 2]) +ru = circ.randu([0, 1]) +# p = circ.pm([0], [0, 2, 1]) -# print(h3.to_matrix(identities=1)) -# print(csum.to_matrix(identities=1)) +print(circ.to_qasm()) -provider = MQTQuditProvider() -print(provider.backends("sim")) +# ------------------------------------------------------ +# Noiselse simulation +provider = MQTQuditProvider() backend = provider.get_backend("tnsim") -result = backend.run(circ) -state_size = 1 -for s in circ.dimensions: - state_size *= s +job = backend.run(circ) +result = job.result() +plot_state(result.get_state_vector(), circ) + +backend_ion = provider.get_backend("faketraps2trits", shots=1000) + +job = backend_ion.run(circ) +result = job.result() +plot_counts(result.get_counts(), circ) + +# Evaluate + +rho = get_density_matrix_from_counts(result.get_counts(), circ) +print(np.trace(rho @ rho)) +print(partial_trace(rho, [1], [3, 3])) + +# WE compile the circuit and notice new differences +qudit_compiler = QuditManager() +passes = ["LocAdaPass", "ZPropagationPass", "ZRemovalPass"] +pulse_level_circuit = qudit_compiler.compile(backend_ion, circ, passes) -result = result.tensor.reshape(1, state_size) -# takes a vector in -plot_histogram(result, circ) +job = backend_ion.run(pulse_level_circuit) +result = job.result() +plot_counts(result.get_counts(), circ) diff --git a/src/mqt/qudits/compiler/compiler_pass.py b/src/mqt/qudits/compiler/compiler_pass.py new file mode 100644 index 0000000..bd28466 --- /dev/null +++ b/src/mqt/qudits/compiler/compiler_pass.py @@ -0,0 +1,10 @@ +from abc import ABC, abstractmethod + + +class CompilerPass(ABC): + def __init__(self, backend, **kwargs): + self.backend = backend + + @abstractmethod + def transpile(self, circuit): + pass diff --git a/src/mqt/qudits/compiler/dit_manager.py b/src/mqt/qudits/compiler/dit_manager.py new file mode 100644 index 0000000..5b71d15 --- /dev/null +++ b/src/mqt/qudits/compiler/dit_manager.py @@ -0,0 +1,17 @@ +from mqt.qudits.compiler.onedit.local_adaptive_decomp import LocAdaPass +from mqt.qudits.compiler.onedit.local_qr_decomp import LocQRPass +from mqt.qudits.compiler.onedit.propagate_virtrz import ZPropagationPass +from mqt.qudits.compiler.onedit.remove_phase_rotations import ZRemovalPass + + +class QuditManager(): + def __init__(self): + pass + + def compile(self, backend, circuit, passes_names): + # Instantiate and execute created classes + for compiler_pass in passes_names: + compiler_pass = globals()[compiler_pass] + decomposition = compiler_pass(backend) + circuit = decomposition.transpile(circuit) + return circuit diff --git a/src/mqt/qudits/compiler/onedit/local_adaptive_decomp.py b/src/mqt/qudits/compiler/onedit/local_adaptive_decomp.py new file mode 100644 index 0000000..e16f3bb --- /dev/null +++ b/src/mqt/qudits/compiler/onedit/local_adaptive_decomp.py @@ -0,0 +1,283 @@ +import gc + +import numpy as np +from mqt.qudits.compiler.compiler_pass import CompilerPass +from mqt.qudits.compiler.onedit.local_operation_swap.swap_routine import cost_calculator, gate_chain_condition, \ + graph_rule_ongate, \ + graph_rule_update +from mqt.qudits.compiler.onedit.local_qr_decomp import QrDecomp +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import new_mod +from mqt.qudits.core.structures.trees.dfs_tree import NAryTree +from mqt.qudits.exceptions.compilerexception import SequenceFoundException +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes +from mqt.qudits.qudit_circuits.components.instructions.gate_set.custom_one import CustomOne +from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz + +np.seterr(all='ignore') + + +class LocAdaPass(CompilerPass): + def __init__(self, backend): + super().__init__(backend) + + def transpile(self, circuit): + self.circuit = circuit + instructions = circuit.instructions + new_instructions = [] + + for i, gate in enumerate(instructions): + + if gate.gate_type == GateTypes.SINGLE: + energy_graph_i = self.backend.energy_level_graphs[gate._target_qudits] + # ini_lpmap = list(self.backend.energy_level_graphs.log_phy_map) + + # if self.verify: + # recover_dict = {} + # inode = self.energy_level_graph._1stInode + # if 'phase_storage' in self.energy_level_graph.nodes[inode]: + # for i in range(len(list(self.energy_level_graph.nodes))): + # thetaZ = newMod(self.energy_level_graph.nodes[i]['phase_storage']) + # recover_dict[i] = thetaZ + + QR = QrDecomp(gate, energy_graph_i) + + decomp, algorithmic_cost, total_cost = QR.execute() + + Adaptive = AdaptiveDecomposition(gate, energy_graph_i, + (algorithmic_cost, total_cost), gate._dimensions) + + (matrices_decomposed, best_cost, + self.backend.energy_level_graphs[gate._target_qudits]) = Adaptive.execute() + + # if self.verify: + # nodes = list(self.energy_level_graph.nodes) + # lpmap = list(self.energy_level_graph.log_phy_map) + # + # Vgate = deepcopy(gate) + # inode = self.energy_level_graph._1stInode + # + # if 'phase_storage' in self.energy_level_graph.nodes[inode]: + # for i in range(len(recover_dict)): + # if abs(recover_dict[i]) > 1.0e-4: + # phase_gate = Rz(-recover_dict[i], i, self.dimension) # logical rotation + # Vgate = Custom_Unitary(matmul(phase_gate.matrix, Vgate.matrix), self.dimension) + # + # V = Verifier(matrices_decomposed, Vgate, nodes, ini_lpmap, lpmap, self.dimension) + # Vr = V.verify() + # + # if not Vr: + # raise Exception + new_instructions += matrices_decomposed + # circuit.replace_gate(i, matrices_decomposed) + gc.collect() + else: + new_instructions.append(gate) # TODO REENCODING + transpiled_circuit = self.circuit.copy() + return transpiled_circuit.set_instructions(new_instructions) + + +class AdaptiveDecomposition: + + def __init__(self, gate, graph_orig, cost_limit=(0, 0), dimension=-1, Z_prop=False): + self.circuit = gate.parent_circuit + self.U = gate.to_matrix(identities=0) + self.qudit_index = gate._target_qudits + self.graph = graph_orig + self.graph.phase_storing_setup() + self.cost_limit = cost_limit + self.dimension = dimension + self.phase_propagation = Z_prop + self.TREE = NAryTree() + + def execute(self): + + self.TREE.add(0, CustomOne(self.circuit, "CUo", self.qudit_index, + np.identity(self.dimension, dtype='complex'), self.dimension), + self.U, + self.graph, 0, 0, self.cost_limit, []) + try: + self.DFS(self.TREE.root) + except SequenceFoundException: + pass + finally: + matrices_decomposed, best_cost, final_graph = self.TREE.retrieve_decomposition(self.TREE.root) + + if matrices_decomposed != []: + matrices_decomposed, final_graph = self.Z_extraction(matrices_decomposed, final_graph, + self.phase_propagation) + else: + print("couldn't decompose\n") + + tree_print = self.TREE.print_tree(self.TREE.root, "TREE: ") + + return matrices_decomposed, best_cost, final_graph + + def Z_extraction(self, decomposition, placement, phase_propagation): + matrices = [] + + for d in decomposition[1:]: + # exclude the identity matrix coming from the root of the tree of solutions which is just for correctness + matrices = matrices + d.PI_PULSES + matrices = matrices + [d.rotation] + + U_ = decomposition[-1].U_of_level # take U of last elaboration which should be the diagonal matrix found + + # check if close to diagonal + Ucopy = U_.copy() + + # check if the diagonal is made only of noise + valid_diag = any(abs(np.diag(Ucopy)) > 1.0e-4) # > 1.0e-4 + + # are the non diagonal entries zeroed-out + filtered_Ucopy = abs(Ucopy) > 1.0e-4 + np.fill_diagonal(filtered_Ucopy, 0) + + not_diag = filtered_Ucopy.any() + + if not_diag or not valid_diag: # if is diagonal enough then somehow signal end of algorithm + raise Exception('Matrix isnt close to diagonal!') + else: + diag_U = np.diag(U_) + dimension = U_.shape[0] + + for i in range(dimension): + if abs(np.angle(diag_U[i])) > 1.0e-4: + + if phase_propagation: + inode = placement._1stInode + if 'phase_storage' in placement.nodes[inode]: + placement.nodes[i]['phase_storage'] = placement.nodes[i]['phase_storage'] + np.angle( + diag_U[i]) + placement.nodes[i]['phase_storage'] = new_mod(placement.nodes[i]['phase_storage']) + else: + phy_n_i = placement.nodes[i]['lpmap'] + + phase_gate = VirtRz(self.circuit, "VRz", self.qudit_index, [phy_n_i, np.angle(diag_U[i])], + self.dimension) # old version: VirtRz(np.angle(diag_U[i]), phy_n_i, + # dimension) + + U_ = phase_gate.to_matrix(identities=0) @ U_ # matmul(phase_gate.to_matrix(identities=0), U_) + + matrices.append(phase_gate) + + if not phase_propagation: + inode = placement._1stInode + if 'phase_storage' in placement.nodes[inode]: + for i in range(len(list(placement.nodes))): + thetaZ = new_mod(placement.nodes[i]['phase_storage']) + if abs(thetaZ) > 1.0e-4: + phase_gate = VirtRz(self.circuit, "VRz", self.qudit_index, [placement.nodes[i]['lpmap'], + thetaZ], + self.dimension) # VirtRz(thetaZ, placement.nodes[i]['lpmap'], + # dimension) + matrices.append(phase_gate) + # reset the node + placement.nodes[i]['phase_storage'] = 0 + + return matrices, placement + + def DFS(self, current_root, level=0): + + # check if close to diagonal + Ucopy = current_root.U_of_level.copy() + + current_placement = current_root.graph + + # is the diagonal noisy? + valid_diag = any(abs(np.diag(Ucopy)) > 1.0e-4) + + # are the non diagonal entries zeroed-out? + filtered_Ucopy = abs(Ucopy) > 1.0e-4 + np.fill_diagonal(filtered_Ucopy, 0) + + not_diag = filtered_Ucopy.any() + + # if is diagonal enough then somehow signal end of algorithm + if (not not_diag) and valid_diag: + current_root.finished = True + + raise SequenceFoundException(current_root.key) + + ################################################ + ############### + ######### + + # BEGIN SEARCH + + U_ = current_root.U_of_level + + dimension = U_.shape[0] + + for c in range(dimension): + + for r in range(c, dimension): + + for r2 in range(r + 1, dimension): + + if abs(U_[r2, c]) > 1.0e-8 and (abs(U_[r, c]) > 1.0e-18 or abs(U_[r, c]) == 0): + + theta = 2 * np.arctan2(abs(U_[r2, c]), abs(U_[r, c])) + + phi = -(np.pi / 2 + np.angle(U_[r, c]) - np.angle(U_[r2, c])) + + rotation_involved = R(self.circuit, "R", self.qudit_index, [r, r2, theta, phi], + self.dimension) # R(theta, phi, r, r2, dimension) + + U_temp = rotation_involved.to_matrix(identities=0) @ U_ # matmul(rotation_involved.matrix, U_) + + non_zeros = np.count_nonzero(abs(U_temp) > 1.0e-4) + + estimated_cost, pi_pulses_routing, new_placement, cost_of_pi_pulses, gate_cost = cost_calculator( + rotation_involved, current_placement, non_zeros) + + next_step_cost = (estimated_cost + current_root.current_cost) + decomp_next_step_cost = (cost_of_pi_pulses + gate_cost + current_root.current_decomp_cost) + + branch_condition = current_root.max_cost[ + 1] - decomp_next_step_cost # SECOND POSITION IS PHYISCAL COST + # branch_condition_2 = current_root.max_cost[0] - next_step_cost # deprecated: FIRST IS ALGORITHMIC COST + + if branch_condition > 0 or abs(branch_condition) < 1.0e-12: + # if cost is better can be only candidate otherwise try them all + + self.TREE.global_id_counter = self.TREE.global_id_counter + 1 + new_key = self.TREE.global_id_counter + + # + if new_placement.nodes[r]['lpmap'] > new_placement.nodes[r2]['lpmap']: + phi = phi * -1 + # + physical_rotation = R(self.circuit, "R", self.qudit_index, + [new_placement.nodes[r]['lpmap'], new_placement.nodes[r2]['lpmap'], + theta, phi], self.dimension) + # R(theta, phi, new_placement.nodes[r]['lpmap'], new_placement.nodes[r2]['lpmap'], dimension) + # + physical_rotation = gate_chain_condition(pi_pulses_routing, physical_rotation) + # + physical_rotation = graph_rule_ongate(physical_rotation, new_placement) + # + + # take care of phases accumulated by not pi-pulsing back + p_backs = [] + for ppulse in pi_pulses_routing: + p_backs.append(R(self.circuit, "R", self.qudit_index, + [ppulse.lev_a, ppulse.lev_b, ppulse.theta, -ppulse.phi], + self.dimension)) + # p_backs.append(R(ppulse.theta, -ppulse.phi, ppulse.lev_a, ppulse.lev_b, dimension)) + + for p_back in p_backs: + graph_rule_update(p_back, new_placement) + + current_root.add(new_key, physical_rotation, U_temp, new_placement, next_step_cost, + decomp_next_step_cost, current_root.max_cost, pi_pulses_routing) + + # ===============CONTINUE SEARCH ON CHILDREN======================================== + if current_root.children is not None: + + for child in current_root.children: + self.DFS(child, level + 1) + # =================================================================================== + + # END OF RECURSION# + return diff --git a/src/mqt/qudits/simulation/provider/noise/__init__.py b/src/mqt/qudits/compiler/onedit/local_operation_swap/__init__.py similarity index 100% rename from src/mqt/qudits/simulation/provider/noise/__init__.py rename to src/mqt/qudits/compiler/onedit/local_operation_swap/__init__.py diff --git a/src/mqt/qudits/compiler/onedit/local_operation_swap/swap_routine.py b/src/mqt/qudits/compiler/onedit/local_operation_swap/swap_routine.py new file mode 100644 index 0000000..1c24c2c --- /dev/null +++ b/src/mqt/qudits/compiler/onedit/local_operation_swap/swap_routine.py @@ -0,0 +1,154 @@ +import networkx as nx +import numpy as np + +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import (pi_mod, new_mod, + rotation_cost_calc, + swap_elements) +from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R + + +def find_logic_from_phys(lev_a, lev_b, graph): + # find node by physical level associated + logic_nodes = [None, None] + for node, node_data in graph.nodes(data=True): + if node_data['lpmap'] == lev_a: + logic_nodes[0] = node + if node_data['lpmap'] == lev_b: + logic_nodes[1] = node + + return logic_nodes + + +def graph_rule_update(gate, graph): + if abs(abs(gate.theta) - 3.14) < 1e-2: + + inode = graph._1stInode + if 'phase_storage' not in graph.nodes[inode]: + return + + g_lev_a = gate.lev_a + g_lev_b = gate.lev_b + + logic_nodes = find_logic_from_phys(g_lev_a, g_lev_b, graph) + + # only pi pulses can update online the graph + if logic_nodes[0] is not None and logic_nodes[1] is not None: + + # SWAPPING PHASES + graph.swap_node_attr_simple(logic_nodes[0], logic_nodes[1]) + + phase = pi_mod(gate.phi) + if (gate.theta * phase) > 0: + graph.nodes[logic_nodes[1]]['phase_storage'] = graph.nodes[logic_nodes[1]]['phase_storage'] + np.pi + graph.nodes[logic_nodes[1]]['phase_storage'] = new_mod(graph.nodes[logic_nodes[1]]['phase_storage']) + + elif (gate.theta * phase) < 0: + graph.nodes[logic_nodes[0]]['phase_storage'] = graph.nodes[logic_nodes[0]]['phase_storage'] + np.pi + graph.nodes[logic_nodes[0]]['phase_storage'] = new_mod(graph.nodes[logic_nodes[0]]['phase_storage']) + + return + + +def graph_rule_ongate(gate, graph): + inode = graph._1stInode + if 'phase_storage' not in graph.nodes[inode]: + return gate + + g_lev_a = gate.lev_a + g_lev_b = gate.lev_b + new_g_phi = gate.phi # old phase still inside the gate + + logic_nodes = find_logic_from_phys(g_lev_a, g_lev_b, graph) + + # MINUS source PLUS target according to pi pulse back + if logic_nodes[0] is not None: + new_g_phi = new_g_phi - graph.nodes[logic_nodes[0]]['phase_storage'] + if logic_nodes[1] is not None: + new_g_phi = new_g_phi + graph.nodes[logic_nodes[1]]['phase_storage'] + + return R(gate.parent_circuit, "R", gate._target_qudits, [g_lev_a, g_lev_b, gate.theta, new_g_phi], + gate._dimensions) # R(gate.theta, new_g_phi, g_lev_a, g_lev_b, gate.dimension) + + +def gate_chain_condition(previous_gates, current): + if not previous_gates: + return current + + new_source = current.lev_a + new_target = current.lev_b + theta = current.theta + phi = current.phi + + last_gate = previous_gates[-1] + last_source = last_gate.lev_a + last_target = last_gate.lev_b + + # all phi flips are removed because already applied + if new_source == last_source: + if new_target > last_target: # changed lower one with lower one + pass + elif new_target < last_target: # changed higher one one with lower + pass + + elif new_target == last_target: + if new_source < last_source: + theta = theta * -1 + elif new_source > last_source: + theta = theta * -1 + + elif new_source == last_target: + theta = theta * -1 + + elif new_target == last_source: + pass + + return R(current.parent_circuit, "R", current._target_qudits, [current.lev_a, current.lev_b, theta, phi], + current._dimensions) # R(theta, phi, current.lev_a, current.lev_b, current.dimension) + + +def route_states2rotate_basic(gate, orig_placement): + placement = orig_placement + dimension = gate._dimensions + + cost_of_pi_pulses = 0 + pi_pulses_routing = [] + + source = gate.original_lev_a # Original code requires to know the direction of rotations + target = gate.original_lev_b # + + path = nx.shortest_path(placement, source, target) + + i = len(path) - 2 + + while i > 0: + phy_n_i = placement.nodes[path[i]]['lpmap'] + phy_n_ip1 = placement.nodes[path[i + 1]]['lpmap'] + + pi_gate_phy = R(gate.parent_circuit, "R", gate._target_qudits, [phy_n_i, phy_n_ip1, np.pi, -np.pi / 2], + dimension) # R(np.pi, -np.pi / 2, phy_n_i, phy_n_ip1, dimension) + + pi_gate_phy = gate_chain_condition(pi_pulses_routing, pi_gate_phy) + pi_gate_phy = graph_rule_ongate(pi_gate_phy, placement) + + # -- COSTING based only on the position of the pi pulse and angle phase is neglected ---------------- + pi_gate_logic = R(gate.parent_circuit, "R", gate._target_qudits, + [path[i], path[i + 1], pi_gate_phy.theta, pi_gate_phy.phi / 2], + dimension) # R(pi_gate_phy.theta, pi_gate_phy.phi, path[i], path[i + 1], dimension) + cost_of_pi_pulses += rotation_cost_calc(pi_gate_logic, placement) + # ----------------------------------------------------------------------------------------------------- + placement = placement.swap_nodes(path[i + 1], path[i]) + path = swap_elements(path, i + 1, i) + + pi_pulses_routing.append(pi_gate_phy) + + i -= 1 + + return cost_of_pi_pulses, pi_pulses_routing, placement + + +def cost_calculator(gate, placement, non_zeros): + cost_of_pi_pulses, pi_pulses_routing, new_placement = route_states2rotate_basic(gate, placement) + gate_cost = rotation_cost_calc(gate, new_placement) + total_costing = (gate_cost + cost_of_pi_pulses) * non_zeros + + return total_costing, pi_pulses_routing, new_placement, cost_of_pi_pulses, gate_cost diff --git a/src/mqt/qudits/compiler/onedit/local_qr_decomp.py b/src/mqt/qudits/compiler/onedit/local_qr_decomp.py new file mode 100644 index 0000000..53ba87e --- /dev/null +++ b/src/mqt/qudits/compiler/onedit/local_qr_decomp.py @@ -0,0 +1,140 @@ +import gc +import numpy as np + +from mqt.qudits.compiler.compiler_pass import CompilerPass +from mqt.qudits.compiler.onedit.local_operation_swap.swap_routine import cost_calculator, gate_chain_condition +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import new_mod +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes +from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz + + +class LocQRPass(CompilerPass): + def __init__(self, backend): + super().__init__(backend) + + def transpile(self, circuit): + self.circuit = circuit + instructions = circuit.instructions + new_instructions = [] + + for i, gate in enumerate(instructions): + if gate.gate_type == GateTypes.SINGLE: + energy_graph_i = self.backend.energy_level_graphs[gate._target_qudits] + QR = QrDecomp(gate, energy_graph_i, not_stand_alone=False) + decomp, algorithmic_cost, total_cost = QR.execute() + new_instructions += decomp + gc.collect() + else: + new_instructions.append(gate) # TODO REENCODING + transpiled_circuit = self.circuit.copy() + return transpiled_circuit.set_instructions(new_instructions) + + +class QrDecomp: + def __init__(self, gate, graph_orig, Z_prop=False, not_stand_alone=True): + self.gate = gate + self.circuit = gate.parent_circuit + self.dimension = gate._dimensions + self.qudit_index = gate._target_qudits + self.U = gate.to_matrix(identities=0) + self.graph = graph_orig + self.phase_propagation = Z_prop + self.not_stand_alone = not_stand_alone + + def execute(self): + decomp = [] + total_cost = 0 + algorithmic_cost = 0 + + U_ = self.U + dimension = self.U.shape[0] + # + # GRAPH PHASES - REMOVE ANY REMAINING AND SAVE FOR RESTORING AT THE END OF ALGORITHM + if not self.phase_propagation: + recover_dict = {} + inode = self.graph._1stInode + if 'phase_storage' in self.graph.nodes[inode]: + for i in range(len(list(self.graph.nodes))): + thetaZ = new_mod(self.graph.nodes[i]['phase_storage']) + if abs(thetaZ) > 1.0e-4: + phase_gate = VirtRz(self.gate.parent_circuit, "VRz", self.gate._target_qudits, + [self.graph.nodes[i]['lpmap'], thetaZ], + self.gate.dimension) # (thetaZ, self.graph.nodes[i]['lpmap'], dimension) + decomp.append(phase_gate) + recover_dict[i] = thetaZ + + # reset the node + self.graph.nodes[i]['phase_storage'] = 0 + # + + l = list(range(self.U.shape[0])) + l.reverse() + + for c in range(self.U.shape[1]): + + diag_index = l.index(c) + + for r in l[:diag_index]: + + if abs(U_[r, c]) > 1.0e-8: + + theta = 2 * np.arctan2(abs(U_[r, c]), abs(U_[r - 1, c])) + + phi = -(np.pi / 2 + np.angle(U_[r - 1, c]) - np.angle(U_[r, c])) + + rotation_involved = R(self.circuit, "R", self.qudit_index, [r - 1, r, theta, phi], + self.dimension) # R(theta, phi, r - 1, r, dimension) + + U_ = rotation_involved.to_matrix(identities=0) @ U_ # matmul(rotation_involved.matrix, U_) + + non_zeros = np.count_nonzero(abs(U_) > 1.0e-4) + + estimated_cost, pi_pulses_routing, temp_placement, cost_of_pi_pulses, gate_cost = cost_calculator( + rotation_involved, self.graph, non_zeros) + + decomp += pi_pulses_routing + + if temp_placement.nodes[r - 1]['lpmap'] > temp_placement.nodes[r]['lpmap']: + phi = phi * -1 + + physical_rotation = R(self.circuit, "R", self.qudit_index, + [temp_placement.nodes[r - 1]['lpmap'], temp_placement.nodes[r]['lpmap'], + theta, phi], + self.dimension) + # R(theta, phi, temp_placement.nodes[r - 1]['lpmap'], temp_placement.nodes[r]['lpmap'], dimension) + physical_rotation = gate_chain_condition(pi_pulses_routing, physical_rotation) + + decomp.append(physical_rotation) + + for pi_g in reversed(pi_pulses_routing): + decomp.append(R(self.circuit, "R", self.qudit_index, + [pi_g.lev_a, pi_g.lev_b, + pi_g.theta, -pi_g.phi], + self.dimension)) # R(pi_g.theta, -pi_g.phi, pi_g.lev_a, pi_g.lev_b, dimension)) + pi_g = None + + algorithmic_cost += estimated_cost + total_cost += 2 * cost_of_pi_pulses + gate_cost + + diag_U = np.diag(U_) + + for i in range(dimension): + + if abs(np.angle(diag_U[i])) > 1.0e-4: + phy_n_i = self.graph.nodes[i]['lpmap'] + + phase_gate = VirtRz(self.gate.parent_circuit, "VRz", self.gate._target_qudits, + [phy_n_i, np.angle(diag_U[i])], + self.gate._dimensions) # Rz(np.angle(diag_U[i]), phy_n_i, dimension) + + decomp.append(phase_gate) + + if self.not_stand_alone: + if not self.phase_propagation: + inode = self.graph._1stInode + if 'phase_storage' in self.graph.nodes[inode]: + for i in range(len(list(self.graph.nodes))): + self.graph.nodes[i]['phase_storage'] = recover_dict[i] + + return decomp, algorithmic_cost, total_cost diff --git a/src/mqt/qudits/simulation/provider/backends/stochastic_backend/agent.py b/src/mqt/qudits/compiler/onedit/local_rotation_tools/__init__.py similarity index 100% rename from src/mqt/qudits/simulation/provider/backends/stochastic_backend/agent.py rename to src/mqt/qudits/compiler/onedit/local_rotation_tools/__init__.py diff --git a/src/mqt/qudits/compiler/onedit/local_rotation_tools/local_compilation_minitools.py b/src/mqt/qudits/compiler/onedit/local_rotation_tools/local_compilation_minitools.py new file mode 100644 index 0000000..3030ccb --- /dev/null +++ b/src/mqt/qudits/compiler/onedit/local_rotation_tools/local_compilation_minitools.py @@ -0,0 +1,61 @@ +import numpy as np + + +def swap_elements(list_nodes, i, j): + a = list_nodes[i] + b = list_nodes[j] + list_nodes[i] = b + list_nodes[j] = a + return list_nodes + + +def new_mod(a, b=2 * np.pi): + res = np.mod(a, b) + return res if not res else res - b if a < 0 else res + + +def pi_mod(a): + a = new_mod(a) + if a > 0 and a > np.pi: + a = a - 2 * np.pi + elif a < 0 and abs(a) > np.pi: + a = 2 * np.pi + a + return a + + +def regulate_theta(angle): + theta_in_units_of_pi = np.mod(abs(angle / np.pi), 4) + if angle < 0: + theta_in_units_of_pi = theta_in_units_of_pi * -1 + if abs(theta_in_units_of_pi) < 0.2: + theta_in_units_of_pi += 4.0 + + return theta_in_units_of_pi * np.pi + + +def phi_cost(theta): + theta_on_units = theta / np.pi + + Err = abs(theta_on_units) * 1e-04 + return Err + + +def theta_cost(theta): + theta_on_units = theta / np.pi + Err = (4 * abs(theta_on_units) + abs(np.mod(abs(theta_on_units) + 0.25, 0.5) - 0.25)) * 1e-04 + return Err + + +def rotation_cost_calc(gate, placement): + source = gate.original_lev_a + target = gate.original_lev_b + + gate_cost = gate.cost + + if placement.is_irnode(source) or placement.is_irnode(target): + sp_penalty = min(placement.distance_nodes(placement._1stInode, source), + placement.distance_nodes(placement._1stInode, target)) + 1 + + gate_cost = sp_penalty * theta_cost(gate.theta) + + return gate_cost diff --git a/src/mqt/qudits/compiler/onedit/propagate_virtrz.py b/src/mqt/qudits/compiler/onedit/propagate_virtrz.py new file mode 100644 index 0000000..28c4053 --- /dev/null +++ b/src/mqt/qudits/compiler/onedit/propagate_virtrz.py @@ -0,0 +1,162 @@ +import copy + +from mqt.qudits.compiler.compiler_pass import CompilerPass +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import pi_mod +from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz + + +class ZPropagationPass(CompilerPass): + def __init__(self, backend, back=True): + super().__init__(backend) + self.back = back + + def transpile(self, circuit): + return self.remove_Z(circuit, self.back) + + def propagate_z(self, circuit, line, back): + Z_angles = {} + # list_of_Zrots = [] + list_of_XYrots = [] + qudit_index = line[0]._target_qudits + dimension = line[0]._dimensions + + for i in range(dimension): + Z_angles[i] = 0.0 + + if back: + line.reverse() + + for gate_index in range(len(line)): + try: + test_for_type_by_EAFP = line[gate_index].lev_b + # object is R + if back: + new_phi = pi_mod( + line[gate_index].phi + Z_angles[line[gate_index].lev_a] - Z_angles[line[gate_index].lev_b]) + else: + new_phi = pi_mod( + line[gate_index].phi - Z_angles[line[gate_index].lev_a] + Z_angles[line[gate_index].lev_b]) + + list_of_XYrots.append(R(circuit, "R", qudit_index, [line[gate_index].lev_a, line[gate_index].lev_b, + line[gate_index].theta, new_phi], + dimension)) + # list_of_XYrots.append(R(line[gate_index].theta, new_phi, line[gate_index].lev_a, line[gate_index].lev_b, line[gate_index].dimension)) + except AttributeError: + try: + test_for_type_by_EAFP_2 = line[gate_index].lev_a + # object is VirtRz + Z_angles[line[gate_index].lev_a] = pi_mod(Z_angles[line[gate_index].lev_a] + line[gate_index].phi) + except AttributeError: + pass + if back: + list_of_XYrots.reverse() + + Zseq = [] + for e_lev in list(Z_angles): + Zseq.append(VirtRz(circuit, "VRz", qudit_index, [e_lev, Z_angles[e_lev]], dimension)) + # Zseq.append(Rz(Z_angles[e_lev], e_lev, QC.dimension)) + + return list_of_XYrots, Zseq + + def find_intervals_with_same_target_qudits(self, instructions): + intervals = [] + current_interval = [] + current_target_qudits = None + + for i, instruction in enumerate(instructions): + target_qudits = instruction._target_qudits + + if current_target_qudits is None or target_qudits == current_target_qudits: + # If it's the first gate or the target qudits are the same, add to the current interval + current_interval.append(i) + else: + # If the target qudits are different, save the current interval and start a new one + intervals.append(tuple(current_interval)) + current_interval = [i] + + current_target_qudits = target_qudits + + # Save the last interval if it exists + if current_interval: + intervals.append(tuple(current_interval)) + + return intervals + + def remove_Z(self, original_circuit, back=True): + circuit = original_circuit.copy() + new_instructions = copy.deepcopy(circuit.instructions) + intervals = self.find_intervals_with_same_target_qudits(circuit.instructions) + + for interval in intervals: + if len(interval) > 1: + sequence = circuit.instructions[interval[0]:interval[-1] + 1] + fixed_seq, z_tail = self.propagate_z(circuit, sequence, back) + if back: + new_instructions[interval[0]:interval[-1] + 1] = z_tail + fixed_seq + else: + new_instructions[interval[0]:interval[-1] + 1] = fixed_seq + z_tail + + return circuit.set_instructions(new_instructions) + + +""" +def tag_generator(gates): + tag_number = 0 + tags = [] + is_reset = False + + for g in gates: + # BASED ON EAFP + try: + test_for_type_by_EAFP = g.lev_b + is_reset = True + + except AttributeError: + if (is_reset): + tag_number += 1 + is_reset = False + + tags.append(tag_number) + + return tags +def alone_propagate_z(dimension, line, back): + Z_angles = {} + list_of_Zrots = [] + list_of_XYrots = [] + + for i in range(dimension): + Z_angles[i] = 0.0 + + if back: + line.reverse() + + for gate_index in range(len(line)): + try: + test_for_type_by_EAFP = line[gate_index].lev_b + # object is R + if back: + new_phi = pi_mod \ + (line[gate_index].phi + Z_angles[line[gate_index].lev_a] - Z_angles[line[gate_index].lev_b]) + else: + new_phi = pi_mod( + line[gate_index].phi - Z_angles[line[gate_index].lev_a] + Z_angles[line[gate_index].lev_b]) + + list_of_XYrots.append(R(line[gate_index].theta, new_phi, line[gate_index].lev_a, line[gate_index].lev_b, + line[gate_index].dimension)) + except AttributeError: + try: + test_for_type_by_EAFP_2 = line[gate_index].lev + # object is Rz + Z_angles[line[gate_index].lev] = pi_mod(Z_angles[line[gate_index].lev] + line[gate_index].theta) + except AttributeError: + pass + if back: + list_of_XYrots.reverse() + + Zseq = [] + for e_lev in list(Z_angles): + Zseq.append(Rz(Z_angles[e_lev], e_lev, dimension)) + + return list_of_XYrots, Zseq +""" diff --git a/src/mqt/qudits/compiler/onedit/remove_phase_rotations.py b/src/mqt/qudits/compiler/onedit/remove_phase_rotations.py new file mode 100644 index 0000000..cf06766 --- /dev/null +++ b/src/mqt/qudits/compiler/onedit/remove_phase_rotations.py @@ -0,0 +1,51 @@ +import copy +from mqt.qudits.compiler.compiler_pass import CompilerPass +from mqt.qudits.qudit_circuits.components.instructions.gate_set.rz import Rz +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz +from mqt.qudits.qudit_circuits.components.instructions.gate_set.z import Z + + +class ZRemovalPass(CompilerPass): + def __init__(self, backend): + super().__init__(backend) + + def transpile(self, circuit): + circuit = self.remove_initial_rz(circuit) + circuit = self.remove_trailing_rz_sequence(circuit) + return circuit + + def remove_rz_gates(self, original_circuit, reverse=False): + indices_to_remove = [] + circuit = original_circuit.copy() + new_instructions = copy.deepcopy(circuit.instructions) + + seen_target_qudits = set() + indices = range(len(circuit.instructions)) if not reverse else range(len(circuit.instructions) - 1, -1, -1) + + for i in indices: + instruction = circuit.instructions[i] + if len(seen_target_qudits) == circuit.num_qudits: + # If all qubits are seen, break the loop + break + + target_qudits = instruction._target_qudits + if isinstance(target_qudits, list): + # If target_qudits is a list, add each element to the set and + # continue to the next iteration because we work only with single gates + seen_target_qudits.update(target_qudits) + continue + else: + if target_qudits not in seen_target_qudits and isinstance(instruction, (Rz, VirtRz, Z)): + indices_to_remove.append(i) + else: + seen_target_qudits.add(target_qudits) + + new_instructions = [op for index, op in enumerate(new_instructions) if index not in indices_to_remove] + return circuit.set_instructions(new_instructions) + + def remove_initial_rz(self, original_circuit): + return self.remove_rz_gates(original_circuit) + + def remove_trailing_rz_sequence(self, original_circuit): + return self.remove_rz_gates(original_circuit, reverse=True) + diff --git a/src/mqt/qudits/simulation/provider/noise/noise.py b/src/mqt/qudits/core/structures/energy_level_graph/__init__.py similarity index 100% rename from src/mqt/qudits/simulation/provider/noise/noise.py rename to src/mqt/qudits/core/structures/energy_level_graph/__init__.py diff --git a/src/mqt/qudits/core/structures/energy_level_graph/level_graph.py b/src/mqt/qudits/core/structures/energy_level_graph/level_graph.py new file mode 100644 index 0000000..ca1f409 --- /dev/null +++ b/src/mqt/qudits/core/structures/energy_level_graph/level_graph.py @@ -0,0 +1,219 @@ +import copy + +import networkx as nx +import numpy as np + +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz + + +class LevelGraph(nx.Graph): + + def __init__(self, edges, nodes, nodes_physical_mapping=None, initialization_nodes=None): + super(LevelGraph, self).__init__() + self.logic_nodes = nodes + self.add_nodes_from(self.logic_nodes) + + if nodes_physical_mapping: + self.logic_physical_map(nodes_physical_mapping) + + self.add_edges_from(edges) + + if initialization_nodes: + inreach_nodes = [x for x in nodes if x not in initialization_nodes] + self.define__states(initialization_nodes, inreach_nodes) + + def phase_storing_setup(self): + for node in self.nodes: + node_dict = self.nodes[node] + if 'phase_storage' not in node_dict: + node_dict['phase_storage'] = 0 + + def distance_nodes(self, source, target): + path = nx.shortest_path(self, source, target) + return len(path) - 1 + + def distance_nodes_pi_pulses_fixed_ancilla(self, source, target): + path = nx.shortest_path(self, source, target) + negs = 0 + pos = 0 + for n in path: + if (n >= 0): + pos += 1 + else: + negs += 1 + pulses = (2 * negs) - 1 + (pos) - 1 + + return pulses + + def logic_physical_map(self, physical_nodes): + logic_phy_map = {nl: np for nl, np in zip(self.logic_nodes, physical_nodes)} + nx.set_node_attributes(self, logic_phy_map, 'lpmap') + + def define__states(self, initialization_nodes, inreach_nodes): + inreach_dictionary = dict.fromkeys(inreach_nodes, "r") + initialization_dictionary = dict.fromkeys(initialization_nodes, "i") + + for n in inreach_dictionary: + nx.set_node_attributes(self, inreach_dictionary, name='level') + + for n in initialization_dictionary: + nx.set_node_attributes(self, initialization_dictionary, name='level') + + def update_list(self, lst_, num_a, num_b): + new_lst = [] + + mod_index = [] + for i, t in enumerate(lst_): + tupla = [0, 0] + if (t[0] == num_a): + tupla[0] = 1 + elif (t[0] == num_b): + tupla[0] = 2 + + if (t[1] == num_a): + tupla[1] = 1 + elif (t[1] == num_b): + tupla[1] = 2 + + mod_index.append(tupla) + + for i, t in enumerate(lst_): + substituter = list(t) + + if (mod_index[i][0] == 1): + substituter[0] = num_b + elif (mod_index[i][0] == 2): + substituter[0] = num_a + + if (mod_index[i][1] == 1): + substituter[1] = num_b + elif (mod_index[i][1] == 2): + substituter[1] = num_a + + new_lst.append(tuple(substituter)) + + return new_lst + + def deep_copy_func(self, l_n): + cpy_list = [] + for li in l_n: + d2 = copy.deepcopy(li) + cpy_list.append(d2) + + return cpy_list + + def index(self, lev_graph, node): + for i in range(len(lev_graph)): + if (lev_graph[i][0] == node): + return i + return None + + def swap_node_attributes(self, node_a, node_b): + + nodelistcopy = self.deep_copy_func(list(self.nodes(data=True))) + node_a = self.index(nodelistcopy, node_a) + node_b = self.index(nodelistcopy, node_b) + + dict_attr_inode = nodelistcopy[0][1] + for attr in list(dict_attr_inode.keys()): + attr_a = nodelistcopy[node_a][1][attr] + attr_b = nodelistcopy[node_b][1][attr] + nodelistcopy[node_a][1][attr] = attr_b + nodelistcopy[node_b][1][attr] = attr_a + + return nodelistcopy + + def swap_node_attr_simple(self, node_a, node_b): + + res_list = [x[0] for x in self.nodes(data=True)] + node_a = res_list.index(node_a) + node_b = res_list.index(node_b) + + inode = self._1stInode + if 'phase_storage' in self.nodes[inode]: + phi_a = self.nodes[node_a]["phase_storage"] + phi_b = self.nodes[node_b]["phase_storage"] + self.nodes[node_a]["phase_storage"] = phi_b + self.nodes[node_b]["phase_storage"] = phi_a + + def swap_nodes(self, node_a, node_b): + nodes = self.swap_node_attributes(node_a, node_b) + # ------------------------------------------------ + new_Graph = LevelGraph([], nodes) + + edges = self.deep_copy_func(list(self.edges)) + + attribute_list = [] + for e in edges: + attribute_list.append(self.get_edge_data(*e).copy()) + + swapped_nodes_edges = self.update_list(edges, node_a, node_b) + + new_edge_list = [] + for i, e in enumerate(swapped_nodes_edges): + new_edge_list.append((*e, attribute_list[i])) + + new_Graph.add_edges_from(new_edge_list) + + return new_Graph + + def get_VRz_gates(self): + matrices = [] + for node in self.nodes: + node_dict = self.nodes[node] + if 'phase_storage' in node_dict: + if node_dict['phase_storage'] > 1e-3 or np.mod(node_dict['phase_storage'], 2 * np.pi) > 1e-3: + phy_n_i = self.nodes[node]['lpmap'] + + phase_gate = VirtRz(node_dict['phase_storage'], phy_n_i, len(list(self.nodes))) + matrices.append(phase_gate) + + return matrices + + def get_node_sensitivity_cost(self, node): + neighbs = [n for n in self.neighbors(node)] + + total_sensibility = 0 + for i in range(len(neighbs)): + total_sensibility += self[node][neighbs[i]]["sensitivity"] + + return total_sensibility + + def get_edge_sensitivity(self, node_a, node_b): + return self[node_a][node_b]["sensitivity"] + + @property + def _1stRnode(self): + r_node = [x for x, y in self.nodes(data=True) if y['level'] == "r"] + return r_node[0] + + @property + def _1stInode(self): + Inode = [x for x, y in self.nodes(data=True) if y['level'] == "i"] + return Inode[0] + + def is_irnode(self, node): + irnodes = [x for x, y in self.nodes(data=True) if y['level'] == "r"] + r = (node in irnodes) + return r + + def is_Inode(self, node): + Inodes = [x for x, y in self.nodes(data=True) if y['level'] == "i"] + r = (node in Inodes) + return r + + @property + def log_phy_map(self): + nodes = self.nodes + map_as_list = [] + + for key in nodes: + for N in self.nodes(data=True): + if (N[0] == key): + map_as_list.append(N[1]["lpmap"]) + return map_as_list + + def __str__(self): + description = str(self.nodes(data=True)) + "\n" + str(self.edges(data=True)) + + return description diff --git a/src/mqt/qudits/core/structures/trees/dfs_tree.py b/src/mqt/qudits/core/structures/trees/dfs_tree.py new file mode 100644 index 0000000..435c045 --- /dev/null +++ b/src/mqt/qudits/core/structures/trees/dfs_tree.py @@ -0,0 +1,159 @@ +from mqt.qudits.exceptions.compilerexception import NodeNotFoundException + + +class Node: + def __init__(self, key, rotation, U_of_level, graph_current, current_cost, current_decomp_cost, max_cost, pi_pulses, + parent_key, childs=None): + self.key = key + self.children = childs + self.rotation = rotation + self.U_of_level = U_of_level + self.finished = False + self.current_cost = current_cost + self.current_decomp_cost = current_decomp_cost + self.max_cost = max_cost + self.size = 0 + self.parent_key = parent_key + self.graph = graph_current + self.PI_PULSES = pi_pulses + + def add(self, new_key, rotation, U_of_level, graph_current, current_cost, current_decomp_cost, max_cost, pi_pulses): + # TODO refactor so that size is kept track also in the tree upper structure + + new_node = Node(new_key, rotation, U_of_level, graph_current, current_cost, current_decomp_cost, max_cost, + pi_pulses, self.key) + if self.children is None: + self.children = [] + + self.children.append(new_node) + + self.size += 1 + + def __str__(self): + return str(self.key) + + +class NAryTree: + # todo put method to refresh size when algortihm has finished + + def __init__(self): + self.root = None + self.size = 0 + self.global_id_counter = 0 + + def add(self, new_key, rotation, U_of_level, graph_current, current_cost, current_decomp_cost, max_cost, pi_pulses, + parent_key=None): + if parent_key is None: + self.root = Node(new_key, rotation, U_of_level, graph_current, current_cost, current_decomp_cost, max_cost, + pi_pulses, parent_key) + self.size = 1 + else: + parent_node = self.find_node(self.root, parent_key) + if not parent_node: + raise NodeNotFoundException('No element was found with the informed parent key.') + parent_node.add(new_key, rotation, U_of_level, graph_current, current_cost, current_decomp_cost, max_cost, + pi_pulses) + self.size += 1 + + def find_node(self, node, key): + if node is None or node.key is key: + return node + + if node.children is not None: + for child in node.children: + return_node = self.find_node(child, key) + if return_node: + return return_node + return None + + def depth(self, key): + # GIVES DEPTH FROM THE KEY NODE to LEAVES + node = self.find_node(self.root, key) + if not (node): + raise NodeNotFoundException('No element was found with the informed parent key.') + return self.max_depth(node) + + def max_depth(self, node): + if not node.children: + return 0 + children_max_depth = [] + for child in node.children: + children_max_depth.append(self.max_depth(child)) + return 1 + max(children_max_depth) + + def size_refresh(self, node): + if node.children is None or len(node.children) == 0: + return 0 + else: + children_size = len(node.children) + for child in node.children: + children_size = children_size + self.size_refresh(child) + + return children_size + + def found_checker(self, node): + if not node.children: + return node.finished + + children_checking = [] + for child in node.children: + children_checking.append(self.found_checker(child)) + if True in children_checking: + node.finished = True + + return node.finished + + def min_cost_decomp(self, node): + if not node.children: + return [node], (node.current_cost, node.current_decomp_cost), node.graph + else: + children_cost = [] + + for child in node.children: + if child.finished: + children_cost.append(self.min_cost_decomp(child)) + + minimum_child, best_cost, final_graph = min(children_cost, key=lambda t: t[1][0]) + minimum_child.insert(0, node) + return minimum_child, best_cost, final_graph + + def retrieve_decomposition(self, node): + self.found_checker(node) + + if not node.finished: + decomp_nodes = [] + from numpy import inf + best_cost = inf + final_graph = node.graph + else: + decomp_nodes, best_cost, final_graph = self.min_cost_decomp(node) + + return decomp_nodes, best_cost, final_graph + + def is_empty(self): + return self.size == 0 + + @property + def total_size(self): + self.size = self.size_refresh(self.root) + return self.size + 1 + + def print_tree(self, node, str_aux): + + if node is None: return "Empty tree" + f = "" + if node.finished: + f = "-Finished-" + str_aux += "N" + str(node) + f + "(" + if node.children != None: + str_aux += "\n\t" + for i in range(len(node.children)): + child = node.children[i] + end = ',' if i < len(node.children) - 1 else '' + str_aux = self.print_tree(child, str_aux) + end + + str_aux += ')' + return str_aux + + def __str__(self): + return self.print_tree(self.root, "") diff --git a/src/mqt/qudits/exceptions/compilerexception.py b/src/mqt/qudits/exceptions/compilerexception.py new file mode 100644 index 0000000..8619b10 --- /dev/null +++ b/src/mqt/qudits/exceptions/compilerexception.py @@ -0,0 +1,22 @@ +class NodeNotFoundException(Exception): + def __init__(self, value): + self.value = value + + def __str__(self): + return repr(self.value) + + +class SequenceFoundException(Exception): + def __init__(self, node_key=-1): + self.last_node_id = node_key + + def __str__(self): + return repr(self.last_node_id) + + +class RoutingException(Exception): + def __init__(self): + self.message = "ROUTING PROBLEM STUCK!" + + def __str__(self): + return repr(self.message) \ No newline at end of file diff --git a/src/mqt/qudits/qudit_circuits/__init__.py b/src/mqt/qudits/qudit_circuits/__init__.py index e69de29..b39b833 100644 --- a/src/mqt/qudits/qudit_circuits/__init__.py +++ b/src/mqt/qudits/qudit_circuits/__init__.py @@ -0,0 +1,2 @@ +from mqt.qudits.qudit_circuits.qasm_interface.qasm import QASM +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.controls import ControlData diff --git a/src/mqt/qudits/qudit_circuits/circuit.py b/src/mqt/qudits/qudit_circuits/circuit.py index 59eb17c..df686e0 100644 --- a/src/mqt/qudits/qudit_circuits/circuit.py +++ b/src/mqt/qudits/qudit_circuits/circuit.py @@ -1,9 +1,13 @@ from __future__ import annotations -from typing import TYPE_CHECKING, ClassVar +import copy +import warnings +from typing import TYPE_CHECKING +from mqt.qudits.qudit_circuits.components.instructions.gate import Gate from mqt.qudits.qudit_circuits.components.instructions.gate_set.csum import CSum -from mqt.qudits.qudit_circuits.components.instructions.gate_set.custom_multi import CustomMulti, CustomOne +from mqt.qudits.qudit_circuits.components.instructions.gate_set.custom_multi import CustomMulti +from mqt.qudits.qudit_circuits.components.instructions.gate_set.custom_one import CustomOne from mqt.qudits.qudit_circuits.components.instructions.gate_set.custom_two import CustomTwo from mqt.qudits.qudit_circuits.components.instructions.gate_set.cx import CEx from mqt.qudits.qudit_circuits.components.instructions.gate_set.gellman import GellMann @@ -15,6 +19,7 @@ from mqt.qudits.qudit_circuits.components.instructions.gate_set.randu import RandU from mqt.qudits.qudit_circuits.components.instructions.gate_set.rz import Rz from mqt.qudits.qudit_circuits.components.instructions.gate_set.s import S +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz from mqt.qudits.qudit_circuits.components.instructions.gate_set.x import X from mqt.qudits.qudit_circuits.components.instructions.gate_set.z import Z from mqt.qudits.qudit_circuits.components.registers.quantum_register import QuantumRegister @@ -37,26 +42,28 @@ def gate_constructor(circ, *args): class QuantumCircuit: - __qasm_to_gate_set_dict: ClassVar[dict] = { - "csum": "csum", - "cuone": "cu_one", - "cutwo": "cu_two", + qasm_to_gate_set_dict = { + "csum": "csum", + "cuone": "cu_one", + "cutwo": "cu_two", "cumulti": "cu_multi", - "cx": "cx", - "gell": "gellmann", - "h": "h", - "ls": "ls", - "ms": "ms", - "pm": "pm", - "rxy": "r", - "rdu": "randu", - "rz": "rz", - "s": "s", - "x": "x", - "z": "z", + "cx": "cx", + "gell": "gellmann", + "h": "h", + "ls": "ls", + "ms": "ms", + "pm": "pm", + "rxy": "r", + "rdu": "randu", + "rz": "rz", + "virtrz": "virtrz", + "s": "s", + "x": "x", + "z": "z" } def __init__(self, *args): + self.inverse_sitemap = {} self.number_gates = 0 self.instructions = [] self.quantum_registers = [] @@ -70,9 +77,10 @@ def __init__(self, *args): if len(args) > 1: # case 1 # num_qudits: int, dimensions_slice: List[int]|None, numcl: int - self._num_qudits = args[0] - self._dimensions = self._num_qudits * [2] if args[1] is None else args[1] - self._num_cl = args[2] + num_qudits = args[0] + dims = num_qudits * [2] if args[1] is None else args[1] + self.append(QuantumRegister("q", num_qudits, dims)) + # self._num_cl = args[2] elif isinstance(args[0], QuantumRegister): # case 2 # quantum register based construction @@ -81,7 +89,7 @@ def __init__(self, *args): @classmethod def get_qasm_set(cls): - return cls.__qasm_to_gate_set_dict + return cls.qasm_to_gate_set_dict @property def num_qudits(self): @@ -95,11 +103,15 @@ def reset(self): self.number_gates = 0 self.instructions = [] self.quantum_registers = [] + self.inverse_sitemap = {} self._sitemap = {} self._num_cl = 0 self._num_qudits = 0 self._dimensions = [] + def copy(self): + return copy.deepcopy(self) + def append(self, qreg: QuantumRegister): self.quantum_registers.append(qreg) self._num_qudits += qreg.size @@ -109,54 +121,57 @@ def append(self, qreg: QuantumRegister): for i in range(qreg.size): qreg.local_sitemap[i] = num_lines_stored + i self._sitemap[(str(qreg.label), i)] = (num_lines_stored + i, qreg.dimensions[i]) + self.inverse_sitemap[num_lines_stored + i] = (str(qreg.label), i) @add_gate_decorator def csum(self, qudits: list[int]): return CSum( - self, "CSum" + str([self.dimensions[i] for i in qudits]), qudits, [self.dimensions[i] for i in qudits], None + self, "CSum" + str([self.dimensions[i] for i in qudits]), qudits, [self.dimensions[i] for i in qudits], + None ) @add_gate_decorator def cu_one(self, qudits: int, parameters: np.ndarray, controls: ControlData | None = None): return CustomOne( - self, "CUo" + str(self.dimensions[qudits]), qudits, parameters, self.dimensions[qudits], controls + self, "CUo" + str(self.dimensions[qudits]), qudits, parameters, self.dimensions[qudits], controls ) @add_gate_decorator def cu_two(self, qudits: int, parameters: np.ndarray, controls: ControlData | None = None): return CustomTwo( - self, - "CUt" + str([self.dimensions[i] for i in qudits]), - qudits, - parameters, - [self.dimensions[i] for i in qudits], - controls, + self, + "CUt" + str([self.dimensions[i] for i in qudits]), + qudits, + parameters, + [self.dimensions[i] for i in qudits], + controls, ) @add_gate_decorator def cu_multi(self, qudits: int, parameters: np.ndarray, controls: ControlData | None = None): return CustomMulti( - self, - "CUm" + str([self.dimensions[i] for i in qudits]), - qudits, - parameters, - [self.dimensions[i] for i in qudits], - controls, + self, + "CUm" + str([self.dimensions[i] for i in qudits]), + qudits, + parameters, + [self.dimensions[i] for i in qudits], + controls, ) @add_gate_decorator def cx(self, qudits: list[int], parameters: list | None = None): return CEx( - self, - "CEx" + str([self.dimensions[i] for i in qudits]), - qudits, - parameters, - [self.dimensions[i] for i in qudits], - None, + self, + "CEx" + str([self.dimensions[i] for i in qudits]), + qudits, + parameters, + [self.dimensions[i] for i in qudits], + None, ) @add_gate_decorator def gellmann(self, qudit: int, parameters: list | None = None, controls: ControlData | None = None): + warnings.warn("Using this matrix in a circuit will not allow simulation.", UserWarning) return GellMann(self, "Gell" + str(self.dimensions[qudit]), qudit, parameters, self.dimensions[qudit], controls) @add_gate_decorator @@ -166,34 +181,34 @@ def h(self, qudit: int, controls: ControlData | None = None): @add_gate_decorator def ls(self, qudits: list[int], parameters: list | None = None): return LS( - self, - "LS" + str([self.dimensions[i] for i in qudits]), - qudits, - parameters, - [self.dimensions[i] for i in qudits], - None, + self, + "LS" + str([self.dimensions[i] for i in qudits]), + qudits, + parameters, + [self.dimensions[i] for i in qudits], + None, ) @add_gate_decorator def ms(self, qudits: list[int], parameters: list | None = None): return MS( - self, - "MS" + str([self.dimensions[i] for i in qudits]), - qudits, - parameters, - [self.dimensions[i] for i in qudits], - None, + self, + "MS" + str([self.dimensions[i] for i in qudits]), + qudits, + parameters, + [self.dimensions[i] for i in qudits], + None, ) @add_gate_decorator def pm(self, qudits: list[int], parameters: list): return Perm( - self, - "Pm" + str([self.dimensions[i] for i in qudits]), - qudits, - parameters, - [self.dimensions[i] for i in qudits], - None, + self, + "Pm" + str([self.dimensions[i] for i in qudits]), + qudits, + parameters, + [self.dimensions[i] for i in qudits], + None, ) @add_gate_decorator @@ -201,15 +216,18 @@ def r(self, qudit: int, parameters: list, controls: ControlData | None = None): return R(self, "R" + str(self.dimensions[qudit]), qudit, parameters, self.dimensions[qudit], controls) @add_gate_decorator - def randu(self, qudits: list[int] | int): + def randu(self, qudits: list[int]): return RandU( - self, "RandU" + str([self.dimensions[i] for i in qudits]), qudits, [self.dimensions[i] for i in qudits] + self, "RandU" + str([self.dimensions[i] for i in qudits]), qudits, [self.dimensions[i] for i in qudits] ) @add_gate_decorator def rz(self, qudit: int, parameters: list, controls: ControlData | None = None): return Rz(self, "Rz" + str(self.dimensions[qudit]), qudit, parameters, self.dimensions[qudit], controls) + def virtrz(self, qudit: int, parameters: list, controls: ControlData | None = None): + return VirtRz(self, "VirtRz" + str(self.dimensions[qudit]), qudit, parameters, self.dimensions[qudit], controls) + @add_gate_decorator def s(self, qudit: int, controls: ControlData | None = None): return S(self, "S" + str(self.dimensions[qudit]), qudit, self.dimensions[qudit], controls) @@ -222,6 +240,16 @@ def x(self, qudit: int, controls: ControlData | None = None): def z(self, qudit: int, controls: ControlData | None = None): return Z(self, "Z" + str(self.dimensions[qudit]), qudit, self.dimensions[qudit], controls) + def replace_gate(self, gate_index: int, sequence: list[Gate]): + self.instructions[gate_index:gate_index + 1] = sequence + self.number_gates = (self.number_gates - 1) + len(sequence) + + def set_instructions(self, sequence: list[Gate]): + self.instructions = [] + self.instructions += sequence + self.number_gates = len(sequence) + return self + def from_qasm(self, qasm_prog): self.reset() qasm_parser = QASM().parse_ditqasm2_str(qasm_prog) @@ -250,9 +278,16 @@ def from_qasm(self, qasm_prog): else: qudits_call = [t[0] for t in list(tuples_qudits)] if op["params"]: - function(op["params"], qudits_call) + if op["controls"]: + + function(qudits_call, op["params"], op["controls"]) + else: + function(qudits_call, op["params"]) else: - function(qudits_call) + if op["controls"]: + function(qudits_call, op["controls"]) + else: + function(qudits_call) else: msg = "the required gate is not available anymore." raise NotImplementedError(msg) @@ -261,9 +296,19 @@ def to_qasm(self): text = "" text += "DITQASM 2.0;\n" for qreg in self.quantum_registers: - text += qreg.__qasm__ + text += qreg.__qasm__() + text += "\n" + text += f"creg meas[{len(self.dimensions)}];\n" + for op in self.instructions: - text += op.__qasm__ + text += op.__qasm__() + + cregs_indeces = iter(list(range(len(self.dimensions)))) + for qreg in self.quantum_registers: + for i in range(qreg.size): + text += f"measure {qreg.label}[{i}] -> meas[{next(cregs_indeces)}];\n" + + return text def draw(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate.py index 7b85007..ede8a2e 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate.py @@ -22,21 +22,22 @@ class Gate(Instruction, ABC): """Unitary gate.""" def __init__( - self, - circuit: QuantumCircuit, - name: str, - gate_type: enum, - target_qudits: list[int] | int, - dimensions: list[int] | int, - params: list | None = None, - control_set=None, - label: str | None = None, - duration=None, - unit="dt", + self, + circuit: QuantumCircuit, + name: str, + gate_type: enum, + target_qudits: list[int] | int, + dimensions: list[int] | int, + params: list | None = None, + control_set=None, + label: str | None = None, + duration=None, + unit="dt", ) -> None: self.dagger = False self.parent_circuit = circuit self._name = name + self.gate_type = gate_type self._target_qudits = target_qudits self._dimensions = dimensions self._params = params @@ -44,24 +45,18 @@ def __init__( self._duration = duration self._unit = unit self._controls_data = None - self.is_long_range = False - if isinstance(target_qudits, list) and len(target_qudits) > 0: - self.is_long_range = any((b - a) > 1 for a, b in zip(sorted(target_qudits)[:-1], sorted(target_qudits)[1:])) + self.is_long_range = self.check_long_range() if control_set: self.control(**vars(control_set)) - # TODO do it with inheritance one day - self.gate_type = gate_type - - # Set higher priority than Numpy array and parameters classes - __array_priority__ = 20 + self.qasm_tag = "" @property def reference_lines(self): if isinstance(self._target_qudits, int): - lines = self.get_control_lines + lines = self.get_control_lines.copy() lines.append(self._target_qudits) elif isinstance(self._target_qudits, list): - lines = self._target_qudits + self.get_control_lines + lines = self._target_qudits.copy() + self.get_control_lines.copy() if len(lines) == 0: msg = "Gate has no target or control lines" raise CircuitError(msg) @@ -95,35 +90,69 @@ def control(self, indices: list[int] | int, ctrl_states: list[int] | int): # AT THE MOMENT WE SUPPORT CONTROL OF SINGLE QUDIT GATES assert self.gate_type == GateTypes.SINGLE if len(indices) > self.parent_circuit.num_qudits or any( - idx >= self.parent_circuit.num_qudits for idx in indices + idx >= self.parent_circuit.num_qudits for idx in indices ): msg = "Indices or Number of Controls is beyond the Quantum Circuit Size" raise IndexError(msg) - if any(idx in self._target_qudits for idx in indices): + if isinstance(self._target_qudits, int): + if self._target_qudits in indices: + msg = "Controls overlap with targets" + raise IndexError(msg) + elif any(idx in list(self._target_qudits) for idx in indices): msg = "Controls overlap with targets" raise IndexError(msg) - if any(ctrl >= self._dimensions[i] for i, ctrl in enumerate(ctrl_states)): + #if isinstance(self._dimensions, int): + # dimensions = [self._dimensions] + if any(ctrl >= self.parent_circuit._dimensions[i] for i, ctrl in enumerate(ctrl_states)): msg = "Controls States beyond qudit size " raise IndexError(msg) - if self.reference_lines == 2: + self._controls_data = ControlData(indices, ctrl_states) + # Set new type + if len(self.reference_lines) == 2: self.set_gate_type_two() - elif self.reference_lines > 2: + elif len(self.reference_lines) > 2: self.set_gate_type_multi() - self._controls_data = ControlData(indices, ctrl_states) + self.check_long_range() + return self @abstractmethod def validate_parameter(self, parameter): pass - @abstractmethod def __qasm__(self) -> str: - pass + string = f"{self.qasm_tag} " + if self._params: + string += "(" + for parameter in self._params: + string += f"{parameter}, " + string = string[:-2] + string += ") " + if isinstance(self._target_qudits, int): + targets = [self._target_qudits] + elif isinstance(self._target_qudits, list): + targets = self._target_qudits + for qudit in targets: + string += f"{self.parent_circuit.inverse_sitemap[qudit][0]}[{self.parent_circuit.inverse_sitemap[qudit][1]}], " + string = string[:-2] + if self._controls_data: + string += " ctl " + for ctrl in self._controls_data.indices: + string += f"{self.parent_circuit.inverse_sitemap[qudit][0]}[{self.parent_circuit.inverse_sitemap[qudit][1]}] " + string += str(self._controls_data.ctrl_states) + + return string + ";\n" @abstractmethod def __str__(self): # String representation for drawing? pass + def check_long_range(self): + target_qudits = self.reference_lines + if isinstance(target_qudits, list) and len(target_qudits) > 0: + self.is_long_range = any((b - a) > 1 for a, b in zip(sorted(target_qudits)[:-1], sorted(target_qudits)[1:])) + return self.is_long_range + def set_gate_type_single(self): self.gate_type = GateTypes.SINGLE @@ -142,8 +171,8 @@ def get_control_lines(self): @property def control_info(self): return { - "target": self._target_qudits, + "target": self._target_qudits, "dimensions_slice": self._dimensions, - "params": self._params, - "controls": self._controls_data, + "params": self._params, + "controls": self._controls_data, } diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_extensions/matrix_factory.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_extensions/matrix_factory.py index 1440197..831124f 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_extensions/matrix_factory.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_extensions/matrix_factory.py @@ -4,8 +4,6 @@ import numpy as np -from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes - class MatrixFactory: def __init__(self, gate, identities_flag): @@ -16,96 +14,52 @@ def generate_matrix(self): lines = self.gate.reference_lines circuit = self.gate.parent_circuit ref_slice = list(range(min(lines), max(lines) + 1)) - dimensions_slice = circuit.dimensions[min(lines) : max(lines) + 1] + dimensions_slice = circuit.dimensions[min(lines): max(lines) + 1] matrix = self.gate.__array__() if self.gate.dagger: matrix = matrix.conj().T - control_info = self.gate.control_info + control_info = self.gate.control_info["controls"] - if self.gate.gate_type != GateTypes.SINGLE: - if control_info["controls"]: - controls = control_info.indices - ctrl_levs = control_info.ctrl_states - # supported only CONTROLLED-One qudit gates to be made as multi-controlled, it is still a low level - # control library - matrix = MatrixFactory.apply_identites_and_controls( + if control_info: + controls = control_info.indices + ctrl_levs = control_info.ctrl_states + # preferably only CONTROLLED-One qudit gates to be made as multi-controlled, it is still a low level + # control library + matrix = MatrixFactory.apply_identites_and_controls( matrix, self.gate._target_qudits, dimensions_slice, ref_slice, controls, ctrl_levs - ) - elif self.ids > 0: - matrix = MatrixFactory.apply_identites_and_controls( + ) + elif self.ids > 0: + matrix = MatrixFactory.apply_identites_and_controls( matrix, self.gate._target_qudits, dimensions_slice, ref_slice - ) + ) if self.ids >= 2: matrix = MatrixFactory.wrap_in_identities(matrix, lines, circuit.dimensions) return matrix - # @classmethod - # def check_invariant_lists(cls, list1, list2, excluded_indices): - # # Check if the lengths of the lists are equal - # if len(list1) != len(list2): - # return False - # - # # Iterate over the indices of the lists - # for i in range(len(list1)): - # # Skip the excluded indices - # if i in excluded_indices: - # continue - # - # # Compare the elements at the current index - # if list1[i] != list2[i]: - # return False - # - # # All elements at non-excluded indices are equal - # return True - - # @classmethod - # def apply_identites_and_controls(cls, parameters, qudits_applied, dimensions, controls = None, controls_levels = None): - # - # control_dim = dimensions_slice[0] - # target_dim = dimensions_slice[-1] - # - # reshaped_tensor = np.reshape(parameters, (control_dim, target_dim, control_dim, target_dim)) - # reshaped_tensor = np.transpose(reshaped_tensor, (0, 2, 1, 3)) - # - # reshaped_dims = reshaped_tensor.shape - # parameters = np.reshape(reshaped_tensor, (reshaped_dims[0] * reshaped_dims[1], reshaped_dims[2] * reshaped_dims[3])) - # U, S, V = np.linalg.svd(parameters, full_matrices=False) - # - # V = np.diag(S) @ V - # - # U_tensor = np.reshape(U, (control_dim, control_dim, len(S))) - # U_tensor = np.expand_dims(U_tensor, axis=0) - # U_tensor = np.transpose(U_tensor, (0, 1, 3, 2)) - # V_tensor = np.reshape(V, (len(S), target_dim, target_dim)) - # V_tensor = np.expand_dims(V_tensor, axis=3) - # V_tensor = np.transpose(V_tensor, (0, 1, 3, 2)) - # - # print(U_tensor.shape) - # print(V_tensor.shape) - # for i, line_dim in enumerate(dimensions_slice[1:-1]): - # id_tensor = np.eye(len(S) * line_dim) - # id_tensor = np.reshape(id_tensor, (len(S), line_dim, len(S), line_dim)) - # temp_res = np.einsum("abcd, cefg->abefgd", U_tensor, id_tensor) - # dims = temp_res.shape - # U_tensor = np.reshape(temp_res, (dims[0], dims[1] * dims[2], dims[3], dims[4] * dims[5])) - # result = np.einsum("abcd, cefg->abefgd", U_tensor, V_tensor) - # result = result.squeeze() - # result = np.transpose(result, (0, 1, 3, 2)) - # dims = result.shape - # result = np.reshape(result, (dims[0] * dims[1], dims[2] * dims[3])) - # return result @classmethod def apply_identites_and_controls( - cls, matrix, qudits_applied, dimensions, ref_lines, controls=None, controls_levels=None + cls, matrix, qudits_applied, dimensions, ref_lines, controls=None, controls_levels=None ): + # Convert qudits_applied and dimensions to lists if they are not already + qudits_applied = [qudits_applied] if isinstance(qudits_applied, int) else qudits_applied + dimensions = [dimensions] if isinstance(dimensions, int) else dimensions + if len(dimensions) == 0: + raise ValueError("Dimensions cannot be an empty list") + if len(dimensions) == 1: + return matrix + single_site_logics = [] og_states_space = [] og_state_to_index = {} - for d in list(operator.itemgetter(*qudits_applied)(dimensions)): - single_site_logics.append(list(range(d))) + + if len(qudits_applied) == 1: + single_site_logics.append(list(range(dimensions[qudits_applied[0]]))) + else: + for d in list(operator.itemgetter(*qudits_applied)(dimensions)): + single_site_logics.append(list(range(d))) for element in itertools.product(*single_site_logics): og_states_space.append(list(element)) @@ -125,18 +79,27 @@ def apply_identites_and_controls( for i in range(len(global_states_space)): global_index_to_state[i] = global_states_space[i] - result = np.zeros((reduce(operator.mul, dimensions, 1), reduce(operator.mul, dimensions, 1)), dtype="complex") + result = np.identity(reduce(operator.mul, dimensions, 1), dtype="complex") for r in range(result.shape[0]): for c in range(result.shape[1]): if controls is not None: - if operator.itemgetter(*controls)(global_index_to_state[r]) == controls_levels: + extract_r = operator.itemgetter(*controls)(global_index_to_state[r]) + extract_c = operator.itemgetter(*controls)(global_index_to_state[c]) + if isinstance(extract_r, int): + extract_r = [extract_r] + extract_c = [extract_c] + if extract_r == controls_levels and extract_r == extract_c: rest_of_indices = set(ref_lines) - set(qudits_applied) - set(controls) - if operator.itemgetter(*rest_of_indices)(global_index_to_state[r]) == operator.itemgetter( - *rest_of_indices - )(global_index_to_state[c]): + if not rest_of_indices or operator.itemgetter(*rest_of_indices)( + global_index_to_state[r]) == operator.itemgetter(*rest_of_indices)( + global_index_to_state[c]): og_row_key = operator.itemgetter(*qudits_applied)(global_index_to_state[r]) og_col_key = operator.itemgetter(*qudits_applied)(global_index_to_state[c]) + if isinstance(og_row_key, int): + og_row_key = (og_row_key,) + if isinstance(og_col_key, int): + og_col_key = (og_col_key,) matrix_row = og_state_to_index[tuple(og_row_key)] matrix_col = og_state_to_index[tuple(og_col_key)] value = matrix[matrix_row, matrix_col] @@ -144,11 +107,16 @@ def apply_identites_and_controls( else: rest_of_indices = set(ref_lines) - set(qudits_applied) - if operator.itemgetter(*rest_of_indices)(global_index_to_state[r]) == operator.itemgetter( - *rest_of_indices + if not rest_of_indices or operator.itemgetter(*rest_of_indices)( + global_index_to_state[r]) == operator.itemgetter( + *rest_of_indices )(global_index_to_state[c]): og_row_key = operator.itemgetter(*qudits_applied)(global_index_to_state[r]) og_col_key = operator.itemgetter(*qudits_applied)(global_index_to_state[c]) + if isinstance(og_row_key, int): + og_row_key = (og_row_key,) + if isinstance(og_col_key, int): + og_col_key = (og_col_key,) matrix_row = og_state_to_index[tuple(og_row_key)] matrix_col = og_state_to_index[tuple(og_col_key)] value = matrix[matrix_row, matrix_col] diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/abstract_custom.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/abstract_custom.py index 8122041..2e7e2b0 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/abstract_custom.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/abstract_custom.py @@ -1,5 +1,6 @@ from __future__ import annotations +import enum from abc import ABC from typing import TYPE_CHECKING @@ -14,13 +15,15 @@ class CustomUnitary(Gate, ABC): def __init__( - self, - circuit: QuantumCircuit, - name: str, - parameters: np.ndarray, - target_qudits: list[int] | int, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + gate_type: enum, + target_qudits: list[int] | int, + dimensions: list[int] | int, + parameters: list | None = None, + control_set=None, + label: str | None = None ): pass @@ -31,7 +34,7 @@ def validate_parameter(self, parameter): pass def __qasm__(self) -> str: - pass + raise NotImplemented def __str__(self): pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/csum.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/csum.py index ad95372..6dc85ac 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/csum.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/csum.py @@ -16,21 +16,22 @@ class CSum(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.TWO, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.TWO, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) + self.qasm_tag = "csum" def __array__(self, dtype: str = "complex") -> np.ndarray: ctrl_size = self.parent_circuit.dimensions[self._target_qudits[0]] @@ -43,23 +44,22 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: for i in range(ctrl_size): temp = np.zeros(ctrl_size, dtype="complex") mapmat = temp + np.outer( - np.array(from_dirac_to_basis([i], ctrl_size)), np.array(from_dirac_to_basis([i], ctrl_size)) + np.array(from_dirac_to_basis([i], ctrl_size)), np.array(from_dirac_to_basis([i], ctrl_size)) ) Xmat = x_gate.to_matrix(identities=0) Xmat_i = np.linalg.matrix_power(Xmat, i) - matrix = matrix + (np.kron(mapmat, Xmat_i)) + if self._target_qudits[0] < self._target_qudits[1]: + matrix = matrix + (np.kron(mapmat, Xmat_i)) + else: + matrix = matrix + (np.kron(Xmat_i, mapmat)) return matrix def validate_parameter(self, parameter=None): return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_multi.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_multi.py index 1d12683..9a17265 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_multi.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_multi.py @@ -34,15 +34,14 @@ def __init__( if self.validate_parameter(parameters): self.__array_storage = parameters + self.qasm_tag = "cumulti" def __array__(self, dtype: str = "complex") -> np.ndarray: return self.__array_storage def validate_parameter(self, parameter=None): return isinstance(parameter, np.ndarray) - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_one.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_one.py index 9e6b26f..3dee28d 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_one.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_one.py @@ -14,25 +14,26 @@ class CustomOne(CustomUnitary): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: np.ndarray, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: np.ndarray, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - parameters=parameters, - gate_type=GateTypes.SINGLE, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + parameters=parameters, + gate_type=GateTypes.SINGLE, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) if self.validate_parameter(parameters): self.__array_storage = parameters + self.qasm_tag = "cuone" def __array__(self, dtype: str = "complex") -> np.ndarray: return self.__array_storage @@ -40,10 +41,6 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter=None): return isinstance(parameter, np.ndarray) - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_two.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_two.py index c4dfab8..29b695d 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_two.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/custom_two.py @@ -14,13 +14,13 @@ class CustomTwo(CustomUnitary): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: np.ndarray, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: np.ndarray, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( circuit=circuit, @@ -34,15 +34,14 @@ def __init__( if self.validate_parameter(parameters): self.__array_storage = parameters + self.qasm_tag = "cutwo" def __array__(self, dtype: str = "complex") -> np.ndarray: return self.__array_storage def validate_parameter(self, parameter=None): return isinstance(parameter, np.ndarray) - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/cx.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/cx.py index b5f384f..f84bbc9 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/cx.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/cx.py @@ -19,62 +19,65 @@ class CEx(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: list | None, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list | None, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.TWO, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.TWO, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) self._params = parameters if self.validate_parameter(parameters): - self.lev_a, self.lev_b, self.phi = parameters + self.lev_a, self.lev_b, self.ctrl_lev, self.phi = parameters + self._params = parameters else: - self.lev_a, self.lev_b, self.phi = None, None, None + self.lev_a, self.lev_b, self.ctrl_lev, self.phi = None, None, None, None + self._params = None + self.qasm_tag = "cx" def __array__(self, dtype: str = "complex") -> np.ndarray: if self._params is None: - return self.Cex101() - - dimension = self._dimensions - phi = self.phi - matrix = np.identity(dimension, dtype="complex") - - matrix[self.lev_b, self.lev_a] = -1j * np.cos(phi) - np.sin(phi) - matrix[self.lev_a, self.lev_b] = -1j * np.cos(phi) + np.sin(phi) - matrix[self.lev_b, self.lev_b] = 0 - matrix[self.lev_a, self.lev_a] = 0 - - return matrix + ang = 0 + ctrl_level = 1 + levels_swap_low = 0 + levels_swap_high = 1 + else: + levels_swap_low, levels_swap_high, ctrl_level, ang = self._params - def Cex101(self): - ang = 0 dimension = reduce(lambda x, y: x * y, self._dimensions) - result = np.zeros(dimension, dtype="complex") + dimension_ctrl, dimension_target = self._dimensions + result = np.zeros((dimension, dimension), dtype="complex") - for i in range(dimension): - temp = np.zeros(dimension, dtype="complex") + for i in range(dimension_ctrl): + temp = np.zeros((dimension_ctrl, dimension_ctrl), dtype="complex") mapmat = temp + np.outer( - np.array(from_dirac_to_basis([i], dimension)), np.array(from_dirac_to_basis([i], dimension)) + np.array(from_dirac_to_basis([i], dimension_ctrl)), + np.array(from_dirac_to_basis([i], dimension_ctrl)) ) - if i == 1: # apply control on 1 rotation on levels 01 - opmat = np.array([[0, -1j * np.cos(ang) - np.sin(ang)], [-1j * np.cos(ang) + np.sin(ang), 0]]) - embedded_op = np.identity(dimension, dtype="complex") - embedded_op = insert_at(embedded_op, (0, 0), opmat) + if i == ctrl_level: # apply control on 1 rotation on levels 01 + #opmat = np.array([[0, -1j * np.cos(ang) - np.sin(ang)], [-1j * np.cos(ang) + np.sin(ang), 0]]) + embedded_op = np.identity(dimension_target, dtype="complex") + embedded_op[levels_swap_low, levels_swap_low] = 0 + embedded_op[levels_swap_low, levels_swap_high] = -1j * np.cos(ang) - np.sin(ang) + embedded_op[levels_swap_high, levels_swap_low] = -1j * np.cos(ang) + np.sin(ang) + embedded_op[levels_swap_high, levels_swap_high] = 0 + #embedded_op = insert_at(embedded_op, (0, 0), opmat) else: - embedded_op = np.identity(dimension, dtype="complex") - - result += np.kron(mapmat, embedded_op) + embedded_op = np.identity(dimension_target, dtype="complex") + if self._target_qudits[0] < self._target_qudits[1]: + result = result + np.kron(mapmat, embedded_op) + else: + result = result + np.kron(embedded_op, mapmat) return result @@ -84,17 +87,14 @@ def validate_parameter(self, parameter): assert isinstance(parameter[0], int) assert isinstance(parameter[1], int) assert isinstance(parameter[2], int) + assert isinstance(parameter[3], float) assert ( - 0 <= parameter[0] < parameter[1] + 0 <= parameter[0] < parameter[1] ), f"lev_a and lev_b are out of range or in wrong order: {parameter[0]}, {parameter[1]}" - assert 0 <= parameter[2] <= 2 * np.pi, f"Angle should be in the range [0, 2*pi]: {parameter[2]}" + assert 0 <= parameter[3] <= 2 * np.pi, f"Angle should be in the range [0, 2*pi]: {parameter[2]}" return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/gellman.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/gellman.py index a6572af..ad50139 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/gellman.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/gellman.py @@ -13,25 +13,31 @@ class GellMann(Gate): + """ + Gate used as generator for Givens rotations. + """ + def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: list, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.SINGLE, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.SINGLE, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) if self.validate_parameter(parameters): self.lev_a, self.lev_b, self.type_m = parameters + self._params = parameters + self.qasm_tag = "gell" def __array__(self, dtype: str = "complex") -> np.ndarray: d = self._dimensions @@ -44,7 +50,6 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: matrix[self.lev_a, self.lev_b] -= 1j matrix[self.lev_b, self.lev_a] += 1j else: - # lev_a is l in this case E = np.zeros((d, d), dtype=complex) for j_ind in range(0, self.lev_b): @@ -63,18 +68,14 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter): assert isinstance(parameter[0], int) assert isinstance(parameter[1], int) - assert isinstance(parameter[2], int) + assert isinstance(parameter[2], str) assert ( - 0 <= parameter[0] < parameter[1] + 0 <= parameter[0] < parameter[1] ), f"lev_a and lev_b are out of range or in wrong order: {parameter[0]}, {parameter[1]}" assert isinstance(parameter[2], str), "type parameter should be a string" return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/h.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/h.py index 43ace41..d3a0c59 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/h.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/h.py @@ -30,6 +30,7 @@ def __init__( dimensions=dimensions, control_set=controls, ) + self.qasm_tag = "h" def __array__(self, dtype: str = "complex") -> np.ndarray: basis_states_projectors = [list(range(self._dimensions)), list(range(self._dimensions))] @@ -60,10 +61,6 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter=None): return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ls.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ls.py index 0dfd7ce..4ac8929 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ls.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ls.py @@ -1,7 +1,6 @@ from __future__ import annotations from typing import TYPE_CHECKING - import numpy as np from scipy.linalg import expm @@ -16,50 +15,45 @@ class LS(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: list | None, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list | None, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.TWO, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.TWO, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) if self.validate_parameter(parameters): self.theta = parameters[0] + self._params = parameters + self.qasm_tag = "ls" def __array__(self, dtype: str = "complex") -> np.ndarray: dimension_0 = self._dimensions[0] dimension_1 = self._dimensions[1] - exp_matrix = np.outer(np.array([0] * dimension_0**2), np.array([0] * dimension_1**2)) + exp_matrix = np.zeros((dimension_0 * dimension_1, dimension_0 * dimension_1), dtype="complex") d_min = min(dimension_0, dimension_1) for i in range(d_min): exp_matrix += np.outer( - np.array(from_dirac_to_basis([i, i], self._dimensions)), - np.array(from_dirac_to_basis([i, i], self._dimensions)), + np.array(from_dirac_to_basis([i, i], self._dimensions)), + np.array(from_dirac_to_basis([i, i], self._dimensions)), ) - for j in range(d_min + 1, dimension_0 * dimension_1): - exp_matrix[j][j] = -1.0 - return expm(-1j * self.theta * exp_matrix) def validate_parameter(self, parameter): assert 0 <= parameter[0] <= 2 * np.pi, f"Angle should be in the range [0, 2*pi]: {parameter[0]}" return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ms.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ms.py index acf4c04..aca853a 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ms.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/ms.py @@ -16,24 +16,26 @@ class MS(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: list | None, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list | None, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.TWO, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.TWO, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) if self.validate_parameter(parameters): self.theta = parameters[0] + self._params = parameters + self.qasm_tag = "ms" def __array__(self, dtype: str = "complex") -> np.ndarray: theta = self.theta @@ -41,28 +43,60 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: dimension_1 = self._dimensions[1] return expm( - -1j - * theta - * ( - ( - np.outer(np.identity(dimension_0, dtype="complex"), GellMann(0, 1, "s", dimension_1).to_matrix()) - + np.outer(GellMann(0, 1, "s", dimension_0).to_matrix(), np.identity(dimension_1, dtype="complex")) + -1j + * theta + * ( + ( + np.outer(np.identity(dimension_0, dtype="complex"), + GellMann( + self.parent_circuit, + "Gellman_s", + self._target_qudits, + [0, 1, "s"], + dimension_1, + None, + ).to_matrix()) + + np.outer( + GellMann( + self.parent_circuit, + "Gellman_s", + self._target_qudits, + [0, 1, "s"], + dimension_0, + None, + ).to_matrix(), + np.identity(dimension_1, dtype="complex")) + ) + @ ( + np.outer(np.identity(dimension_0, dtype="complex"), + GellMann( + self.parent_circuit, + "Gellman_s", + self._target_qudits, + [0, 1, "s"], + dimension_1, + None, + ).to_matrix()) + + np.outer( + GellMann( + self.parent_circuit, + "Gellman_s", + self._target_qudits, + [0, 1, "s"], + dimension_0, + None, + ).to_matrix(), + np.identity(dimension_1, dtype="complex")) + ) ) - @ ( - np.outer(np.identity(dimension_0, dtype="complex"), GellMann(0, 1, "s", dimension_1).to_matrix()) - + np.outer(GellMann(0, 1, "s", dimension_0).to_matrix(), np.identity(dimension_1, dtype="complex")) - ) - ) - / 4 + / 4 ) def validate_parameter(self, parameter): assert 0 <= parameter[0] <= 2 * np.pi, f"Angle should be in the range [0, 2*pi]: {parameter[0]}" return True - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/perm.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/perm.py index ff5a879..1ccabdc 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/perm.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/perm.py @@ -33,6 +33,8 @@ def __init__( ) if self.validate_parameter(parameters): self.perm_data = parameters + self._params = parameters + self.qasm_tag = "pm" def __array__(self, dtype: str = "complex") -> np.ndarray: return np.eye(reduce(lambda x, y: x * y, self._dimensions))[:, self.perm_data] @@ -44,9 +46,7 @@ def validate_parameter(self, parameter): ), "Numbers are not within the range of the list length" return True - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/r.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/r.py index c8a1440..ececd2f 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/r.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/r.py @@ -4,6 +4,7 @@ import numpy as np +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import regulate_theta, theta_cost from mqt.qudits.qudit_circuits.components.instructions.gate import Gate from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes from mqt.qudits.qudit_circuits.components.instructions.gate_set.gellman import GellMann @@ -15,24 +16,28 @@ class R(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: list | None, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list | None, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.TWO, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.SINGLE, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) if self.validate_parameter(parameters): self.lev_a, self.lev_b, self.theta, self.phi = parameters + self.lev_a, self.lev_b = self.levels_setter(self.original_lev_a, self.original_lev_b) + self.theta = regulate_theta(self.theta) + self._params = parameters + self.qasm_tag = "rxy" def __array__(self, dtype: str = "complex") -> np.ndarray: dimension = self._dimensions @@ -46,42 +51,50 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: cosine_matrix = matrix return cosine_matrix - 1j * np.sin(theta / 2) * ( - np.sin(phi) - * GellMann( + np.sin(phi) + * GellMann( self.parent_circuit, "Gellman_a", self._target_qudits, [self.lev_a, self.lev_b, "a"], self._dimensions, None, - ).to_matrix() - + np.cos(phi) - * GellMann( + ).to_matrix() + + np.cos(phi) + * GellMann( self.parent_circuit, "Gellman_s", self._target_qudits, [self.lev_a, self.lev_b, "s"], self._dimensions, None, - ).to_matrix() + ).to_matrix() ) + def levels_setter(self, la, lb): + if la < lb: + return la, lb + else: + return lb, la + def validate_parameter(self, parameter): assert isinstance(parameter[0], int) assert isinstance(parameter[1], int) - assert isinstance(parameter[2], int) - assert ( - 0 <= parameter[0] < parameter[1] - ), f"lev_a and lev_b are out of range or in wrong order: {parameter[0]}, {parameter[1]}" - assert 0 <= parameter[2] <= 2 * np.pi, f"Angle theta should be in the range [0, 2*pi]: {parameter[2]}" - assert 0 <= parameter[3] <= 2 * np.pi, f"Angle phi should be in the range [0, 2*pi]: {parameter[3]}" + assert isinstance(parameter[2], float) + assert isinstance(parameter[3], float) + assert parameter[0] >= 0 and parameter[0] <= self._dimensions + assert parameter[1] >= 0 and parameter[1] <= self._dimensions + assert parameter[0] != parameter[1] + # Useful to remember direction of the rotation + self.original_lev_a = parameter[0] + self.original_lev_b = parameter[1] return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass + + @property + def cost(self): + return theta_cost(self.theta) diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/randu.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/randu.py index 24a1def..ebb1867 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/randu.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/randu.py @@ -17,12 +17,12 @@ class RandU(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( circuit=circuit, @@ -32,6 +32,7 @@ def __init__( dimensions=dimensions, control_set=controls, ) + self.qasm_tag = "rdu" def __array__(self, dtype: str = "complex") -> np.ndarray: dim = reduce(lambda x, y: x * y, self._dimensions) @@ -40,10 +41,6 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter): return True - def __qasm__(self) -> str: - # TODO - pass - def __str__(self): # TODO pass diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/rz.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/rz.py index 82152ab..70c307e 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/rz.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/rz.py @@ -4,6 +4,7 @@ import numpy as np +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import regulate_theta from mqt.qudits.qudit_circuits.components.instructions.gate import Gate from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R @@ -15,55 +16,64 @@ class Rz(Gate): def __init__( - self, - circuit: QuantumCircuit, - name: str, - target_qudits: list[int] | int, - parameters: list | None, - dimensions: list[int] | int, - controls: ControlData | None = None, + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list | None, + dimensions: list[int] | int, + controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.TWO, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.SINGLE, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) if self.validate_parameter(parameters): self.lev_a, self.lev_b, self.phi = parameters + self.phi = regulate_theta(self.phi) + self.lev_a, self.lev_b = self.levels_setter(self.original_lev_a, self.original_lev_b) + self._params = parameters + self.qasm_tag = "rz" def __array__(self, dtype: str = "complex") -> np.ndarray: dimension = self._dimensions phi = self.phi pi_there = R( - self.parent_circuit, "R", self._target_qudits, [self.lev_a, self.lev_b, -np.pi / 2, 0.0], dimension + self.parent_circuit, "R", self._target_qudits, [self.lev_a, self.lev_b, -np.pi / 2, 0.0], dimension ).to_matrix() rotate = R( - self.parent_circuit, "R", self._target_qudits, [self.lev_a, self.lev_b, phi, np.pi / 2], dimension + self.parent_circuit, "R", self._target_qudits, [self.lev_a, self.lev_b, phi, np.pi / 2], dimension ).to_matrix() pi_back = R( - self.parent_circuit, "R", self._target_qudits, [self.lev_a, self.lev_b, np.pi / 2, 0.0], dimension + self.parent_circuit, "R", self._target_qudits, [self.lev_a, self.lev_b, np.pi / 2, 0.0], dimension ).to_matrix() return pi_back @ rotate @ pi_there + def levels_setter(self, la, lb): + if la < lb: + return la, lb + else: + return lb, la + def validate_parameter(self, parameter): assert isinstance(parameter[0], int) assert isinstance(parameter[1], int) - assert isinstance(parameter[2], int) - assert ( - 0 <= parameter[0] < parameter[1] - ), f"lev_a and lev_b are out of range or in wrong order: {parameter[0]}, {parameter[1]}" - assert 0 <= parameter[2] <= 2 * np.pi, f"Angle phi should be in the range [0, 2*pi]: {parameter[2]}" + assert isinstance(parameter[2], float) - return True + assert parameter[0] >= 0 and parameter[0] <= self._dimensions + assert parameter[1] >= 0 and parameter[1] <= self._dimensions + assert parameter[0] != parameter[1] + # Useful to remember direction of the rotation + self.original_lev_a = parameter[0] + self.original_lev_b = parameter[1] - def __qasm__(self) -> str: - # TODO - pass + return True def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/s.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/s.py index 7830f84..290bd4b 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/s.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/s.py @@ -29,6 +29,7 @@ def __init__( dimensions=dimensions, control_set=controls, ) + self.qasm_tag = "s" def __array__(self, dtype: str = "complex") -> np.ndarray: dimension = self._dimensions @@ -58,9 +59,7 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter=None): return True - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/virt_rz.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/virt_rz.py new file mode 100644 index 0000000..3103308 --- /dev/null +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/virt_rz.py @@ -0,0 +1,60 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING + +import numpy as np + +from mqt.qudits.compiler.onedit.local_rotation_tools.local_compilation_minitools import phi_cost, regulate_theta +from mqt.qudits.qudit_circuits.components.instructions.gate import Gate +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes + +if TYPE_CHECKING: + from mqt.qudits.qudit_circuits.circuit import QuantumCircuit + from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.controls import ControlData + + +class VirtRz(Gate): + def __init__( + self, + circuit: QuantumCircuit, + name: str, + target_qudits: list[int] | int, + parameters: list | None, + dimensions: list[int] | int, + controls: ControlData | None = None, + ): + super().__init__( + circuit=circuit, + name=name, + gate_type=GateTypes.SINGLE, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, + ) + if self.validate_parameter(parameters): + self.lev_a, self.phi = parameters + self.phi = regulate_theta(self.phi) + self._params = parameters + self.qasm_tag = "virtrz" + + def __array__(self, dtype: str = "complex") -> np.ndarray: + dimension = self._dimensions + theta = self.phi + matrix = np.identity(dimension, dtype='complex') + matrix[self.lev_a, self.lev_a] = np.exp(-1j * theta) * matrix[self.lev_a, self.lev_a] + + return matrix + + def validate_parameter(self, parameter): + assert isinstance(parameter[0], int) + assert isinstance(parameter[1], float) + assert 0 <= parameter[0] <= self._dimensions + return True + + def __str__(self): + # TODO + pass + + @property + def cost(self): + return phi_cost(self.phi) diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/x.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/x.py index 6f63fd3..aeeee5c 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/x.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/x.py @@ -29,6 +29,7 @@ def __init__( dimensions=dimensions, control_set=controls, ) + self.qasm_tag = "x" def __array__(self, dtype: str = "complex") -> np.ndarray: basis_states_list = list(range(self._dimensions)) @@ -46,7 +47,7 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: array1 = np.array(l1, dtype="complex") array2 = np.array(l2, dtype="complex") - result = np.outer(array1, array2) + result = np.outer(array2, array1) matrix = matrix + result return matrix @@ -54,9 +55,7 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter=None): return True - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/z.py b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/z.py index 557b568..d47e4f9 100644 --- a/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/z.py +++ b/src/mqt/qudits/qudit_circuits/components/instructions/gate_set/z.py @@ -22,14 +22,14 @@ def __init__( controls: ControlData | None = None, ): super().__init__( - circuit=circuit, - name=name, - gate_type=GateTypes.SINGLE, - target_qudits=target_qudits, - dimensions=dimensions, - control_set=controls, + circuit=circuit, + name=name, + gate_type=GateTypes.SINGLE, + target_qudits=target_qudits, + dimensions=dimensions, + control_set=controls, ) - + self.qasm_tag = "z" def __array__(self, dtype: str = "complex") -> np.ndarray: dimension = self._dimensions levels_list = list(range(dimension)) @@ -58,9 +58,7 @@ def __array__(self, dtype: str = "complex") -> np.ndarray: def validate_parameter(self, parameter=None): return True - def __qasm__(self) -> str: - # TODO - pass + def __str__(self): # TODO diff --git a/src/mqt/qudits/qudit_circuits/components/registers/quantum_register.py b/src/mqt/qudits/qudit_circuits/components/registers/quantum_register.py index a6de020..d7da71c 100644 --- a/src/mqt/qudits/qudit_circuits/components/registers/quantum_register.py +++ b/src/mqt/qudits/qudit_circuits/components/registers/quantum_register.py @@ -13,13 +13,13 @@ def from_map(cls, sitemap: dict) -> List["QuantumRegister"]: else: registers_map[reg_name][0][inreg_line_index] = line_info[0] registers_map[reg_name][1].append(line_info[1]) - print(registers_map) + #print(registers_map) registers_from_qasm = [] for label, data in registers_map.items(): temp = QuantumRegister(label, len(data[0]), data[1]) temp.local_sitemap = data[0] registers_from_qasm.append(temp) - print(registers_from_qasm) + #print(registers_from_qasm) return registers_from_qasm def __init__(self, name, size, dims=None): @@ -28,7 +28,6 @@ def __init__(self, name, size, dims=None): self.dimensions = size * [2] if dims is None else dims self.local_sitemap = {} - @property def __qasm__(self): string_dims = str(self.dimensions).replace(" ", "") return "qreg " + self.label + " [" + str(self.size) + "]" + string_dims + ";" diff --git a/src/mqt/qudits/qudit_circuits/qasm_interface/qasm.py b/src/mqt/qudits/qudit_circuits/qasm_interface/qasm.py index afedfe3..872a34b 100644 --- a/src/mqt/qudits/qudit_circuits/qasm_interface/qasm.py +++ b/src/mqt/qudits/qudit_circuits/qasm_interface/qasm.py @@ -2,7 +2,9 @@ import warnings from pathlib import Path -import sympy as sp +import numpy as np + +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.controls import ControlData class QASM: @@ -30,20 +32,58 @@ def parse_nonspecial_lines(self, line, rgxs, in_comment_flag): return True, in_comment return False, in_comment + def parse_qreg(self, line, rgxs, sitemap): + match = rgxs["qreg"].match(line) + if match: + name, nq, qdims = match.groups() + nq = int(*re.search(r"\[(\d+)\]", nq).groups()) + + if qdims: + qdims = qdims.split(",") if qdims else [] + qdims = [int(num) for num in qdims] + else: + qdims = [2] * nq + + for i in range(int(nq)): + sitemap[(str(name), i)] = len(sitemap), qdims[i] + + return True + return False + + def safe_eval_math_expression(self, expression): + try: + expression = expression.replace("pi", str(np.pi)) + # Define a dictionary of allowed names + allowed_names = {'__builtins__': None, 'pi': np.pi} + # Use eval with restricted names + result = eval(expression, allowed_names) + return result + except (ValueError, SyntaxError) as e: + print(f"Error evaluating expression: {e}") + return None + def parse_gate(self, line, rgxs, sitemap, gates): match = rgxs["gate"].search(line) if match: - label, params, qudits = ( - match.group(1), - match.group(2), - match.group(3), - ) - + label = match.group(1) + params = match.group(2) + qudits = match.group(3) + ctl_pattern = match.group(5) + ctl_qudits = match.group(6) + ctl_levels = match.group(8) + + # params = ( + # tuple(sp.sympify(param.replace("pi", str(sp.pi))) for param in params.strip("()").split(",")) + # if params + # else () + # ) + # Evaluate params using NumPy and NumExpr params = ( - tuple(sp.sympify(param.replace("pi", str(sp.pi))) for param in params.strip("()").split(",")) + tuple(self.safe_eval_math_expression(param) for param in params.strip("()").split(",")) if params else () ) + qudits_list = [] for dit in qudits.split(","): match = rgxs["qreg_indexing"].match(str(dit)) @@ -52,12 +92,45 @@ def parse_gate(self, line, rgxs, sitemap, gates): reg_qudit_index = int(*re.search(r"\[(\d+)\]", reg_qudit_index).groups()) qudit = tuple(sitemap[(name, reg_qudit_index)]) qudits_list.append(qudit) - gate_dict = {"name": label, "params": params, "qudits": qudits_list} + + qudits_control_list = [] + if ctl_pattern is not None: + matches = rgxs["qreg_indexing"].findall(ctl_qudits) + for match in matches: + name, reg_qudit_index = match + reg_qudit_index = int(*re.search(r"\[(\d+)\]", reg_qudit_index).groups()) + qudit = tuple(sitemap[(name, reg_qudit_index)]) + qudits_control_list.append(qudit[0]) + + qudits_levels_list = [] + if ctl_levels is not None: + numbers = re.compile(r'\d+') + matches = numbers.findall(ctl_levels) + for level in matches: + qudits_levels_list.append(int(level)) + + if len(qudits_control_list) == 0 and len(qudits_levels_list) == 0: + controls = None + else: + controls = ControlData(qudits_control_list, qudits_levels_list) + gate_dict = {"name": label, "params": params, "qudits": qudits_list, "controls": controls} + gates.append(gate_dict) return True return False + def parse_ignore(self, line, rgxs, warned): + match = rgxs["ignore"].match(line) + if match: + # certain operations we can just ignore and warn about + (op,) = match.groups() + if not warned.get(op, False): + #warnings.warn(f"Unsupported operation ignored: {op}", SyntaxWarning, stacklevel=2) + warned[op] = True + return True + return False + def parse_ditqasm2_str(self, contents): """Parse the string contents of an OpenQASM 2.0 file. This parser only supports basic gate definitions, and is not guaranteed to check the full @@ -65,15 +138,19 @@ def parse_ditqasm2_str(self, contents): """ # define regular expressions for parsing rgxs = { - "header": re.compile(r"(DITQASM\s+2.0;)|(include\s+\"qelib1.inc\";)"), - "comment": re.compile(r"^//"), + "header": re.compile(r"(DITQASM\s+2.0;)|(include\s+\"qelib1.inc\";)"), + "comment": re.compile(r"^//"), "comment_start": re.compile(r"/\*"), - "comment_end": re.compile(r"\*/"), - "qreg": re.compile(r"qreg\s+(\w+)\s+(\[\s*\d+\s*\])(?:\s*\[(\d+(?:,\s*\d+)*)\])?;"), + "comment_end": re.compile(r"\*/"), + "qreg": re.compile(r"qreg\s+(\w+)\s+(\[\s*\d+\s*\])(?:\s*\[(\d+(?:,\s*\d+)*)\])?;"), + # "ctrl_id": re.compile(r"\s+(\w+)\s*(\[\s*\d+\s*\])\s*(\s*\w+\s*\[\d+\])*\s*"), "qreg_indexing": re.compile(r"\s*(\w+)\s*(\[\s*\d+\s*\])"), - "gate": re.compile(r"(\w+)\s*(?:\(([^)]*)\))?\s*(\w+\[\d+\]\s*(,\s*\w+\[\d+\])*)\s*;"), - "error": re.compile(r"^(gate|if)"), - "ignore": re.compile(r"^(creg|measure|barrier)"), + # "gate": re.compile(r"(\w+)\s*(?:\(([^)]*)\))?\s*(\w+\[\d+\]\s*(,\s*\w+\[\d+\])*)\s*;"), + "gate": re.compile(r"(\w+)\s*(?:\(([^)]*)\))?\s*(\w+\[\d+\]\s*(,\s*\w+\[\d+\])*)\s*" + r"(ctl(\s+\w+\[\d+\]\s*(\s*\w+\s*\[\d+\])*)\s*(\[(\d+(,\s*\d+)*)\]))?" + r"\s*;"), + "error": re.compile(r"^(gate|if)"), + "ignore": re.compile(r"^(creg|measure|barrier)"), } # initialise number of qubits to zero and an empty list for instructions @@ -91,29 +168,13 @@ def parse_ditqasm2_str(self, contents): if continue_flag: continue - match = rgxs["qreg"].match(line) - if match: - name, nq, qdims = match.groups() - nq = int(*re.search(r"\[(\d+)\]", nq).groups()) - - if qdims: - qdims = qdims.split(",") if qdims else [] - qdims = [int(num) for num in qdims] - else: - qdims = [2] * nq - - for i in range(int(nq)): - sitemap[(str(name), i)] = len(sitemap), qdims[i] + if self.parse_qreg(line, rgxs, sitemap): + continue + if self.parse_ignore(line, rgxs, warned): continue - match = rgxs["ignore"].match(line) - if match: - # certain operations we can just ignore and warn about - (op,) = match.groups() - if not warned.get(op, False): - warnings.warn(f"Unsupported operation ignored: {op}", SyntaxWarning, stacklevel=2) - warned[op] = True + if self.parse_gate(line, rgxs, sitemap, gates): continue if rgxs["error"].match(line): @@ -121,17 +182,14 @@ def parse_ditqasm2_str(self, contents): msg = f"Custom gate definitions are not supported: {line}" raise NotImplementedError(msg) - if self.parse_gate(line, rgxs, sitemap, gates): - continue - # if not covered by previous checks, simply raise msg = f"{line}" raise SyntaxError(msg) self._program = { - "n": len(sitemap), - "sitemap": sitemap, + "n": len(sitemap), + "sitemap": sitemap, "instructions": gates, - "n_gates": len(gates), + "n_gates": len(gates), } return self._program @@ -140,3 +198,4 @@ def parse_ditqasm2_file(self, fname): path = Path(fname) with path.open() as f: return self.parse_ditqasm2_str(f.read()) + diff --git a/src/mqt/qudits/simulation/provider/noise/noisy_circuit_factory.py b/src/mqt/qudits/simulation/data_log/__init__.py similarity index 100% rename from src/mqt/qudits/simulation/provider/noise/noisy_circuit_factory.py rename to src/mqt/qudits/simulation/data_log/__init__.py diff --git a/src/mqt/qudits/simulation/data_log/save_info.py b/src/mqt/qudits/simulation/data_log/save_info.py new file mode 100644 index 0000000..3378a83 --- /dev/null +++ b/src/mqt/qudits/simulation/data_log/save_info.py @@ -0,0 +1,58 @@ +import os +import uuid +import getpass + +import h5py +import numpy as np + + +def save_full_states(list_of_vectors, file_path=None, file_name=None): + if file_name is None: + file_name = "experiment_states.h5" + + if file_path is None: + username = getpass.getuser() + file_path = os.path.join(f"/home/{username}/Documents", file_name) + else: + file_path = os.path.join(file_path, file_name) + + size = list_of_vectors[0].shape + + # Generate random unique names for each vector + vector_names = [str(uuid.uuid4()) for _ in range(len(list_of_vectors))] + + # Combine names and vectors into a list of dictionaries + list_of_vectors = [{'name': name, 'data': vector} for name, vector in zip(vector_names, list_of_vectors)] + + # Open the HDF5 file in write mode + with h5py.File(file_path, 'w') as hdf_file: + # Create a table dataset within the file to store the vectors + dtype = [('name', 'S36'), ('vector_data', np.complex128, size)] + table_data = np.array( + [(vector_info['name'].encode('utf-8'), vector_info['data']) for vector_info in list_of_vectors], + dtype=dtype + ) + + hdf_file.create_dataset('vectors', data=table_data) + + +def save_shots(shots, file_path=None, file_name=None): + if file_name is None: + file_name = "experiment_shots.h5" + + if file_path is None: + username = getpass.getuser() + file_path = os.path.join(f"/home/{username}/Documents", file_name) + else: + file_path = os.path.join(file_path, file_name) + + indexes = [_ for _ in range(len(shots))] + + # Combine names and vectors into a list of dictionaries + list_of_outcomes = [{'shot_nr': nr, 'outcome': outcome} for nr, outcome in zip(indexes, shots)] + + with h5py.File(file_path, 'w') as hdf_file: + # Create a table dataset within the file to store the vectors + dtype = [('nr', int), ('shot', int)] + table_data = np.array([(shot_info['shot_nr'], shot_info['outcome']) for shot_info in list_of_outcomes], dtype = dtype) + hdf_file.create_dataset('shots', data=table_data) diff --git a/src/mqt/qudits/simulation/provider/backends/backendv2.py b/src/mqt/qudits/simulation/provider/backends/backendv2.py index 2da7042..313ee0e 100644 --- a/src/mqt/qudits/simulation/provider/backends/backendv2.py +++ b/src/mqt/qudits/simulation/provider/backends/backendv2.py @@ -4,6 +4,7 @@ from mqt.qudits.qudit_circuits.components.instructions.instruction import Instruction from mqt.qudits.simulation.provider.backend_properties.quditproperties import QuditProperties +from mqt.qudits.simulation.provider.jobs.job import Job from mqt.qudits.simulation.provider.provider import Provider @@ -13,23 +14,23 @@ def version(self): return 2 def __init__( - self, - provider: Optional[Provider] = None, - name: Optional[str] = None, - description: Optional[str] = None, - online_date: Optional[datetime] = None, - backend_version: Optional[str] = None, - **fields, + self, + provider: Optional[Provider] = None, + name: Optional[str] = None, + description: Optional[str] = None, + online_date: Optional[datetime] = None, + backend_version: Optional[str] = None, + **fields, ): self._options = self._default_options() self._provider = provider if fields: - for field in fields: - if field not in self._options.data: - msg = f"Options field '{field}' is not valid for this backend" - raise AttributeError(msg) - self._options.update_config(**fields) + #for field in fields: + # if field not in self._options.data: + # msg = f"Options field '{field}' is not valid for this backend" + # raise AttributeError(msg) + self._options.update(fields) self.name = name self.description = description @@ -86,10 +87,8 @@ def instruction_durations(self): def max_circuits(self): pass - @classmethod - @abstractmethod - def _default_options(cls): - pass + def _default_options(self): + return {'shots': 1000, 'memory': False} @property def dt(self) -> Union[float, None]: @@ -143,5 +142,5 @@ def provider(self): return self._provider @abstractmethod - def run(self, run_input, **options): + def run(self, run_input, **options) -> Job: pass diff --git a/src/mqt/qudits/simulation/provider/backends/engines/tnsim.py b/src/mqt/qudits/simulation/provider/backends/engines/tnsim.py index a0dfed5..2da19af 100644 --- a/src/mqt/qudits/simulation/provider/backends/engines/tnsim.py +++ b/src/mqt/qudits/simulation/provider/backends/engines/tnsim.py @@ -1,3 +1,4 @@ +from functools import reduce from typing import Iterable, List, Union import numpy as np @@ -8,6 +9,9 @@ from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes from mqt.qudits.simulation.provider.backend_properties.quditproperties import QuditProperties from mqt.qudits.simulation.provider.backends.backendv2 import Backend +from mqt.qudits.simulation.provider.backends.stocastic_components.stocastic_sim import stocastic_simulation +from mqt.qudits.simulation.provider.jobs.job import Job +from mqt.qudits.simulation.provider.jobs.job_result.job_result import JobResult class TNSim(Backend): @@ -35,13 +39,33 @@ def control_channel(self, qudits: Iterable[int]): raise NotImplementedError def run(self, circuit: QuantumCircuit, **options): + job = Job(self) + + self._options.update(options) + self.noise_model = self._options.get("noise_model", None) + self.shots = self._options.get("shots", 1 if self.noise_model is None else 1000) + self.memory = self._options.get("memory", False) + self.full_state_memory = self._options.get("full_state_memory", False) + self.file_path = self._options.get("file_path", None) + self.file_name = self._options.get("file_name", None) + + if self.noise_model is not None: + assert self.shots >= 1000, "Number of shots should be above 1000" + job.set_result(JobResult(state_vector=self.execute(circuit), counts=stocastic_simulation(self, circuit))) + else: + job.set_result(JobResult(state_vector=self.execute(circuit), counts=None)) + + return job + + def execute(self, circuit: QuantumCircuit): self.system_sizes = circuit.dimensions self.circ_operations = circuit.instructions - return self.__execute(self.system_sizes, self.circ_operations) - @classmethod - def _default_options(cls): - pass + result = self.__contract_circuit(self.system_sizes, self.circ_operations) + + state_size = reduce(lambda x, y: x * y, self.system_sizes, 1) + result = result.tensor.reshape(1, state_size) + return result def __init__(self, **fields): self.system_sizes = None @@ -54,7 +78,7 @@ def __apply_gate(self, qudit_edges, gate, operating_qudits): tn.connect(qudit_edges[bit], op[i]) qudit_edges[bit] = op[i + len(operating_qudits)] - def __execute(self, system_sizes, operations: List[Gate]): + def __contract_circuit(self, system_sizes, operations: List[Gate]): all_nodes = [] with tn.NodeCollection(all_nodes): @@ -75,7 +99,8 @@ def __execute(self, system_sizes, operations: List[Gate]): elif op.gate_type == GateTypes.TWO and not op.is_long_range: op_matrix = op_matrix.reshape( - (system_sizes[lines[0]], system_sizes[lines[1]], system_sizes[lines[0]], system_sizes[lines[1]]) + (system_sizes[lines[0]], system_sizes[lines[1]], system_sizes[lines[0]], + system_sizes[lines[1]]) ) elif op.is_long_range or op.gate_type == GateTypes.MULTI: @@ -91,4 +116,4 @@ def __execute(self, system_sizes, operations: List[Gate]): self.__apply_gate(qudits_legs, op_matrix, lines) - return tn.contractors.optimal(all_nodes, output_edge_order=qudits_legs) + return tn.contractors.auto(all_nodes, output_edge_order=qudits_legs) diff --git a/src/mqt/qudits/simulation/provider/backends/fake_backends/__init__.py b/src/mqt/qudits/simulation/provider/backends/fake_backends/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mqt/qudits/simulation/provider/backends/fake_backends/fake_traps2.py b/src/mqt/qudits/simulation/provider/backends/fake_backends/fake_traps2.py new file mode 100644 index 0000000..9adfee6 --- /dev/null +++ b/src/mqt/qudits/simulation/provider/backends/fake_backends/fake_traps2.py @@ -0,0 +1,208 @@ +from datetime import datetime +from typing import Iterable, List, Optional, Tuple, Union + +from mqt.qudits.core.structures.energy_level_graph.level_graph import LevelGraph +from mqt.qudits.qudit_circuits.components.instructions.instruction import Instruction +from mqt.qudits.simulation.provider.backend_properties.quditproperties import QuditProperties +from mqt.qudits.simulation.provider.backends.engines.tnsim import TNSim +from mqt.qudits.simulation.provider.noise_tools.noise import Noise, NoiseModel +from mqt.qudits.simulation.provider.provider import Provider + + +class FakeIonTraps2Trits(TNSim): + @property + def version(self): + return 0 + + def __init__( + self, + provider: Optional[Provider] = None, + name: Optional[str] = None, + description: Optional[str] = None, + online_date: Optional[datetime] = None, + backend_version: Optional[str] = None, + **fields, + ): + self._options = self._default_options() + self._provider = provider + + if fields: + # for field in fields: + # if field not in self._options.data: + # msg = f"Options field '{field}' is not valid for this backend" + # raise AttributeError(msg) + self._options.update(fields) + + self.name = name + + self.name = "FakeTrap2" + self.description = "A Fake backend of an ion trap qudit machine" + self.author = "" + self.online_date = online_date + self.backend_version = backend_version + self._coupling_map = None + self._energy_level_graphs = None + + @property + def instructions(self) -> List[Tuple[Instruction, Tuple[int]]]: + return self.target.instructions + + @property + def operations(self) -> List[Instruction]: + return list(self.target.operations) + + @property + def operation_names(self) -> List[str]: + return list(self.target.operation_names) + + @property + def target(self): + raise NotImplementedError + + @property + def num_qudits(self) -> int: + return self.target.num_qudits + + @property + def coupling_map(self): + raise NotImplementedError + """ + if self._coupling_map is None: + self._coupling_map = self.target.build_coupling_map() + return self._coupling_map + """ + + @property + def energy_level_graphs(self): + e_graphs = [] + + # declare the edges on the energy level graph between logic states . + edges = [ + (1, 0, {"delta_m": 0, "sensitivity": 3}), + (0, 2, {"delta_m": 0, "sensitivity": 3}), + ] + # name explicitly the logic states . + nodes = [0, 1, 2] + # declare physical levels in order of maping of the logic states just declared . + # i.e. here we will have Logic 0 -> Phys. 0, have Logic 1 -> Phys. 1, have Logic 2 -> Phys. 2 . + nmap = [0, 1, 2] + # Construct the qudit energy level graph, the last field is the list of logic state that are used for the + # calibrations of the operations. note: only the first is one counts in our current cost fucntion. + graph_0 = LevelGraph(edges, nodes, nmap, [1]) + # declare the edges on the energy level graph between logic states . + edges = [ + (1, 0, {"delta_m": 0, "sensitivity": 3}), + (0, 2, {"delta_m": 0, "sensitivity": 3}), + ] + # name explicitly the logic states . + nodes = [0, 1, 2] + # declare physical levels in order of maping of the logic states just declared . + # i.e. here we will have Logic 0 -> Phys. 0, have Logic 1 -> Phys. 1, have Logic 2 -> Phys. 2 . + nmap = [0, 1, 2] + # Construct the qudit energy level graph, the last field is the list of logic state that are used for the + # calibrations of the operations. note: only the first is one counts in our current cost fucntion. + graph_1 = LevelGraph(edges, nodes, nmap, [1]) + e_graphs.append(graph_0) + e_graphs.append(graph_1) + + return e_graphs + + def __noise_model(self): + """ + Noise model coded in plain sight, just for prototyping reasons + :return: NoideModel + """ + # Depolarizing quantum errors + local_error = Noise( + probability_depolarizing=0.001, + probability_dephasing=0.001) + local_error_rz = Noise( + probability_depolarizing=0.03, + probability_dephasing=0.03) + entangling_error = Noise( + probability_depolarizing=0.1, + probability_dephasing=0.001) + entangling_error_extra = Noise( + probability_depolarizing=0.1, + probability_dephasing=0.1) + entangling_error_on_target = Noise( + probability_depolarizing=0.1, + probability_dephasing=0.0) + entangling_error_on_control = Noise( + probability_depolarizing=0.01, + probability_dephasing=0.0) + + # Add errors to noise_tools model + + noise_model = NoiseModel() # We know that the architecture is only two qudits + # Very noisy gate + noise_model.add_all_qudit_quantum_error(local_error, ['csum']) + noise_model.add_recurrent_quantum_error_locally(local_error, ['csum'], [0]) + # Entangling gates + noise_model.add_nonlocal_quantum_error(entangling_error, ["cx", "ls", "ms"]) + noise_model.add_nonlocal_quantum_error_on_target(entangling_error_on_target, ["cx", "ls", "ms"]) + noise_model.add_nonlocal_quantum_error_on_control(entangling_error_on_control, ["csum", "cx", "ls", "ms"]) + # Super noisy Entangling gates + noise_model.add_nonlocal_quantum_error(entangling_error_extra, ["csum"]) + # Local Gates + noise_model.add_quantum_error_locally(local_error, ["h", "rxy", "s", "x", "z"]) + noise_model.add_quantum_error_locally(local_error_rz, ["rz", "virtrz"]) + + return noise_model + + @property + def instruction_durations(self): + raise NotImplementedError + + @property + def max_circuits(self): + raise NotImplementedError + + def _default_options(self): + return {'shots': 1000, 'memory': False, "noise_model": self.__noise_model()} + + @property + def dt(self) -> Union[float, None]: + raise NotImplementedError + + @property + def dtm(self) -> float: + raise NotImplementedError + + @property + def meas_map(self) -> List[List[int]]: + raise NotImplementedError + + @property + def instruction_schedule_map(self): + raise NotImplementedError + + def qudit_properties(self, qudit: Union[int, List[int]]) -> Union[QuditProperties, List[QuditProperties]]: + raise NotImplementedError + + def drive_channel(self, qudit: int): + raise NotImplementedError + + def measure_channel(self, qudit: int): + raise NotImplementedError + + def acquire_channel(self, qudit: int): + raise NotImplementedError + + def control_channel(self, qudits: Iterable[int]): + raise NotImplementedError + + def set_options(self, **fields): + for field in fields: + if not hasattr(self._options, field): + msg = f"Options field '{field}' is not valid for this backend" + raise AttributeError(msg) + self._options.update_options(**fields) + + @property + def options(self): + return self._options + + @property + def provider(self): + return self._provider diff --git a/src/mqt/qudits/simulation/provider/backends/stocastic_components/__init__.py b/src/mqt/qudits/simulation/provider/backends/stocastic_components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mqt/qudits/simulation/provider/backends/stocastic_components/stocastic_sim.py b/src/mqt/qudits/simulation/provider/backends/stocastic_components/stocastic_sim.py new file mode 100644 index 0000000..d78e569 --- /dev/null +++ b/src/mqt/qudits/simulation/provider/backends/stocastic_components/stocastic_sim.py @@ -0,0 +1,48 @@ +import os +import time + +import numpy as np +from mqt.qudits.qudit_circuits.circuit import QuantumCircuit +from mqt.qudits.simulation.data_log.save_info import save_full_states, save_shots +from mqt.qudits.simulation.provider.backends.backendv2 import Backend +import multiprocessing as mp +from mqt.qudits.simulation.provider.noise_tools.noisy_circuit_factory import NoisyCircuitFactory + + +def stocastic_simulation(backend: Backend, circuit: QuantumCircuit): + noise_model = backend.noise_model + shots = backend.shots + num_processes = mp.cpu_count() + factory = NoisyCircuitFactory(noise_model, circuit) + + with mp.Pool(processes=num_processes) as process: + execution_args = [(backend, factory) for _ in range(shots)] + results = process.map(stocastic_execution, execution_args) + + if backend.full_state_memory: + filepath = backend.file_path + filename = backend.file_name + save_full_states(results, filepath, filename) + elif backend.memory: + filepath = backend.file_path + filename = backend.file_name + save_shots(results, filepath, filename) + + return results + + +def stocastic_execution(args): + backend, factory = args + circuit = factory.generate_circuit() + vector_data = backend.execute(circuit) + + if not backend.full_state_memory: + current_time = int(time.time() * 1000) + seed = hash((os.getpid(), current_time)) % 2 ** 32 + gen = np.random.Generator(np.random.PCG64(seed=seed)) + vector_data = np.ravel(vector_data) + probabilities = [abs(x) ** 2 for x in vector_data] + idx = gen.choice(a=range(len(probabilities)), p=probabilities) + return idx + + return vector_data diff --git a/src/mqt/qudits/simulation/provider/jobs/job.py b/src/mqt/qudits/simulation/provider/jobs/job.py index d80b55c..f2e8bf7 100644 --- a/src/mqt/qudits/simulation/provider/jobs/job.py +++ b/src/mqt/qudits/simulation/provider/jobs/job.py @@ -1,12 +1,12 @@ +import os import time -from abc import ABC, abstractmethod from typing import Callable, Optional from mqt.qudits.exceptions.joberror import JobError, JobTimeoutError from mqt.qudits.simulation.provider.jobs.jobstatus import JobStatus -class JobV1(ABC): +class Job(): """Class to handle jobs This first version of the Backend abstract class is written to be mostly @@ -19,7 +19,7 @@ class JobV1(ABC): version = 1 _async = True - def __init__(self, backend: Optional["Backend"], job_id: str, **kwargs) -> None: + def __init__(self, backend: Optional["Backend"], job_id: str = "auto", **kwargs) -> None: """Initializes the asynchronous job. Args: @@ -27,7 +27,11 @@ def __init__(self, backend: Optional["Backend"], job_id: str, **kwargs) -> None: job_id: a unique id in the context of the backend used to run the job. kwargs: Any key-value metadata to associate with this job. """ - self._job_id = job_id + if job_id == "auto": + current_time = int(time.time() * 1000) + self._job_id = hash((os.getpid(), current_time)) + else: + self._job_id = job_id self._backend = backend self.metadata = kwargs @@ -59,7 +63,7 @@ def in_final_state(self) -> bool: return self.status() in JobStatus.JOB_FINAL_STATES def wait_for_final_state( - self, timeout: Optional[float] = None, wait: float = 5, callback: Optional[Callable] = None + self, timeout: Optional[float] = None, wait: float = 5, callback: Optional[Callable] = None ) -> None: """Poll the job status until it progresses to a final state such as DONE or ERROR. @@ -85,18 +89,21 @@ def wait_for_final_state( time.sleep(wait) status = self.status() - @abstractmethod def submit(self): """Submit the job to the backend for execution.""" + raise NotImplementedError - @abstractmethod def result(self): """Return the results of the job.""" + return self._result + + def set_result(self, result): + self._result = result def cancel(self): """Attempt to cancel the job.""" raise NotImplementedError - @abstractmethod def status(self) -> str: """Return the status of the job, among the values of BackendStatus.""" + raise NotImplementedError diff --git a/src/mqt/qudits/simulation/provider/jobs/job_result/__init__.py b/src/mqt/qudits/simulation/provider/jobs/job_result/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mqt/qudits/simulation/provider/jobs/job_result/job_result.py b/src/mqt/qudits/simulation/provider/jobs/job_result/job_result.py new file mode 100644 index 0000000..14c89cb --- /dev/null +++ b/src/mqt/qudits/simulation/provider/jobs/job_result/job_result.py @@ -0,0 +1,14 @@ +from typing import List +import numpy as np + + +class JobResult: + def __init__(self, state_vector: List[np.complex128], counts: List[int]): + self.state_vector = state_vector + self.counts = counts + + def get_counts(self) -> List[int]: + return self.counts + + def get_state_vector(self) -> List[np.complex128]: + return self.state_vector diff --git a/src/mqt/qudits/simulation/provider/noise_tools/__init__.py b/src/mqt/qudits/simulation/provider/noise_tools/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/mqt/qudits/simulation/provider/noise_tools/noise.py b/src/mqt/qudits/simulation/provider/noise_tools/noise.py new file mode 100644 index 0000000..2b8f79e --- /dev/null +++ b/src/mqt/qudits/simulation/provider/noise_tools/noise.py @@ -0,0 +1,60 @@ +from dataclasses import dataclass + + +@dataclass +class Noise: + probability_depolarizing: float + probability_dephasing: float + + +class NoiseModel: + def __init__(self): + self.quantum_errors = {} + + def add_recurrent_quantum_error_locally(self, noise, gates, qudits): + set_of_qudits = tuple(sorted(qudits)) + for gate in gates: + if gate not in self.quantum_errors: + self.quantum_errors[gate] = {} + self.quantum_errors[gate][set_of_qudits] = noise + + def add_quantum_error_locally(self, noise, gates): + for gate in gates: + if gate not in self.quantum_errors: + self.quantum_errors[gate] = {} + self.quantum_errors[gate]["local"] = noise + + def add_all_qudit_quantum_error(self, noise, gates): + for gate in gates: + if gate not in self.quantum_errors: + self.quantum_errors[gate] = {} + self.quantum_errors[gate]["all"] = noise + + def add_nonlocal_quantum_error(self, noise, gates): + for gate in gates: + if gate not in self.quantum_errors: + self.quantum_errors[gate] = {} + self.quantum_errors[gate]["nonlocal"] = noise + # self.add_quantum_error_locally(noise, gates, crtl_qudits + target_qudits) + + def add_nonlocal_quantum_error_on_target(self, noise, gates): + for gate in gates: + if gate not in self.quantum_errors: + self.quantum_errors[gate] = {} + self.quantum_errors[gate]["target"] = noise + + def add_nonlocal_quantum_error_on_control(self, noise, gates): + for gate in gates: + if gate not in self.quantum_errors: + self.quantum_errors[gate] = {} + self.quantum_errors[gate]["control"] = noise + + @property + def basis_gates(self): + return list(self.quantum_errors.keys()) + + def __str__(self): + info_str = "NoiseModel Info:\n" + for gate_errors, qudits in self.quantum_errors.items(): + info_str += f"Qudits: {qudits}, Gates: {', '.join(gate_errors.keys())}, Error: {gate_errors}\n" + return info_str diff --git a/src/mqt/qudits/simulation/provider/noise_tools/noisy_circuit_factory.py b/src/mqt/qudits/simulation/provider/noise_tools/noisy_circuit_factory.py new file mode 100644 index 0000000..b19b8d3 --- /dev/null +++ b/src/mqt/qudits/simulation/provider/noise_tools/noisy_circuit_factory.py @@ -0,0 +1,79 @@ +import copy +import os +import time + + +import numpy as np +from mqt.qudits.qudit_circuits.circuit import QuantumCircuit +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes +from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R +from mqt.qudits.qudit_circuits.components.instructions.gate_set.rz import Rz +from mqt.qudits.simulation.provider.noise_tools.noise import NoiseModel + + +class NoisyCircuitFactory: + def __init__(self, noise_model: NoiseModel, circuit: QuantumCircuit): + self.noise_model = noise_model + self.circuit = circuit + + def generate_circuit(self): + current_time = int(time.time() * 1000) + seed = hash((os.getpid(), current_time)) % 2 ** 32 + gen = np.random.Generator(np.random.PCG64(seed=seed)) + + # num_qudits, dimensions_slice, numcl + noisy_circuit = QuantumCircuit(self.circuit.num_qudits, self.circuit._dimensions, self.circuit._num_cl) + noisy_circuit.number_gates = 0 + for instruction in self.circuit.instructions: + # Deep copy the instruction + copied_instruction = copy.deepcopy(instruction) + # Append the deep copied instruction to the new circuit + noisy_circuit.instructions.append(copied_instruction) + noisy_circuit.number_gates += 1 + + # Append an error depening on the prob + if instruction.qasm_tag in self.noise_model.quantum_errors.keys(): + for mode, noise_info in self.noise_model.quantum_errors[instruction.qasm_tag].items(): + x_prob = [(1 - noise_info.probability_depolarizing), noise_info.probability_depolarizing] + z_prob = [(1 - noise_info.probability_dephasing), noise_info.probability_dephasing] + x_choice = gen.choice(a=range(2), p=x_prob) + z_choice = gen.choice(a=range(2), p=z_prob) + if x_choice == 1 or z_choice == 1: + qudits = None + if isinstance(mode, list) or isinstance(mode, tuple): + qudits = list(mode) + elif isinstance(mode, str): + if mode == "local": + qudits = instruction.reference_lines + elif mode == "all": + qudits = list(range(instruction.parent_circuit.num_qudits)) + elif mode == "nonlocal": + assert instruction.gate_type == GateTypes.TWO or instruction.gate_type == GateTypes.MULTI + qudits = instruction.reference_lines + elif mode == "control": + assert instruction.gate_type == GateTypes.TWO + qudits = instruction._target_qudits[:1] + elif mode == "target": + assert instruction.gate_type == GateTypes.TWO + qudits = instruction._target_qudits[1:] + else: + pass + + if x_choice == 1: + if isinstance(instruction, R) or isinstance(instruction, Rz): + for dit in qudits: + noisy_circuit.r(dit, [instruction.lev_a, instruction.lev_b, np.pi, np.pi / 2]) + else: + for dit in qudits: + noisy_circuit.x(dit) + noisy_circuit.number_gates += 1 + if z_choice == 1: + if isinstance(instruction, R) or isinstance(instruction, Rz): + for dit in qudits: + noisy_circuit.rz(dit, [instruction.lev_a, instruction.lev_b, np.pi]) + else: + for dit in qudits: + noisy_circuit.z(dit) + noisy_circuit.number_gates += 1 + + return noisy_circuit diff --git a/src/mqt/qudits/simulation/provider/qudit_provider.py b/src/mqt/qudits/simulation/provider/qudit_provider.py index 1351ed9..7c93ece 100644 --- a/src/mqt/qudits/simulation/provider/qudit_provider.py +++ b/src/mqt/qudits/simulation/provider/qudit_provider.py @@ -3,11 +3,12 @@ from mqt.qudits.simulation.provider.backends.engines.misim import MISim from mqt.qudits.simulation.provider.backends.engines.tnsim import TNSim +from mqt.qudits.simulation.provider.backends.fake_backends.fake_traps2 import FakeIonTraps2Trits from mqt.qudits.simulation.provider.provider import Provider class MQTQuditProvider(Provider): - __backends: ClassVar[dict] = {"tnsim": TNSim, "misim": MISim} + __backends: ClassVar[dict] = {"tnsim": TNSim, "misim": MISim, "faketraps2trits": FakeIonTraps2Trits} def get_backend(self, name: Optional[str] = None, **kwargs) -> "Backend": keys_with_pattern = None @@ -15,7 +16,7 @@ def get_backend(self, name: Optional[str] = None, **kwargs) -> "Backend": for key in self.__backends: if regex.search(key): keys_with_pattern = key - return self.__backends[keys_with_pattern]() + return self.__backends[keys_with_pattern](**kwargs) def backends(self, name: Optional[str] = None, **kwargs) -> List["Backend"]: keys_with_pattern = [] diff --git a/src/mqt/qudits/visualisation/drawing_routines.py b/src/mqt/qudits/visualisation/drawing_routines.py new file mode 100644 index 0000000..a272712 --- /dev/null +++ b/src/mqt/qudits/visualisation/drawing_routines.py @@ -0,0 +1,27 @@ +from mqt.qudits.qudit_circuits.components.instructions.gate_extensions.gate_types import GateTypes +from mqt.qudits.qudit_circuits.components.instructions.gate_set.custom_one import CustomOne +from mqt.qudits.qudit_circuits.components.instructions.gate_set.r import R +from mqt.qudits.qudit_circuits.components.instructions.gate_set.virt_rz import VirtRz + + +def draw_qudit_local(circuit): + for line in range(circuit.num_qudits): + print("|0>---", end="") + for gate in circuit.instructions: + if gate.gate_type == GateTypes.SINGLE and line == gate._target_qudits: + if isinstance(gate, VirtRz): + print("--[VRz" + str(gate.lev_a) + "(" + str(round(gate.phi, 2)) + ")]--", end="") + + elif isinstance(gate, R): + print("--[R" + str(gate.lev_a) + str(gate.lev_b) + "(" + str(round(gate.theta, 2)) + "," + str( + round(gate.phi, 2)) + ")]--", end="") + + elif isinstance(gate, CustomOne): + print("--[CuOne]--", end="") + + else: + print("--G--", end="") + else: + print("--MG--", end="") + + print("---=||") diff --git a/src/mqt/qudits/visualisation/mini_quantum_information.py b/src/mqt/qudits/visualisation/mini_quantum_information.py new file mode 100644 index 0000000..9b07fb6 --- /dev/null +++ b/src/mqt/qudits/visualisation/mini_quantum_information.py @@ -0,0 +1,56 @@ +import operator +from collections import Counter +from functools import reduce + +import numpy as np + +from mqt.qudits.qudit_circuits.components.instructions.mini_tools.matrix_factory_tools import from_dirac_to_basis +from mqt.qudits.visualisation.plot_information import state_labels + + +def get_density_matrix_from_counts(results, circuit): + num_kets = reduce(operator.mul, circuit.dimensions) + number_counts = Counter(results) + probabilities = [(number_counts[num] / len(results)) for num in range(num_kets)] + kets = [from_dirac_to_basis([int(char) for char in state], circuit.dimensions) for state in state_labels(circuit)] + density_matrix = np.zeros((num_kets, num_kets)) + for k, p in zip(kets, probabilities): + density_matrix += p * np.outer(k, k.conj()) + + return density_matrix + + +def partial_trace(rho, qudits2keep, dims, optimize=False): + """Calculate the partial trace + + ρ_a = Tr_b(ρ) + + Parameters + ---------- + ρ : 2D array + Matrix to trace + qudits2keep : array + An array of indices of the spaces to keep after + being traced. For instance, if the space is + A x B x C x D and we want to trace out B and D, + keep = [0,2] + dims : array + An array of the dimensions of each space. + For instance, if the space is A x B x C x D, + dims = [dim_A, dim_B, dim_C, dim_D] + + Returns + ------- + ρ_a : 2D array + Traced matrix + """ + qudits2keep = np.asarray(qudits2keep) + dims = np.asarray(dims) + Ndim = dims.size + Nkeep = np.prod(dims[qudits2keep]) + + idx1 = [i for i in range(Ndim)] + idx2 = [Ndim + i if i in qudits2keep else i for i in range(Ndim)] + rho_a = rho.reshape(np.tile(dims, 2)) + rho_a = np.einsum(rho_a, idx1 + idx2, optimize=optimize) + return rho_a.reshape(Nkeep, Nkeep) diff --git a/src/mqt/qudits/visualisation/run_info.py b/src/mqt/qudits/visualisation/plot_information.py similarity index 71% rename from src/mqt/qudits/visualisation/run_info.py rename to src/mqt/qudits/visualisation/plot_information.py index 7395c18..8d3ec1b 100644 --- a/src/mqt/qudits/visualisation/run_info.py +++ b/src/mqt/qudits/visualisation/plot_information.py @@ -1,5 +1,4 @@ import itertools - import matplotlib.pyplot as plt import numpy as np @@ -33,10 +32,7 @@ def save_to_png(self, filename): plt.close() -def plot_histogram(result: np.ndarray, circuit: QuantumCircuit, errors=None) -> None: - result = np.squeeze(result).tolist() - if errors is None: - errors = len(result) * [0] +def state_labels(circuit): dimensions = circuit.dimensions logic = [] lut = [] @@ -53,6 +49,38 @@ def plot_histogram(result: np.ndarray, circuit: QuantumCircuit, errors=None) -> s += str(state) string_states.append(s) + return string_states + + +def plot_state(result: np.ndarray, circuit: QuantumCircuit, errors=None) -> None: + result = np.squeeze(result).tolist() + if errors is None: + errors = len(result) * [0] + + string_states = state_labels(circuit) + result = [abs(coeff) for coeff in result] h_plotter = HistogramWithErrors(string_states, result, errors, title="Simulation") h_plotter.generate_histogram() + + +def plot_counts(result, circuit: QuantumCircuit) -> None: + custom_labels = state_labels(circuit) + + # Count the frequency of each outcome + counts = {label: result.count(i) for i, label in enumerate(custom_labels)} + + # Create a bar plot with custom labels + plt.bar(custom_labels, counts.values()) + + # Add labels and title + plt.xlabel('States') + plt.ylabel('Counts') + plt.title('Simulation') + + # Show the plot + plt.show() + + return counts + + diff --git a/tests/mqt_test/__init__.py b/tests/mqt_test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/__init__.py b/tests/mqt_test/test_qudits/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/compiler/__init__.py b/tests/mqt_test/test_qudits/compiler/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/compiler/onedit/__init__.py b/tests/mqt_test/test_qudits/compiler/onedit/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/qudits_circuits/__init__.py b/tests/mqt_test/test_qudits/qudits_circuits/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/qudits_circuits/components/__init__.py b/tests/mqt_test/test_qudits/qudits_circuits/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/__init__.py b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/__init__.py b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_csum.py b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_csum.py new file mode 100644 index 0000000..6d1aa56 --- /dev/null +++ b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_csum.py @@ -0,0 +1,60 @@ +from unittest import TestCase + +import numpy as np + +from mqt.qudits.qudit_circuits.circuit import QuantumCircuit + + +class TestCSum(TestCase): + + def setUp(self): + self.circuit_33 = QuantumCircuit(2, [3, 3], 0) + self.circuit_23 = QuantumCircuit(2, [2, 3], 0) + self.circuit_32 = QuantumCircuit(2, [3, 2], 0) + + def test___array__(self): + csum = self.circuit_33.csum([0, 1]) + matrix = csum.to_matrix(identities=0) + self.assertTrue(np.allclose(np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1], + [0, 0, 0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 0]]), matrix)) + + csum_10 = self.circuit_33.csum([1, 0]) + matrix_10 = csum_10.to_matrix(identities=0) + self.assertTrue(np.allclose(np.array([[1, 0, 0, 0, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 1, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 1, 0, 0, 0], + [0, 0, 0, 1, 0, 0, 0, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 0, 1], + [0, 0, 0, 0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 0, 0, 0, 1, 0]]), matrix_10)) + + csum_23_01 = self.circuit_23.csum([0, 1]) + matrix_23_01 = csum_23_01.to_matrix(identities=0) + self.assertTrue(np.allclose(np.array([[1, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 1], + [0, 0, 0, 1, 0, 0]]), matrix_23_01)) + + csum_32_01 = self.circuit_32.csum([0, 1]) + matrix_32_01 = csum_32_01.to_matrix(identities=0) + self.assertTrue(np.allclose(np.array([[1, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0], + [0, 0, 0, 1, 0, 0], + [0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 1]]), matrix_32_01)) + + def test_validate_parameter(self): + csum = self.circuit_33.csum([0, 1]) + self.assertTrue(csum.validate_parameter()) diff --git a/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_cx.py b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_cx.py new file mode 100644 index 0000000..cc3a911 --- /dev/null +++ b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_cx.py @@ -0,0 +1,43 @@ +from unittest import TestCase + +import numpy as np + +from mqt.qudits.qudit_circuits.circuit import QuantumCircuit + + +class TestCEx(TestCase): + def setUp(self): + self.circuit_23 = QuantumCircuit(2, [2, 3], 0) + self.circuit_32 = QuantumCircuit(2, [3, 2], 0) + + def test___array__(self): + cx_23_01 = self.circuit_23.cx([0, 1]) + cx_23_10 = self.circuit_23.cx([1, 0]) + matrix_23_01 = cx_23_01.to_matrix(identities=0) + matrix_23_10 = cx_23_10.to_matrix(identities=0) + + self.assertTrue(np.allclose(np.array([[1, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0], + [0, 0, 0, 0, -1j, 0], + [0, 0, 0, -1j, 0, 0], + [0, 0, 0, 0, 0, 1]]), matrix_23_01)) + self.assertTrue(np.allclose(np.array([[1, 0, 0, 0, 0, 0], + [0, 1, 0, 0, 0, 0], + [0, 0, 1, 0, 0, 0], + [0, 0, 0, 1, 0, 0], + [0, 0, 0, 0, 1, 0], + [0, 0, 0, 0, 0, 1]]), matrix_23_10)) + + cx_23_01_p = self.circuit_23.cx([0, 1]) + cx_23_10_p = self.circuit_23.cx([0, 1]) + matrix_23_01_p = cx_23_01_p.to_matrix(identities=0) + matrix_23_10_p = cx_23_10_p.to_matrix(identities=0) + + self.assertTrue(np.allclose(np.array([[0, 1, ], + [1, 0]]), matrix_23_01_p)) + self.assertTrue(np.allclose(np.array([[0, 1, ], + [1, 0]]), matrix_23_10_p)) + + def test_validate_parameter(self): + pass diff --git a/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_x.py b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_x.py new file mode 100644 index 0000000..4da33c1 --- /dev/null +++ b/tests/mqt_test/test_qudits/qudits_circuits/components/instructions/gate_set/test_x.py @@ -0,0 +1,26 @@ +from unittest import TestCase + +import numpy as np + +from mqt.qudits.qudit_circuits.circuit import QuantumCircuit + + +class TestX(TestCase): + def setUp(self): + self.circuit_23 = QuantumCircuit(2, [2, 3], 0) + + def test___array__(self): + x_0 = self.circuit_23.x(0) + matrix_0 = x_0.to_matrix(identities=0) + self.assertTrue(np.allclose(np.array([[0, 1,], + [1, 0]]), matrix_0)) + + x_1 = self.circuit_23.x(1) + matrix_1 = x_1.to_matrix(identities=0) + self.assertTrue(np.allclose(np.array([[0, 1, 0], + [0, 0, 1], + [1, 0, 0]]), matrix_1)) + + def test_validate_parameter(self): + x = self.circuit_23.x(0) + self.assertTrue(x.validate_parameter())