From 6ae57ad9f221e6b65bfd58d6cded114549c64d61 Mon Sep 17 00:00:00 2001 From: Bairly <2652270566@qq.com> Date: Mon, 24 Mar 2025 09:57:14 +0800 Subject: [PATCH] first commit --- .../air_quality_prediction-checkpoint.ipynb | 467 ++++++ 25春统计分析软件大作业-v1.0.docx | Bin 0 -> 27537 bytes XG_pred_by_recursion.png | Bin 0 -> 86586 bytes XG_pred_by_step.png | Bin 0 -> 293714 bytes XG_top_importance.png | Bin 0 -> 40191 bytes __pycache__/calculate.cpython-312.pyc | Bin 0 -> 1184 bytes __pycache__/heatmap.cpython-312.pyc | Bin 0 -> 1327 bytes __pycache__/sort_matrix.cpython-312.pyc | Bin 0 -> 1476 bytes air_quality_prediction.ipynb | 1278 +++++++++++++++++ calculate.py | 26 + components_heatmap.png | Bin 0 -> 82406 bytes correlation_heatmap.png | Bin 0 -> 258843 bytes heatmap.py | 29 + readme.txt | 23 + sort_matrix.py | 36 + ...市空气质量指数与气象数据.xlsx | Bin 0 -> 309580 bytes 模型分析解读(论文参考这个).md | 54 + 研究思路.md | 40 + 递归预测整个月.png | Bin 0 -> 86586 bytes 19 files changed, 1953 insertions(+) create mode 100644 .ipynb_checkpoints/air_quality_prediction-checkpoint.ipynb create mode 100644 25春统计分析软件大作业-v1.0.docx create mode 100644 XG_pred_by_recursion.png create mode 100644 XG_pred_by_step.png create mode 100644 XG_top_importance.png create mode 100644 __pycache__/calculate.cpython-312.pyc create mode 100644 __pycache__/heatmap.cpython-312.pyc create mode 100644 __pycache__/sort_matrix.cpython-312.pyc create mode 100644 air_quality_prediction.ipynb create mode 100644 calculate.py create mode 100644 components_heatmap.png create mode 100644 correlation_heatmap.png create mode 100644 heatmap.py create mode 100644 readme.txt create mode 100644 sort_matrix.py create mode 100644 北京市空气质量指数与气象数据.xlsx create mode 100644 模型分析解读(论文参考这个).md create mode 100644 研究思路.md create mode 100644 递归预测整个月.png diff --git a/.ipynb_checkpoints/air_quality_prediction-checkpoint.ipynb b/.ipynb_checkpoints/air_quality_prediction-checkpoint.ipynb new file mode 100644 index 0000000..8bb5f9b --- /dev/null +++ b/.ipynb_checkpoints/air_quality_prediction-checkpoint.ipynb @@ -0,0 +1,467 @@ +{ + "cells": [ + { + "metadata": {}, + "cell_type": "markdown", + "source": [ + "# 预测建模\n", + "北京市空气质量指数预测(推荐难度系数10)\n", + "\n", + "这个数据集是北京市2022年11月1日至2023年10月31日期间空气质量相关数据。\n", + "根据这个数据集,回答以下问题" + ], + "id": "b610f839dca4877" + }, + { + "cell_type": "code", + "id": "initial_id", + "metadata": { + "collapsed": true, + "ExecuteTime": { + "end_time": "2025-03-22T07:55:04.926730Z", + "start_time": "2025-03-22T07:55:03.071940Z" + } + }, + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "from calculate import *\n", + "from heatmap import *" + ], + "outputs": [], + "execution_count": 1 + }, + { + "metadata": { + "ExecuteTime": { + "end_time": "2025-03-22T07:55:05.632142Z", + "start_time": "2025-03-22T07:55:04.941177Z" + } + }, + "cell_type": "code", + "source": [ + "#读取数据\n", + "data=pd.read_excel('北京市空气质量指数与气象数据.xlsx')\n", + "data.head()" + ], + "id": "92ea7ba1218799cd", + "outputs": [ + { + "data": { + "text/plain": [ + " date hour AQI CO NO2 O3 PM10 \\\n", + "0 2022-11-01 2 18.371429 0.211429 23.771429 29.057143 13.257143 \n", + "1 2022-11-01 5 21.914286 0.180000 26.571429 20.142857 18.914286 \n", + "2 2022-11-01 8 28.628571 0.311429 30.028571 14.285714 27.942857 \n", + "3 2022-11-01 11 19.000000 0.237143 17.971429 40.529412 17.852941 \n", + "4 2022-11-01 14 21.742857 0.252941 15.588235 53.617647 20.941176 \n", + "\n", + " PM2.5 SO2 T ... P Pa U Ff Tn Tx VV Td \\\n", + "0 3.057143 2.628571 6.7 ... 770.5 0.1 36.0 1.0 5.3 17.3 30.0 -7.3 \n", + "1 3.771429 2.542857 2.0 ... 770.8 0.3 62.0 0.0 1.9 17.3 7.0 -4.5 \n", + "2 6.857143 2.400000 6.6 ... 771.7 0.9 56.0 0.0 0.9 17.3 10.0 -7.1 \n", + "3 5.914286 2.176471 13.5 ... 771.3 -0.4 19.0 2.0 0.9 17.3 30.0 -9.7 \n", + "4 6.742857 2.000000 15.7 ... 768.6 -2.7 19.0 2.0 0.9 17.3 30.0 -7.9 \n", + "\n", + " RRR tR \n", + "0 0.0 12 \n", + "1 0.0 12 \n", + "2 0.0 12 \n", + "3 0.0 12 \n", + "4 0.0 12 \n", + "\n", + "[5 rows x 21 columns]" + ], + "text/html": [ + "
\n", + " | date | \n", + "hour | \n", + "AQI | \n", + "CO | \n", + "NO2 | \n", + "O3 | \n", + "PM10 | \n", + "PM2.5 | \n", + "SO2 | \n", + "T | \n", + "... | \n", + "P | \n", + "Pa | \n", + "U | \n", + "Ff | \n", + "Tn | \n", + "Tx | \n", + "VV | \n", + "Td | \n", + "RRR | \n", + "tR | \n", + "
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | \n", + "2022-11-01 | \n", + "2 | \n", + "18.371429 | \n", + "0.211429 | \n", + "23.771429 | \n", + "29.057143 | \n", + "13.257143 | \n", + "3.057143 | \n", + "2.628571 | \n", + "6.7 | \n", + "... | \n", + "770.5 | \n", + "0.1 | \n", + "36.0 | \n", + "1.0 | \n", + "5.3 | \n", + "17.3 | \n", + "30.0 | \n", + "-7.3 | \n", + "0.0 | \n", + "12 | \n", + "
1 | \n", + "2022-11-01 | \n", + "5 | \n", + "21.914286 | \n", + "0.180000 | \n", + "26.571429 | \n", + "20.142857 | \n", + "18.914286 | \n", + "3.771429 | \n", + "2.542857 | \n", + "2.0 | \n", + "... | \n", + "770.8 | \n", + "0.3 | \n", + "62.0 | \n", + "0.0 | \n", + "1.9 | \n", + "17.3 | \n", + "7.0 | \n", + "-4.5 | \n", + "0.0 | \n", + "12 | \n", + "
2 | \n", + "2022-11-01 | \n", + "8 | \n", + "28.628571 | \n", + "0.311429 | \n", + "30.028571 | \n", + "14.285714 | \n", + "27.942857 | \n", + "6.857143 | \n", + "2.400000 | \n", + "6.6 | \n", + "... | \n", + "771.7 | \n", + "0.9 | \n", + "56.0 | \n", + "0.0 | \n", + "0.9 | \n", + "17.3 | \n", + "10.0 | \n", + "-7.1 | \n", + "0.0 | \n", + "12 | \n", + "
3 | \n", + "2022-11-01 | \n", + "11 | \n", + "19.000000 | \n", + "0.237143 | \n", + "17.971429 | \n", + "40.529412 | \n", + "17.852941 | \n", + "5.914286 | \n", + "2.176471 | \n", + "13.5 | \n", + "... | \n", + "771.3 | \n", + "-0.4 | \n", + "19.0 | \n", + "2.0 | \n", + "0.9 | \n", + "17.3 | \n", + "30.0 | \n", + "-9.7 | \n", + "0.0 | \n", + "12 | \n", + "
4 | \n", + "2022-11-01 | \n", + "14 | \n", + "21.742857 | \n", + "0.252941 | \n", + "15.588235 | \n", + "53.617647 | \n", + "20.941176 | \n", + "6.742857 | \n", + "2.000000 | \n", + "15.7 | \n", + "... | \n", + "768.6 | \n", + "-2.7 | \n", + "19.0 | \n", + "2.0 | \n", + "0.9 | \n", + "17.3 | \n", + "30.0 | \n", + "-7.9 | \n", + "0.0 | \n", + "12 | \n", + "
5 rows × 21 columns
\n", + "keuYQo^)S_udxw>A0tflM39!9JG6@B;F4#hPM+Q z$u`hBNTc{XK3tQDx?(ByWTEpjTHxx{tIpx0A${kXd$Tlq5NlN#ZK5Y0I|XqV>6LMaT}j!8spAmG8E;J1 z6ApDoa_B!d3_FwK+jkC?uAI@W{v_sepvw8%>rWRu68)$}JWA1%f$ZI5$GiMHV7hWL zkzDm&8cCl_UrZtGXC5I~ct+ip*tAUt3(XWgXaeN#Gk6xlsy|g |tR8)t~W&GLV*vWCp;y^))NS}7Oqda`fv*b9M>qKP*DO%`-L8tlAyFIXJusB2F zyW_UAI1o)YVROk> &* z*9SIDk4y4lnNQybE8%5cj&F=uG;loH-$*Yk>>i~hq`GSqa*HT~PRKcxIrO%IFxWHa z@S8ALFEcp}zjY=<;%naoZb>l}C8fH(T8ob!n@w&$bdpln3QRkgdMe%b_6<{zqNVF7 z;vTa5wE8w}2umWheG%^X3;rFZ(6cYe+HSPzMs(-s>S{X=81I@eF$J8$`fcjvhZ|;K zVHYd5+Pb>@_-sZ$=C*?YB<$ItbB_BNAgxqanJOrA*Q5Gj5IHE(1ZOgffyTvT_DMTq z |2=H}Ug5B+R~i*259&)Gi|VJ7DWl2a7D0 z44;yDQC%`YrQQf45MvlU-LL=*vzIwg`ps3^E{KlHT{`#WJU7Qnk`xc))V1oCnh)OH z$lIs6Q`6X;tt}+{nY3YY{Ka{dK3#9mB3v>qpLVdGx3xLy+Fi7R^z0Sy)Iu3OsxEPx z^lMXlc~dajiNtyCs#mU6KRZpnTjT%0vgG80f*tzs^hYVg_!M8k_-rYgTJD_@`>$+h z8^RnvGShG^`-dLX*}`-eT8}l0uCnOWta+cfW7MUGimkfT!^ZG0-BEcP+%4X_LHEKT z@Fg-ZR0Itj4c(I A**K~h^bEq_q#G6+CN z2fJ{>Wc0-CtB0^^9)&IUOL*SWO?6LBIzqjYPQGl=z1-5PO%?Wl9pRq?HbnW|hQ{^I zkV{@2N0Hicz9eQws6Bh$&hE7l=wnrkJl@Gcm(9$~p!520drQW=GD^mrhpf K`r+ 3MuGx9CGI z`;A$BInZGF31zNa1xkVsW;^CGMZ# P+0!BEA)zfR1{%*!&-p6 zI8;NQErlhgB45LLJyNdvZrE>2P7}0aU@nXJqWjN|X~pt=g2uToGq`wLK31tlMakV7 zjrc9FufF?HkUi>
ky707{#O}Ro*jblprsKOf{P$MA$nJF>O8Xh!6B8@av*KI@A;l68k zrtu@|_7Yvd%I~Z>Oa=2VS~98b(^or(nc)zxIdsYJFAOtxS@dRh_?l2mYz+3FAJTQ5 zxmf8Ho{N;?kf8`&L9tYY=VD^uqpxhlCFMLCIKLc->!0)W@IWT6TcY4)7!P1VXMdQ` zc*1WGXej|+(CfQ6xQc$#`|LYZuCJTB9*bt_5_ipC?!x_`b;q! 0+AY&Lr>KG%&Qwc z6k>-7iZGbGKUXjfzpPCIl;&BWuBCV!A!GoGN@8MOmOEpA+QLA88b2h1FfqVZpG~oM z`bfv2m6z~P_;`QH?GS6yJ}Xq7FX|6u`p+jewGcm{xMFuVIN>Gv@{7!)g~#3s{KK~5 z9tb1CdVYsWXhHjJ{zgHOoVQL(y$kK|9%a?5mJN9|oNp#?ezJYm*8qi*#|ARV2tqyL zBi;}Nkhq+m9;9zQt8i3s--B^Y;iDKg#3X#`O=diY+3FHsfpsVik+BPX@A0Fn(Kmct zYz{m*g;j|7p#+2!G8@OxsL1KHeazliUnuf$RY;qs0<$|rzFT0dQC&Wt5V*TsIFyzW zn|`9AkcX677fLu~JWIyG^_zq;?UOqj=iA*eJALH4;$d`i#D_z2MzsV2fBN`%0ucl@ zD<~Kd>laAt@XjY1mlEc+ep}k^xiqnwb1mK_N(YESHOlm~B8Wvh&RUL9kOkAy^*8ct z(A)Z=K_Ph)w~|=&^tUf2Urm1V5QiAj;1Xo^jE{nQu{VpxJE+|+!Iz}|8il(;Q{hwJ zDPsuzsl?WGL9RDaZ8@$Xr$X~as<@47Uy|%N7py;Th)6bhYiKMh1qziSdfykg{zhk7 zk1$uI9^c-$=Mg>fB$h^6xt8LlG-GXjrS|sXP)Uwgi1s^NitQHpS5Pgz!uQf<7uC9m zyhRuEjNWK} ZEqX-6lF|=q{jY1$Mg~5dGbD-!uCRTv*Dw$ABpmmH=f)98Qz{5KUK-f0ew{xV znlqVXP;UN_YBdVVuBG*Txh2SN%N9Fdkfe-cer>y9K}mN8_F<*n>Z>CWqhyqxTWqU{ zm+YKs+uNWz^3B8Ou9o#%156mGO8n#1Apgm;^odk{WIUyc*K`>0XtwskS&J+OxT;!L zx!XxZi0!ZAoeye6xygPFXYa#A^uAo#AF;Y6+2~VUR;|Pn?Kv8wmvk<9PN0TBqJlJ; z-{2nP_}a?kOX; JlUSQd|!pE;L DMr|-rR(A4zl)-!nlE-_+nKWNJ!bE_@vqnEe-lN&vpZ<+iv zJ!km}B5C=_iEN;6;{DBMd82VZRGy_Ix 9l@;V6VlEOEUe zx%K!+)?0{AI!i)FewaHYUeK6`In{`QHs41&Qt{3P!_{>LHV(J;W9^P)*%<0E)p5@* z8O3W%2`EL3w*=_v#E2lgrKL67bXw8_Bwg~h&wPB_aNzMM#{|&aXog ??@XU1{5DO=M@)%F^v zi3cdCc#U-L8HRaN*d5)}Bg_=_k!ZTxYmcJ4Bm>Qi|74W?YP#sDZ->b2$mE%1_{17% z*YdjS8Op|zl;0-%^|g5@-sb5jb2)!dpyM8 sER zP3BWPd)Rb{7nO{E1J&pEL?L7W=2S7^L|g$=He&Lm-tGewxjvaJ*WrFn&F_M=>Y&`T zPmb;rk>@}6qDUOMv%Ai319|kyKXqOCM3;<-DdDx4J`sdVR)T@zk}ZxA>{<|+Z2!wJ zN~jVEgNT;y)A(D@`%r`G*GeE}X|PW+vc6>1JOWx*47w%vR!4T|W^BV=iqR%d5tMyp zN}krcslf+ltRuL}Di~~VfztcS 8gCtrax5<$X&MK5XY#bt` u$sv(fkfiLFb6KYtai=M zA&`lR$YECIoUP@?$P4LDY9B0 F-vnkYPtPHHc~8k z1LJ^gQ@q@7-WWfcs1VudRum)`e|b(GG-%y%1F(v(^D;)jMG`)vPXaEGk@->(DMC#$ zwaPkI18SA1wB(`_4U-?oWv6gX;1YTQC#q+Kbz7#vI;GPBNUx=!{HyWC>LI$BUYl>@ z<^#30>Lv}yA#bix 1$U$9 zN|xz@L+<6_G^EMK2=++A1Y&-8mfLjL{cT_F0C`Ysm(H^KDu;~glrWJNKKp0{l$LJdxfq-ft0Gs$HL!3!ZI`V`UoWK#nqocl*?kzK2D zN_Cuf!+0*Gr1?N^#Xt3tm$uKAH!5Gw|EiRslJ%RHr~u5QmQ(VYeA1hpYM-GNvGS>x zNSfh=3v;v$q!zFBy;%iqWIb!452eQ> *Yz{KvPM63*p5Ri^6=n2Zvq;F0F8qkeMl9)%369@+0N z`P96p0D1WFivNPeAAY=isfpG8_?*I=RZpPWst3ZZlX>&z&2IG0(m?-zz49$nb3U~_ zca!2%tG0joA^>qN@4sIMU2--}XNlEF &Hnh# `{2@j zg2Z5074-d|Bp8RM&;Ndf%j8?&I^a96^(axyL~|&M7+*YAe4X=_-x4lZZ{lO`g8koD zu0Ou>fP;8~%-3O}s11et;dBXpaeDeAWfhf|*;f6zcXt-L?qjEk*Y`TyBM=3lJ9zQa z9~ZYx`hc4(kS=FyBf9gAzjn7oa*Gd`v_!;Tll_=_Qgqn=+^Uge^DVplegd;M2l15% zJTA`j;P3YpV7#4R3+wDr@6^Zndbj*EOFhdl%KqyIwjRmBGa~>h$ZY=lbqDFppvgfZ za91bE|NZ}Pne@|vW_k)0L>Vzc@N{g8;eA63{4!_3=bwk5(4#)A2ZjKC+rb09qjyh6 zE$`_?9Wd}0v@_xqRr8HMHsilGEKtdbk{=k*>&5CvI4rt&{+7AmR|jp6|Ce9PB2I;o zQ0Ago#tvTn;{u1Jw@qSgP=T)B19CZE-XD*Zc5QV8F%->w{eSzN8j|ROvJgD2V@oxI z{;JeA(q%auz-{u0l4%S_ Gx3eS2H{kqUKQorol-kXnCa`H@(^vuuqYn0&e-cvI9{e>+{t@Y9eMYa zqVOm#<3}iGT0d-E7z40Lkj45Rlo-VcF;vW6SNw@3zVa|(4Cj8Aa5-*{N%c>Aw18Ze zyD(5;<(E+$Z;wEWZ%vxlvlRF%mmFNKjKd5Y$pmonrQoU{oL3wf@!j@TvqHdH`t;3r zrG%m<&U>e(j8DMtF{Zk1&6eA=M)A5CDFTqIdvoTi(+eZt%ZR7Epv>GEcoMhJcdr(j zu6r~IF$X>6hUYLvZl~ul02{Qmy$)tJ8j?fkgckRpH*R! ke;5t{op1=JgAC+QJy3+U>-bXmp0j)ZbA!l6kT}ptDzV%GGK?oFvryQ zx1kVye(GxmcVDY4(a1B9@EF2^yVjLEz57!DCeSScWyW#;2P>S6iV7{^_3G2<&MSj% zM2x+OC?zC-!Rq%Os#e=?9VlMR 2*qyc^3k-$Ph6g F8 zW36fNbiqJuR(Rl~w}N}`nj(Q;8!Tt{eq^S;=wVrt2KXS(ZSe+1NI&2c&v5H`3+*gz zgvy#jBcq>@Ry9gcDWd#|`9Qw07|v3=_i;fiT2)CYY3=MSfT{|+HG5<^f<7zmq_9g? zF *0{=(yxtCq=v?zPoV#0{zu*b1X1ak2DKfy+g z9giT5<2nt~t65dw0Z{0a)AfFI16T;wQGOeIbv-t9)N@a}a*P2mHSZJ&IG-;9SWc>c z7XX+UaVJM}g!P3()(E!vr%vO~@Y5fQVt9^AGc% @k5x}z zrWTvB8tZO@zaS}Hv5&!H?YGt?zi!c=ll*n3tkLh!Fzd#4r;%0{;XgA6{yz0ZeXBZL z%>YS0Q~15x?!c3tOHV$=d(#U#rqcIZ2`qgaBdA;i=zuDANq%kMmF56$H}6STcB9!9 z?;wDm`Y7sM<+fJ2*A3wAk8;(hrKz%hV3T=^C}Q^Ru8Sj-xx-#wAK#WcEv4(8p!?D- z`mzBzp)`iG0Z0v1QOv^Qoq6^eT*@Avzo&Ds@#6%nd-k5NO~$_kKzq+{Jj7FFq?e}? zfW6e+>l+8<_95W<$;4t%D*dRjVE$36F?dS^r(5~u +{zY58jTQa8Y%0VQBC5pnEPM|MAz0W*I;9k7Cg7Bn?jsxdKCB%M@vTh6H( z2S3#!yDWK-B46qEtXYGr;_^@TH<{@Ef|;z(fE>20J7LGLr8WKN_c3VO)n7~pbZGfy zU!f*#&z+vd`NYuPC2B%eO0REs@fV7sY$4^E)@2fq0zS+B3uAM@jFj%vyCz{-swH-9 zkBxe_%0v*t_C?Y_0{neZ)|=s83F{K~kH1^HkpVr{=7DP-G>gsbru%fL=8!y~trI&C zf|R`j4k wmx!>HwsoDRC+ytID7NZreXh_`y z7PVZxXI??_%E=Zvl`3Nx(zEC3GxyXH&Q>UqQg@xHFTv!+0uP<^wzQu%f?{Rj{o2vJ ziNKJf@1^LUe!cnL_u*#?aw0YUB6{OBg{hhUY&Qrng%^9X%g3J+PYy{2Q-Ai>4@%`4 z0X*g6=2!MUQQ(vED}YQU#MllPho=F?Yiu-Ap8`Ufz>^v7yQg01Rz&JQz@cpSCFqj* z)@*C}9f~h6)80V!CUg;@Z2d2XFN-#Y#bjymR4`P{ujh<3s1#5aR9_2L*W;$y`u_eF zTg`t}r9?}sXA-Lx(d_h`^jhg?S;a+-ZaTs22jp~LS>h}Kc0}bn>pi)oP_0qSx?z0= zaG5zeqQoGn0mdZF4Me-;R%%M$hNZzQ#S~e=D<(@I6Gz>$OSs9--Y3DtS1e6!|KjNK zedpr8b|mH+hwb>nP7~>)#Fab91`$B->^SXU`iT(nRlhaiQm$Th0aZ{MD8yj;?%Bx~ z?9WhYR#Ds6lBrqV 5wH~ak^JFB-Ja##zO`4u7AvB%~Cf_8h*Ojnkh=_{&l zHLKbrV4BmCdisOo*u3YplcAdisN%tq4T)jRLQ}G_V$ka*1(w1WI O {UNP=9Ca` @(@BneG(ZV zhEhE-D_<7k5JBt(@Qe=Z-rfLVEBM>R+-2U>B&Ydrj9}LK@pqnwsbT4UEJrX2zd->d z)uWzd^rKDK9rO0a#&2bn+2iw 1o3v8z^c#jQI1O;1&L1EEYp-NxW`^>*)s`0E z^z#-1_-g6w2wAzQ@@+$3x80>Q^jsf)OYwir1I5(yY)9+qesP9^BC@dLi=Gf#*#4%T zw(HD$w|g`JuF(EZrG6deO)dwuxx{LbjY;$GWUuAyq=;f3VmWp FGY-^Dr6lQNxXnekf%PbKv0{+_sjgO|7BFC_Go1ooxv`L*?l zigpNKc(r8S h8spsTLmn5of$uxT38S+?p4gZJg`G}}W9LJ+=@A>REgDb;WVkQ{0nRJN z?#rd}lgxs)&MxT@id?yQG0yWytl*>PdYs3bZ=p d_G<`d?L*NPe!v985VwAFLW%Mt_2vjC#6vRoRZIdmlC1-)qq&wWs|$3&YNq zQo|)lZx!M&S9jUbtqr?XyA}_nYOHXUKqZwTxcyChryZ&n|G=UCqUyX;Z53u$Q@dL5 z Uz;5(#>Wtu%SvcP)ET<(akTA1PO(0VSS6DzdM) zv(dniaj-R)LB=dOKUcfIF}0J|fHsCwH642FPx!fI6 (bbh_3@g;>!Js*2Fsl+JZSW$u}-<&J{Rk5U1a7@RS!UPl))ht<5fJC=&nN1 zpw30W_@j!k!Um-1_|~US# )# zkciHUxw+Z_s{5+DY}Ri|b3*Yl8IITe+}>RzdZ3nj^peI}4hRU!8Spa6Wp6Q7i56N8 zD6IL-MUV_}1Q2luHpSZS?N5aY0Y$)kO nIT|EZxoHkW)fK(6$oKdds3oQR#13G9_-Uk>hB&C$$#8R`cmb>2DYjQ# zgl|`(Ge3_jRe$fK8xte~DV2%6@_qaAWH0u*pd6N8hCO<1hGPMC;}Rq{$$uMbafh^< zf~Deme0Z54k*Ke|n2hC-COqoN@%juZtVu
fSi39rX;IK5DwE$55?5IA}23SeBGO=Uf^SOEmF+ix2GOt zwb%Jii`;h1E4@_b+G4P6)FjE0xBlXl-VWSM@Au|paEh9H (mG-rFm)v_T4{kxqKK$9Wwc`<_7`*S=W!+b PI+SPV2eX~X z_MvjU${a1Xj@m65b(2D#m$V0; >_Pa(UJXUGq zI@J2C-ESo$&e7$^=%t-@Dyx@HNLk?>rJfQST>vsBza*hahE=SKReJRT&~UQ7z*{wX z?#KvAr0e)Qp!pxrGc1&qXN6ZBlA*IG#9fs&(Wkgm+=t)BxtlrgUtLEm@r5yGCzygh z$atF>Pw~_o>EJAN?*v(`L!P$+WFb577H-$P+-*V7)$bhYd1ivKdcY`BLj-22Fi}_$ zog3g!CjrSj;hEd30+64{AtC4G)V5nw=Y-9P@HmFqE(E3$Q=rzX<{P|r(MrW#vO+S# zN9(n_CM50k-FGNDPD!xR;(Ne?9@Q?z!be><5a)>w;YF@(k6-?S4>8kSUohyo&%DdZ zxi$LQwMWvp$MNsG`W^TKDmjT`ls_j$b2)s?8vgm+KNLD)zR{voS%J!x$*jRPOY-^m zY{VJrr~e*Qe=pMyo^|L_37BLf-pf{Pk^kK0U|zh%dWR8s8B;^oU>X@EF?*YOhV4=R zmB*sjaPI*eohZj+?)pzQa6*+b-Fa0ZaW1EqIb)rjK2VW*udhBGkA?qB$@`p~?x7GH zwIpYyjVQ_^LCD=l{|OtGRm2wt^l(@zHe=#`l4*Sy)aUuFA_eC@-z~p 6@2Urg0%UsSI)3 zTB4vZiIrDhZ}=eYIF^BVqDoVwOztWS(f<=P`My#A+-nlDtKX? mtfnl6A$-yHhpU3mDC_liid9<}}R zip%_skE;R#e-bLeh^wEkIFmJ}3GWZw!_e|47Jt(vPa$^`faw1LOn1`tgN7juMDT?$ z9(_x0lNLFw1o33h)3Szd`s_hd_|LX3oYja6H^VN}?2<74VGoZ^n}k|YMnO_7AR_qj zDFa&=Z|^>c<|qVJXR3%NdLBF0aq3M2cG-xZp^jjjuRD~Ql20e-3sKrMw6Bpwro>G- zcT?_Wm{oiX%(Yc~^6=MGh)e79E;kj0>hi^v3G^In>g)C~?X#Jdr80uk|HjEo+^3YQ zOYg}|)gW8^N@%=++xvQ8#!VNjRq0uk-8m*xoh4R)_pQ6>y`c29efy(a{44i^3T0*0 zF1f1Xv3ScltUR^;0%pI9Gq8JropLEIg)Pm0jXkk=nTc{uY#yU^ruE-Qo&7Lh(BwGb zEPmO$ztCXi$Nnue$I~WBa5YlRF5N@i808?Bl)onF-@sesg6H)y@RMs+0jSEWm!6Sm zP@rUffD(TrX+-mF*RGR0;w;A8b=aBO+ |7q!YiK*0maVdJs2g}^gTntch-gqQwFkqqO6jyO?50ljzv0oh3{J&f& z%!-m@#Af@bXXD1xlU0S^#;kL!fS NyKN=r=`J@@6UC)CpA};WpIiq?rlNQ0D>xX!_q4oU7@1^un_z zd^B=a?)lf4bH@`th;J9$jb(9;X3aKDYx%tYH$t)T3bAzxe(ZpyUZ=c<=`OXJt>zGC zdCpK${TD>f?MN`A&3~Pd5l+|f@^hv9-on1^{dZyr7vnMC3&)2uCFLh8cOA%!`*{Ax z>(s0eur7yN#=~zH2dX|rT|~#B?E^-X6OHU)sOEoj52H7D>ZiZbt6y!6rT6!iZ$UM( z9W6PA-<77T+p@vf2K~?1iNY%*j@PcUkD{MH3u2Ci9_L;ZYnKC= XH`fF@-b>RN*|0MYqAWzgEgi94;L`1 z>vk8P9ne-kFi$`#{zfeSKQ3G;qSi&*7Hy!FHuC;`9 %`$Aps?q@?oUU17{g7A R}0B z!Xd7ipW3XLe#TRB$X(V+X39a8f^I2~f!VCe#Nj?Sn#qph(t BYHGSnRrGLT7#S4{8tJA-8Z=6{l!OL*Q9cm!Os1Dr+pL%ofec zs#T`*B-c5y${YxPd(Z`DjhheKcXrsOeEai3>12_b)7_7&0*-ZHd8f>qEaY?5UI2bc zFD+FAnsyma09!2rXiym-%4R5$VsO4nNt2)W2cB&CmzTbU%+Su!u|d_|YVq8pPI3I0 z7b%S 9@?5fc3vP6wWj=>3S|J9R zF-otJ#oqNHBM4&fbymwKtEZn#t=8{+A4V}*IuDUPP-GE4_$1C#2{gPbu=_f5CTB?| z?v!q@_gMZ-*&^qXOZwXLZd|55QX15_`AuSdgvNq!crncrxG}5hCH8v*KXT>`uxc;P zl3 SCHFV|hNnOzzd?kKBUZC1 @fP-e`%y;%0zlOD811mg-9kNl!>% za_W3|J&n8lHujj=077W ezAYQA@=S^!2bZy z=a-~(>E4V8aB$;t)nfosbps|f2YB1=ZM%~Ed@iRB3CQ;&cvu=F9njE=fRGH=C@=}G zw0QJ$i4R3=dJLjlfSsgs>C^yZ+ca%U)yWH7Yr(lS?k%WCr@*q;lE6%_rv00fHp z@pd hvWOrJ(D OX9-D6&H*hV5l#@ip~_pIoDtzkX&mU zq2ARt0 DOvTOvjuG`xY+xljPAVlIvwwwFImp;Bx5%is`1wYOs+JkBgPM};OqWl zfbX(LGr3(l9WcwVv5zOsdKmhtDosPU1Zncakl&-FWQ%%y)#~c8mQUE9dD$2(A>ILY z@GlIc?@Cz6+ey4k0N@XdT+*j}U=)RA>zvNY8#TWd8meEl?>7TEZ|0RcD++lxC-1%G z1X{3tPo+|datJ|r?$4C{bvy87Lg4Q@v>)Uj(NHTxP>AkyY-cHQB! zZR162A-M<-=0p 6Uzv=RzTBSqLo_2_egwD}c-tS9b+AG9Yx%Rn=dj&T3&L*{c&2E_6 zv%8m0*%>a0Qe#C?YwaFlH4xwa(sCs0@=$31J$jZ>W{oDXo7&BlbVb!k8nm*EnXb)J ze>dRUyY)sf$n$<|V37+f`e06rt7Lu-Dweqj?%%!`$WsNHd;O&qkw%(A%YPT<{g5Wc z+XjR7NB5gfzk$Et+Dr|4?oGbau5~tWHm+6_9Yb)>!J)Z<_1Zi5iaYbp;dacTm1jB! zWuTFUVZKw@x91VP^N?RJvTDa3WTP|}^Yt*Xd&cHmmuP4NqWO;n+TYTwbvl081_S%J zb1(cijEI`U*T7tGef@*QxIj2#(iN--@@LkZQQNq-UB4n8_gIO)O7zjmu+5;oJAWUT zU8Kpx`PM+E<761ny?I;>tQY;B4 fahN<4xeIU;gf@OQPB-^MP7Hk6ib+9-^NF zH8)d&?S9LuWH~_3eyn7@=M1lQoXzh4G=?8omS{Wcw;;tb8Fw< X;%%ECqAOvlg{i{ zs;cT-ZENOtQ29cvb~4W~x=QL3#Dj?MX$%73&R>@B|9}j>sH? mU?;|!Lxa8YEC>(*igRT}p&&`!TE`U1(t6vU#NNGED%4iL(!VG*-->CCd zF!~Fztf@|4rW<^Hc;8~A+wI*59l?P#m3m}T83D_mM*V+ j+OGYE)Xo&LsL6|j0T@6z>$Ew~ zJMv5?W29>SOAMFOh&%ICdro+YQ$^>&;VKP}V~pH~T`daSUoX 5WQzP?C2 z{8*B`JG9SokP PQg)s)3|tv2024vWdNz^L{NMSy!J_nZQKg*FIzpC5Yk&m;sgP zBUc#FF9qmOX>7pNo!*V1M%a#(8@8tg2e1vqNd2&!LzvGsiU 3~g`8nVOZwTvz>c#&7)4sKea{<^4tb(KRW$92Y-N9mdo zU3Q@GuoHPK#x30|2GpSP4Qo|269GH#cdcD}Jnb#Rjx $VL`=9pT39U3E5tK@aZV+WJGQM)W-)Y&D5L<)Q$k69Pk%70}PbnqIp z5qCOqs2Tt{+`qE% z3)T^Dd?)XOzPY+_Lt|q>F^5E^e{Z%o&o?#DnSD9-#`lP3nKO7P&bg$5>7;A*_*;b< zat}yL2DGz#tmqMkmvzK-&IhLAr%kMy1>2na2o@Feb929fLs7(m`iAnBS}l(<4lxqD zFXHNxg|!cQbA5RIR?Qir+j@*WA~$ZXf+#d>q+iqA|DYNq<~cKJ-C}D~UIip__!YO} z{t#zhWqGcIC69WsqAg}~{0aHa+`iGa7^WYzb3(tIvn*5xD@6Yo<=R(rUr45RNQ8PL zX2*OL#13%7^~{TcHufbI9<|i+E+@sckbdoKY+=|gx*92Be!oZ7X<=z>z9DfoCm-IL z5iRN;oV3hqoaVI*nzxu=xeNhA(7C+(Is&{DW#8oL+>(b%+=hl;%nq_IfW8zZLn#N9 z809d460l!v?Or=U>U6EZR5_F{w4Y$Z|3=SRUGHleF2wL4H*(Uq&^1pi>fc<3(ZeX1 zrGx|=C98 _eWI5><3-K4KGBae4iC&s(r&)!z79OFuzAdM)T% zsEvpBJFj7Hw7o_95n8+88QP&mi!$S3>A!9+KA`I*Zt|}*!4$WVYG(w0+^}>iF;CED zAiHc 9h1Rq)lkGzL)f5`4z^EN4X z<{ZvqL)qTZ?wzceIX hno8zTgMrS_j$uLUu3PMB}gOfmEFygIdL*EZ? z k`ofYT;!+a33N;{E8;NpFpxa%$!6ORW!tTwi`0@^hx<;2ADCk&H9W&9}Qo z;lC-DxEkP`!{e;rlh&f3skGA%6i(#F!YvQNeTxx&X6~R^cUILIDRLi4XLk-wXs*Lj zd~>pz3h@m5i?O#pa}ewcuU~30t6pf6U<3&qpum3xW<&5Y!J{-3*mSFIkM?Fh)M8!z zi`-b{?e)hh5M7VFbj6gA^mKbshTfmz!oI_`g?B|Ib@b!m?j7*klm#CeD2tA@KLl!U z6JO~xo*2k6tdISGc`~5wdNppU2&Z5r``wRnmRg6#z`})hiB3~|^}SaOMwSZW+rDnp zcVolq&+&c*f-0<9`?umq?8!Tk!{tOl_$uvKvEzcm&I^X4J3DL0Cpd+UKR>(HC`=Kx zY@ozPlJmBCvM74T3+Ql*5Lkyw`iio$YM9T&b8QfL{k)xA`_XdtJC)3w?slOnefbK4 zAk@WT-WA^3K_PFQe(ig}Ik>CXM#`XPKwigFuSSDsP^6QJ9@#1b&9W0fgVQ%RH(gG~ zYhLVZ^=4~Z+?Gnio^;{09=@fodGqIR+BChS)IfczbQEi+bx84}WP`0(ME(TKE)w7o zV0f 7(WWOF!O7~)80fkNvhxGO{*y*xC_ z9pni>MkdOB>Kmr)iQbk6hfx)Q m{8iM96*ET$yXt}W>8juea?N$Y=xc$6doXpa6{nTr z&-NBa;ISmp={qSFSUgury}z`KO9W$mFc{o}-Wrf>4;(2SKT eZBzY3o#3Ud&9a-iA9V0>?A>@d9_2r1gF*@`M&QeWYX z86+ezY`5tvb7P>1X2^0%p%*knx)$&4^{w 7zRBQ$u3k==xp?y|Q z+4FzTavqpbP3S{1T6&Wjl!O&5x;|u~$E?Yvc98EiOO)NSlvXk!XBYdTHHwopbjz_n zcWB1l+@F2guOYvqLE3aH&Wk@tuuf2A|F&@kztU3p%XYKS3N9K+f!N+8 (TosQR7G-YAsb$+yIZ@=fMy5Ph8v(n_1OsGZWLU6IZ%zi zgg#4D3iP5Y*`?CfN$VwihRZ2)65!0l{*!8wOFo`3A^>q>5p3wAfhD Dphd$wfJ|WeX%b`*DCIx;!@~@gX$u2SAh;x zMaUDT5ov8kj)+)$KWQ*Z2*%lh8<4r%$Wl;NDP@w4h1@U#8r}tSZJx!_l6oWG%#*-^ ztLez6jWH-PfoIM+uqLj<7rwI&Dr!GJ>-(A^*j>5{lJeMlCu?LT!(D_vXDp?wQ~~jo zjOcu6bwjykj#sB*4&)whv Z*Y MGabBI$$~G!>Tw%q=!} zyJ2V!(_A?XR&QdC!;ze<`tB4}iIu+~sl`^$$kTooxO wNg-TBx zif`53@Hlwdez_~?1YMKr(@y8RX8NnDe_WIu(x+1?bc>Iq*(@tdI*{UkURk`x_GW3a zMH#G7&<+80&p(t;S zZz`P0%O;yqEq`v2K3h1dl-=ZraAZ^W>a!lCTpN=w;;yQ+Y&EG|Nt#1na-aLqHI}4K z6@-Ep{;Gvoj|&g9$SIeFcI9|JLD&%v6|gBxCp1b xKoSW?Y!4&f&h(|p zDOXh~*kGF$!XbyNBV$QH-E}dSi7|iOl6~(xzn^>hU6}Cvq(V!}-It8UWd&IwdQ%@U z)P996yo>gR)-a`3?K_ei$5&`7->q`Dsg>)jIrI|0ve4ESjK4ib8~L8a`sCXE7Ipdc zv5r6c_%A1?#r`-B|AU4&nwyy%%)q+x9=7o(9OAyAaHc4m46oLT@v7y(>jn7kn0k5p ztyKiC8&b4NkVoGg8(b_b2g{k`*&)NnGS1Oz8vk+=dvQsz0k)C)B2@q-E$#^b)cpI6 zK5i-4wTUqJJ}ytQd^JE|(#mpuf%48{lg3Q@N?i a1&9L_it^4h=FW-5ml70xC#LNp~aNDJ38wEhQq2ba!`mcXxNZ`^d~Z_sl)c{eC-N z&Ts$s+I!WtuDzCQ0VlR{GTR253XZY`lVLB7Q%WkJSR@oYugEjt*Mg#X)viV?&D+vY z=D|h8TjRV6r^szHX< Edhu zFKb}hsa7VX<~!_CY^FLq@BlD8X 4^G>^BAk<@Ra*+q&;1@qoZ0LjTpc=6#K3#41*~4!Mp7Y8jF?PA z7&NnHWTSgU`a%u4sg!m;H^CiMwL1#O{ ;y%q(Cb|*JdgLZFbg+fqr8N+eLYL0xx0uI3zELeF zxB}X`3DsoXuxPc7d-C~3SlJQ<&=IR #yjU5MaUqs?^vs^dC08PZq_<5 zi$5q=qDK`EZhyO9hs9Q*AD*Rwnk8_q%K76})*YUlr`CO^i9K2y&dyH_6Q`0#dIe@? z6=^oJV+~6jP0B^MfjRwck7(=P^3}@_)7Nr*ehO )YunZyz)?w0WZH}~BwmkLe%Uq~FE|%s6%vsZ zQJ=c3)4wWn6o19*vFj~IcI46~OxiwfJw?F)&OJlwB>mhuueOp7=|3f74a#cuL^h zt;huPmx|qvySBZ)nIqI|^WpQUooGFV2t_VFQLM9+P(?CArL`+vczkunM8pu@F?}k$ z!$IA~EpKb<`$=Gvxf+lK(tY@YoR87SGF^}V*WvC=inrCfl+6~q4VQ`-dk#4#h~=sY zG>prywkRoJnXCzKVvnobPkhz0c5eI9#`gI@S%rVq485wJZPQ50xz(XS1x@Ppux^0M zjP}ff{}uF1m(e|1GQ1ZtarcW@kVScI%M?OiP{o7!Y)>o`O3k=K C0F2>Q+)NPl-CZB1H#)jL-KaWR_`B%>hJ;uo& z?m(tCLlX^0HEQIFmH5ME838*LrU&d5F~6-I7w3iW_qg!BU3tl@ 2w5Ov2qnz$* z+*SRvD?5udrHd!5+OvZz4m_$aWezz%T~amfcs*y4U!7T6xAmS-F^?(P^1V@+)tfk| zNFA%@Q!kzhXQ9j(GQ}c5EV0|tt*Cg^ 3(W&JRVCMnl^?bNq;l^J! z{hf7JuOt0*$5prr3^wAw;ky)L&;O5Y-voTAd9CKD$&E3b%$%yd1nZ~Jwk_=2BP|W7 zD1`!_#{=`h?jVcozi{5|astPo>p0YHCoE?+`DIkzZ3bC%#H6oA^oO^QVQRw+(Qs8g zp8^6+wERWS@Rb4vpIZB{@$k+^DTOvaLoYje &nJHXa&-|G8K%sOZ8dH0A+Ex=TOL!`Eda5m}ns3*_FSMsG5n}ip8l<(SOOdlr33 ~PiC9+KS1eouO`~*3@}Zv;uV5uqXl?z$p1A?CJ8XD_o5W$@v0kz z%d5bg|8^Z8)UuH<5p>x-O^1f3zxOK3&3eyBaLd#WSMjhC*!azCk1N&F0f36nAbMqJ zpG&A^Uzq8$^>6ocJKdbPU;m7UE#PIG_To!iqMWR>6XTIX|5X`#6dABKkfj2Q5n;tB zo?4##Hl RGs-H1~n zJt31ZxY=f`&mGv-`rKnsOG&-)ZEU5@U)RflUhH3Q0f~Yo0#2fS+xBA!R=|32&y%jT zZr|2tB{`0b{wg%X^5Yefo|RRORjH{p=fm67qdQ)}KlRthOw1u~(r+zD FYIUC&ezl;E(&-bC8;ZGp+)6QS}HegQ9|*L9#0ULKpsxV^?lP;XGcRbzQb2!x_F} zncGqEZv2+;W3`0r|G9fXVVBBYo-;4=>cm}boFAa-OcCs!vgMEg%0Dr=K?7le)W!;} zgex3lWpsl(Ui6slhdYb1F9U;Y@IiXo@7?oh>cMV%2{4UZmhUD;S!cFGLvtqH{?EO; zvsu1>Fb?QSQ`q;*3KYwA>20Pe?rq#0W*6Tsx>CcekTCPnfB5H)8MWoguH&*Dc #$xxKUH5G7_ z)8k(G{cttHjL9CcY?rPOjVUv(+UDQzT7+Y)Nv3%$@ITeq6gV+wn03~5GRmlZih-NX z-(>Tt+{eVYzSpzmI3@8Vq_VG>*&2AASLIe2>OIXgVmB$Mcnk8dRnTr#Ot C z3{08};F@p?d7bd7x0{ORq?TGu(w^tc0qMXp@%0tr{`l}V)nHO18C^ HL1^W zBI0d!hkn$^t2fj`_%x1MV-J?|A61Skj=C+mjRc_LV>Wi3!v0(ZrA|pbE0-A8qi8m+ zSxc@%Sby6$+(A~(O~Zpx;p+)jgpEtqD1zLXhr?vm7Y>o2&z@&xyLOod`{TMMoL@!S z65V~@6?Ifsxz3(OM=i&pymrag)U!xXdDN-%+^(n~7p4Oy2akZ2+&5+qVfZfC4_K*I zL4y};vW~~>Ncj;#qVuxpP?7*#m%yrSD=DUFb!^_Nh%JOGoDHeZjQlvNI~kYCsPAGq zCyyey7qnwTYp62Ka#@5vR@YtXHlJVZ*TfsMs08`_|LhR;@MU>P-;1&PTYQ!>X^xc7 zVUH?;e2*KcnbgNnxwPxwgzD$ios-D}5rUPk`&{!X*>TshuoN$~h>G`u;M5Dhu`=q0 zvkzjTbuY!;w^YPX-J&(FwWu{}hW~^(uY2iUREv=X=MBzKP5~W=wv`aqdYh$nR8Wc2 zc{vNW$SSfjp1?35A}|H7;8ef%p<;Dhs>xu|V+|MjT1p=yBW4@x$>SsnQ3v@rI_f}w zGDhRz{!NCbNg@~GJ&G|)u2mx?&;Gx*8jQ! Ep@+zx!Qe|-vJpIRs>V@4`WxU}ZY#Pak2(u#De^6wH-n=zhwcw=| zj_UB(HPmb4h8;d!8)yQ3&S