From f0578091d829afffbc44ba38feb08ad1c8ebb8ca Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Mon, 19 Oct 2015 22:25:23 +0200 Subject: [PATCH] Rebuild connecting, bugfixes --- .../.vs/ErgometerApplication/v14/.suo | Bin 112128 -> 117760 bytes .../ErgometerApplication/ChartPanel.cs | 19 ++++++---- .../ClientApplicatie.Designer.cs | 2 +- .../ErgometerApplication/ClientApplicatie.cs | 2 - .../ErgometerApplication/MainClient.cs | 23 ++++++++---- .../PanelClientDataView.cs | 35 +++++++----------- .../bin/Debug/ErgometerLibrary.dll | Bin 25600 -> 25600 bytes 7 files changed, 41 insertions(+), 40 deletions(-) diff --git a/ErgometerApplication/.vs/ErgometerApplication/v14/.suo b/ErgometerApplication/.vs/ErgometerApplication/v14/.suo index aba3c9a054f846c118635fb16fcc6d3041d9d0b0..ea97c369c55e846a5d502b9e6be2f7916dbe1b9c 100644 GIT binary patch delta 4464 zcmcgv3s98T75>l9vMjjZ@)S`J6$t|BN}9wVM8a-;5W+6eB2nsyN)-!>;$jRT5fxJ( zq>;VW-$skgYSyGRt@>xW(>9~nM`{v$wN28=qct{ZovCpwv(7jsg?{JXe_>59?Q|ON z%(v&0~0Q3(G41h=kBp<8%lqg?}m&e6f zfB5mN7h*2ZLLOWxTIE)%64&Jl@oUTU$d4gQ6OTtcWX9@&O!SzF_=K$VbLgC%gdemR z;9oqVw@6VtD{*5Qq!|Efo(5_IiU6Ke3YwzxJe~=jcbEv81&jus1K@yk82CQG>t=%9 z1&q@BEXxJYhV0X2iJ(&@DOZXEGesBj#Dm~x0nxzSx}1+@Tvuh{bh9qti8>-KN)lc&?@4a<~+OzTs2?^c;ynEGS6+<=lXSFefE1L`t`bOV^^guwN3AQD{Nv1 zc#mAJ2W(g7yFG`(16E;TCs-Q?=D&&_ofFriCPoiN2M4f`!^4|!h&VjVa|lD>;Xb!4 z$il8Pj zHR?9eQU~(xC$X*0ocsvNZ9cF7_y)j-+22*W)7py86F?jAq&~0_v>n(4Y}RG$G&hkH zQ*&&^F7m|L&GX?o&JH{7#5^a1r2zO$qC)I9-p;|$NCJT3})67*8s&CE2 zN^w2aVdi*q2@lO3-N_zt|BiYj-0=%;DH{=pZ~uaes(XxsVre!kE(^ChFxC+~fpi?! zJd9L?jjDlkvr#E{nYz{P*(EgLon!kxICH8muX6YPrTr5RvzvqI%zh6H{69|7n3mOj`0$u=K z0(h?%L4O2{0e&puI<|s&8TbkCi>}IP8-EGrRp2DRE4cN5KLz|YOvdup(ElB98h9Oe z19%hY17;9Vd%OZ&|pcn^a2fe(N`1AhT70v`gGfWHDC z;cM0+uFkWFqm!qqB}+?WwcXktrL@~9N15)VRDaKAN+3h+nl%l3N-0_Swu6!_-+8d_ zeA$^Z(^?9*&9ndXz^{~D4q9`(@U(0y$DXX7>p}#I^i(SD^sKj=WAw4mxbX-Cfr+AZ zeVJAyd^d*1L}0zs{0IbmlMV{qk2zws&t~X@#%e|sqDreU4NX)Qq^n~~K8p8L+k`Cw zbzJRWss^gf5f2!4^wSD2V|0oP+t$dQR9Hx0<5Eg@LtB zVK3^qU79=1d>!yNIkb(DGqr`(n@<>JPx}VS6_2~if*I+KBO$k)(k|OT+X69nOTKVF zi3I0IM0(gBv`}2%;y2_&B#ydXH1K60YPKFa-jQh#nb}$9hcFU)NCa(v$|-(RWEFvI zY{#ZN9JZZs-=&qMc`xcldoqJ~Uy(hXNzrk+k~FV$zHPf0?_DddSsTRp&YYB~(sF5? zv_@){nxxgz^WLO;w&RVater+lYWXvLk!p=NG}d!@oJvOrA`fO1jUP~@yTRT zOKzYV`_GfuHDDDzpQT3CNVPD&QTZ@|#_y&`f22&GlF}!0=~}2KN}1rI6k#p1__Gc4 zKKbP|>L;I(WM2kg0ww?!Ae#)n1kijS39ynuDSe8P{7ETvg?woc@sdI^9B%&_=9ZGY zCx<4|C4W{9{evjrx8%}$5%G<%s9tj6U>iW|B$r~e(h~n7EBPXnW5whU?UPLYg%$Kt zT#6#v;omuzj1<{6yQ#TR!K~B1rIa$#UEk!YS-z^a*}bOLRo9@@7E>N=S1|V- z(~4Sm?fUw<$21`?ITNEzYG_(n?+VV`s_ZPH-k8sAVAPcC;9dS?YI3=2>s@ut%BD)X zKWLsIMzUkHh&;YFoZ;DGDqxqDh4ZLzg0^;yldZ8e)YrM(wpF$6sms@8F1FXLt6%B* z<~HS68MzdAo)9xA+^AT~s8Q*yA_x97*q_zxQkFW&uFQFYey+?aqbB9iY8s)mK1#Oa zyR~x+{>%i)1MEQ;Z}lZV4(glTnmI6{mDRY6L6PriGDgA7L3#AxRApKbrOVq)qypXL5m3 zPz3+^A7rpyJIViDVgcR%TSJ^5r@3CvArJZ4IGikIXx@GE~OL6{P+sCYbRAO;{kgxf&Fi8pejn~(8rnZbMHZbbLo~$<0KwEN;61L zp->XSg^t1WF`I`M52fr-6j@)W@nP`++J~!?)RZv2c2rOmDhO(|@M&2)!aTg#6cP`e zUp{|9LTxgbB7kN5wc<7h7l>P$E44_=r2pmJ=IbC?xpsg$M0aJ9e{UzPiuD~OqwhIN F`8V)6XD|Q& delta 4557 zcmdUze^6A{702IsEI-5rc40+}$PXoCC2AHi3E~fypA&xqN>mgT{E?~wLv%?DYIs1} zV5E+4Q!bN96j!@yVikF*YcmsF#ZGNUjb_@^{?Tc}v@`9*NlgYbQ=@LbhuxJWGqsaU zCboCy^Uk^F+;`u7_uO}XtkxB--3Z%jOH~zrGAT+PR0Fu@^?KPF0;ZlU`-;dQQq|<> zs?`ITpl%ae&L@L%t0nK{7}I+(`DNLH+==0kmHk30?ZF-Q- z{!HX2wwEoQzYIzRXz&-Pgj@+$`}0+h)nKhZzYcPPU+0QAZSv>EkrwNumymf8Yy&TY z?SNap1M(HH6Vw9@h&xoupJ6gn;w9J+Lr4+>qQ!eQaq@r%Yl20}L;I){!c2&8!A0|PDs`nL+*usYjU z6@TY(Ec_;M90Z5J&wvXY21meA@D6wv zaAm>tz;+V!0$r4i6zz3~ED!C;9npnGG(?%?j|R^zbX?R&FOKkk$b-`j{aoCNUKm9@ z8I%SWJtpd7u0#zE4xZV#7r6@IFqMdckW4Y)lLsAUqDi7Y7Il=N+@j#J1FKr%NZ~DMEW0=#bcC;26xlj2^AL`pyf8VyE-{!%yV3>CotaD+R zA7mZb#X)8iMOJU2mEtcSne>_sZ;&%X?TyT)#u7M7K^a&C7K3u|3|In|f@PorEC(w< zC0Geofz_Z2RD(5OEm#NEgJ;1H!3MAqYy!`L8c+*1lai`D52X&g0Jeawzya#Pi$Gj2 zv;P0IR8H+BP1kH%ct=%V6!H4UGjt$^`aqSDdUGzS;$rJ0F)$M$W7nLZBEm7Nt+5G) zX3zp&^E5fkZII@8coNzP*0g;gnbzhM1MjrNu~$zU*}Wp* zscYHWVJi6V%kbbz*HCEWO=J<^SM)8mGs`1}ts?(%N^&|3y_@<}(YHh}Jg?zK|>vp1i zk+(Z{a6^O@M=4rRTrMtMnI^Q|cIWA^-j3O%&pvnFAWE;F(Yw3yM>~7MoPSs05^E0B zh|+)9^*v|G$>|9b{b!T(q?`S8uwNQP|F4ro(m;m(^rh1zJiG0pw#TAdzPv#lw-dyh z*V1+SZH=5CsUr2uS>oh*PL5H@8qO_3lF6}@EL{M|v!DUcBL)Cha?Ewo!2? z>y<4yR@EtWuJNRviYGfo7<^4s z|C~(b&LpzSo^`a1kFcC-38!L<{CyHVX5s@R!--#Bn3mf*lPT5wiQ}HLzRHe-@himPcrr?{FAtgxzdTT& zOvkl&@K>N@$(@-rF*FiY=E>X{^pq@XCX3W&kS1-5s9hGlM9+(B(-LIvUW%6~O;js) zw2;}bcB@81S@}#m6}jtYQo7F=y`XyI=7O4y>o+^5tlio$Sa8IBn{4W$$#P~VhS~=e z6e<6dPos?-_N_`Ks8-}BoxVq3cCRWSr$LAt{W2<6rMARZLxd`0TIfyJ4l+2cBs~=vGN^L@ z{hRpUA^&`lW`!^NkUK~bnU75G$hL|_X=8MIb}UIl0hz?j{CJ#Id1}3(xVkZ{FPx+d bcgBzD<51aOP5a#YoU|s&b&BF$JrwqD{mnk| diff --git a/ErgometerApplication/ErgometerApplication/ChartPanel.cs b/ErgometerApplication/ErgometerApplication/ChartPanel.cs index fde0ab9..423df00 100644 --- a/ErgometerApplication/ErgometerApplication/ChartPanel.cs +++ b/ErgometerApplication/ErgometerApplication/ChartPanel.cs @@ -6,19 +6,22 @@ using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using System.Windows.Forms.DataVisualization.Charting; + namespace ErgometerApplication { - public class ChartPanel:Panel + public class ChartPanel : Panel { private Chart chart; private MetingType type; private ChartArea chartArea; private Series series; + private SeriesChartType ChartType; - public ChartPanel(MetingType type) : base() + public ChartPanel(MetingType type, SeriesChartType charttype) : base() { this.type = type; - + this.ChartType = charttype; + this.chart = new Chart(); this.chartArea = new ChartArea(); this.chart.Titles.Add(new Title(type.ToString())); @@ -32,7 +35,7 @@ namespace ErgometerApplication this.chartArea.Name = "chartArea"; this.chart.Size = new System.Drawing.Size(250, 200); - + this.chart.Dock = DockStyle.Fill; this.chart.Series.Add(series); this.chart.Text = "chart"; @@ -56,7 +59,7 @@ namespace ErgometerApplication { Series serie = new Series(); serie.Name = "series"; - serie.ChartType = SeriesChartType.Line; + serie.ChartType = ChartType; serie.ChartArea = "chartArea"; serie.BorderWidth = 3; return serie; @@ -64,7 +67,7 @@ namespace ErgometerApplication public int getMetingType(Meting meting) { - switch(type) + switch (type) { case MetingType.HEARTBEAT: return meting.HeartBeat; @@ -83,7 +86,7 @@ namespace ErgometerApplication case MetingType.ACTUALPOWER: return meting.ActualPower; default: - return 0; + return 0; } } @@ -96,7 +99,7 @@ namespace ErgometerApplication POWER, ENERGY, SECONDS, - ACTUALPOWER + ACTUALPOWER } } } diff --git a/ErgometerApplication/ErgometerApplication/ClientApplicatie.Designer.cs b/ErgometerApplication/ErgometerApplication/ClientApplicatie.Designer.cs index 040f542..43f68a1 100644 --- a/ErgometerApplication/ErgometerApplication/ClientApplicatie.Designer.cs +++ b/ErgometerApplication/ErgometerApplication/ClientApplicatie.Designer.cs @@ -57,7 +57,7 @@ namespace ErgometerApplication // // updateTimer // - this.updateTimer.Interval = 800; + this.updateTimer.Interval = 600; this.updateTimer.Tick += new System.EventHandler(this.updateTimer_Tick); // // panelClientContainer diff --git a/ErgometerApplication/ErgometerApplication/ClientApplicatie.cs b/ErgometerApplication/ErgometerApplication/ClientApplicatie.cs index 45d65bf..7b87357 100644 --- a/ErgometerApplication/ErgometerApplication/ClientApplicatie.cs +++ b/ErgometerApplication/ErgometerApplication/ClientApplicatie.cs @@ -32,10 +32,8 @@ namespace ErgometerApplication private void updateTimer_Tick(object sender, EventArgs e) { - Console.WriteLine("Trying to send data...."); if(MainClient.Doctor.Connected) { - Console.WriteLine("Sending data"); MainClient.ComPort.Write("ST"); string response = MainClient.ComPort.Read(); Meting m = MainClient.SaveMeting(response); diff --git a/ErgometerApplication/ErgometerApplication/MainClient.cs b/ErgometerApplication/ErgometerApplication/MainClient.cs index 26506af..3f9806f 100644 --- a/ErgometerApplication/ErgometerApplication/MainClient.cs +++ b/ErgometerApplication/ErgometerApplication/MainClient.cs @@ -13,7 +13,7 @@ namespace ErgometerApplication { public static ComPort ComPort { get; } - public static TcpClient Doctor { get; } + public static TcpClient Doctor { get; set; } public static List Metingen { get; } public static List Chat { get; } @@ -37,8 +37,6 @@ namespace ErgometerApplication Metingen = new List(); Chat = new List(); - t = new Thread(run); - Name = "Unknown"; Session = 0; Loggedin = false; @@ -53,16 +51,21 @@ namespace ErgometerApplication { error = "Succes"; - if (!Doctor.Connected) + if (Doctor == null || !Doctor.Connected) { - try { + if (Doctor == null) + Doctor = new TcpClient(); + + try + { Doctor.Connect(HOST, PORT); } catch (Exception e) { - error = "De server is niet online."; + error = "Server is niet online."; return false; } + Name = name; NetCommand net = NetHelper.ReadNetCommand(Doctor); @@ -72,6 +75,8 @@ namespace ErgometerApplication throw new Exception("Session not assigned"); running = true; + + t = new Thread(run); t.IsBackground = true; t.Start(); } @@ -105,7 +110,6 @@ namespace ErgometerApplication ComPort.Write("ST"); string response = ComPort.Read(); - Console.WriteLine(response); SaveMeting(response); } @@ -136,6 +140,8 @@ namespace ErgometerApplication NetHelper.SendNetCommand(Doctor, new NetCommand(NetCommand.CommandType.LOGOUT, Session)); Loggedin = false; running = false; + Doctor.Close(); + Doctor = null; } } @@ -183,6 +189,9 @@ namespace ErgometerApplication case NetCommand.CommandType.SESSION: Session = command.Session; break; + case NetCommand.CommandType.ERROR: + Console.WriteLine("An error occured, ignoring"); + break; default: throw new FormatException("Error in Netcommand: Received command not recognized"); } diff --git a/ErgometerApplication/ErgometerApplication/PanelClientDataView.cs b/ErgometerApplication/ErgometerApplication/PanelClientDataView.cs index fe3d405..4c27172 100644 --- a/ErgometerApplication/ErgometerApplication/PanelClientDataView.cs +++ b/ErgometerApplication/ErgometerApplication/PanelClientDataView.cs @@ -5,10 +5,11 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; +using System.Windows.Forms.DataVisualization.Charting; namespace ErgometerApplication { - public class PanelGraphView:Panel + public class PanelGraphView : Panel { private List charts; @@ -16,7 +17,7 @@ namespace ErgometerApplication public PanelGraphView() : base() { - createCharts(); + createCharts(); flowlayout = new FlowLayoutPanel(); @@ -26,22 +27,13 @@ namespace ErgometerApplication flowlayout.Name = "flowlayout"; flowlayout.Padding = new Padding(15); flowlayout.AutoScroll = true; - foreach(ChartPanel chart in charts) + foreach (ChartPanel chart in charts) { flowlayout.Controls.Add(chart); } List metingen = new List(); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); - metingen.Add(new Meting(23, 25, 12, 46, 13, 25, 13, 1, 32)); + metingen.Add(new Meting(0, 0, 0, 0, 0, 0, 0, 0, 0)); updateAllCharts(metingen); // @@ -59,19 +51,18 @@ namespace ErgometerApplication public void createCharts() { charts = new List(); - charts.Add(new ChartPanel(ChartPanel.MetingType.HEARTBEAT)); - charts.Add(new ChartPanel(ChartPanel.MetingType.RPM)); - charts.Add(new ChartPanel(ChartPanel.MetingType.SPEED)); - charts.Add(new ChartPanel(ChartPanel.MetingType.DISTANCE)); - charts.Add(new ChartPanel(ChartPanel.MetingType.ENERGY)); - charts.Add(new ChartPanel(ChartPanel.MetingType.SECONDS)); - charts.Add(new ChartPanel(ChartPanel.MetingType.POWER)); - charts.Add(new ChartPanel(ChartPanel.MetingType.ACTUALPOWER)); + charts.Add(new ChartPanel(ChartPanel.MetingType.HEARTBEAT, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.RPM, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.SPEED, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.DISTANCE, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.ENERGY, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.POWER, SeriesChartType.Line)); + charts.Add(new ChartPanel(ChartPanel.MetingType.ACTUALPOWER, SeriesChartType.Line)); } public void updateAllCharts(List metingen) { - foreach(ChartPanel chart in charts) + foreach (ChartPanel chart in charts) { chart.updateChart(metingen); } diff --git a/ErgometerApplication/ErgometerApplication/bin/Debug/ErgometerLibrary.dll b/ErgometerApplication/ErgometerApplication/bin/Debug/ErgometerLibrary.dll index eacc8eb1987d1907a2a910f9e11836c8d865ad37..8ef32a70817857d7fd2b3666ccdbc1b6d1107db2 100644 GIT binary patch delta 7226 zcmZ`;3wRV&mOi(tx~jUW-<|HH(+TM&ozS5>fe^w&0t5|0P%tDW5CkT{2jHurvuJ=1 zyL)s{2cu^044^E-%h?Zf9f8QIJL;01@i9JDWgQnsL0DhlV|=a)eu{hUt(!KuyUo{s zo&P`Qo_p`9dvA4x?DHi1Jh}G{>8e@%zZ^lP_3v9iKB0t+vQ4@fpoB)HB<&=lNE6MG zOeoR|{4*O-0vkNu0Fb=^fKczEiL^z^kg9=Kr9a7;@K_tHCx9W~1*x#F24gCMkw0L& z?Wr;V!w8z72JeqY&^F@(a6El?^+?%zLVbW=1#Ir;`|c%03DU@xFcf@Ittip+r?$I+Q0hTDl@nu#37p znUt74Z0_Uu+=tK9QpOCchNYDLICXcAC7J1&m=Ir@)RM7Zw>?Rb9#)5iQ;sJ8BnbiPyg8*&1zsa26=Fy2v*axG*~6a ztLPL*We7KeVaRu{44osvbHt%1&GaSc?y02f9H%whX~yn&l3wdTLSWF7n1rPj%t4Xy4`id){RpFv!?LT(S$2L>lP3K4Vxtm7**t{Z~eg?bV zT~Q*%<5+9H?pf=v+>=~MHqL~ZZr6DgCwpp^;rU@~@B=8)dWLce_lW@(8Ic&rp+2h~q)1vh8kELcE#TcnUDDsU@2%rHGvoh6D5-JT(lby)cCbi2?TXV>r7M zo-fRPC2zxVQ%`Dos*yR~2E1i_=SwgZ5-Y$2prd_(aWl|s^jwH&YQe}4Km3qMU4+Du z@Pih?CfQ*cs6Hv)L|6L~89vZLekfK1rFbh2cz66_Y#5)#5@O$KQd33WKgPA4ABV>^ zPEXVRSKQ_2$2rcQixjVC9m=d`M%<3(U2MtlV~*9%fb>Z$1NX!YbjRngz)NV0|I$Ls zZ@0rLDb9v7=-qJydJu$p?(h*B=C`Vyr5idVmW*0n7~LBMhDoFvNez- z4Kx#IC5`k*U|f(b00UIM08C9vEkvH0MvH@yY5e|cJ~_UaX`BJxt|iE-U&B#J=YseM z9U7IET8a+H-=~4zV3y!!J6l+dII5`3%__RPBE%=jwp086q1{@BmST~7pR(_|L{4*>Bzjx=$-Av}sFSfPw(O3RNrYA$eilH8s|HLUe zUdel)CB+S-hISU$8Mvqo6Cd+RzXf1FJut!_)iKfMIHvOUHaLSP8vAKb zKC8VM*COcS0eb2CBSwYhB6HyvPX@RNziIqt@H>K5lpT^B4*Et}(tk5-bh0vxf$NA0 zdmK+eh6W<-bX8=bqQa9l`fQ|<`01yShcnxu4Ay`|0M@7gOCSn2bGC=G8o_d$jTh{0 z&L#`Cm9uHcqEINUm!q%(k-#$f7Q|C>4sipwo8{Zk-X`6SctF~O_+m!72QL#8idZXe zLHt2t&2Hf-tj6yWmToLpLh?4W|5IX#nms$@TG%SDN1V&OVTI|B5r!`jmgjqpkMfQ$ z<6ep5i>O3#h#3}?HTEF(A*yN&8+T+Mf!h(6a0J5aAjd;ov2pulZm;6#;>vB@?%;S7 zaVXojKrzE{jvsNH$FT!wCLgp3Het|Ojz>A}K^#hP9o&Q7BOFT!vzMVg#|^xpDdW-rcuwQ&5_Sw$pRE7(KM0KO9Z++s!j z&WB|g_H*_uoUl7_alOacX8m2yqp}J`QNYh;s8SzC)*{$Q+f%Xze~+D8s4vS7cw4Y{)Fa5=7wiN5sO*GK z1^Zk-hU^=`Iy~>nE;uLHGS4Yw8oqh30!=smCcD8c*c{_4dO8+P?3F!GCA9y>qIscK zFirK~YtRLPVcqDMiZF4~ODe*XoumM+5}t)N4-~)+f~m$?IRI+}^BU)n-6ELH?x#B{ zsxpdF1n*fI*2h%B;49~2MCMaUp*hcrl?dFNXHjJ&Y|pc}5`!1>Y>ZL~I=)2VOfgHn z5{J4xo2n$BJ3Z53@XOpg9A*f^H;EG6(i@wprirpvWE(?Dsat9=8~bv2`hP;L@=y>1Nn!UWIJ0 zV81k1Alr#QVVN&t-l$v(M+NhnYn6FWfWK&&@1I<^Dwjc~OVCyBJCL5@tRG%>P-Q+i z@X5exvBO4{Rv0f>jY*X@SS;8&H&rf&+c?_{&$zZK?cl*D2H2G3jpd_(vA8yAg}=Jg55*r!b0#0b|2X* zFN9*jjwy4Y6GjU5k+N6rgoI%APQSDW>gw6!jO|A!fkn_DoL_nT(iPAo*f|e@D`2i* zZ(+m5&@R}A*lsZ_6|5P3OW+#8I?=ZTQi4r#%!Q@UYcbpv4=GFG?Rx$=wHDNJSb;C~ zY?&-qoMbs%if{X@hy~i?3i|TwX=Mfc3SS|ZFRMJGTni5f_80rVDc8dp!B#78C^te0 z{$gj5FW8SODd-jKIe1@L#cxaqJH*kbuo@oVPR2e_R>Q)9H>=8IGM}DJmS^UZYWGs; zCJnF>@g`RaR+2y1*C0MOYe|9j4`{D29zy)ez8|sLeF$=- z-|6A@lW?c7YrRKMnaZ)tJO%yO_6+3skmiDgamQT z6Y>J~6@yI~QYghBf~zuyDaK1lOfg#;4~AZApEN;ldA zh?`umNmbG&@*h&I)bBhlMWuQ6_YhCwO__`e!I<^-k5TC{zLc6#Ig56oN0qxp{C?9Z zN2R5_)l80m^mwpUyZN!SQtBiH=w0J1#mDv?FdgwOXv*N_UT8-AHOxcY3T=pg4+{}@ z!V<&>@aL5ddto`^Kf?8h`(ZWWqi_@AlRVL3XhQo>JkRqy&r3Yd>)d;kd*9~X6Wn`> z>z|;W(cyFM_?kPu;|?G!okG~Kbi#(^AZ>C4)?Ed>`K&E85 zofF8Eo!s6fkST|`Jt&YVC%JtRm`wr5b1BHYIHlwl>6nAFIn83LKo#qBJ|oIs}U=UDJ-2dfU6*t4B8g!rzuYc_0h1O2?MBD30u|7<{9r7lE_lJQRg zHhf!mF?6|H3J~J5Yf?$Tw}$vike0Yq%QiI?JJYe>Qr*;KSHQcL_;jCcxph4PO!0$i zIg|*VjUmkl_%>i--_^csPS5Brmo8ZfHe(JvT6HZVVLLxQ)D(f@$-dvS8S8cPxE7-;F&DH84dvo~(mvPj6tT5IE zr!bIO&`*+A&8p~ND^tSnR{UOmGk!Y(THBi1uC-0vHgQVBtlh7UEuVN`^>mu-yvk1O{?;ZnP8#qo`iA@u!B!;W delta 7232 zcmZ`-33wD`n*RQ(>Zk*L))YIFq|Qmnz=nuMzktE96X@-l$Z}vI9>oMVq9feiE0G!z`w&iS_n^f z5#Xoly(_aiww9t6cUHhwRvIF^&z9Ap`fS@DCZ8>!B2|09=CdL2yb{oSTKO?8p!;-l zrdF4<*WQJO>GtR(A~j$y+W>Q7+DyQ#OPkB}D7wr2iy)3qn{#1e0Ju60=Ge430cLI5 ztb%!E+AM}SCT-@3j%fFcM2iy{y}UEUgPrl&M-Z7YJ;F-NnfjH<65c~OwB4yCb}~dp z!OO>JiQR)_yp}jLNb0r3?*>VumN+&@n#<;gvE+b^HQb4RW>qw zspKll%f4K3CVoUk-9=`Vy`=H~Yw{s!p#9ZD8&;_$J{`jEbl5`7=q)3h>j$Y`XMyo+7;cBdt0q7iA) z)At<3wL^O9wGC<0ut8F+C29sqftHvlh*{~ZLFcY_PRult(GlhXS8*7N$KjCgT^T;lLg$%Fk2w=p!`)qC zZg-v1V(>m3EjKs2>sh(^rh7b4^Na$H^W?B%v(0mri^s$(tiZ=SQ`EFze&q>jn01Vo zcY5cb%p&iUOQZLArwqSXyeKE}GOB*KC|BasRTUGRmkt=U9!xxkqs*CT)x{`w7!^y< zb;pJPks__cx}%t)P29!~z`af_HYKfO z@$JFkBE1_shQn>ojAIjVkUjAndKa%x+wTn8^s!TqX?nbYJ3b;TbYceIOzWs@1v#~6-X9b5tXbzSD6Tuj(Gam}hWew)p;HVIv0659S1aN9nyd69~$s8Ao zOcc*w^UKkNToa7&xE6txA4aRB^C8>CR%!9YaM0j$+SeCKF)X%lRylB5)-W$0(T9t| zqLX|%t@#_;BO>~+zzYJ)!@T^0@F*>7ku<`m^}|F8-3eRk_GYY#Z6%tdN04_lp6T*zlabQNmhD=bhc5f&w7i}lH%yMBYGX6dj-I$ z#nCB;E3p;%^db3lcbT3j#hi4P5zckXpKtLLHV>+utx+dw^)y0)fT%~uv&}t304P|Pnl9&&ZiYXMoZ)b@K5p@ z;09qg$+yA&rL-RSl#~R%nUwCpZH%%BSS4=(UXXaP+eM0W;Xg8-u2Lvr`99d6NIX%K zVaiq1C&z&^g*Qjx`g4rqTa4%VQQ&Vy#j}K068I*Rd^9o1gHnzMfm?y9T8P4Jso&6g z;39#uj7hZ4VvoCnIIez{W?8-NU9wDj1$%{#+YL;ulY(v2|7iS5Rw)aMm1rB4 zs!xE;w%BmnQ?f?4TFefnQ=ecPkyAC773O$%$aZ=8kTe6$JwAk1BVX(hgtj+kn?4k1(TVi|!rVZz9-l$J< zd?I_vYq4g>XJ%8VQwkP8Edc%y3X>n z+YHK}n=Pg~zLbNs#$rClS+LtJX0sdSABswo-^p2YGOb~JF336LFA#0yqow3g(;)LG z5n4OQg355(ImmLALV9zM6)44|;{_8vMV3+}O4Wm`N-3k(K~|eoD(L5eZlesXUKvHM zVqUP9rn9L^HBGTtt7EECLs@u9<-S{tsmhh~lEuDtO;yGcY7xG3`c!2+?YGz$>QtqU zW?-M>GD>y)o8A*co{wUE}1e(qfI8K}|_&x9CP@ux7eTuxG zEcT?0v%WN=k+ykCGsP--(rwh|YzMo`Vw;@{!BTj!<-Uk>i86!sTP)zbS-FP3wb-+s zwaP3?*5kF8hpzJeJ?LwK_0rp}P0Ael!eS5EHYsx{14jfOnF{A7rG+L~?5EyM$~?MG zux<3R=N_e%zP8vqo(I5&tUhX^9XME!CF?==Jf)3ZO$xeEAMG`yHhRZmlf4X~M=WNN zAze$yE%r-dbS<5-*nMm!wbL1k{eta~+v%Lejwv&7$Vhlw=S%K$Wry5BPK(vJ4QW0F zYWPXU*Q1-!e9E<)-x!9pfC?>k-e9zV$}M&j1s76{#Xdv1g*4G(P4F$EsTS*iZxPM1 zSgmU&EvEJ~!>V{lSxhg~h?6uup_bEhd`0kSvRpCPa*E+QpFfxk?Fj|GLH4w=f)e;S zfcsL)0p$j|(_$ak|5dq(-nH0jP6YV zQjgg9o0164U?|`=*a70LJwTshr#nDDco^_%-xbj9-XdVO#+BJl9@C8Vc7SA!+l|;k z56}eFV7pnd_ph{@<@>H;2ZViq&2~1k*O9pe*oX`q4SJo~QFb>=F83^DhegGQ>1ksn zTgUi;beQe&#Mue9K;4W)CEES$6q}`PgZ-AVoj2Fp&(5$1Fmh+uW8S^krtfecWw~TC zP6MAbVxnxn!2MJx@_#QH@jZnw=f9^nP)i|gNwN&7kRq6sg-B5)#gL*=8cnB>Xf%DQ zcR=CkUZ*mLN~c(rW3j}mzd>riFm9H7=yQzu*b&Dzse^@VD=Ca&-yzv0J}P#Jm&zB4 zPvRp~%6!@(sS1ipV}VJP!qP4FAaIN44JlvR!rqlirC#^%rLc63{TT2B9!C`vhM4vC zlTf-Hr=xN!_s0=s!`y-83szVI!{VnXr3G1HSQ3O?YpQJcn{Sj zal4-;1Ak7_fPFLrxP#^Z`>751C@lc~iaLQ$&@$j&x&gRfq_72UJ@Bz6B*tW z-uH#~i12F)ta)j1H&$sXnTB=syvpd&T zK>;cP=Fk*i0nG%K(NbVFJq{dCPXVtI`qlIb>=vOf5V({+wpAqQM$(b4n}TY+sGz|@ zUQMU4yDa2NO4vOXa;0C`yDa3&L17=VkSiyIeS)~n81D>Y+|Fl7(KA6Bgrh;&UBd1X zc8{=oguP4HyM%pE*oQ3S>5dEggoRwe&oR6*3%L>zcD{voBq7xc(qJJE>J)ZLV2_1d z?-%wi3%PPo*oQ3S%5hTKgy}(X^DS`b0lLy7^xIl7?0%@ce&7q~Vm0qELr=#=8;d^f6iW!13b5v{g;su1~A zj?J#mfxmJ8S-~OsnQ<26dLi{Y{{s8h>N(&U^#X9LU9l1M8Ft`&hX**u&I>z5B9Vfg zQFzjuMFm0p20#?H^E|(GWx;;h#&N2bD-RLJos4Jrv%)cFshdlZkK<`!FA|70?u(CZ zWX@;U`|KpMOLfv5^TnEiWS+c)@uL>;gMWGQX?*@)uJ!S6>&xO^!B;L}NG|>r%OMwM zL-UQ4b45M}R3|PME;lX@DH@*01~g#b^<$3a_?_LfjBcS@DMI-95cX2DZtiO1xo=+n zYS!t_rUT<5wZ$V_&zcA4Ud48sO3Mhg#~j&mMXpzKzsl@!L4?Q|b{+m6%)CpUJF@Kj`v*mgGE6u!lMai4}__q=BB*VArYj}TV^q^2E8 z1lw$u<_P-NA*a8~zd_eM9$gAf6aq?d9hN#fhtlD z@X!Y^K$6FRAg>rf=c&EzcFPF^|jFQ{?L@wWY)J)2?#eOR}%0 z3S*NNs?3wEbItK>CF&wY^`~~4E85ye3WqY;mTTztAl86%aoRn z{_*JS@cx44`xiG%{O{(?UFM38JN-uxFz|Pl+mYV*dnAtgh!amQ!b2dq- N-RE2K73;0k{udR&AHe_s