From 4d19c170d790260efb4e4af2e0a03994efb6081d Mon Sep 17 00:00:00 2001 From: Mark Liversedge Date: Sat, 17 Dec 2016 13:40:35 +0000 Subject: [PATCH] Training Planning Development Starts .. added coaching notes .. added new planning widget to trends view (for now) .. no functionality, just kicking off the next 2 weeks of coding. --- doc/design/Training Themes v1.1.odt | Bin 0 -> 27375 bytes src/Gui/GcWindowRegistry.cpp | 5 +- src/Gui/GcWindowRegistry.h | 3 +- src/Planning/PlanningWindow.cpp | 109 ++++++++++++++++++++++++++++ src/Planning/PlanningWindow.h | 62 ++++++++++++++++ src/gcconfig.pri.in | 2 - src/src.pro | 8 +- 7 files changed, 184 insertions(+), 5 deletions(-) create mode 100644 doc/design/Training Themes v1.1.odt create mode 100644 src/Planning/PlanningWindow.cpp create mode 100644 src/Planning/PlanningWindow.h diff --git a/doc/design/Training Themes v1.1.odt b/doc/design/Training Themes v1.1.odt new file mode 100644 index 0000000000000000000000000000000000000000..732255903e341119a736bcb7238025a09fc50659 GIT binary patch literal 27375 zcmZ^}Q?M>Pu&(b*3`w*!PL;f!N$_q(8bc;j={~&gx=oJ z+0vQb-oez)#NOD|*3{00-o@0zMdANf4DV2&d4>)E_#emoub7I3tF4ipp{0#8gUkPh z^bU6BkqUC+aM0M$|4o6Dln_z+Pg?;1AOIxDf6>tQ_&ERo{H-9PB5I?f?Wm_@ZDwI@ z=WOfj>1t#3pSU~OdboMnd4+iSg|S3$+6P8>2S@lN6e^_eXy@#x<^R(yIxx=NvCP{x zF5I;)+I1@1b*tF(uG}*&`Da>jXjQszU3Fw%e`ecw=2W`xTy@}6bKu%=;?i{H)qL#T za^}}_9p+*Z;_Vvj7aSGhl@#I;86FuClN6T_8Km6R9xFtQ{Gfn+f-54S=&%s-PGP(Q{GtD*xpp#+}zyM z+S%IK*3#MC+1lLI_MfzLcX#Jk4}{e0hcq7rcV9#{AH{T>ME9I0wj3mPpCt93Wwjq= z^&DsRo)y*&RJD!P^endb3^(*G7WW-j^q=$&^o9)HL=WA>j@>5>UStoQW)ELvPu(U@ z-epbS<+|$0+U%%MfJlHq% zcc6BBsAqM&b9cV)V7lXYp=bENHaa;nIXXHyJvllwF*fm^Oixcw{9XFH@ONf$b#Z2V zes=ypSzB8hSw0wAxgKA?onASZT)F`)_0K zc4_B+V}EP(-^=LH+w{Tn%*or##mCma)5XK5h5v%1hwby{t;@IV`_I$$iNl?>yRGs4 zz5T2G*|USK`~Atsv#rm&-NVDfgX8nli<6_XtMlW7v(vN7^W)2_tHY!FqszyG>$l6B zhqIfv>${tiyXV8l&+GfAtEcy?x39a?{l}}L`&KV7lgGR3_xqFgr^~Omo5#n; zhnM%)x0mPlulJY7x7Uxa_vfFVAIJv^V*r3UN>W5n#bfi@7r|v~)z!WKMt_w~x6jPF z-*Z;&lk+;=q-Z^}@eLPHCkV+ZNUWp@0*<*Tg3@i*;{u)Ye(98Rt>CQHUjAq6fZdY0 zu!)MoU;+^qiID4pAiM_I<$9en4>Q`iQWA~Wy0TP7$^;A+tM4(e3HMjtl*9HQGeLxx zcl-5j>9F^8$NT=r2cQ=>4v|%n{eLwE_-7SYBE`y_8E!A;%lXK!V&!suj;4Ly>-ZA} z_|0X0uEUplg6Bapf43*`-|yjiUf}wjuN9DRcohU*k3Eoacp1D3+>9!p>kSY@z2>ht ze{P4T4Uj{KxEo%V{q=?LxZW=ah+l(?fk*AM&E@f*&te8#&W<9df{!a<9-PvueyC*> z0?iMK{JoxYm|r0NHrKVL&-z}!S3dncpK;;o_A8BtA#0j6T7K~Q-bWh!@2@B_g1tuL z(I$r5w~?mfm9@0Gj++-cp5LFt?A!I;r>^d+c(m#K&Yur?TJ5&u*-Jl?ihS)Zn|I&t zwC_W^xAEWm-2QIgja-@^)1{NzwcDPbK%SrH*2^>-KOjAp=Q;Npjjp4YzpwRgZ@I7E z@A~x>_}h&KoBrDmGf}1PwmVJ7#spi9$8nc88z1wn`nn&X-tKh%&%RW#?fyUOo{!`F zjir^s|GVk_u@$Leg!1!jf;~rVDBAHX^MVe;_@mbzpZZtj`ORFDHjZ7;)I)uYTKT;UU6&DkFeuu+4 ze%8Z)7{K)w`7?NGe2_Fd@D}zKJ*uH2;pFzu z=&j8nvP$8Cra6c ze^;M)uJZgyre2OIw@zqY?`$=}a5ehZG(CGLlvKI z2+g)2w8dkOR?tVONfijoM@!f^V=Rfo+{ zR%e+Vc?Fae)3nJ(pQ%N4F%lc9Qta*}+IV&L64RL-#L`kWYM9~pohhm=#l+`WTa$^; zIn*#wHJ3*g%t~tLkzO~{LXga$@!on@EBxNV;bJ^a!Xs{*ncg6rlyS#D3Ux_=0r?=z zTl6oH1hg$?o1a`!Jgeh&q>aGUhL92o)B|T$^*+X+P@J!Z>ZWUNlE2)%zZvV1g8W$S zPJZx@PVpp%3CC(%VVl@z;v2@aqf8P3k6v6M#7mGuBh=AH*2XTZ<)f~pDFoh9Yo?z@ z9%>7Z7ZSQmu)1r_SQV2|MOaunDbnvYN;nGTPZUp)SX3MZGBZ@F#Tm*{PC}J0F6Ula zOdqbg-lfNP%2fEX$4`b8lw&AeMblCAg%YZ3u)ba$fM_pxtEwLlr4^LwCQ(f$rLMvr zh(!)JF`T>#2F7;?Ab`EFFBgRPnK?2Ai~SktNy<3^dMMCNbyYGDWKD zjh^>3HePPt;34ckTuS(PD=9g(Y+|)es?VraX2m80tgfy8He(@9mApDRn9cB)Cx%NE zaC0&O-FfX&ecXQ(GO4oFu(Fz$9pKVQXjyn!bl77vw?_+ZN^i`3fpDAsBjFqz&&lXmFw2X3u%j!v z1f@)n(ECDWcvRKaviUx^Y@MnkFCT=obmom8;b?OWO2i5b>$>;LC|uDw*d>>4hmA73xP@imF$Lr z0C#sx2yraB(@;q@GUcHVO}pJibwIl3&k`H=zZuLUBd1eIT}5}WOX9-1RIf@XxOyQD?=?R zz*3XDE}w@!;hzbS8%!%9kU%pdLU%zq@!%dNyQ1aie>xD44pDKgz4i)kv`;^;F%34V z-_eP$Du6=(8*go0ThTx%1Dli2a%sb3d+r~bRodt^y{6U5mw!3_X}4ynMs8uTS*+}9 zBdT4hPJ87)xGss?7yaaidj0M=BbgLwP^F7|+cPOED3ME(7>|i`%FF^H;Addhrj8GO z=$B@mUHRH5AXJywJz|{=5J!rcAEJa_KO6DgydMT#%1pkX~W zKjhenq9HQU#=9Lr5AAw;!qGAE?m;}2SBBL1b;7z-vDH+y6 z7ke2y;D!q~$?U5|49Z*H)#PGGH&TtAn+no7d529o+7^9iwbMgw)=jE+S`=bXE%;eQ zs}Q!j7+hlDpy!Ob@M#_?$0iy_5g!RyNG{CmT=%&%H9O2a8H}v+=U$Q^@a{I<^Ih)! zlA1@i1Irc0Lmh81m{c8z&?zDCy-bVj^0Fr&P)%q2h&fjzu2g2hvOow3e^HImY<9b_GZ{v9~E34h+ z_Zw&a^V2Kr3%mPR|GM{l*DHOa<993n=l(0nf1~$#lLuetrPMT=V7>P%`c+N;^XS2z zR{P$#!)LAi&ppNO*E|J(pZEKC{@&B+v^(9_yZbHL1%%%hW6c%k-8aadm&3Tc8}H{z z{uTc3=J)F@_ua%S9)izfV!iFpS^sb@4+8G`yYSmUFht+WOkB7-zrW2|Gf#i3^*D#S z@1ypuvgOy$uq>XFX|dXZ#FfZJ2o$w!29BK0mif=orR^s^#Hs!I?0}7NQoP>*p4e#F zLZPN6kA_O|7i_*lTBUC04dr>vc-wJdZclsin13-QVLgf-l6A zkzQv~@G1i|gTzTn;7!0JF+FgllLU=eVFMflWl%Tt-i=iu<6BwN)3j&uKlZ&AjPRq4! zyL5}RE~u3eEvmr`C*D~H9ZWGW9El!1esB)M!M}5lpm=gZynRdb;4ARS^g`P?2J|8< z_Kv)=wJrDy@T_D<&4@AZ?)(6pAlzKj;06YHCmbOrOuS+|V!oqzq^+|)KB|c+q{xxw zhHu48_%Tzl1t&MVgfbXfUn-y6SzX}qQF)fU)OI;%UU8UBpQoJ=Z+X+aIVQG3&*Sri z1E1i0pL&a&pRoH#mhG9D%BL-1XG2Gy!u1~M`E(AsRMuJbhY=m`N{GQ@(&BPbyDmis^6%@TQ8A5CFKVenCTiAyb};j;E}GPX~wGqhgLBGZ}N- z{fN6aC@JxShXQc}CXt=R<5XM5zg>X@FcexkWI_5zDtJj?oe~Msq2A&-~Y(c}%Si3Hi0@YPPmwq5zTrjb^ zsApFs_%cojq3Yy?@;)Ff{Lx3piw&mh54;oVZfEv4&VlXSU@{c*Oeuh z=)vls$_C*vdNn&p9cf2+T^0`*7_boEt=|jjOV{sXCT8NekP24%C$|%EaF+uj%lB|2 z+_A5xnfWpl2F*L$;pwQ8neV>Mg#(=OJ4sv@`66kaysQa{2~A3pc-ce^smf|-PDnKg zEepd!FAYWqIGsgY;?E=wk*M^TrKpPHI;C0udO?C3F;id~ij{=I-4J4!DFvB>H5a!Y zY9(h;q=K)~YH`#)RG)N3C$MA#W@lUkkFr6OzHHk#HBty6(QdK}%cVN=%q{Q6Iho|^ zgf#4oi^d=Kj0b8JVGu|QbO)! zC}4uGy8Q2(?%*yv*pyf&O^6wbPQZA~@H3D`+hYNjQeNxhbg59K7JHPTg?=jBw8dAN zIZQD)E&5cc6F$0BDAQ6OhZegzc`TN1lUao)XK}n7b_2TtE}I$n{@Fx@X-e#H@o|~& zj>wLPFVS-F%m8T1MVeiz(R@>k;dE9d{%Xybx5Z8n8;Tt6oU^j?Vg1I9Sc4G{Ti73C z&93X(j0QpNV#C-rY~yG;>o#sw>zJPv=HlQTxXrbx;2mLaGc)m;>)0=`T6Urqcxw={ zPstZ&BHAUC`7Vj&;($B7&_b*r(NRl|JvSNyL5cw;hBy@{UY-u{mJ)x0e6OdA@!LF* z>TN=nXpewtN#GQ4Rdg^t0>$z`ZBV-sJVH9fGSi&n%{=2n378L^%F%`JefW~`KvV%g zeb_-r4hLj-hP#4ZIiP}BIY?V=Fi-~MR&;ZolJzmaIQS7M7boEiRZ&L}nsvDtw8+u!3hy!oI@faYPS)S4#VIPbB3(?Xoh~_KoSi0z^Cm} z$4V`(rSwi_*9gZO*K?KOiPJ(pw%gko5>>8byF#1B5BkDgf)}Qa^j@x*2|a9zt%@&& z2+?*pzgapG)<97JI)pOzs)Qib)Eyw2Q|t(?LM1hFhdKc0f^R;~8^VeEbEgM;(a{knHenGxFUjeM z5azTMhDp8dSTa1!1tix5&)kRIB!`0;ptCK$1+I(}i1$)Q%w)9XxE(zRh*h?ul~(b3 z-)c)$*rExk_b${1D1+Q+Tn4@>y^;BXtKgh)m zdR`%t7qgyRQAu%Cj+u~2raFsS94(WAHrIqSdYd&-k?mlhtng)_H$QhP!eEJ2(N4Y} z3c8Z2+TE(91ZqiPh)4R!*3Il|n#v?VpbDRY>CT;x@-9y)^`QexG3mEAt7_6;CNR8M zgHUlP&t3Q`R>5?+s7_u^9VqaJ{mZ&M7nJGM0+S#NaE#!w9Hf+5P&HDEJ9@Rp8R#mZJ^R&y^7wg?f1iAF__PQC+TUhHI7p@a$ep+g9ec%IywW*toeg6 zRM%FG`qRk3q~W^%G|yDEn{cb2L%4=!w@zA>4;Uv?yBv~N>r4_cUX$w$yEn0UDWz|VzSy|=FN;x^Hhp5$%?HbtwP>hs)0pP9>!dp z#_5<;S(rA6mki@nMGY2PCz!a+cxr8umqTygZ?n=@OId=zW6=vlSjGa3Y-mK%jYCK$ z$|9pWTi35JOa~%MP$4NNu1=?@NQghCB)! z!mCI+&Lp6jeNl)xdxs8ig4oum&qNGEZnF#H1$3%P!^08w*gB%pM=PxJKn<+}Dhz?d zp_Xf}=;K62)F_QXjB<}isu7jk`YG=kxdv_HSll=$2E0>TV5tb^#X@s}l#-GaALAZr z>8~@QBDqJxRXynlSdrWe(29BCI3%KZC&#P_1Qd_=9aAHqR9Kbs+$nzave1T!5QfBTPW`gfS!Sa8q#73N@Z>@!1^)r}ve?`KR4T3=fRge-UGES8y{ zf|cQNEL7SQR+;5i?C5x16Dz!#kf8v$k#`m)u5(BR-Yb}J6^sUf?F4e&h#ZKyBA}dH zNB3#e$Ka5s(!ikL4&WUuOLAFt4&?9(fw!1i&Cp;S?fM6RbJ(SdIh_5?Zi#y`ilv|s zO;9nO3(mg*&}{lIkSFb6eziO4$%2qNQ8H5&@?qlxO@w4Z1Z#ZQ*N) zzFPxN1AfbcP6T3{k&*iaG5E%s@E{s#MTCObu^!}84$8gqz!-Bi#%27M6cfPEhdJqM zJl=?5qKo-Amyk68sH{L*%$8r{pL6MhOZ}YH z;xzCYQEtw1nvF$G8jina|J^e(1+OBfVO{gp6GDaVoP@6twTirh#!SbEV%JDZ6Wi&9 z`|Li>WS7-}FDl!|yYqi5RQ8OQA?kmTL-sbD?2i?W=NE*P!>h#0+x~n`tloZa6;>99 z6Y_ewTp-r;C~$dQ89dJuy%k>+RuaVSz2;)TtH$AbF>HN6yb8WGs#mZ18jd%`({}nk zx=M4~w#{G59-8ir=n#-7bo!`Mux%zD=+B8*Q*<|KjO6|DCFZ7TG{enpJ-f)9h^ezzVxhi zyl>aHJ?eG+%PSdtHxdW7^4bYsnfJ1>?2{g+#jg*!N}C@Al+QbtH(pzvOU>)U?BjF5 z$s?qY&x^%}Lo+Z8Q%XUP=Bi&#Z_R5zv64c3Y$}{cu@Zw{@`WgmiA4!V`c({-d#(1I z*Iih$&c!4-TLQ{QMMX?7N8U0o!jvW#SyxgPLXGsI#z!9AK#`(?V?9JB)k7Hma9@BO zdEbO}9xlG>lYItBT{-{8x{|hbWYdSbG_w3AT1fw*Q_AJ>({6;;CZhN3td8w($KT+) z4uDmn`@pr3P4EErWj)a;wdI-RVmvGFu^Zisu6? zvyXE5Bsoow`N6IEf+Z@E?zoj2m+G=hiw<4tz01z*snMpfkzBt^VJ!vN25WxYsrn;& z<0_-*60F;y(By&w9t1s~*@diFJ^I+k5!vc^yQQ#w&xlI2H)DxSdTqMRToZd$b;p7h zkik$zjH?`jRJz!bw_9EjjitFD?o!>`pTR*rk4blRt4=FSO=LXWI+Q_evKeM5Qh9a) zFeSZ^sr5)8U z9_E0F`JK(++xwc};H^K1@O5Ur4L4wZK~5flpk*5F6q4*?Tf>0R&leKH!EQu;(L}t2 zHh!o#ABwYa|%YS|4^K(u_I}8u~#tUa}FOJUlxT_=s`(JJ?+PMeLLij zYD#slw-Q4i$HrvZq29(Onfxv^`93=D(*{ijxw$kHg!nMlIQ+70fZzcQ?6@(n4z}K2 zi0F)Tl!Tq=6sH+B#hVHxQ=&|Jn}i#S?4ivIH-!kIxg5w7Qv=xRVeN&Oum-mDA>dtwWB-KZQBx!aT?Q7p#2-3B*Mgq`d|e#ejw=1EaE=!RpaLdK!`hnMQAN5|8&F| z00vg~6%d&T63%_Je;-h^GUzHAceiqmYJqpUv!acYk<=c>489!yNU{8pe-fo4J5put zj5AAGU6Gq#fLN7zm(yP8r>zcTy9D?P+CLz+jpOn@@%C7!0wzRMO_0;%Ka14A$-%xSk`5~rgawjo#b1kHp=5vG5^WQJ83RV`(9slVU zY{f&*2+-K~MR9fLZC{8%NdX~e{{9{Pygsovz<_0d40!QooQo7)^wI;-!!v(II^a5h zZ^v~2gmuDHr*oVe2=7GUOSLC=cHhvNeguush|m8ir4uO;~7ahb(k094mz)Zcu)U`u&U=5Qfy10xu%ic670N{FcB z)j{$FAbVMegGG zYJIAz^wrhM(L^Jkw#(S7QbCOzeQkBb=8mE9bQ1;$3Q(7Pmw8RR){0aZ;p!K^mm6r! z!-U%ua^qkeyrtL0BT(l&y(>|3V)czk5h^I%<*)zMK0@Ws@JnP^>jn|54#imA3R!QBS#QNr=;|Vos79G4@aO7LuGie;UxqS#x$2_29LU zrD*+cWa0rdroSj9^s!#jUvbgnO&6`wtFu!0;RBp8jX0*1+G}DYkwR)M>ntN}eNs=u)t6EC| zyFzOPt8$N=GRzpsP{&>+R8H$FGWAk`;|&rT;)y zQVZMeia;Hw>9jk1h7J ziT9iI{pkl%wWsY;Ql?k>IZBKsQqOjiKzUA$`}k*!_~-L42#h+!9R8pCD;Nr89wMLp zC%7E~-k04%KhHG^qOZv$4E&zo4Z7}skJ-P5Yd5(Fe;!6_5e7kc@^(II&Fz0F-Uiab z-SBtbCz#(J#NB+KkG#gl-G7FW-~9X9zoZHJ zFF&l^cKU(+jyLOld^Z;Dzfg4Ao{Q&fI-N(EEo%QGGsqaWAMgHq2fiffPX9Udj`-M* z6Ym4x>ni>jn7#cTCAk}{)!%zxx!=+M+P(4qH_PMx$K@78n;?)t`+k4c{C1}atgq+r z=QF?m_0xT~`*9!_;ri<s?JIO_b^BRCIb3J30wSM2R+y3_tuSkvwI*;fR1|4e zL(QRQtk%PbG6H>qytz4ZdcX%6xP-0) znmkC7@dfK)lSj(Q35RhVaGJMblw-ipuK$6%@Y#bMVXnf%!r&n*20REklthk56~4}x z1W-itn=>D2*0ACep^0}cB;wia*bZ!TAaKLM&9j6`fye%?bI8alFp`6JQ~=tR1#X8B zV8_jIL9$HvbyfWzXD{+)gW{npswohmL`Wd&Twg^U2p$0bpEWch!eIr(0pv~Yi&T4I zZFMs~u52(gnm~?CAT4a?>l5g`MRu@h8EK@YAvw^ILyTx=z5?26Fa0o;wQaUHXilo~d~-B*v5OIuH>Vb#Y6DelIn-ukCYzUW+FB4xqXW15 zQhVpvW!)xL^enB%ZWUoZ8~7RC7}T;e3@S^kp>?Oelz-of&t_5+EesG=D02jbp@u{& zR3hXK|8lF;5pt1Jh*{88!*w)RKM$$LqjQ9`$)htV9{QqQ9y+ni=E)?JK0;c7W+;6H zX)f$N^oX!yquhdFWqy~eO4yGWGT9%h@eT!-BSkR@PdWrS>!4bJ0795N>J{|m^NRx# zGrgD*2NSxW*+M%4aPN7!c$^U|n~Ld2OLHIwnRafJpUK}R->T|MGQ^82pxg3v4$g9qJCR)^AeOTmKZp z1i~ke^$G;6z>YO^hch5lByHAeHVuMCvl>H`AK2L*v$!vH7wFmb=XI5nbs96t z5ccyDOReVEu0qpZGueUn@-KDxtW>d37XIwOVReOgyFA#V**yLxYduakNc5+FSxTtT=TjD8*9=fz zGI*Rq^SHO?!~6@SB)&BC=pQd z!W2gw+^BfkXKVfFV2c4xMJUc#B)|S*(T-yr_^2lFG&;X8%M|w9ZtTWHN%S*XlsByf zGMb|#Ghttbl2v4(XriO;%BS3-tsGdzuBR;JrB)YrF0YEOtBgAz?#Qe?RUxLwW?_0S$FG0$d8CneaZ)0 zcjr=95w#aru^?TgP7~`Y1%ppL`(E;l-m*rz^RE3ewYp9G?s{`OuMRdxZMjmH0ox07 zm@x|ZpPZ&KUKB>nFfV=eQXA~MiL3|0&T^Z~`V{dCk5pXxYz3<97dmUsXBDeHN-mpB z9W$dV^Wlbw)9asI+=|#3c~M+4*H5 zuG&HX7w2m}`9>gm@!ajlj#5D7n|5lZ9t0p!Lb6{P0U*?WMj;d_Bn1poUlLjD38pzP zfAU{>rf+p&CMOH2Xq1XTgv2T-L_#TfeLb7VAis6g9uQ(=Dk)3;>0x?4NT9655q%e> zdiEd}l`lOq;z(gndlLwfgvQ|@Hx7euv?09W)n%6aO z_Ye=^+joJ3-S>(7;(v?=>{$ao?!@mn3q!~-nyqp%GpuXvy!#&YQS(Zm&L z%Tr`?jusyF-Q5>E-|Y_*-yiLa{5=b_i*ldC1yN~ZIK0>;<_UsVMa`|yROKFlP-rJ! z{vCJY2elSRKf0}${-=L#VsekWLyminA{@v~N%IfbRnV2A*E%q3E1|nT26vpo+nBG< zwT4`~MBi>fA#8bnYoL6*<6qYTy&!8|!2}N6^?7GufkPrZrR>DJf=70852J;2<+V{* zy7Ka+;o^^5k+$akR=#J>D6d!&)%RxRE&I_q$4G;b)R(~d8ptig{_BkSleQ$*!fJqe z`EY4^@fW{0vg`k|4}bcLUxb&H<4y^Ir1$?QZGfbxoJgIJLD2t8fI~t;{y#YR|78BR z!TuN67<$^fy3iRL8e5nen;4i-GMX3|K<@w7{R?L*5rEYL2ZvH6430&bT7Yo!2*3p> zNJBt+`lWi1{kNFyKmWg%hxspSY;WiCKPb9~t<7Iu&7|$IOuu|(!c8U=6A{&Cp-3ZT zbUftR&^AlQiPibXk_q6ZDkV6=LYac-Qi?r8J+nB*(~Rsl(#P-Ld??bYbfM@XTG0#> zkj}5qxR=}CyE^J-n(Lm%XLIrL=;UIVwN5&j-k+&vMhjiZi>$;qtT#WK= z?eDtWuFTcAm#X8ZY){9oZU-wKSC(2Z#ieT+9@j@6{aJN%m3r)zEI!KJ)Uv*>D~qMJ zze|UQ*KXbGf3!5(|NPb9!fF<)}*OE_*sD7p^ndF#~O@q_pHM=b~;`Sy$JKvRR&DQpKIC>+~dmv!= zWu6GCF54Bg7B88~wIna5s$TkD-NaYfB!r&Y&&$p6aiQg>sBU+s-{W4gN~fK>)yb=7 zzNNCO&W;FkEg#olT2m)2>)l5o`l7>`jXQSjU&m<2|87tB_e{2TDGeJvxjX2r^sT-K zWRA;lpeZ9D;MvhwdkN8$<;d7y)kN4TtDV|f$=w|*wN^*vpaW@0SWuU{VP5@&okrV|s|EHPY^Tvp9HP`q|Dq z99bdTwA`%$=#digDR_AHE-ritJt{9+sqH)Z{qKqFf2(cjq=jC-tKp~{9qM;V7wxRPPH{1l=U!4wk02P0HZ%n>Q zYhRt+-p=Lu?0H`I@&AWWs|SBA%mseI4P^^;9;j7J>X!g0hMcmA^57rD`5}(%TZp}o zMtTKQC+J(UIjnl)*LRNM>n*e;EF|(E=yt>jt|o0Q8*khxDB=lD-xnC96XW-iiOt)Y zZ-j+^-hu^xqJ!QiA(n0tpkI>rkk>Wyg?UBaA{;O!my*9!_~iCrKib;OxED|RT}x86 zE>?g_((`ltod`+S!Q*KqhyT!No# z+pOV`z)f$X6)Rsj=zI`cag=^gavNRaxGinct=!w`>((FmycN95N4t}Or0{O4CTrU~ z*$npRdM-P@dQTpGKkSJw+0qS;cG87F@i%xpKR;MVj&JZ4;Ol(%0L~$pzt_=O(&)NY zzxTvgL%o=-uBRD&%C3`KOhZ@rvUnXod!?FSR2|$0Q{{N-?A>e z4<9&br_);-y5W&@u=e5l9Q-Cg<%e(sovz{dW&VqP?KGw#%)%i#T9Y!@{q50ho9}RMGLrX{&d=+L9)d zJWjV3zmD@{rK0&^$V;HL$gSc_W`W3*mzVo_rYwg4yOc`h*w$W3l|-=yf5g$I*lF3A z@3z<9=IUcD%hXfA*!dfHM0e=MPkhqZUabZ#AdNXDjaco9HwjdK_c0Ei@jNa!>OLkR*qlfG5i zmPl7QrAQP{aD(UX^>hVuy>*qU%+&$4!{Yi~mw(SC3g%w_gL*1XTQJoCMj+=%gq@RdBsj@ z2YREA&Rx~mN$e!GnUOem`axH3(UDFFs9)kA+^^kD+4@#2)gXbw^f_!-zNhwi4P$jG zxiBFI3LPD6D)lsMTT9C>d$#WCCM>r>gi^DOar;w&QmbW`63}7r#OPlVX8nz(>Zh1W zO>bhhf8KXB#I$Ynd@)4frXfXo=QAqH+2wYB@;jS6#s5@|qnijEjKxPtBbo~J5lXhf z4W2U?zTV-RsK;tyGolCaz$|Z3BlM-Gjn3hC&>ROHsX9sok?Nq426Iv>f$v8GnL&JPr5Bn$My}z09IJrGtxg`3k54+Cu ziVYGY6k&foPNC*fQ)D2_p8$LB6BPwQUW^_D(XY)?6>XRug>oai1bY;a;c zMkNwVC4|siGl?j>a4XXD0qb44MJ;8>KiItLZWiAdP#7g=r6H>Ok7-v*(4rKv-Ur4q z88~pvqTL=sHNgRU4lvv%V>hu?h05_(6Q_yvuVK5CpZgM-MK@U#|dU~%RJ{R&iDxBU3CLC)Bnx--4krzh{F-rBoS}#{lxEg+4nraq( z@!4mC;vOKyUx;6Fd4SU-8i6>%jjUi)8&Eo>i+n!gtuX>_Q-IJAO^@0j{&WLN#FIfV zoKngjemN?eKX59g+ZC8Q(s!_kTDI*TG@}jaeISk;{GBg(_C9Ph36(#V)-f|acwd%GplTenDLS+rkZTtWY8{dP12PYz2Wcz2~Zmp1@)q4=&7` z&Uy0AyP(;Kyoj$5SycSq`m?kKx`{eF3jTx9BhdyyG7G|Z>tz<%Ou3|8%wA~e+tZ-<`B#%%nqYv|CEtf+YE$4m0jpc0u7h|Su)vx2j;_t zJEwrdA;nfGpW+6Y0FQ>f6x$K!yy~EYOO=&|yAvt0O7JMkMIc(`#NiD?T(aep$Js9e z4H?`g7G<`@Sy^X^oj_h!6p&Z;Y-8jH+BM)+scd4f;O6pn@cKDI0tQaiS7eEWcCDPO9)9Nr@rx+3mtg~Yq>%6@lo9MMk|~vxY~XsTKa-VI zXiEb|H^^;Qpx+rFUxcCwR)`MP8kjHU<)kNYoO-&&;ETRUyIr_0F|Tq|fP z>sS9ebbQuADb&?wW4;PUy7Czpk!-KULtZ7EHQ;`R z5DF9)q}t7d7UUccXZ+Ry!zI32x{a)%B@{DeXhzJ2Tchi-^E z0ePGqBP6Itv3onF4+-!{EugDNx{<#soK3gvb5s%ay;(Jg`wS9^poX7PQ7h~2>eKnc z2uFGqjTQ;Op^fmO#rjsHBX{@YCaVtsQ^G;09zj4_ePAu1eNPyw+Ec^7VJBfM(1>Ac zrjloGtQ2aDK+&Y80lNgE&7X~-;s%?ks<(wX@ySJ(s7#%hJ2K>FVd7jt5FXHg)eXiI zhglmFMNf&m={t;sDKS#RrB1FNTi_S_LX~~iG&m%@uyoX0$+4`sB&Rh_hY4uM}$00X3 zVMr0~?>W+%IC0iEIsVGcm68YeJ^~Q(`Shvt&46^Sg;skXbBH&b6jJ!4ub#BHnm9T% z3yknOr>}PyZhtHiea|I5V@_e04WZOzq&pGN*BD9yDuq+1C=t=P>@%fzhs>&~;e4@2 zGic;U#+YBGHqgk1bRe*m9@3ySXbEt0Gd_}(XZi4UlUeX@5GTD z9fZ$@&tw(*Dz1@6QEaGr+I4FQ9fh&w7~_L=W~RJu>xFsXz+#i+s=y$)PZyQqo|0ur zjgSzBzo4aJL$?;6LAPMnW(@2(;#^2|27AZgmlI3x0FNew!akE(rQq3lC$(P%J(QM9 z9R@!<(x0NEcT^PjVusWezJ!tx2=~ZN)i=sn3SEiqs}CV^d#|D^6(ZE`J+NM7ZI05r95OL%vGT8&M9NBy>HKmtSa{H4xcr zYy&Qap_rwyX3xqLT39Akr~6d-O5#;z@A z407S^%%@XQjF*zVxJt2oQI*-7P(mMxE#Dw|4Xk09G*Zj{VTT?DiGmy(5?LmrXOyFc z^agb`l@*|>Vzgz!$wJE7|5Sao$EaFsRn1Yemdy7e_gW1#*a9$~q+|0rj@iwdgyph) z)TYO~bb!;(NrfZ&nTE8{fc6!*EjfCdS^A$PR$?8!wh5M)f$%bVXhG}9q}!G=-);_x zKeY|4fT_8mcLJ0OlL~+(M;eCA@0PH&GUn7n3SaQ`iAF5QSCDpeOv-zZ;PyR3wgkPh zb;x&+5lg5#jdfZJQCw!(&?v9r>&Gv1cb7EFvv6qcHkLPl0uh-p@dm*Lo^)9f^emq1 z;X`jEJz%H48)h3nc1i>#bfqw|J%vO4G#X6ucdDQA)j-*hWLv;LBov!speZ(4WC#Z-1q`?wtln2JT@LY5Uy(mgq#;_mQ0Z}fTZ1-eimy^$vHDfoKrfGKO|ByAN>!xENh zCZ%P+sL+Jb0r`n7l@P)kjfq@Xi}-Qy3j~%b`LD&1pWxmZrU@s?6%baOqFws*uuR^v zm5|gJEeFtWh))?*`xA(s1c$FFBo&>+?!ctw9#ndX`ZuHfw3m@?efWXMPA=PHwUr!t z9)teVmChvAbMi7?iq4E`otiGM86nPzu~a^qa{Q{2LqobMO9`5rQ;YLywAOgvklDe4 zB)Xv@(Vh@XReued-!7pZ0sO~(eeWFdh&GeSU2nP{-uALc z73}u+I7tG~fkP&DYO$r_Z)0g#W<%(lE2R zrwta({VfS5Sd|HO(?4NS*g&oK8Qclj<09%)$Q~?fY+;xv1GGSg+Y>$th{}*Q#5}_H z!ZQC7047*mPa>4S3d_JcZL=q8Q3hgx@a|M8B5!j0g&h>Gk%|&b4~lh9F5?ewI8d)N z?Rn-ZCkUMEZ))P8B=~g$Jn$|a&AsbKR6ILyy z#?GK{kY7CbIqJ{*2{QA_bE z24wZ_S=@e#(%mMCg0r=wi+UoXNl;>7iC(Gc0(o*sqkK&8Yd67FK@mi$Re}OG!JW4o zS#(`JukJgXZvs{?f$))jzv*5rAyi;jsE4ts%9TRd$y(Tklj9$on1=<9&1Be>!x27L zFGwTSbzJtN0>0K<-*#}ug*V=D>axkE(q6b<=f_k>el!={cC_axl{i@$y=#b8Fks{Z zQnkQ$l-oePq8l(=I}aU{0AIt>al2t26u|}IDjJ+gsR(#}*()}w<)}HzpdhRAXu62N;qn+yqXLIN!{IKaUK9Yn1s&6SOsr zvGP$^9ZYDe5n-8Hq7-iT3SsmHM%WxLqjec_{0RZ1Cd`EQx-AvT+r=~=mFhk;w1rPE zVtR_8kPG&ScQb{`#g{&IzJ8tI6FbmssDq$ZJb!WDO?MZ87SyKJE?4pBeQGWtM4}E*I5E3WzlPZXKF1j$0#1xh94C?MDh_Ix zt9be3;lr9doL*+KHn3e4Ni`SlkC;iQP;1=S6t*r<;^zVk5(HaU?0SmZco5$4t1H8i z+VdvE+ZMt8y9Y-$SqU-ZS@i~AijYHbh`H-sj37dGq(jN7oZ+3PL@-X}VXTJ$b0!=l z&1^u;s06k?8rP!U`{bu$q@c9?tX?KBMR_nhA%E|qPLX|m1|Y@b%SDd8OahGWYe#c) z`tbH@3gC$N+5u>8`L0#*wapv@aR>}U8Bn=n=s_9pr2TI;adJo>Yj@9?M->UDz3bWG z$`F<$L0s7aK7aPp=vhidMKJBg5GE1xl-27e4|XV@n&JfCxHv7bUzPS}-ewJp6HaYd%X*$X#6O7FX*Op;LLsb9N$F-u%^M z=_t)MhBMxmY9SJu1F6F4+h)@53tU8`LRv{u%(lCDt1F_I!}X-B?)Q9f!X&nE#|FJe zZk%n*%POMa4oW{M$k!C-B zu^Dz?&gk9>J5wF|kEA-OK>-v4`_P6Z`(vG;DmRE!YBo>+3Zww)N_VKk6!hlZwDRD4 z7zOfCFK^{QSMW-c3oyOjY~|aB0UE5BqB?~}1*PaBV&9drVU-(YnkH!0kGAuih1T93N#DOoc_c4HaNgEXXxHEGaX?|x3bn?}BlgMpb0c9+vQ}rYD zT3hW_Z9?f{Py*=Qkz8g5C@!-lXD7kMcYivEB+i`j} z(ct}q^!}J$ajU4v-U}};b*|ShZ#{QT#P03BI6y#XuM5}web3$7x=#Q{H!EYnTgTn8 zwsri%0P=H|uE4qj)g3_$7!Blp zjHA}iOH9kmlb4RNF40qIZTIG1p*^A#$brN0?ngUMZp^kA`9o9?pS-=jESGP*-Jgn8 zt(xI@xNcG#mw!;y$6X;!6hLO?8_|U#KG8<+M34wDMGpj#T~4LfriipmE^TFnml}m* zezA1vvbvVp=R01&a)b38%zGI2n?E`R)EvI<11r`(#5o#>Ctb7H}arqb+8u@_72A7GTQ~Exdl3$vAStFHH7plgR-ooosBjSri357zgwQ>z8LAiiL1bIbm0Gl`0Akd%}{5cb^&=m2(V^Qpn-LwJU`;&Qhz&^?O8xA$aG?#AV{# zWWrH4rySsHW-x?szPwZmo2YObTsNjI789NkFm-1aIiIL>>q@5<==4Sm1=ho`2QOOc z5N7Od6;Po@JkS=8aeCKLXYgSO7$loLHH!x_$yRr^7~#rFd8UAi<$ z1}VxFS9e!~#cCPceY}+}F$E@%zs?{#3=(kBg^JQ7&sV^ar~|;SrrZw$sn2;E%^0?7;;ja5al5e~ z9I}pa;}UG>V%K;>RY<<1@)K(Tt`TXByHVV2pU=luirL#&_bqVZOb%@heh8>97rbY? z1Dd9bH)*HJrW<5aDy_p)hi=;-(Sg*_z5KkY0(TOA!QwN8g8`kM=vf%^7ywsOj*)-9 z91!uqd$ql`(#?=BwLCuodZ}G=hY(bwmH{*SjuFhk4qCeWNoW->qD`9i zT#l${jgCf)wKTD($N%H31~c9#!#%Iq>2_OVuO4AHWtET-ZPD_onTXO42>S0^3A8mY z_Nqwq4b(KHIFMa2exQ?VH4d;Db3mr(ttpbJi(^)XW_<{$2I7Y?=PaQ(Q;_ajf-+uY zz;6j&lE47Zhat)~5cCtJ0WfNa(Gmx^RNmdbm>yBM7_%-0fWRSJC`(mDkZx;g zAblRh@MDB_NBIQWve{Q^2CIK*I|!3zMuN=)bxsKxe)n@1jxbHovARP6FLZi()LfuQ zByT1%%jE;1BP3;5nz(qr`RYtsUe81TJN{>owNj#j2Z&&*qG2@)@{y9m93E?t`(q*g zS%WT0$8)sQg@^KMSPM1$4c5p2i1L_QzBPIyWE}!HHUTm(QRe8z*kqe+pFLr{#44K~ zyXT%c$FmopXAsCTAnH>+gY4$^#XUeK9YWqIm-ver(w6xPPKnYnlkm_)u(Hbw2+J^v zZPGKONwC*pJZM;aECoeagS*_YefE|)%L02q#4zF+Ir6$()xGl-ESz--Z2PJbhSbK? zX%*+dFgD$WsOhK@i_c)1L*z@R?Dt_h_B;*Jy*lvgKJekAjyQ27!29~G?|;%wmJz|?afC_iW5qVanuvq9 z)FRBFfV$sVym&t;nsQD>08}-dp6h#-q=}nrrKb-##WrGa;UxD`w*W^c1~}$*(dTt# zo>1x9lX~?sj4AWzc$Dq$WAG@U%{UkrZRd`))Yl_ z)4q#`#pRTK;AXZKAB*SZ5_rCSUC;a8tprDF{;q^tM>d7w3IBa=+jm3?RpH%eS7&p+ zV%&3f46^6FP0Ftym5Yt<`=iqm8@09}Xi+3V?(hIyDa+fZ2opjPY+}_*-+($wYnicz zwThQA^Otcbu)8y!`pS2<<{m${flB`TF?W{5wL5?>n2N5%qrTujNGY4R!j$yPkb@85 z*a2*Ri+Jy`ZY>`rKMTUU4P5=eSee%y%VTV7WCd2A zZ;7eWafAbP#*lUQCgDaZsQYZhtghmqwN7Y#U|~Iphkwlrr0Kkn4}>7Tz`ZH9Sk=fC zrb+WU^K9N?I4zM=+pCV%~}!kHo~y)nJJrya{8f8relkl&0aYmK0ox zw2e5WU$jd~I#J-!sNl>^(5ZZd4WvA&<2g$^4BsWby1Drz)8+~i<4RpZ3O^GyEkZlE zEw@fZ9j)4JV{HepckX3VMf!R_8PB&>sjoXzDL!s}|72Bjx>1*0#c<|9Z*?v^Ef)ym zbRu6L;VmxlwTB`Ot(T7ZWrA4SXRbTVGY-2S?Y!ipGc8W6xB_PoxVmzlY)uwAbJ-8AzeQZleK}{-@obr-p^1F)Ih0-x>}YdJVrQ@_vB!q1TSEH`-d%@`Ar8OZdwA$ zM4X*d!Kp3WzIb~&8x&~<`PfE*DLcfa<4gcRh7y<-T2*wR+7{+uyc2J>UnpL|M+244 zw?&NUd`ve6Lna9ylP{Iw5FuPvfUhcxAT1x0`SYyQNb#6as}{sV@bg+x-C|0|qJQi7 z*2QBx@D6Iinirx(%6zGv7&(2VHMDdyFKkW zZ>%P-tgT&pAOCr1XrMLHPV0XVKn5!Set zUyC_*nbx)w!$$4OJWVBQiI6CKT)xkcavi}%QeLqwp=3}ZExka<2I^;n2sS`bUA1F-mnv7QxnT7$pIjwqzF_=pFz( zXQsK<17?>8`jcAoG0i{(jckhjAocfYWo24y6Q7-*Z z&OrtABq$8bx6}6uUz9xN`4^AiPt{q1T{o|yIRK2iF!Vpq&zY2GvF6lE(+T!$6_@7q z7BD@g(2y1sU>W*g36+sdaP43w!i-ryVNEEZZOo))EIKC28*)rYoLN0KMhW%mx-ivS z?z`@bLr6G}izG(dVgzSYW{JXBVtX5di2Xn=(J)j#Rw4@h zHCC(GFR@|HSo0=aWC!B$(d~Q`_cl@<>Ii%p0D&lHH~U zmvXh_NkNk>oUE2fUxRu5& zy}ljL9--{M^E)onsOwihXQ%t+tyvq0}-zoTle((CU2e%*`@RKW0zc)MP0wMb4jv977vU0^`-TCEJJ=^%?jH6tV{ zZBUuSn-iwayjH<_Kx*T1HsLOOx&c&x_SL1|`}N$>?Q&mt(a_;buJih^X$=nd>u-4w zlp1KEr+T-#qYgiQf9w^sX3G#9LMxYyVWa3m851uQ=cc%{q*WA#V=pBkO_`cdQYL^D zZyA$W6w%(6w{y$B)3hu@%U!m?IEj8q(h`WW3WF z<=MO>s1;wFl9kP3PkXOH8&?>0$`gMs&_pT&yVD+Z3k5~e4-%m@xnnl^tIJw-He&H& z&j5xsCSCLPM=&MOYKh&`kdB+AwsBx;Jztp`^oXLbN=N$Ihv+jBr~){-Xw++0qczgxcRStMRk*6;+k zK#m&PJ8~KUhu!EHN9?co*7Vrd(%0v3Q12u;0|N5d!kl^aSk8r&l+ugpv(w~Zlg2S) zv7vOlV7vu4NRz0uL~U-!?zx^|ql^IU9`ZMg_$J80)|llaO@?>56|;;ke1Pi`{8}~y zy{dH-HF_8R%wcb3r;z4~hjMXpLw;U* zpLrf$wYX6YPbUq4%t7DOD}aPZekJVgT)k0ayKbD8&~DZCgm}S`0Mjy8<_&Iab+8M5 z!Jk1Nl4u%izZRF_u3oR0YYVU*p;bP{Os(7^zg6+C1~q7YSMjW~9~TlssfjS4@{Q~= z{a6TcjDYKBa=bU>+b!JUrQRJ00t8eA@!xLYw_(cwV@F4G8`FP$pJ>-uby?to^ZM#7 zEW5%@alDW?Sp({5wQRPI)R5K69uIZaTkT*~-096f?^}^?bcpgP+vhRHN<8~YeCOba z3RyHdheg!weMVa;q$mM#M018Vq;7xvrc2ku48JNz<^@z5qlh}l1g<4R5Z<`xRm;@K z-< zotdTO<9y^H%ItO(<>xDaa>#ALKt~LHAEo8gp=tf2i(Q@i7V{*F-^>ic;&EdI8_Y$t zp$$QG1LuNPgJdg$nDJ%ow~IlGu8tco&s`keRh7=Z6o^G`lgx?tz7FVhqlc>X$xJ%* zjfjf1s&>N7h&*hU?S43s_xr6D-Tc7WBRBL9TUW=uiw+atIO#-@6k`NjMz`RuqJp6F zfXMul)0TxjA9oT7FzHj+qqV8R0sDrpmI}zg$Ay{dJ$q_LHL#wTF3Q|B$P*l^O@pk4=bk^l#Fz2Ef1%hf*g04cqFL?O&bLC6GOGsTs`Dr`JSrua)jKX%pwC` zqp*=Ls;4O$S8}Ao5$Al8WNTI%gJXIgKonr=fzpxlMjyJ(*_r7Ozdj-wr8J2W&_(=! zu|#Cvc8GR*0=*-VNpP4o!gGL! zy6cE2(J=&FF9BO@3=5BFp=B3nDb4;Va1H`b(N|J-4o{Q%ZfKPdOQ+K`!__xCP&2vE z9g2!*LfC2VamgQVW7My%Gnj<+kPb>;-__NBnUVRF0lop+7M3sGISAm&ddxxI=D(kS znIFxkdovH#Ghza>UAE%)xd#p+wL0iT(HQl`0jc`g5V^c+V=?t3IB!MWe*BE41#m%g zBA>FCw4q7oL>41SY0haD!wTUA{ zWcdSuWL_rA%f>`Q0r_`$7MVf5A?z_tpc*!e%atfyaYIO~_hC)eDK!JI^KkRTpU^n; zW#|2e8_&>G-N9zaqZ#^eqw%I9SXN0#wu*C{9Ne7U?44B#AC?_Y^X*qvgPeYzG%jmT zn*JJHxoXmqvkHYPUFRP-Qt4Cd@e1}v{ zkB;e29?YX)((E5n_(q>&qzNDkPAx#cY-Fv5xf|CrCC-6}f1waZkO!0vYMLo>VB#^Z zC#wg~_spH0gtFR4g!o}@G(2o0R^fb!8Yi4}=Eq|bY2o`qfk}$$saK6*Gd_}#N3g2E z`+#Loly?zONn1kg!jK2i_}vH$FNj}h7hbq3(j=Rsnq^v7!&&5lz0Q51*BL3<-J*0W z?CRs$do+c%XF{d2>d6Lf{=ra6N>A*E1I_u@dCRIJV=wH$qVpH9UtFe<>_*49w3zC> zmT%urn#R5xO)R{WwXTAU$tUT1Vn%|9g8?#r`DR%&>=n>-7?QD^Ju5qkO*-#sHUo0S zyV99p+zpyqN2@GD6*iV3Be7%8-H^8i4_~yH=5Y(Zw8on@mdf_2r9r;{zbSQIJMXzM_sv&el+6myO@96aZDcN7)-b!YtZ)0rrUz+Ic)x%of z#@xgh;7I3SWHJ&zV&l(%6mZHDXgoUifgT*(fnuoHBD<3{NDZ9+A`NAwBPw1+zTopg z_S9yD2=i)GUHY*;?m&1=NtY6fAtmXMm|6WkHCHQLbKxS_!dwG2e%kwU3;)7wsumX; zDo)*`Kw5Sn8NROKBHb7I_X z2zbMnxk__tVDuXl+JhSiVtqeELQ4$=IQrwZ$Vm1wCtb>OcI6&#^y{@x`seZJol!@P z&8>vM6>aORy)JR0<-htV(ainC(A{aW_k5K&K`(>pME0PS+wEodnQrU_YooHx`J>f` z(R|bUnBBSyd}Yzfx5ujP#%ux{7zoJ!H9^SV_ba`7tv+dCB>`G-84>z_*W+s>Qm!Ov z^Nj#$c^3_Rap;GMaxRCu(gE}YsMOhT)nxU1)rgwB~hrL6f^AM9$jiCM3(!Ce$Om-NW@6hDmsy+dRXG_diFzdIQYvdUXg~srV;)b_pQ%+26(HKb!X#?w@k=Yd`ldc>ag@{FCgD_Id;Vp&)Pa z^UGHLg6wa^=)aZpO?-YCtHEEC^gpEN@5}loM!(GVFPMHw)Bl#G@Gn??N!9k&l4e-0){?Gf__m$`0F8WpK{%GYt lkiWa2H^2VNI*tCu%gafEzrJ|^0inG9KEHY{dXu-k{|8ABhn@fc literal 0 HcmV?d00001 diff --git a/src/Gui/GcWindowRegistry.cpp b/src/Gui/GcWindowRegistry.cpp index 790da8f30..1dae04276 100644 --- a/src/Gui/GcWindowRegistry.cpp +++ b/src/Gui/GcWindowRegistry.cpp @@ -60,6 +60,7 @@ #ifdef GC_WANT_R #include "RChart.h" #endif +#include "PlanningWindow.h" // Not until v4.0 //#include "RouteWindow.h" @@ -75,12 +76,13 @@ GcWindowRegistry* GcWindows; void GcWindowRegistry::initialize() { - static GcWindowRegistry GcWindowsInit[31] = { + static GcWindowRegistry GcWindowsInit[32] = { // name GcWinID { VIEW_HOME|VIEW_DIARY, tr("Metric Trends"),GcWindowTypes::LTM }, { VIEW_HOME|VIEW_DIARY, tr("Collection TreeMap"),GcWindowTypes::TreeMap }, //{ VIEW_HOME, tr("Weekly Summary"),GcWindowTypes::WeeklySummary },// DEPRECATED { VIEW_HOME|VIEW_DIARY, tr("Critical Mean Maximal"),GcWindowTypes::CriticalPowerSummary }, + { VIEW_HOME, tr("Training Plan"),GcWindowTypes::SeasonPlan }, //{ VIEW_HOME|VIEW_DIARY, tr("Performance Manager"),GcWindowTypes::PerformanceManager }, { VIEW_ANALYSIS|VIEW_INTERVAL, tr("Activity Summary"),GcWindowTypes::RideSummary }, { VIEW_ANALYSIS, tr("Details"),GcWindowTypes::MetadataWindow }, @@ -237,6 +239,7 @@ GcWindowRegistry::newGcWindow(GcWinID id, Context *context) #else case GcWindowTypes::RouteSegment: returning = new GcChartWindow(context); break; #endif + case GcWindowTypes::SeasonPlan: returning = new PlanningWindow(context); break; default: return NULL; break; } if (returning) returning->setProperty("type", QVariant::fromValue(id)); diff --git a/src/Gui/GcWindowRegistry.h b/src/Gui/GcWindowRegistry.h index 8d4635d5b..863874d66 100644 --- a/src/Gui/GcWindowRegistry.h +++ b/src/Gui/GcWindowRegistry.h @@ -65,7 +65,8 @@ enum gcwinid { WorkoutWindow = 36, RideMapWindow = 37, RConsole = 38, - RConsoleSeason = 39 + RConsoleSeason = 39, + SeasonPlan = 40 }; }; typedef enum GcWindowTypes::gcwinid GcWinID; diff --git a/src/Planning/PlanningWindow.cpp b/src/Planning/PlanningWindow.cpp new file mode 100644 index 000000000..9678777aa --- /dev/null +++ b/src/Planning/PlanningWindow.cpp @@ -0,0 +1,109 @@ +/* + * Copyright (c) 2016 Mark Liversedge (liversedge@gmail.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + + +#include "PlanningWindow.h" + +PlanningWindow::PlanningWindow(Context *context) : + GcChartWindow(context), context(context) +{ + setContentsMargins(0,0,0,0); + setProperty("color", GColor(CTRENDPLOTBACKGROUND)); + + setControls(NULL); + + QVBoxLayout *main = new QVBoxLayout; + setChartLayout(main); + + connect(context, SIGNAL(configChanged(qint32)), this, SLOT(configChanged(qint32))); + + // set the widgets etc + configChanged(CONFIG_APPEARANCE); +} + +void +PlanningWindow::resizeEvent(QResizeEvent *) +{ + // TBC +} + +void +PlanningWindow::configChanged(qint32) +{ + setProperty("color", GColor(CTRENDPLOTBACKGROUND)); + + // text edit colors + QPalette palette; + palette.setColor(QPalette::Window, GColor(CTRAINPLOTBACKGROUND)); + palette.setColor(QPalette::Background, GColor(CTRAINPLOTBACKGROUND)); + + // only change base if moved away from white plots + // which is a Mac thing +#ifndef Q_OS_MAC + if (GColor(CTRENDPLOTBACKGROUND) != Qt::white) +#endif + { + //palette.setColor(QPalette::Base, GCColor::alternateColor(GColor(CTRAINPLOTBACKGROUND))); + palette.setColor(QPalette::Base, GColor(CTRAINPLOTBACKGROUND)); + palette.setColor(QPalette::Window, GColor(CTRAINPLOTBACKGROUND)); + } + +#ifndef Q_OS_MAC // the scrollers appear when needed on Mac, we'll keep that + //code->setStyleSheet(TabView::ourStyleSheet()); +#endif + + palette.setColor(QPalette::WindowText, GCColor::invertColor(GColor(CTRAINPLOTBACKGROUND))); + palette.setColor(QPalette::Text, GCColor::invertColor(GColor(CTRAINPLOTBACKGROUND))); + //code->setPalette(palette); + repaint(); +} + +bool +PlanningWindow::eventFilter(QObject *obj, QEvent *event) +{ + bool returning = false; + + // we only filter out keyboard shortcuts for undo redo etc + // in the qwkcode editor, anything else is of no interest. + if (event->type() == QEvent::KeyPress) { + + // we care about cmd / ctrl + Qt::KeyboardModifiers kmod = static_cast(event)->modifiers(); + bool ctrl = (kmod & Qt::ControlModifier) != 0; + + switch(static_cast(event)->key()) { + + case Qt::Key_Y: + if (ctrl) { + //workout->redo(); + returning = true; // we grab all key events + } + break; + + case Qt::Key_Z: + if (ctrl) { + //workout->undo(); + returning=true; + } + break; + + } + + } + return returning; +} diff --git a/src/Planning/PlanningWindow.h b/src/Planning/PlanningWindow.h new file mode 100644 index 000000000..836493728 --- /dev/null +++ b/src/Planning/PlanningWindow.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2016 Mark Liversedge (liversedge@gmail.com) + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation; either version 2 of the License, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., 51 + * Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#ifndef _GC_PlanningWindow_h +#define _GC_PlanningWindow_h 1 + +// basics +#include "GoldenCheetah.h" +#include "Settings.h" +#include "Units.h" +#include "Colors.h" +#include "Context.h" + +// trends view +#include "Season.h" // for data series types +#include "TabView.h" // stylesheet for scroller + +// qt +#include + +class PlanningWindow : public GcChartWindow +{ + Q_OBJECT + + public: + + PlanningWindow(Context *context); + + + public slots: + + // trap signals + void configChanged(qint32); + + // show hide toolbar if too small + void resizeEvent(QResizeEvent * event); + + protected: + bool eventFilter(QObject *obj, QEvent *event); + + private: + + Context *context; + +}; + +#endif // _GC_PlanningWindow_h diff --git a/src/gcconfig.pri.in b/src/gcconfig.pri.in index 2cb0b141b..668485d86 100644 --- a/src/gcconfig.pri.in +++ b/src/gcconfig.pri.in @@ -285,5 +285,3 @@ DEFINES += GC_VIDEO_NONE # dont add any video playback support #DEFINES +=GC_CLOUD_DB_BASIC_AUTH= #DEFINES +=GC_CLOUD_DB_APP_NAME= #CloudDB = active - - diff --git a/src/src.pro b/src/src.pro index c40b9b601..4e1ac9036 100644 --- a/src/src.pro +++ b/src/src.pro @@ -79,7 +79,7 @@ lessThan(QT_MAJOR_VERSION, 5) { ###======================================================================= ### Directory Structure - Split into subdirs to be more manageable ###======================================================================= -INCLUDEPATH += ./ANT ./Train ./FileIO ./Cloud ./Charts ./Metrics ./Gui ./Core ./R +INCLUDEPATH += ./ANT ./Train ./FileIO ./Cloud ./Charts ./Metrics ./Gui ./Core ./R ./Planning ###======================================================================= @@ -694,6 +694,9 @@ HEADERS += Metrics/CPSolver.h Metrics/ExtendedCriticalPower.h Metrics/HrZones.h Metrics/PMCData.h Metrics/RideMetadata.h Metrics/RideMetric.h Metrics/SpecialFields.h Metrics/Statistic.h \ Metrics/UserMetricParser.h Metrics/UserMetricSettings.h Metrics/VDOTCalculator.h Metrics/WPrime.h Metrics/Zones.h +## Planning and Compliance +HEADERS += Planning/PlanningWindow.h + # contrib HEADERS += ../qtsolutions/codeeditor/codeeditor.h ../qtsolutions/json/mvjson.h ../qtsolutions/qwtcurve/qwt_plot_gapped_curve.h \ ../qxt/src/qxtspanslider.h ../qxt/src/qxtspanslider_p.h ../qxt/src/qxtstringspinbox.h ../qzip/zipreader.h \ @@ -780,6 +783,9 @@ SOURCES += Metrics/aBikeScore.cpp Metrics/aCoggan.cpp Metrics/AerobicDecoupling. Metrics/TimeInZone.cpp Metrics/TRIMPPoints.cpp Metrics/UserMetric.cpp Metrics/UserMetricParser.cpp Metrics/VDOTCalculator.cpp \ Metrics/VDOT.cpp Metrics/WattsPerKilogram.cpp Metrics/WPrime.cpp Metrics/Zones.cpp +## Planning and Compliance +SOURCES += Planning/PlanningWindow.cpp + ## Contributed solutions SOURCES += ../qtsolutions/codeeditor/codeeditor.cpp ../qtsolutions/json/mvjson.cpp ../qtsolutions/qwtcurve/qwt_plot_gapped_curve.cpp \ ../qxt/src/qxtspanslider.cpp ../qxt/src/qxtstringspinbox.cpp ../qzip/zip.cpp