From cf4690c073c3635ed68dc34751b8e8f2464e3dc6 Mon Sep 17 00:00:00 2001 From: MarkovNiks Date: Mon, 8 Dec 2025 11:09:30 +0300 Subject: [PATCH] test is done --- TEMA9/M0.py | 17 ++++ TEMA9/M1.py | 48 ++++++++++ TEMA9/M2.py | 41 +++++++++ TEMA9/Res101.txt | 2 + TEMA9/covid.png | Bin 0 -> 33052 bytes TEMA9/covid.txt | 1 + TEMA9/test_module.md | 215 +++++++++++++++++++++++++++++++++++++++++++ 7 files changed, 324 insertions(+) create mode 100644 TEMA9/M0.py create mode 100644 TEMA9/M1.py create mode 100644 TEMA9/M2.py create mode 100644 TEMA9/Res101.txt create mode 100644 TEMA9/covid.png create mode 100644 TEMA9/covid.txt create mode 100644 TEMA9/test_module.md diff --git a/TEMA9/M0.py b/TEMA9/M0.py new file mode 100644 index 0000000..21f7d73 --- /dev/null +++ b/TEMA9/M0.py @@ -0,0 +1,17 @@ +from M2 import main as run_M2 +import matplotlib.pyplot as plt + +def main(): + values, t, F = run_M2() + + x_axis = list(range(1, len(values) + 1)) + plt.figure() + plt.plot(x_axis, values, marker="o") + plt.xlabel("Номер дня") + plt.ylabel("Прирост заболевших") + plt.title("Сигнал из файла (COVID-19, январь 2022)") + plt.grid(True) + plt.show() + +if __name__ == "__main__": + main() diff --git a/TEMA9/M1.py b/TEMA9/M1.py new file mode 100644 index 0000000..9098ea3 --- /dev/null +++ b/TEMA9/M1.py @@ -0,0 +1,48 @@ +import math + +def stats_on_signal(x, N): + NN = len(x) + if N <= 0 or N >= NN: + raise ValueError("N должно быть > 0 и < количества отсчётов сигнала") + + part1 = x[:N] + part2 = x[N:] + + M1 = sum(part1) / len(part1) + M2 = sum(part2) / len(part2) + + def sample_var(data): + n = len(data) + m = sum(data) / n + return sum((v - m) ** 2 for v in data) / (n - 1) + + C1 = sample_var(part1) + C2 = sample_var(part2) + + return M1, M2, C1, C2, NN + + +def process_file(filename, N): + values = [] + with open(filename, "r", encoding="utf-8") as f: + for line in f: + if not line.strip(): + continue + for token in line.replace(",", " ").split(): + values.append(float(token)) + + M1, M2, C1, C2, NN = stats_on_signal(values, N) + + print(f"Число отсчётов NN = {NN}") + print(f"M1 = {M1}, M2 = {M2}") + print(f"C1 = {C1}, C2 = {C2}") + + aaa = (C1 * N + C2 * (NN - N)) / (NN - 2) + t = abs(M1 - M2) / math.sqrt(aaa) + + F = max(C1, C2) / min(C1, C2) + + print(f"t = {t}") + print(f"F = {F}") + + return values, t, F diff --git a/TEMA9/M2.py b/TEMA9/M2.py new file mode 100644 index 0000000..14341af --- /dev/null +++ b/TEMA9/M2.py @@ -0,0 +1,41 @@ +from M1 import process_file + +def main(): + import os + while True: + filename = input("Введите имя текстового файла с сигналом: ").strip() + if os.path.isfile(filename): + break + print("Файл не найден. Повторите ввод.") + + N_str = input("Введите N (число первых отсчётов для первой части): ").strip() + N = int(N_str) + + values, t, F = process_file(filename, N) + + print("Считанный сигнал (отсчёты):") + print(" ".join(f"{v}" for v in values)) + + if t > 2: + msg_t = "Сигнал сильно меняется" + else: + msg_t = "Сигнал заметно не меняется" + + if F > 4: + msg_F = "Разброс сигнала сильно меняется" + else: + msg_F = "Разброс сигнала заметно не меняется" + + print(msg_t) + print(msg_F) + + with open("Res101.txt", "w", encoding="utf-8") as f: + f.write(msg_t + "\n") + f.write(msg_F + "\n") + + + return values, t, F + + +if __name__ == "__main__": + main() diff --git a/TEMA9/Res101.txt b/TEMA9/Res101.txt new file mode 100644 index 0000000..8a3904c --- /dev/null +++ b/TEMA9/Res101.txt @@ -0,0 +1,2 @@ +Сигнал заметно не меняется +Разброс сигнала сильно меняется diff --git a/TEMA9/covid.png b/TEMA9/covid.png new file mode 100644 index 0000000000000000000000000000000000000000..8bdabe5717f322a2b573fc023c15386538cac607 GIT binary patch literal 33052 zcmdSBbyQX1yEVEtsiY_Z0s?|`OE*Y^w2IOO-QBPeMd=izk#1C^Tj}mC-Q69VxbN2A zIp6ulx#RwS8N;!Zz4p7-o6mgaoR5L(s`B_a%V+TibTN@q@ZY~Z1HX1W0Cp$-BPEPCp zzJtTo!IbmKce@D=J0ELS4O9D?AV6lJ8Ix+QH*VSC+KqQKtG@f^?> zUQOSuJ9*Ck2~R_ch*D6UxY_SqJ0O>-QmQEs9Xk#FNJcV3O!s)&*hy0P#OB~y)Yg+* zC7RzldfDLw=_76)Rb#n7t=}5$Dq4~(moab)JR8als4K%o{RQH~h0%ZuypsmP09W;U z7;tcbSo|T>jgrQ7wEGTbOT({9^HUo;QAB`MguPYzy5N@qeqWc7s4e* zr_~e{zxIhEyVvEd+9Mtuo-Tyz){sH`ue!f*JI#2XysROk;kf}d6>{iRN~(#UJsc^} z4%gGy@963Zu6Er~P4(KpX>4k`V5a+`NT+Od?jtq-#6ne7)xbtcgQ~>k;T`=tkIyDO z39^=>g%2#p%PdK)Co3bf)lv;i^dCP)t2>o$@# zV7A&u?VD*(=Mfnm9{#7^xGVN>Inh?r#3b9L<}<5yRC4lt@5>{ET-Q(YA%^cgIjKG@ z+Xq6kj$aGZQpI0W)c={72tJWpXboNa`jP7Pwc)+4SoRG2g;tH<0r)Kodv7T2+`q5l zkA;7`Z)I&w5giLJ?e|AQ?e(*?!pzKv2@<~bZkNNw`nt6N)lO@)y`c|4ujcu5b5!r| z)vr%hImREPeEv-DW3(rPbMq$AN`du6`A@R}S{61owz93Yp`5j)IKymy>+w%pZpg3F z9|xQKvAaYCBzAThu2tp3D4X)$Uz6Bl>r0<4(%A8vcEdxAOZbMv%IQkbyg7&$rnGT$_YKP!07uEAhvXlOqZvASwz zFG|jD#nih{>wduNyfJ!rW$$oph(U~$tlXrBe6Omtq%BV?t-ZafLnVe1_Qj`sj~o^i_P#8%g>xRcan|m>J1ty7 z2uM)b8aDWN?+H)-G}nq>*%{7@UIvTc*BS;p2Hc2*l+%FNP(dYucVM#8KBN2Gaiuqq zQ1M$G6aiN2vr^9!o1U$S3ck^17>TdB4_ISav5r-brKS0#q@)tGa#TN`Nf0bAcgJVc zUH6LYeByj|^=R~DCDk{G#;!k2YTWpOzN@R)u))9txw&aYM6+&V%LZ9Z*Sg1FuNWP! z<)o4Z%Uytn*sfS)bf^XYz5z$OnJ1f_O%%olz+~>21QS8HPl{nxq ztk<)6si6_M3?4UJSy^cYw(rlbldTEH-kpoH1LZm!L8Appb%%pxm7cwYwk}ZwUAQRi zRjPzMJvJfLaAr$IyquKV)ao@ZTaUIr z$Y;h2Ihy1dU*N{ZZTQ4nPgOr-<8g}g5jt4d^}gC2cAjm7efR2!q8~Q~tC+~JS3^T% zUOE9C>&kBA^4;*=d-u$DtE%*t=2m8}N3I8#$H}g)mE$8p?sJC`|GIg@6%vtx)Vp&s5OWB(B^445m!2WLd?dh-*)?a>N4Hbub z$Q0@~OP!xTk5j92$S02)!C4l3UQO`d3COMI?R5%V0pqbB;mCRNxuXxe?{etytB z9usv{)vzY#i&MQ63IUt`UmtMuz@Bni8>AoL?D=vs?HNApd+j~&F$7s9c71UW6Bj4H zF{sG0!TqLbFknmt}4o+$$I6Hzb3qpp6pOTBZeOs08XrmPs)ni*h7&_ah zK5^L?Wk0_-=xf<{*Tqza&@O!O;JgDI9g4LC$2&7>xFl?8mWbj&=jzHn$`kL!%R~WN zD(gSr{7ib26frR|(^GS@n%mlfH{ft+>xcA50@RX}k$9q?EbM$6G0CVU9F{F^;yyt> zUi`AuWWKD?+YD^0mw{qvEk9f^aLU7dNA{Hik-xquHDJLl3(?Tg`M}X6@B;mX0ltQ@ z1$1PI^M|wHg0_5N9MgNUu)R#`d@0WgpGIKA?#}#dlYiGRw60t4RrMzz(Jf@o$K0zH z41?}EsW{@%Pn#*7=)^?USo1e!|xqpZO;$p$PgZf*_H*q?;wZSce#x3iNOU)w`& zJTZwA&joSUNvG$LRAL^V5TC@02No{*F%P5fME|3AW^9-2fqxq+nt|Tv%(~0wrBQi|9k=WQ+ zhGO@JI?wbPeDp7ZR>lc0Bcne@CMB_15M<&ao~{lR;m?f=POIj_0s{k?OT`dT;M7%j zt~*~Z0GL2TBjeQ#goWM9N`~2jlKS+tG#ZUJM%~}vv@wCf8{SsbDYKxLGjQBWEiEm5 z(OULU&-18H;`-?snF5F!($mw^>HMR&#GeBKQ|HDl|h=-^)MW=UyD|UXLt5P)Lft?W?3?=B00bPj`*xOCzA0<-3s$S%O*`7=b=-O; zU>Q6zDr`;ITWLZk6s55^cX#^s;9`3262s^Q^mRPbBsAa0-o6wsM{f3zd!(sHCMis+ z+Kwk*{AzzLTY})*Y1jLT=ma@@%#hkbVJYSX1~D7j6$afmJq42wTa4#o2;(>nvwg2G zD<+{2T0g$^_xIzZrdC9jmvnL)O;TRAkQ(-Hj+K@f>YQitvfjPVnfLNDbz5Jbny5rh z71#0PIi9!Ffo1M(t?I*-@_FVBU4gs+$V zw(=W6vignUn&ypT0FAgj49@Db3`hypNe^M~EfzQp31%x@zWz9kyKt|7}v zQyF))w^ilxLcD1Ta~VFP^pek8&bq^>T;>HrrK|b*`p4&nMi-dfWtfv{#lnKvq}VrH zr`>b@XiEdQsNjt}zUv(?e!faqy^`W7BUIJebL)-w&Cr3OSGnEX5f?kY*LQ?g7@mBQ z6mi*Psz}vzZwtPTLtfh#Jv`Z)pEUNGu4+iO=}F+$+h{K1Jr~@eMx^YYMOjFMnveg? zs}%P*%pLIYtPQiLNe{M!8M-gsjkF9!V%Pwjabd??V$%9_5Sb(8k2RlQ=~`huk*(j? zHvMNKM|6@j#*xl}TFpny{#Lux1J;t*F|uvnj+J0v8M~r#4uYs7djpZFl{uYfKHe0x zODzlVfSJAvoh53#OXLZu_xWkUOx#7vykjrl`^k5WQeVF#ikT~CSP;Djj=QF}u`4dd zXWy9MT)k>8Spj3Ieb_P5R^rH!Bc8_)D;h zuX0VzL$9^WlCp7suMlV2v^aDDK}0w?+ZLD5ezYfvUCb8~gTTnswUqEWwHvRnO(k1x z_M>+7oTYZ2@x87yYmFsSPVa#|AaohT7eBjxIR)UXb(d7+;pD}e(8Tv=WlhNTotAw& zco%G8I8O_ofzkBhUYi7o;OWR^WG9lb2+>mJc99W*UbAm9J?FjnrfFwwsVmOXQW}4* ziF5LHqeLS_mH=;Jt5gj14L$f6`&A=-a6 z6d{6P&By-vv2wDdPNiYk6}FdqCZ~e5irj4~qMjbPYC5Yb5LmIY61ZB+=mBgaZL)tB z23sKKOzFw0M7J`dBm!s<9raK&OF{&_WgtB*2(5jlX&_pEXICRgT5X)aW_3F7b@=r3trvFl-w{ zHuhV_*>3n2ug?28R!{7E7uzq7AMY!a1uk9AMuyR+@(_HIxY(7>nAlr&nx?*rWShI3 zrxq8b`((o-&|v7k&hOLbaL3Jk5kyZfFAWetmlSf&Y*E&FIvS~*%1W2-w{0imhwCDhJtG+cWvw*rDfn)|G+!7A7my)|97v8wtL{3T>*tQmHS5zUpdq zPVAX-z~N2(MyjTLDR;H%_nfqnZ2X1-?4F-v;*xwCroZj8W?zk#lCMOXQ~K>K`4<$j z&HLhknk9vRd&CYa&)a#gIxvdLp^B68i78SArTv4Gj%~ z21&EAIU$eeiFk9~&pxd53K1%53&5xN8JL!%mdX*ew$J(At#sI)5Px-XN7GX#|L1l%zNsV-txcsd*;*#?<4vxjU+(3hds z+RNh!OX-D=A3gO$Eu1Sz9cY?wffO5`BM8kpN1MQNVARgd{V#^#M@zR!srGyNht zM6({|h|e*fJI(le)w(C}io4XRUA&~D7aa9YrBK4?x!HZ@o_X&n9zEyEQaMt>#ovVJA8M&MZ%@9g9fcmcTws6a zfm3k;ix9ft&Kx zG6vK=JgUFEsma%(9T&!ck2E%=Zc~PV&x}Nh4eFFYGL|WK11j*dyvih1f3^}_hAC>w z)`#8I;p$H7Os_RmpKtB^y`=MlW5JVH(GqiW^K>-%b1H2*&=d_H(qT8}5Q<|I7ChoBZArOsHFa*pjtu7WcueX0ZEJkC}S#t%6wm zMVLw>crFg^6$5)H^WBT@r^A%rlMv{CX=QcwQclE$IbLCO?4HLo!7x6I2E5{9yHttG z1POi0xmiQaD}>0UlgKekM!#$n)m2y zdH4{H1;{f9^!83-5`A&qR8p>|KeX@QoOzgpChQ_MGA@fAFZu6j+EGF1jS9Z5-18N> zmyo?L;!O8B$Gvt;G)eIN4}mJZ#0Vmv?fGiY-}8{&iVy}|{qF?Af9Y}L!3sBa9u(Ig zPDl|0+BRA)24A0bVeP~J_WIRpWwgc{*Yo6!xe#Ig!j_Wz2U(|ChaaDnu^s+%M{x`< zOg@$uHZe99*hFK6z~n_o|NB_k4oM_V{`#V!$;xo=*#S8p_2C-~B9N;D?7W9NGCQ9%S$qF<&xHrUC99Nxw| z>mg6}+Ng(6>_1@Ba{$jXKqzq`DPS|%KT4be=p}xuKazm#;{zvOyvO0H6pBCr|9)oG z=5xNr*xA*UVcT#Sn;>AT3JBn@AO#5%2WV!?(R;sxk=LxB#$zojF4uf0o7c3L(gIO@ zpIxu=8&)_Fs^Cjek{cTX-vsaDox|Q`BoQ=aDaSF1iyQDFm1^tiWYa24`>2T8_xJ>m zF01`gHTbsRhtmR2=-Z;T$I-fMZ*T9obtTDO-N|$Yz=6>vB_)4M#($b;rKDC2*hY7GJaf`y?#?6Ua)Cbo$|TZ))0+ zqHztMteaqei<8K?!x8^FdFBJY6hvX+ypASc^fQRbwWR*sB2P!U7`6ywn4F2g&SbiK ztvN4XbbWQ%(a{kY^F#%iUw+wA&qCU}M{h!F2pYlYXW>E_dRdX`Q(OqQ*BqZ6(dd;XQjkvWxHh zbK;A0n=}rvlpuMPFFIh0wV$06P>Zv13^o$h->0Bp-A7YR7Je3T`wFm&Yk*nh1-xS< zPlVP_E~@Wc8Lrg67xv=~z7l|A4`xtHVZ-{g>$2&GO?3-hQm_R#C-`N#RXo{I!GxCx zATGHRPW=hR(}r@?f_b?CLr)xz2|{LYaZDyWkT(KN?w8-I6%R7}LKm>V93n=_t#$2R zQO4|9t6p^*_?#Jg9FLjG8Z?C67YTw#qVuVavd!^wCN);s&eZb)5g`&sPN0oCoO0Rk z9;IHn?M#XR$WQi8tEo=->v&W;x*B)9ZK-&tr#vXgf9a%M_@XBJ#! zdH?rV$1H`fR+Ky2!hPTt|H2zgvvi-CuSO6l``)l6`i_x-k@LSm25CnH1F~VL_+xNJ z2W&R7fH@}CKW||8uO zkU1x=3byAQ5sVmc@N!DzkY>{jBmF_ih~yj4Gi(^me|jW?Z-nrGy)~7066cogro&tJ z`}@MO;Dz^HT+^R_ou21U@EgJW`-RZ14$jQepY!Ck)mPa9FrGv7r~jJAiH9{0wM2SN zB?D<-@TXl3$0Unu{&RH_3^)Yh={@LIPlITeyz$TALwZtqPbGz}EL;H|wx^FHDE{8T zzpbQ*^95k8$Vy=$^|orC`Qu(k1?&uxe*k3=gHj`qm@6RXgYqNGD#`l4>UFLa$*nh+ z(22p5^mo5#O958738MkM!ZC#nj1-2Eo>huy$l1W|SH)T^5BgC)fPfJG?Umje*DaUw z%KI-nh`DZKdy1?-Z*Y4aG4))ORDZsSKU^KT?X^N8XV)Qfyef&G#S&C^#&bFVt;1>VJALb495J5_GerhdQ z8k%x8Wz>X=xPQABI%vi_&M=#w4Ij9x-t{2?!!u~2hSTWzE&9Lf$0))oS&W3zYVJ8~aZSfHgZ z;o$HsV}p5YeA!r?>hEjwuLqT1r=Fon5|YYWP|UH~ym@}>AAB>)cwNS9lrI4_t4lOa zt#IFx$@|aKx=fzHG73EX=bgB~dPq;F1DvKCM>y_|@z>U14t!^Vl)Y3d%-tGuL z`io<~&ApVQ?M_0Idu?j^(ZmSz-$4HMhS;B>=S~pXG48`y2+$-U2%>nqCJwJYgTnQd zzYZ6A1&a|5i~j8qe*ki6N};E`osFjYaqU#Dk2T@EUcV>DYcMbW-r`O1R4+qlK>O5~ zADV@b?qOBtKx0ks%#YOr$)3MR)#x`5eAftH8Q@>_$bUolC1LfNaZR%?b#vTJ&{y?KvsKgsCjzgrZPs5E@O27oBf z)I3opmon5c;3qtKbf?0V_I?QMzj1q@DAZzZ_{(dmecI3)WWYF+=r4cGFkV^vr_duq=w3|PG0_{CLq3eheHOJ*{=8?4++rBT{{*NC& zZsz|lu<4PsxcJrs2x}-ahL@Mu>i0IPjF6DQOOh}uF(on2VX+Bk%SIqnC`BY%9* zfOVy%CyKl=Vf~uXoMc|Mep@vrURy!FID2^2(H{q`5hd!8u@6xE#wxac+ zN}#=yi+c&;-xrQqA1zYOkPj#E8^5|lmX-N}2+Lgu7?amE{{vN~0Y6HxwV>VPw^!&W zH^^|6qv`rU#>X2pzL!VZ-|r)VO2Wj+8D4*RtZOk{D-?QoF+=H9pn5xo=3_m{0_JJGDWIfT)60 zzIIQ(Blq>;qLz<}*EVpMn0gTrR$U)(H0z5pnvgv_= z$cu{$CF|dpct_OIIx8C+y4hAJe+uoK!;gy#FMACZ^O>01aEnRpvMtWzXH~;aHn!Qu z8mh1C@r^#^Xoc=Leu|4G^Y+?u;olNZRq!SsDepK)D0znn>cNC}#c`7Ml%jBgS%R3? zDVIvJ@aOg6Jn1_OPrg}&k8@(hRU;^sJUUJ{(#$>l8M88@7X)appN8rbem4Om7;dB z9#Io1HoU2+>9zag$M486+2)WSc_FHB{|hO@b^mWjImmx*;C=Kgf!|suk6e;UtlOK| z{pWYhJx+QbbfC_rCM6{)bPWG2v6wL2EO5wMn=B5gQgXT==EFPw`aoJ(H|JK{ym{Y# z2C?>{taN}=DHwz2gYR-oe&9kvEGzXM)s@VZxw)s>SOOCc@YYL=EO@xu!;`HV?1EWFQU_&zi-1+}pbm{5oHOo?8Hw;QR z4gXBFnE0<*v9l@3Sq|K2hX@O{Ec;qprm}h;zU|*idW>`ER91Dcp1F$%R3SjS$8Ysz z^`OFLO1RqV>=E!;DTQ?37jnpaVQXs2nDBlEWMAk11CN^S-Y$zuSGY^l};?Y8axaz?#b3?(e zrSFkM4*iG2a9{&_y^(6Mw~%GI9DMsm{SIJWZJEnDpbp~8Fk7JG)*UJ;yQd@yv7 z?Y~TN-7%3%d1e9|D4TPmWS?}X@7@Q@O~OxJxkBu-fALMa%y*lBeBY(CmnPsBEq;%I zV-zpesA88J;9&Oug49MVJw+A*=#pJzwOkL$Nw1}6(ed;lmffGW4R?_U0Sq{JD}EY& zAuT&*klOYk`UNX-tZNmzGEgI-DU$wOUykdvcJ+Rdr;pb0~(nooESlyD$I zYVjxf)lNhwTbr9^U{GGGw*w0byS^Ow(laC{WnP&?pSzVrTDJr56xD z#C!xd!daMD20zt1JJ_JbKH1a=2Qa5RxlS=>ey~uVGS>!LU09F?egR{SK?iX6w~*#T zz0MBK+Zi?+r|q6WWjB0X$p;_FOkUkCgO{gbWdq(S=F1m_lG=S7=bh=P{VV_o;F@%B zp;N~neupe-$N6fO;jIIy@;3dr=;Rt-N@^|HM>;d1U7*wbG-^WQMmz2QD$Q#Q%kU1exA8B`5oZt2T~>?}G#)uqwg=bc0nT3~QEsI-IitT{ zotvF<1@nob;&-o`VCJ8)mA}QX%WT*h&a`KzK^{r6Wxeg7v*(L>o>%==LPFvk99**O zvq1jKLkYs-;DIkHvHAnh8dLDmbIm`I8ZX@)9IVqujfTY?t{l&~N#AN-@=!8ZH=kb; zF={)p3E_US=7sTu-Ambg7M{%^@?>VK{>dHBQ95l#Y)evH778egjQdwi54gASv0|Ea z9##at_1(t@*W%I$tsmyb-Oe6qj_=EYF+Sr%K-4quGy!)S$>qH~i%Cc>iAGm{!_yWg z&n7WS7c{Ns8C5@SAGy6l#-TX|7j5?y6#^ryq|Y1=%Ph~qb+7#L)Rc~u^3c6TXdp{B z{^#1;+OlAD(6G=L4yN@rZLO%sdR|VqJ_ES7|338k&E>U|%Ib6NZhWsr3!JTnm?y~_U+3FR&>C;vVIb4% z&43d@V6tCSWA(epK^wTaOOG=qJ`VIDU$-3E-GG)rIt8ZVZ6}E%M85CV=g~a2cqNpq zV0ve;NS~6c3~RSXV1~D{HZ2Xp1~g#fV=H@-Thi%hqGsv`M&}!DwYivH*VCh;98v4> z#89zLS?8>S(=sZb3`x3p9HiDoR6%!XU2*fpzD$V+Ep)N4>+JDLk`8CjrPL+zX-_5; zk>kVjkdg7DsHoMo>`e%w5%^Bu(~!auwz#n^Q(kQSp3^yOKf^mN%Dkhv>u@|G8$2ri zSpi|%)uA0~I;LSXqG&IeXDZZ=iaCqjB^7j3?cZ5O*h61pV@-CW5)v%VZiD{k3SvId z$K<_MI_E7`3H29crmK*|@S{0^`rF#%ANr3rU|?hG*1rcWve=-NFHyqJD;W;<433(& zY+Vh~C*M7`BvmYXvW{Nqyz#s%4)hNq=E42M?OIVRy>sm?hi7-T(2rkT@}{yZI8%uM z6JFmT;E#YVH zKHXa|-=3_BNex#`0^eMIs{TR-VPne5fEiNHo&2j~Xe5$jvYWW$t5h~@mbIkzu|GCp zHp;(;VqEVqs%8Sm>G^6#xEWwBV>#);`U`5#T2_~elpBuy;8qni=vFN}P{|RAI&?T* z)ClIk)r7z{lNkJA++~I+)<4{?*%^$YS2hFG^y@L;yJ9y~0`GD6_!{@bSCMS-xvI9P8dA?dQ%PLv?z zn4Q&y5_zhxe4T5j+CdUIoMsy>nQu7ZKj?_Fin#m^y3XBf0c#dNw#B7Yz+SCq(3 zt(J%gswClQst(xC^LiiEVnS|QnXJ%vvNHW}i6rg=r#6bBbXaVE)P;_YzBXE<8_NVz z5IBoI^V+qxfTS3VhGKv}#=^7u(@XVH%Boje^GqpdGqQz_!NUm_^g~jS{Vq`%P;j-E`H8yifQtkRxlz0&{7>>=XR(RSwCCb@TZ#s0v>+5z zZ!C}Gpx1g8**Y$(WeT;UOVppQvqs{W02=qF)0(ER_c`w+*dL3tM$<$}6}B_k+fy~s z;75VS5tv)gXZ;D=5eV%Xd~6F~;ALhvsC^Og*>}vvzVm#oN;nVl4pY_drptB zF70~#TD?6ZJZdXG@KbV5+{I^0x}kF$I4C({4}ohoa9nU|Og=q52#KNaH&gze>rN@| zRr%uhH=zWO8*UXD)ameQqx`)n0S23ZGL7KA@F!~$wilAp0eD{lB1%Q2c&LhvrKP0- zkb1JBO)mE&4$b}kxCYu_yUPT|Z`f%owc#U=d$n-hcB5m&$$002aco=8a(`wP_fIoD z5%OW$W)@>DV@S|qIM)H;Xd~%(1`-ol>uI2>u?cZ}f%btuqtrwVY7e%yWJ4c>n=M;c-qRH*!k6I0PSeB9(_LWd=;^sjI;A5M zo0`hWp+vux7&1KQbfJd!((Ww)9F=DuCS6J^nrs!13?S zc@G(}J?pid&u~P2NNz$^CR?a_h|4Xut@)N}43kpH=GDEnAx@6s+^1 z=Y0M-n-{MLqsj4^Q&yRctP|~gp$*c=HLyNNEByWaTbw~w{^$9xlZl_^8B=lzB`-Ap zS4RFX*=@M_`B;uuh8>w#{vWkU`R2;;`qq3?h(?)M*AyxJWg6(<{=FLAZ zt%$h@YgZ>KN>)wVh8paHNT}jHx5oKONk7R$so{sCx*pn>X;L~9{QByfT#$?i{9 zlmOakUfeJzGxO6xT@<@+`KNK&X>4-}s(XbKgmB+yd^VGRj1D-#(U;Yd??iHIl({qf zajm|rp@g)XP|3d7lrzysBOG5nGU?@N_X zLlGhhJ^S4}eV>l>?g%-rKjjwSCM26PUl+W`7ruF)`}O)Cd|Sji5qqta~{ zZS8%}SwC!xhxR@6;a7DiGpB^yROD|_H-Gdl5QelQCE*Gjp~PGO zK;Z+35iKXZxV(BQL9b=H5a(!eS7lKb&7S7aB+D9N7UUF>- zr7BRkZf3y5M6?iCez|9*E>Jt4Z-`+M@QJ*}0$vP=OYOEEAjdXK*+UzH#x-Z}Kn3at^;r}XbHb#<|=OuFM!@c)#lLPcUa zarTeKv@8IRgP>3%7ZfD`uhAMgGZX0Uz9~!!hwR&HXmxc};oiM_F)1k= z+iLNTJ_tLlN`i`|p8)>aS2--2-{BG>x~w%CO;mq6c`WI>DdDT_oh(uQ9~V7NcqJ z;%PrSFa{+puQ_Hx!QH4;AQ)}pKi7ngkUv`j90|CLRNpJ1P%5#6$;ru|LrwPAlICgc zX;S{H(Q4v(9s3}_F*!mv5`3jN%#Bbc4h>`lD6ZqC1stFP+sV;U7K2K{Cyhoh{_4&^ zhfIWTU>RX>wKEZ>ef;<_cMS{$bnu&vhGs*iKR!PGr}YGXBn|^7XUQLLjrqeb+sSRvn+hY9oLC^(NU{ zE}Rz#5J=TP=_1OU5Da@DiuUD>)WJm~;CJemlmT{4;{rY=9nZsn%B{Ig$ud0^n;7)m zcxZQb?)Tv@T+WEPIx!(Z!B6gf0B)IsVl|8n4Z? zec%9%VZc>YRcTM(OfGg^Lh%(90-!i<e|wET3vjJ8@YBp617(_hA5sNHHj7x`T;pVa$_rl8c+8i%>Pb(k&#iVqut5a~ z6rm&KnV1L%o@b+uM_{&@H2;xo-^}o7x&TjPZj?Cz>bAfNHdtZ=yp?*Qq?&fA4Ytt$ z6k&M*BoihkrceAflS~#EXSYd65xq-!f{n^Khx8R$wzYh1kzDHoT#|=p3nqrc7k-6kjQ}kV1>RxI^|?F; z2w_i?&!6%Z7;(6H)FTH#%jnJ@XNn)?0U}b+iKY*V!1l3YPpb!{%=u<%ADadTXj*pM zj@IDedmDo`+$QRF5onQl1`k+mLaVyKkffPeh7S}2Lg%Tw4Hem?YAOm7gQb(110TI7Z4#Huk@u>{0%==w`4f!NMEi=<4YBYMSC6aB+E=2c$G7z|gA$ zVKMJII5ad1oSeXFR6|yG0hAdHQ1F^(eRX+ah_YH$ff6WCFTGl`Q(wAT58llqsWMV7 zF8T+^TT{;Y@qf73LoCz~aLwpp7?E=5G2OkW+x>;>1gbKlvnU1a;Pt2TxF8-p%Uc42 zAzJjZG~jvR3n_5+XP_z!K@|GAQB{@T-v9`%aZvu}eSLXCTbaoHCcq^TM7}`l?aBoL zVXxC~e;U9#5Aq2G<3CcCoq4>|%i#C4t7Y+L4YYp~TIoq-v^cNq5MW_Z(gR4I#bOp! zsTfSm26zM1u?|3U$=|F^l#lN-%0i721J^)lZ6<(4LxB8{Nvm+(G5FpCcGTKpM>HxC zv>3|9#|KU~RQ*<}_i_9UoG~!GEk3Ba#@B|x@bd&nmD%Cq=k2seuvu6vuhI1lnyH>LhG(9xder+f$i zFDL@kjbG_SWmPwAy98;Lf;AP9*^Ay!7ye_li5hw0{sxTvHPJ zy2HCiyJ?R{7i#z3s;oKzJn_7EIL@-)U7$VlTKb_Jz*^Z)z5?1J64)L)I>6dB2L&=< zQAYC+@@oi-GyWehn=;2rxq|dhmT|uVRVKk5;UYsrN<0>OL(6yc$9$};!Na|PCqxd4 z?YGmtPHS=O6Jv};S*^~Gw^*^XMZs}w!g@$)^Nz9oA>)WT0x-LiX(X zZ#G5o&G-6haWQjK^tr|Oe}ub57n>79)$HLqY!o4v9k#|O2V-?MWbcSV{u2-Z`v+`{ z^?p=MO^7KQa_bs7ITu?L_qJSLy zXJf1Crc`jiA#3HNB^b=~3aITlKiW_hBebOx3wV&k5x{v~DXQd4mv1gHQvM%pvtwz} zM$leMkI;AmN;+K-pmVvUvW9cU%jz$SCj9> z+4lLdHQUw7!_e{ih%)a=v0jyC%`~XaMcGq}g}5jMY$!viB~qq=&bP&%gcjg0R(xbR zRb8fleE=$igCiTkGoF1vdHo1@GU%vX8P^AB04r@(gB3AUZx_wU_+)#uD6yQ7=Hwc= z7_G*pFUS4nBL@}bFQLoR*H1t(aXf>8xA*xWIOYiAivY!%W-~Z!>#vIu9qoU1eg%6$ z4{Ky52 z&f@Be3r35fzKJrIYQU(5Ys2DDlQ)f0+lnTS z3=G@`(4j9iV{w*OhyD_+U6o%W5hu1JA@i(z>FrDD!K%>Hn`3Qi8#JMCg%^YeZHyGigX-bKPSz52V5(*} zWPug7p-Zrg=Gw@%Js^^7!~VZlFlK9a?dLi>f( zNrz`ZsmunebpUK2CKi^?{Va5dYl8*{`+ROvDv?Y^qb4?3abhpm=vx>ceMhPW5<92| zeRXkB2ApLmPr8Pg8B>|XND#^d%1zA$!6&gbRt2(@{F&V9D3?fx2RV^%x~2j)IE5mX zVz|@~qIeF>09qWs@`XSr=zV;AXz79b)1clfo}AYVPRtD%Mf)?60qSINw8ZLH1yXh^ zYFNp-@Oy$K_tJDs(Ni#E!3fpTTb%jYHL<9Xj%S!Hx1NZ-hw%$t(!tSDR%I4M3fAjx z2qJkK?9XJA`F7~H^6}8vdpwlmEx4^LCuH*CkvlXdw)NO}>V1)uWf*bz)%{WOp|9`W zp*IrI$-St52x2Uij6Dm73Wo1Z^D5%SrN_!t+cG^$`Xg8Ol+B@26p zgK3mF`;UR~rgi1j41lT>Jq>BAkR6ESDApf-FJ4&iSJz0#dRsCwO6=$jZ`KNl`tL@a z!>Np9rr|b~nv_KMEFGm3>(|#y6HY*3t1G=C{(nk4%djZh?%fYk79}Z4hzbY-f^;h_ z9g5P5vC<@XbDM+^@~jc{(s!ZvG?|i$D|Bo{i_R;G&z=5Zp5!*GMzCuT*UuK4f$iWd6d`qaH zH7JFgPj0<)+-{wh82Q-0ARu0X7%eP!)MumW#7=p-R9aDyUg1~4xE{UJ`uEzmg@<;^ z6oVey3(sjzaUPK%3iZFs!q%DrW0t&!E_ZfRzp!*U?hcyxU89BbcJ3_< zt#|5+=G(tIqf~bq=B61gOOYYo_Tx4{t)&4jzh8uL;E(6@_zs6*IPQesq`$QV^E{In zLig|e({^i%Q?ctQ>ef;+4wGiOT)n?~T>7fsIR?cB$%WNzwc5p3{0*+`F*%(@^J4{; z+r~A5DaGfFdTyKcx_sxkt(}?&#V`B2*)GBzLO_HeJVx0 znqlK?kj8W=)4#2oJ%hzNI4jfL7&I&+8g={`x#nYEFEhB9xtZ9K+nvmGnccaeOz-UsvYf47NHTMsj^`Y$6y{QJvMbFAIiGgx_hLAVL<+vXez@RrF2z`K~f_Kjyg{`{@Hl}8%P z6Q$+?banAeme;)Fe^-sUo>mUqs0wAZ+e(Go9X!oI4s(4ZG4&@lPK78a44wsrempL7`gp%SanIk`ld(I zFO)?`Snqv_*50+w8n#$p-#Yc=jjRrZXB6`*vh}LVvUF_c<&`r<7+=mau-s#8dOJ+t zh^kL1ft~W~8p7x6=#&1_@$c$ukIoFWd@J0SJ*DU&7Hvdok?s&BPSPL%Oo2P@He*Gj9(XABG=4(&{dw6jP%X-J_m zN8?B1`Cz4N*wJjK=yp?EM+wITIc0*WA^XRI(Ekd0%yHBs^=^`so^vmUJg6PZ~avZe`>!eNc9F z*WD8j%f`mDjlL1-o$B;jx;<;!mupNoaWd~EYZ_h2c;`bIV z=r}D3bD-QN|2S)G9;n62$Bz|~4MkC(G}jClvB87h;r#iXq0$=tf)SRCO*}lB@N_eYvsJTcbjBX{11l<^}H#S z!*-1^mza#+vy0+xhKC%QkcTj=^P5BF2_ke1Nj zf2T!7xK`~cyl0V5fx;bpiujcn!!coZ718h+yb{fK>F3um**$}LUh~~YX3IX|ed_OD zwDZu{23~y_MGik8&mc)Z*HP-T*~u{Xtja!f6y$SibbYZlnoxla?K`HL-Y}pNiAzj7 z1wry--eOwI^Rvm_jgtj0M6Avi%J7yO3!Z($uyq~I;GOYhvIq&K^tBHAx+5Hl3t4e^ zNf2B6`>Z`(IQ_tU!F6wi1nT0`0I$YjUz82>HZfgFKSDbx{=4MjPGT($Wi}v0c_(PvkeK$6S9+BeLoM}4n>78TW!B;b1 zA6i!x;_YLBOH{b$DphF&F4=d5>%H~uTl;|>k5iB*FcG}FOEW$^CR1{u3ctDPx==Lf z0wz+|mPAb-wAzw(ONKiBC*d|k-6QRd2HN)*uJJDTgbVmrqnu%Zu)ek}+Q%|L*2|1^z_}UJ> zT_SHh+vHE3rfp`^8ad`2+(F`z)Q^?FCB&+tk+8(Y75g11}+$Q=-Z#?((D)#N* z?PBhGN}fNk)^+C%bx!6&^7vy;4Kz*!GEDAO35opa^?8APF9|N}H)BH$6e%m*`I^p; z1QNUxeTQ>{z+{24|JZnInx6!XP{TItjCPzqvm?=Sxl`wA!xt-=1_(|C81e4EJ6+fy z--?RRmHg|494zKEJwljZWt99jx^1fro|Z=YB)7v&&p&6d5m#IZolKD+Hp~{I{+Of2 zvQ(@CAFzywylW2e$WOW#ULlcH|3b*3^sBT}p2A3sPfqH`o%Fn8f+~onv+b zq<6S--mF?8Kvt#*3ea1ss;bbd%Ye$T7iM{ntYJVeg`E*#0a92jAt=66-@SXMG2YbD z(hnlGwuuRS(QY7ZNyF(Rvm6UK$^~i%%uOB=(ekEj)SVQ_?vo)p7Y;+T9(8w;r}Kjm zV7fQne5UO++3D4b@37r(qShHLr@Pv8)hf{FY^|=N_`88zn?~etVZ|N^=hyewClnL- zt;Xw?AfC_apS>Fl6OwX7_{MWC{L<0ua&rEDK}4DSs=r>Q~s>v^yG1)+xpjLc?NSCxXOxw3L{Sg{g_CgV-a z2C6C&OO2rwv`u-uPlxytiM~zh-y{7WVQgsM-ao^$N`b@m1oAM(1srb9(0$&F=<4{o z2elyaU7qm?J368a`!y{YZiRocw~{@Pr4Y$X@!w_`4x?ekt5FR+?<>U1FocnYlW+>0 zDFUq>8KlPitj>k}(*!8!=)_mfZ*R)vW_W6Di+`~*j4rCr9X+BTch^O&Kk3OvofYkQ zehm)X=i|(LHBeZ*w!Kp;zy8G?=`BLTUT`8nbW4EHwO)2pn191g>;5xB9~l`LCdQS? zT9GpIzK3^%!osNeUWezjpA(tbL{8@$} z`0z{rakupYvc7h6aVlqu81Ka4LN4UR7?GOLJQi#lOl25{@c>`c>$K85KH68?&@(zq zIU%dIr||`ps*CB1bGI>uZ9_+yO$_`1zF~o18a$xPzq0Sr`h{HDG12eaS4AlTfhW6l zPh@3I+C5LaPK-ouXUtiioL=2-b<$p*%)Gr9wB1S`hTSmA16&Ws{W0}pA!RJaq$;o{W9%!;1i!IRq9(dy6 zx%!*?k&@CN@@GAjN&S|uFD#=z+k1I&SO8ff8GzkZcV zumOn1G@yd^gMmf~y39G}`2mup0>Hh}Wi;+DN`Y(JIlWE0*Ws(8d=Sf*(2=prrN462 zQD^$7`+*V0v{4p7C|CB8dI<(Pc2V8TFMB`qIQJ>yUK=nLOQYb{Y>B@qkdq=W#UWLj zs~(;Wr}mU}gl%7%%yc!tRG}^XB^LTRPf_z)9Q*tGOgOw@?Q?zKVVqj!tP5XzpGRl9 zm(aak5I%w8v=@X4xf6a?RM2ex{1(Ix0p_Nl9xseIN6>&!x!CFY*HP2|se8)@On<%6 zamDfa+JVmg*VOyRxq=uI*(nPL&4iHr86V57LjtPZ<{kt*Ea({Hjmk zL%YD*%KRq~5U2fS$)3!dEz+{G{m>)r@VrjULqb=QNQOiVUqn|H#pl~U#h z^Ynwfk_SVWr}}&vcoF+$qVg;BE6!7roc;dHhpe z!uf*-#)}v;I?;vgAowN=RUI?c7z6^9yVFkUeoHY}3oGKkm$~I40{1LP!?*2R(nJzc zF5%>mLt$_)Q0{%agNQ?=BYR{4vl;A{N50ez+pn884K>{Zue<5x?YBuRnD0)DIUWsr zYj$nfBTFzK+_lpmn80thLeJHCcZVL*;yHbsU?fF^k5G$-?eh&^?hGjuz4DEDXH%i8 z9!~NR{+Gmm$9?eJ<<#U#^wy&Exn^LRNeqPuiPjL7#1{$NX|@bD+P9m43sKD^o$DIqGPO zF@%1hZ*F*Vq*$<>gEfudO<9u>6`~9(CVrXFE`>)U*>)*$)<45fMEpj~l~q){ZmiYD z-GW=;U7fD|&odlvubLovD(hfAxvU1{R zZXk4aybraKo^q;E&nMwVjn@qJH(>o@M$+rK-aY4L}?L@c~(|2y`_nXGOO znJ(g1!+c`b!feuq?r3YmZLOMO@`(rZ#4EO|#i;nmL7xE+d527AD^kgy&SyjpTA`+6D@lvWu5pP%9_^uYy-pZKk4RvVt zT$e4o#QwNrXa83W6Up_SY&L66V;sg~Ok4bQxiD%<3-h_uj|}&P3r+rAni7@~>}Naf zb(*fMmdfCg!G9g4Gr}~O!0edEj;t>}u3StuQvhX9-%-um$N>#fYe<$}}&1`DJLu_Gqd-MnK-`q*~hs+)xoc~Gn|6ol=+ zI8yEz3Pea=M}WqN-zOo!;3`V`N!y3$P}~COuaH*AU9&((+ZG+nZ_cM>*@8o24f9D; zY1MiQe|_Vx62~&5Yaz$qgWK6|fBR-UCYXQt&xasy4||sHo%~6gSF3!kY{wp z;hdx-`MuwG7Cvu$-_Y1Rn)3UFYi_D1;vm9qxVteEb(Jz;_aMb=;}s(k+E9TSr8^wp zx7JP{J3Ob2ASOs&e5{J{vS?NpcD>n^c5~DvCRn3Bo6a7CBM=RK5mC(Um{ zmSS7K_p%s|^)}2ucyU#LXq(>%jq<)Z<`=J5di=W3O{>0~5NnD(z=#_U54=Hpx8L_v zBVQi9=TowCX=#grSOaTOPBMGkCchu*HWn=vx*LOjwuzg-zX|#*S|mXFU*R|6b-Nt0z0&F z=VSv8E-Nmk=&4{i-O!#(Hn_2OJ5{-(44=M4N33cvIn1JQS@Cfge@%wDb6T+^9PHT+ zbCPU1lRNa4sG^0e%C_%xG5FhHb@83MefNHqYG67Vk8;XWnucwq&(IuL9IqaoG>{HQ?o*yD2RuPui+jh;= zt$^S2=V3v!g1?jUvS#w<>#Nd4f9iso)1_10*xJvuBS!rAZ*ytOsavu0O(a+y3#cW@ zK1kZ_JF{+D+i*6_njB3kS4ky3UL-u-gnWqx^OJqUp|_wYG+= zuP_dsODcVMA$m?rFaA7AFo%Bli%K;8&6Jo+wLF!%m1m7D_g~b_f0-7w>*sYikBAP! z{g!)18#rEAD9kDAnP7bDguy=uSMo9%!FmZU7L@=4`Wx316#W!m|Dv-72O|lAknL4Z zoII&zuAvGAwcPprcG>~%&ttNOYNiG^x}Le0w1+v&>RilxITx9omwrfwXx~F65;Zpz z)cjy_TW&SycB>FBPr5_jM!&f9Q0!XTK8+;9Imz&^u))i0n}NZQw!i;1Ch?x3i*-S@ zs`{m;Uwz#7{$3lhgy*H8tU~S^1>ITIh2;9+y!*$ogx-R}e`X%F9rEoodRphGt8qM1 z>dAzDZo%+re}CAgh-jKN;uPjXY5dV+yA2a->yLSwM-DFH(B={v8}AEssDKT1FClEu z{G=*@>HQ@Z-F0KXQU3U$tu(o6%7gLGTdiAco}U!YFvq+X^POEK(b(g(_Ke7fsw7v6 zqicC#+IO1Cv!f!s9BsGF{&UItkD460^YAdX-bF!M^M(qQ$=~_AaF5SD;W}W*{%yyj zX+1uO4r$``(vB>(_#3kmeLOY($rVQOj}S!54OPcf;=NC54z#5W(>GkGF{Jsh1tCAw z{p5I9n`37?CtHG>16_siOa?{SuzhP>isuN8QjB3Z| z2W!3NOugdtG%i){bt((L$oj-OXf%{M-N?{yMC(veT1sA8UMV~p!SzJ6MeTx1AgMP0}o3jfkFB~=I1ALhjezO%v+ zLY^)-GSSs1S?=?&b)lQ4!`_I8SZZ3UQU~!b@m~bVgb3{_Ua>C4i* zeRGuim^$U*dBg*LuSpk~L3yXZ?R4fwgCVzkD8{}yjHYp=*s&`fD^3jYWVBc+8PN4> z@%Gsz7i?UfeLe0e9&j;`SBtAbDtMJ3-1bqbiqjdZScOm0;a|o~(*>&$I+gNt=@oGd;FF6OC(+42!b?MEJ+-{~o)%n+i_+RznV)i9zp~0uaK+FJ3`)vZF`ufu*LI;awcH za7;CFu0Y5wT?u`!>~GeTRYhqVP;BhyubPY{dYWFo2y?3j3U?_haCx`5uWRa!v zAoxw2*0v^?ID|=4UFmF=r}8VQY*X7$&e`{N`ITQRwv-Uzoq6zhE36sJ=RErXjUBGF zx4pH_{RTXu5g#naX^Is*GRlJ=_*41%r-IL1X9@Ica=UdJ0F-mQ@>DNG>Ffy^_FoYC zJ>CbT!6xf7Mz!i5tl|~BoIVxXyF|!D&lyVPT?ZqS!3qV&t%ip8xn?!;WOr+cvM0iz`vq2xm=SrnMO-yDd3Eq0AS?QE>fa@AG${ZTJnh*c2IdCNTf zS-g(#T(<(o)5o6Gwbe42x8OR|hQbJ39j2+E_2=@jAVoadv5If|?? zk654jLd4LE$DMp+jxMBQC?e*?kqW`Kw~=OZnmJ+DU?!zC(=)~YBi4=Y z3x|ELXWibpT7hcHJ9It8?6b4g;h}IKV4l-(~UBCojQ$mTn0+(>+8Fq zKGFGZ9{6pw;W3yC(_-MBgBo;J@(aG6*CyM9d>ixa1@yI1{-{;%`=B^HXtct z__9Xi1&IqFe9lNo>9>$SL_?Gg5n2_AEU1+4@9%GN0x3e}??;Tzo9))v@=sEgnw##a z%uUWr&%AE&?bU0aKm2a(3Lp^3hmW0{EnqVKqiIa)}T87M~4DU_r~$FAMEy;1Me)A~#*eVIz#%DbcPGF9TY z?19{UN3%pGTKZ?w_CGd!@L8@eKCGrI+vZ5)$D!S}XZo^{c|#Y;J$L4I@Bz2kY`pJm z?_#cQINQ`RNZ((YnDhZ_Uotm07xd$q?Kd;VXd8Td5cZ&!#tt?*j=XGbiyASmdqdjI zDP$A04V#;`Fm>=*HI#&{KjpT2Xw)YMKE9sNn9oir_{KT|aIlm0zJmor9v^I|g3>?Q z3)wB<;?~1C{bXvSbvMn{@Cd(y8r41U_AB+$qP4rQ+xOSciefL-if07$%`myN7G|rT zPS(ysIl>iIJ^_&h zj*!3;&uvW5+}f%MvmbNtYnTxD{r-~1M6?EQR&kW$aK;)&)LuWs%+A62p6*q&poi3K zO5VzbN-ga$vo2BS)HCmoFdKao;w#oRlxx}Q@B1r0e#05M4%|~bB)dy@e$EiX{5x|Q z5pL&DSj=pwOPL%m1?xnn31MM>*?87M`H2bUu@0<j?K>Z|Hpbnl8+CmK#M8B$=iw}6m-o_OJDKk1{hjwCI z4A*A@2MqH=_y~mO7ZOA?R^nNnRHabA9+vsl?261X$^6o?{Lk@0>`d&=otr&In%Vko z&LGBd+;isV7^ZuSE!q)H7O&(wPP=`n6n7R2L7L3=!{FNP*;R+yL(J+2EQ2se z*x=h-XO}(UAKNZ$D}JaTH!?o1YCkr+Vn(MOPX0q~N?=W4#`EFPQa3CH&H#7)O5sUi zpt#o+I3f3WxEuQ0T9Q7kK8mr5tISfUzsmEp@M?+bjHF#v{AZc^)iBC|iY@cs_5Ih) z2TsPDKWHGk=SJ^e?wY?5edh5(_-kZeO?}Iz-P{=$m*D(f|5oA53^S+4bw{&tL4zx# z_RExYbjdMN)JW4nMb`{*KRx4-3JarXGkNa8CXd^96z^6vlXW5xSn`=kR!!ZD>w|W^ z72CZ|eH3ki27ktCx#@1^c$YFp>~zr(<5gz0MZGx>oAd5=3Nvq}p_GpMp)kkk39J4i z79E$nDteW7XW$f(v;TZ{Zu#Z6RTW}q$2I2|bE;@|O>Oj!**6blrQJ4ZZ@1;KpWJAbYz@^a%MeAc88tT$Wg zehIOsq zLC~e+@Nxdk)6cKs0%cd?M!v-3tX0w00uHMiUNq7`{NmZUxb*6wUnR{CTs1+~A)<>%XhQGguMy0q@Wm42`S6E_sc26zzuA>s zIKMoR!!IN}_=>hQ>qgRU_pg}U_CL(u*ygJj*Q%s28XIpz$eUqFRWao%|54K*-p5PIhr3Q#%o2?y0lxvN0?E#~YK#>HY_1 zM@gVI1C5)hq6;`5mVMw>RyundGecd)5nG$3Wr_&B9UlkfD*_SlW#L>5`BD(-sbE8g z)XQTTWQR$iLOIl|{C{RR#$Cvu1;9+DilXAp+h8!u&d@Zl2K?{cZ`NJ+za;Z;P&XBT z>#oa59Qzgs>RX{IdhA-W#%oFJotK-F^8s6EBqb%iG&7TX)Lb7W_zP(GY_6`Z5g&6c z42R0=e{0YEsCvw-n4}#dd-H8Q>|9{y6L$ZZN>D_5C_@g;HOodD$xOlv{{wu(z6*_o zA>B+q?<-DzweY$Kwtv*Bf9aMF--D#j9Q3c#I!ph9NBfIni;VBi<1-?~UMZjU6f7G1 z{}hJ#7zvK|!D3@M?gRxRBSvh{R`+Ki&2@|iIDTHtlTQSJ>tpmSlu6Nd+#{Kl+s~3A zukC~NYX+FeDy)nYvgoRTN0;ZMJr?XpE%QAq;J>l>UG$tONFvr@Z+Xb1zuZ-;ta59v_Y+L@(lgR3VNPz{b-V=#gw9S>%ZFzD2Hxqk5WdiNT@ z3-q#3;9DwbbI|RpqjkeTP8e44T$#6&btS{ZJ+E{Rtl~`4jVha!(GVyGWfCz?}oQ}4fqfi zV8Pw}Z5-AICW9t_D#K6)2^D)6KyquGv@OI=xNp?*dm9|>jaEBZZDk^Vfv$TI5LB6v z&^A!#c_MAZYx_rX3*Wf&zXd+inzWKq@M{lrGWg;??x0OgOaiv+wpzgd2CqLIvj^oU6JNp@WF%Wqi!q4m;*Z7dOM{HzSjYGzmXO7AdcY$ zIXXvKK8VZXA=gX8*eXluQyQeh)qx;HUVS0jun1#;$i$V9T7t*Q50ovJr{?o}NO~&B%y|2Y@?&k+u#%3#?7@)x5m@4nm-65b{j1rm(<}5Wea)An8a) zzU4$awRKo47#PrV=vPP4d+w^M`=&JQuvIxOU4hCjR@g>#fkoits)&t;M_PKi;u%TL zUe|&3nx5i@v3QTTxVWi1*RQsE44OTj3^YDUaPOx|3?>Ogm}TtmzMbm=wb8l|#8YUcq&T5+ev@d?118=nq%Ez3&8fFY);> zD*acD0tU>?qN1Wlbd(@{u>|fKu`miFE*sJeb4qU4sW8*qJxmj>C ze3`C!w2;NKz`@Aq1MJOL$9js549Pa@FAWXW3?ENkvTyGC?12uB*1fRc4E%)`Mye)L zKkY>eTk5P1^=uu)DzxI<{&Ni&5n4h8cm4>>0-wqp(25k4l#iEM|I9~&R6pSPVY%N) zjeezVqxoo+Y;Z!n<5p}QQuz~#<5`LHZY-^^V-8z4d%fS$Ps4+n%*@OHvbQbW*962s zxl%WXvAs_@Rq@_|1K%5U5ajErlKvbPI6XUR{B>OOd{ns?GLzP0l8~PJRo+5b+6L{U z1iCNRJxOqJ4jt6ejlHi@(qG;?p96sdkxjpP;IN`iPEDO%3r9hvsWCz59kutC^5@JQ;fn~L3ylLJJ<|XqD3@Aum?EZn9BU{LIJ7Ye8 zC5beQjDevrVh24xH)nwbIw(JV8aEGy_sq#wpd!c~RHVTca1cF$1roi`VvThNIa|E* z+L#68(B{C}Ut9%S!b)6bR+c4dVuBBzGoC}5a(nE~;0lDbriCHEb?{;%R2|pG9_u** zOyp^){oJE9PtC~{BS`&)N^0kbggq^;;j)W7h)!VmkdBNb{2PAy+ zSB((aTX+Ftf=x(>h$s($CSv1gI0_I6z7SfzD;P+FaOi?nfw%lEuCRDAaOUomcE|L9 zx<{9&4w-rOcb60!T=|;>J-q>Ht53$HSFheV=ca!u!$yazLRSK2)ezJ{Z2e+LZP*be zc+Ey;17B#Jo$wM6czdxK#;2q+o^Eh)JMiqw?UC$mbfxe_KAZurQhx%?3-*Pfs0~`; zu_Ui!ix7xCIPV4#ly}}rpSAX#FEf+=hb@}>r4ht&FqopkHovXioEhu(?asU>}v*lv!ngb8sZHSh>NJNwgX&L!H zc(xrj9hM9ot$2>m%R_mJXNJk*p5_2Q8an~-2e0KI>o#!sj=?JT7z-PJB@2wE3ApQc zVJU*}VVbUZz91}X1QcMjPQYB z2ZHeumaPn-lF`+d=|w9C`LPIsy|r;|JWuTX<4GuFG{dMoB1Ix5U4OQpP|hFb+X%VN z-v;?%i_XMexxq@lSHHvII?7@(RcG+rMMXxYPZWTpo@sMt!5snxEFh70w@;2C`a2g~ z$7x}REYbtm+80M9Fmx-Ch;AaBpsvvg!$qW!;4mV7{Qz0&jdS!99avMSWdiI~0X|C9 zQxY!g*D0x}EMx5)xCFAXvahtP4QTd2eoB!B#s#Qn>JB;AYylGy4j9QrfIy9{RXeZg zEMpGEW79<;f_HkXqazQsR%!9<;K*h5x4NaLmKK)qne;I-5(HjQncC;?dIQc7aZqdp zS31`OxOI8kGh$m!5#}_gk%t{i3#t$M zikbK(a9&$%ID}-N-3+KmNhP7%nfX=^?n7*d4Sza-55B==*XTGD7wCbj5v4N;YQ}h8 ziz`^l*X8pHs;XRNb+F5&nW{-F4uWHRlINi6`rIgpf6X<9xgy1p!$Y24^ucM0mh2cY&a|NG^EC)+C!Dh z^_E2+k|MG>^{YRKzk^knf-n3!={ADIOKAe(03;74)f@DZ#e=OhtDSM{taJdW)9 zzI8k>l9xYU3uzB&F`c9Z_`F#VJ^(ND+*LCyHgLpCb^2LEx zT=mMrlpETG2AP2U2pUIy%b%)&Xl>&y(X2m48^9-{>}fqALKvwy(`rh9ZC}f82eHli zd;;Y$_jgQ|-Xkr+N{xC1eZ!vt@e4;5AiZ%H4vzBlznAyzi3(puND^b2?r|4-nC&5b zI(?<*vyiVb5u(J0*$4r@q8|`3!f*e#=}-Sa?g%Xc9PAGxayu|M!>F}IyR#@H_P-Tm LRHO?Y8om8r7TYhv literal 0 HcmV?d00001 diff --git a/TEMA9/covid.txt b/TEMA9/covid.txt new file mode 100644 index 0000000..6c70808 --- /dev/null +++ b/TEMA9/covid.txt @@ -0,0 +1 @@ +-440 -131 -456 1419 -167 -322 -416 1695 421 3209 2665 3359 2051 1496 526 2647 4951 10663 7699 5993 diff --git a/TEMA9/test_module.md b/TEMA9/test_module.md new file mode 100644 index 0000000..6c8c2ef --- /dev/null +++ b/TEMA9/test_module.md @@ -0,0 +1,215 @@ +# Тест по модулю 2 + +Марков Никита Сергеевич, А-03-23 + +## 20 вариант + +## 1) Создайте модуль М1, содержащий две функции: + +-функция 1: аргументы - ряд отсчетов некоторого сигнала и целочисленный параметр N; функция должна рассчитать и возвратить оценки средних значений М1 и М2 и дисперсий С1 и С2 по первым N отсчетам сигнала и по оставшейся его части; + +-функция 2: аргумент - имя текстового файла с отсчетами сигнала Х; функция должна прочитать данные из указанного файла, передать их в функцию 1, отобразить результаты расчета и по возвращенным данным рассчитать и вернуть 2 статистики + +t=|M1-M2| /((C1*N+С2*(NN-N))/(NN-2))0.5 + +F=max(C1,C2)/min(C1,C2) + +```py +#M1.py + +import math + +def stats_on_signal(x, N): + NN = len(x) + if N <= 0 or N >= NN: + raise ValueError("N должно быть > 0 и < количества отсчётов сигнала") + + part1 = x[:N] + part2 = x[N:] + + M1 = sum(part1) / len(part1) + M2 = sum(part2) / len(part2) + + def sample_var(data): + n = len(data) + m = sum(data) / n + return sum((v - m) ** 2 for v in data) / (n - 1) + + C1 = sample_var(part1) + C2 = sample_var(part2) + + return M1, M2, C1, C2, NN + + +def process_file(filename, N): + values = [] + with open(filename, "r", encoding="utf-8") as f: + for line in f: + if not line.strip(): + continue + for token in line.replace(",", " ").split(): + values.append(float(token)) + + M1, M2, C1, C2, NN = stats_on_signal(values, N) + + print(f"Число отсчётов NN = {NN}") + print(f"M1 = {M1}, M2 = {M2}") + print(f"C1 = {C1}, C2 = {C2}") + + aaa = (C1 * N + C2 * (NN - N)) / (NN - 2) + t = abs(M1 - M2) / math.sqrt(aaa) + + F = max(C1, C2) / min(C1, C2) + + print(f"t = {t}") + print(f"F = {F}") + + return values, t, F + + +``` + + +## 2) Создайте еще один модуль М2, в котором должны выполняться операции: + +-запрашивается и вводится имя текстового файла, в котором содержатся данные для расчета; проверяется наличие файла и при отсутствии - повторение запроса; + +-вызывается функция 2 и затем отображается в числовом виде введенный из файла сигнал и рассчитанные статистики; + +-при t>2 выдается сообщение: "Сигнал сильно меняется", а в ином случае: "Сигнал заметно не меняется"; при F>4 выдается сообщение: "Разброс сигнала сильно меняется", а в ином случае: "Разброс сигнала заметно не меняется"; эти же сообщения должны быть записаны в текстовый файл Res101.txt. + +```py +# M2.py +from M1 import process_file + +def main(): + import os + while True: + filename = input("Введите имя текстового файла с сигналом: ").strip() + if os.path.isfile(filename): + break + print("Файл не найден. Повторите ввод.") + + N_str = input("Введите N (число первых отсчётов для первой части): ").strip() + N = int(N_str) + + values, t, F = process_file(filename, N) + + print("Считанный сигнал (отсчёты):") + print(" ".join(f"{v}" for v in values)) + + if t > 2: + msg_t = "Сигнал сильно меняется" + else: + msg_t = "Сигнал заметно не меняется" + + if F > 4: + msg_F = "Разброс сигнала сильно меняется" + else: + msg_F = "Разброс сигнала заметно не меняется" + + print(msg_t) + print(msg_F) + + with open("Res101.txt", "w", encoding="utf-8") as f: + f.write(msg_t + "\n") + f.write(msg_F + "\n") + + + return values, t, F + + +if __name__ == "__main__": + main() + + +``` + + +## 3) Создайте модуль М0 - главную программу, которая вызывает М2 и отображает в виде графика введенный из файла числовой ряд. + +```py +#Mo.py +from M2 import main as run_M2 +import matplotlib.pyplot as plt + +def main(): + values, t, F = run_M2() + + x_axis = list(range(1, len(values) + 1)) + plt.figure() + plt.plot(x_axis, values, marker="o") + plt.xlabel("Номер дня") + plt.ylabel("Прирост заболевших") + plt.title("Сигнал из файла (COVID-19, январь 2022)") + plt.grid(True) + plt.show() + +if __name__ == "__main__": + main() + +``` + +## 4) Для проверки запишите в текстовый файл числовой ряд со значениями приращений заболеваемости COVID-19 в России в январе 2022 г.: + + -440, -131, -456, 1419, -167, -322, -416, 1695, 421, 3209, 2665, 3359, 2051, 1496, 526, 2647, 4951, 10663, 7699, 5993 + +Проверьте программу с использованием этих данных. + +```py + +Введите имя текстового файла с сигналом: covid.txt +Введите N (число первых отсчётов для первой части): 10 +Число отсчётов NN = 20 +M1 = 481.2, M2 = 4205.0 +C1 = 1529922.177777778, C2 = 9855042.0 +t = 1.4806648475081259 +F = 6.4415315649025455 +Считанный сигнал (отсчёты): +-440.0 -131.0 -456.0 1419.0 -167.0 -322.0 -416.0 1695.0 421.0 3209.0 2665.0 3359.0 2051.0 1496.0 526.0 2647.0 4951.0 10663.0 7699.0 5993.0 +Сигнал заметно не меняется +Разброс сигнала сильно меняется + +``` + +**Результат:** + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +