From 4757756d32239cacc8849907dc01deffe75491f0 Mon Sep 17 00:00:00 2001 From: Vasily Date: Mon, 4 May 2020 22:05:20 +0200 Subject: [PATCH] Refactor alarm system and replace notification method The old OpenVR overlays did not function for unknown reasons, and it was not possible to get them to work. With this a white overlay with ALARM ACTIVATED will be shown for 3 seconds. It's not pretty, but it effectively communicates that an alarm has been activated. This fixes https://github.com/OpenVR-Advanced-Settings/OpenVR-AdvancedSettings/issues/417 --- build_scripts/qt/resources.pri | 1 + build_scripts/qt/sources.pri | 4 +- docs/screenshots/UtilitiesPage.png | Bin 71678 -> 61360 bytes src/alarm_clock/vr_alarm.cpp | 187 ++++++++++++ src/alarm_clock/vr_alarm.h | 65 ++++ src/overlaycontroller.cpp | 10 +- src/overlaycontroller.h | 5 +- src/res/img/alarm/alarm_activated.png | Bin 0 -> 4703 bytes src/res/qml/common/HourComboBox.qml | 50 +++ src/res/qml/common/MinuteSecondComboBox.qml | 86 ++++++ src/res/qml/common/TimeAssembly.qml | 49 +++ .../alarm_clock/AlarmGroupBox.qml | 211 +++++-------- src/settings/internal/settings_controller.h | 4 + src/settings/settings.h | 1 + src/tabcontrollers/UtilitiesTabController.cpp | 289 ------------------ src/tabcontrollers/UtilitiesTabController.h | 26 -- 16 files changed, 531 insertions(+), 457 deletions(-) create mode 100644 src/alarm_clock/vr_alarm.cpp create mode 100644 src/alarm_clock/vr_alarm.h create mode 100644 src/res/img/alarm/alarm_activated.png create mode 100644 src/res/qml/common/HourComboBox.qml create mode 100644 src/res/qml/common/MinuteSecondComboBox.qml create mode 100644 src/res/qml/common/TimeAssembly.qml diff --git a/build_scripts/qt/resources.pri b/build_scripts/qt/resources.pri index 6bf55e6..5b03921 100644 --- a/build_scripts/qt/resources.pri +++ b/build_scripts/qt/resources.pri @@ -14,6 +14,7 @@ DISTFILES += \ src/res/img/audio/microphone/ptt_notification.svg \ src/res/img/battery/* \ src/res/img/icons/* \ + src/res/img/alarm/* \ src/res/img/video/* \ src/res/img/chaperone/* \ src/res/qml/qmldir \ diff --git a/build_scripts/qt/sources.pri b/build_scripts/qt/sources.pri index 28658c7..a2e35e6 100644 --- a/build_scripts/qt/sources.pri +++ b/build_scripts/qt/sources.pri @@ -22,6 +22,7 @@ SOURCES += src/main.cpp\ src/keyboard_input/input_parser.cpp \ src/settings/settings.cpp \ src/settings/settings_object.cpp \ + src/alarm_clock/vr_alarm.cpp \ @@ -61,7 +62,8 @@ HEADERS += src/overlaycontroller.h \ src/settings/internal/settings_controller.h \ src/settings/internal/specific_setting_value.h \ src/settings/settings_object.h \ - src/settings/internal/settings_object_data.h + src/settings/internal/settings_object_data.h \ + src/alarm_clock/vr_alarm.h \ win32 { diff --git a/docs/screenshots/UtilitiesPage.png b/docs/screenshots/UtilitiesPage.png index e8ef72516a697b00cc4ab1f790a5752ec957616b..f521c9827c67684e230dff2cf39ef4420d55bb47 100644 GIT binary patch literal 61360 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 R0`#y&M^j(pnY!(be*zi{@Dl(4 literal 71678 zcmeFZWl&tf_coXWcL?ql+zGA$2A42+&=7*l;4Z;E1b5fq?h;&sOOW914DLG#@UW1-L?}jB zK>mAarz9!*qI8&O2XX^#EFv%R;zdOS(w#mGVw^j7pR?o{=Mu46?}&L@wL6U zhP^V#$lgic*6@X-t)Zcnoe9WZR}~)emB&D7fQX8-?*8vUJ*=4yq2r~;$km@eJ&xqV zbPQB1fY23}1Q>wgUv5WCJ&OiMEl$}cpN>AM7sD$-1Nj*DPm?Px1d*Dm{9)2hUD__g z2Zv^76YY$Q(^7d)A6suKxPty&0^uT97|)jrj4v(4^94qP1p=P0b!_CUfBpLy@Bsh% zN2;?1{p(Lr_7PqD-xqY-$wK~pq1osE*cXJbV*pe^qlhhV;oaaGt>cl6J?A?P0-F(8Egg98M)=m|7HvvrbGx(EuAM?%OB}I*K&$XPA=+? z-K%4B+!atM#C+q9_OGXHx)Ls6%H$V8a_y0rky;$9_Bh4cx0r;r2kj$mwK%Ob{}j?t zItdMYR4>6$1N|ypu%bbXUJyaenYNq_f1EO5)Q0`{!0}QQXkbaxxyaezOviEGLUMu= zkL@Z8qjm+V@+M=)F+vrV@)l#yYAm7kzWtlk#a^T>&dXhSxJCXviCL@HD(F0mh$!aJ?`lv&_FPg6Zq==bbCZyso(3wCX?8o;AU4$UsBHtT!o`( z`pMo$RZ!UD)HlwKOYHlu3G7^VL3dDbHrs<%ZmBb0{$zU_p}p9tLd#f|9cbqU{<3T^KZ#fKKbju{Yneihh__9;1HE$m-=cyO&i&fNU-=g%5`g5W7&8d1UmPLg;w>3DFqIY&H6R7Zi7BhPfd-h za2iCOvgj1^5xu6OJ|myG@GQaint}UM|8BTOfoI}|K#^a$gkN-PQNQRe*`AGBKE7Z^iKqBI>fm9$2qh_8!=%i?D4zv2HDD;KvW@6 z4tMVY_QnABH5Eod!S)`VBxe(0pZaad}!)8k1! z`iQO?^e>VF`x(Z_3MD$HaoWFHtPa6+n2N8Xn{70fa5-SjIbG$gT08>R3egWX(Wnx-l|(_hX*qkNKLuagaf5 zvfNJ?J%|QIJo?*W?;&hW?8f(4S}saHAZM9+_~!c-NWdr9yyi}C?HNo^`MiS?EhT3+KLg>G(SyM&tOIky*lO#q>2+b z&^9Y)81~ugSJHmAeG^ov9UQ5$NWXJ7S4PrbOR*#Mbvy3-uu^?s!P(KHb{maD^k zH`gI^s!*UNhN34x3UKkfZlx#nJDk@|^w)6-YHLJjN#d$ZszrUc-$Q4tkFvng*jPDV z1Qu8bS*iT=)HvapKX&@Q?)4*=b8W0%!Nc8BZHYS;YGuX)5hukt0INat-@sK6V@%Mo zannCy?1m+)*~3qQenGFVuWJmgS@Bg! z(_$COAo}(18%4jiUg)mlQ%6o8b;^qYbA2{AaOfR6`uaYbG7-qkS<0E3Hu@YrHd^## zYj-Yv3r-&FIQG51*iNBf_V1{W7w zgzgAt){~iC`F+5d$j>*1&p$KSdV6FG)-Az=54m?g(H!!$duclLGTeO61@A34ac{mew-#-;(g0pRxu=V0 zFf7nE$be)Q5SB!dqQLdB>vM!23Kau$5CN}gZTFd}=?+A9P`(ACX&S9wHJV@d@B@Tp z&98^9YPpUWR7%j)1h{o2{MY+-3a+E?>h#9IBPMt(K?4!(dAjlzTQpCuM4u~jG2MK5 zf|IFWv-b8w;JY+MZFJ6ir@{R5?w*rrf!TOmfb^c@9aRqALr9og!c<;n_no7vNkrr$ zUYVQd;e@;iQ1wAe=Ssfm>qx-N#)iAwX9`c|T{YpS=VvM90DNg(GC-$_#t-Ad{u7DG zJa*pQ0@IM-89F#)WyIj3A7Cu{_>hI;4&&rs9#bb3O@S`>3_iPtKhQC6%3 zBvR z=EC!Aw^xm35Kq6t?bsvOEg8kZ$dAgYvCugiHOyV^PHn4jxjx#y*HTw09bn6RTAmB+ zApv#ZW;bgFw1kjfb>VQ$r%`E^-QB$Dc*ySq^0a-FZoF$fTEk>ol+{HYtN!=4?$QL? zPM&u$vQ&@vbZ4c;u1mJ(fgg7cRMw`{E@VU;DGrIW0zFHTf4S>Euf}>RSt2SBM2wU9 zwb<2Ht;4jWKXY{MC%@$;OSR#aXI&uB)0^0Gk;Z=6WTm<_6V)v20j@t_`Bh&}3zgtW zDg=>u?$?l(g?*QLxwuc@Lt2t|z3Nji(563~%GkNIu626&am^=p0PoXq5{D=2u1b~r zQCXqmy9gK>8ydD5XQcF&tPxjV56s4u$Dx0Q1QvnJw5s{&IQ6eY4)aWFO$=U>xyIWJ zd1C)*(C-pxwJet!^xv;Fa&_$>W6A<&OayULFM)H?pA961&XA0|6D3kzA8gKjEdZc?PU{6*=!3`Wb+NUL`CLgW>j z_MnI69$!ei1YD|xkVtPCW#FWjKSLRz;x69;n~6;=KmN);fIPn@U%T6t$B}P5FHID( zB02De?Go|zfgWWw5!YP{UFxJO8gyw@p46k+4+A{ZXoZE>zC-U(O(qRISnUp(9p&|jOUYG|A6*Go@+1mFX>@W=l>ulT%xNn{(M8jdv5J>c&>a^JOX0?We zA*+CqUMn0ad*X+buo;bflx_1hE!hpt$NtWXzNed@;~ISrjl{=Mop_i`ZD+mcJgWk+ zp;}_efj_bDJ>wEud(-iP1^VSLN&{eSvmr5wY6Sze9`|pOpvh3Yo1$AQ@#kUL)S=l;5)(r~|ZNO0$Xs zd7ZC}mp+xjDqUypE-O15BO82aj&~cC=D<-Z!T5!5>>7_|oWHV_4n2{0VuZdCxlzQ6 zZk|S1h7H9|^2z3s8pi=^kH$--WU0^E{{xhY`Qpos&=1VnU`y7kl%2$&M(*3OZp<~6 z=OEG$3<1BK1hs0Vtn6s6y3MY>k7}SdDT~RTh1fy$kk~mG7Z-PU>Kl{Huw;&w^|KdK z#>)>o^QT280mBlET=!z#=3ArH&8)O5UDgBjShtT>Dz*B28DuLgXXYAb3DUYKSpt>r z=Zc^?PInGMK>_YfmN1JQsiyNzFDOa<_I|e@?O8qIcdhP7en%c(=6lt%wblZ->V!3K z=RnZ4ZEU(x{t>uFnQ__VIM2`y;W(H~rq=A9E3{maT91w@XFPLD{g zA_&zc5^1cXjJ%ao?lfFr)UnswWaY643@U>Kl4!P;6<+*^8T@Xfp7QeAw9MLK%;Zk9 z*YUTfG8H^Z=jO-joh>Ofb|IJMLhk^ENzIQxcCZXz*n2oqlpg2==vpSN@F&mT-yM7S z3MJT6ljJ2FzkNuYMR}}Dc+UFz>aOI_&%LGy$Zs~xlShrmi~T!xTJ+n&4qSt$+dFo5 zO)^j`XRZ6mHD2eGtyFnZ=1S$70*mBD>BT->QX(H zjPOhI@QqlpJVZ#?g{Ud0nek0|VMg~bE4(uJYU7-IX-62-i?ySrf8EpfvZj9D&UHv8 zxHO8M+BJ2}abA6?tU;*L} zhdNKFce-Yb0r_cWhL*4O@aJsKy>B|Z=DkAqz)toe4b3|z(D>cD6-fFD_Tzehtn&ri z`|>dV+!wP5mlXy^5U>3#B>X&+M_>ryfa=3_^os@Ahs$C`qN zZRpnP;5wlv`7tmWI%s@pKQx4#mpfdF=(E1zzn+1CuHB8M$VHG5;EEP8F&uo9c=rl=(RC4TC*JlJezh_K;lAqa0Den5Dh)xO}i z;|rZ)YhAmDbcy)g{I&l)BTESb(Ep&G%{Fbd7(6s2r|-Ounl7BL-(MJh)oLcT!jAsj zHPSJcI*9(wl3JbVthgN&yh%_O|gG%%C`q277~x@ zUOD}HplwP@Mc;?el!l-O-6%+&A9bV^!-BsStN4%GJ)|^dvfW%YH;{-mL8qdz1K)>c zwf#rwj(4nY@6FI#K5+wEFcaLh}eiJdO!VW3kvtVOAFh3v1 z8K%No(ZD?)a&+uLEvy*d6;l2)gG*HVe z7D*%_k0E(L4$&Vmf;`qLsg9=$o&{IYCVV5;t*1BwQ!i=%4kv~)*tzpe@w4|x%hotGJpC_ByflXE}hfH0KEnb=9IkB-eY_hyc5Rq0vfB$i&^ z4LHM{Sc9TM>U;`#_Q=fmhI0naKQE6X+wiEEE_*IO7@#ed^p*7?l5SYwMV`}s%LT&L zKgbW;5TwgOXGk4%)8;69;w0m(WV|^cxD6~@@1gmGPK8a1nzdhn3z%ISaCraHV%n{zRP)08bkxB_Hf8H1(2`X0WnT&PJODjI3LK`v>AX z?vJcJ#k>K^@nvhZ4OZ|uUP)Rxdb(G6>6F^@u7oy>C0eci}Y^lnd*r{)^X-kfCl6RpJ4TpRlTwS{qF zfGSc?j4WxcdXBpAVh=>8!nTil>0)eapV-&Kr0B*Gywr@ozRoMieL=?!*_{Jp)!vw# z-Rk7@vup|UMh&;kP3D_@UF?mDc|m?T%T-;X?Jx_O@rUVUC!7DO_V%3OC5H@ z{PDG8vtlP_%{DN@59m(?$AYTht!FrR-D<{)oi9W{U7-$MwRYB~39Sf`dw=Z~aUdp! zQF%wO8uLY*8GJ)xft=O)ogbRvD8I;C8rZ!jqC$u)`1rkVW1J>UB0FE4|nB7w8zp}5*-{Jkrbs5 z%xP9c1<))@utVL~@4@DL0!sovz=dSKWrPad{aC!PeLcT($**)>f8qh~LxlKIah;gO z+rBNDV6daEP3v^c6Ll^L>9%jbtNM{A0b*2?)P@7Uwszbxfxd=Y@tT4_V<5Xioun8$TKq5oD=%QeAhG+`PHDi8Ku>L|MoaKyk*x;ks#DQxM z8ND#}NE&tFIqo_+6YopVQup#r`tHqD;U}7~FgZ3qvRP-FoA=15NaDYH4o1txpkbMX zya`Wc&1hH8wN43Ei6PBNPAPdNKI(p3!S~X~)&nP8p0D}gjh|v!Auo(YK2v;54v`7sG6~9Cb`psJ27|pxjv~H_7>;p7*)qkg1h`9Ti@b8YG%svc zGaRLBj$bMwBWb!VD#KUZ4nt6%*yw&|yN*1`0sZy@mZ45Dn^aA_XokyB_zKe-Z0QK0 zC8l-Gu}G@`G;d_AXfW!p)uaSsEUu!mwKYaMVd#b zwaQjC{=7NQfwn9}8NP@Cwb_03yGttxz|=Crfo4@BL|dICtrV&E5n=NgH?Y(ERWlYW z&}?kaKA^(kOscgSJvc@1Xwlw3>|55$$YhxDs0pYG-}ge;adOvBn*I_6M0g>?zWE0G3sV}E zCoeA28UpdCu=?A7iwlOW0TLrH47qtu2}6AmWGDi;n_$-@$2eZY0^|Hn%`79PZuQS) z9h$aiblX#O4^F(YMD~K8P#yA<5{Jp?56E#YcSBFSl6x3jtJz)&2X98lm{$;SqZoMY zojQ#6lgB9vO|rGyS%akY71ttAllADmMJ<9{fFC|?yDx5J=-z1#L8UCz;AF#H zi2T+(57(!C0tu0F5X2-avqMzue#A;;e^a}{v+r88xEOGE$wNz^EDcT{PCfw;dlT}S ze!uz#u8`{QuLw#Zv}oQq5GJ0XltI80qO?_V<0LDbCLBx~h}~Q{nG?Dy)7MNi5Q!n( zm23MRfcOEJu-MG}a67L6D2kW*5VrEU2p_`0s`=pk9!xb+*YUV-%1GpSU8KuKsp`{Q z4K2{(f#Jqg)){6xF=jkT0HE$4OFb2tyiDa?E?e0;zG$){${{lG&)oA)g|@HZn)Y)xX6 z$u4c?P1Dx7Kz39VOZ`U~N;i6k-l6$jDn`>8+$@pqxvM1*|FIk@W+lldUH-xLK4PS- z-K>X{CPf^<13n4vleb82$+^LH1;4~|MBKA%V;sG0&bOXccodV<6 z;r(!#aa+wH<7TR%YqH%X;^{SS0fpLX3tZ|t%m8Ng5|J39;evD>R0qDf51oC`=UUUzB_@|uCeQo&H{*Tc zXRgw8=OQugp<2Fl@fq6Nl(GB9Zlga(Y{?ElNkiUATAx?unoGNd^heYnq0$pm1{?p9 zwMZVx{`a*4e)jHZ4NQSvyRB=lPeIRi`9X=2WUIUC2usb0tz*t{478w*}rN_i@O~@9;)XgW= zYJu#tx!h}+A8(TCw0{U_E51S}P6O?hE#O?GGixE&xp{P*U^rT(+K~s{6mFthgaap9 zBfJRX)LB!f$##o0J1gEQl;|N`hWwIP;!5s){<-V)!`<=(snSJ@(MaPdk zqREH$=g~&M1+7x)HH9|t@O(&o@^x=|p42mDi~no6l@NBt6ScRa!|m+bS3=p&W8t+W zLb8uz9_L*36g^Q&*DLv7F)^lZ)CXq<>)y3R@74ou_AUBmMMduD{HAJ}Z)A)x00_Rs z!YVsncx4-=XLLNgg*D_uW`11e*_i+=-jRyx&;!c=Fb9*mu<|0QOIdkdU>o?R?&ax8 z1m7~272_4kV{Kv?bD^JAkIqI21B%FG#7_)Qx%)e*rtqB-CXl3xikbf*A&IQH9{n&Z zaQx=LZb8xO0+Vs4(34p!9KHI?yOAj}WMXYj6V{s(_ERSz@902p(E&yWL+1hxz|@n) z^5A4%f|AYsomSJ!3GN4fbxn^By|vK#n&_vX+lpt4(W0v~pny(wU3#sZa-E^8>bp?) zi>=(BE$3>l*9j_FMNM*I?}5#Xhvs{;iV7 z(>zkus4Py%A}&RypL@s<@tw=P$QxleMH;}nORe80vAi+Au6)RQ-9WbXz*o(R%*A|L z+mD>Wv0z*vTkn(j+eeOE+@GvE$qB$G!|-Rfy`3s>5xVIZAAY>^Xxp0#b0@Mswp-1+n?`J5(L+ zitln562`yNJy4YdmgOF3mAE*mlS0`9CJ;#9qix zU2NB!^RjQ;upb(zCExTs(+Oh`V*AfpkcgNS!w`OR&}(;IN`sZ7-Q5+J$KdoZuTq=m*_`@Y)5wyspx-eQ-W4sI^^g6)cgZdb@?50Re<~Gu| zcM=7fdmMpWU+Af7MzGS1}K9zyKOtH)>8{O*11Oa{}To$#Q~5BAl3 z1q3!jjI<2zbbE|*+=qQ`;$W_>&bSTxx{*=|x4N58mh*%?-IxaU_%mbDYM`O(s|o%*W6^wbBD zC*RZ~_?wRB(g)4qMhB-X$O+7I)dyi7^q5p^a|x|)lGE^`fXa%+n)KwnShjEjBIm8v zEE|XIvp}>rcXG{5Zm^*emlD`jFU#fE=ONitkth3M@jJ{Fj+zsX`0yZ^5izSd2BJk< z`1rNTSeG#I^uU~^Th{Uh9;wLAf)E|tPe<7*+r>CaWw(BCfw);U>B|`R8~0<*clrWS zRnFY&#$BrmA(6*OM4`kiRo{|tG2*?r(XzP6=;bvR!_B zn$a#ROtpD@deXc0iUmH?==65sKwP=fwSc4&>z2eFkai9m6{35I|6ZX?bxlOSO z5fk>$oEMAofV>a1`8a~Mud~Zt?m$=V*5|~}faGbl#su8|AqLz~l^1fpf&hU-r1YhDT`7)GLh39vM5?~SDcP>rvVY8LKCw4Dtu1j|0UIHj zKdb|sx@uTI&nk@ud9jnu%joL5cw7h1#J+3LOdYMf#5*HoM@;3f?M3s4DvD>(J_;Bq zO(bo-+zZNBUV$g%f`NjKcsFD9Td~IVB)x5P2AeSR(^@I~{wNd*0nCbU&-~pT@_cWj zB~~fv-uXw6E9TbHV2JWT1?s^4!s~PXGqJ7Xm2I4HTzM$pV~>h^pXV6JF>J_^rXJ!` z5H*c1GDs>$(joP@@`}QfiLd$}ok(xm8rQ-aWUKO%{8usZ50x)YaFW?kCItUJCtWq4 zMe?N$oD?~a+=_gIHW+;gODGzGFZm2^gZkjEG%q^H1~6h9_2*E|+3sf}xH4Q++c};o z8-S3+pCEzgOAF_Y%K_a1?WZO6)5kJ5@MC-&TF-Q1nYP5(dD&ngnvf1dfT0J6f{7qH>mqx1=q2_zw-VQk3Jjn zVmeh3ETsQ=4aVyN5`zVY6^=}sDgK`t$Ny^+@V{QH1WBI2o>zIz%jZhV`Cs3%x^=rU zYCluKV(XS0p2PwDwoTd<|AP!(+MM3+Mv(!bt3IetA|^&SY>}+0jvMC~8d5S)64N2D z)q63$CVWT;bA0)5rN&Vf@tvLVwY00L;b(DuiBs1O(|vk9IK4p#nJgP}of1oNvDTBF zALMFJDrpS6rsreY$Gf3f*7MuqyUuR3jkV&p6Nhw-84I*03qrM_b36H>gb(o0d5b(j zu@+f0sR$U$Upq{CxB@B$vH*Q(U0hNj4AKAMWqnKsUP%fWcZ=jl(gwOH6$NPyEVmQy z!vLvTAQaA%8xcKat7kAk)kcHWZWSzAJ6tl#O#-f=bbp~0sIkmTJmj=0l)%GgN!Qk! z%etn(n3X50_N~$KcvvM70Q-@b0c9a#eyr@|ZsToA%B*j@FX68iibB5`&UvW6VJvd( z37}Sz4M2E{d&!n?6uxFbKI|HX;QU*?DmD#wAp$2Zwjlb0)|inU^FJdDKk)uLz&@M5 zP)9}`UA2`8_8~XL`&D|`ryMUfC^vO@(ch4rP0-j9mcy~-hQw8cqw<|%N$bR#w1-Zn z(1X@nbYZoktt&kFjlI<+VYn>!a9G-WlWdHz48A07f%xq|CEO4h^TZQCOEtodJ79)Iuy%Khne8X5>nDu0-8Snk2CGP5vsrh=>bE3@)hXK<}%aZaUA-sR+ z8PC)?X-gm4byE3>j;!MVZG6}&qAkP6Zg&b)RD7YMfFqRK-0OSF&z5EI?cPBt6Ty?X z5)}^ACT^>iR;>-wH!>&+o`>UUHlx>km?OzV^&Ix9NesMKKU|qRkkuG#!f!1c$Ha_S z>^Yymv_9E>1+9kD+$QoL{@M;BH0QwlE;;%jM}uHy=JH@@PEQK`VcrBikF+_$X=nTn z9LLxvCUYjN@vDuv)o!i%!l%HirdD&t=#(~Oz7&P9&^x?puQS*YG(m#6$2vMrs=bJ& zvKGjs4ej`{Pne|oCP`Of1-@y6XPgRViNn)Sa z%ZVwn?1EKm^eI@e5ij~mA&*s4KYX8pqgT}Wy`hYqdg~Oa_6#&j|F~fc{cuG{dUQUf z=-(2B8`!zVHybu~dd{+v;Bn$>$`2pHd_gp=+NBL9c_-5AXgBKR5MGp-4# z8xsi(z&QfF_8S#LkoorQ@)IuKq>A3mxI##-jfcllZuvdcN?9t+3D56gg8uhi!NI9a zuc*{FYj6Rv<~8GHI?0!+o$e-sAD&Nx;f~$yboII z#D6;M6S>v@H_bLQ0C0*9PK{)w=uwc`7;jN#7@gGJ;i;MgisWPF^5)w0SDWl7ED&;< zP4;p_eCjCaV9am~yKAH0VQY1#$NQ?CHT?v-x_q5#t!Hs#o0Q<|bmkhXYbVMZdf#lQ z#LF3qzB`%3kW^N7cJY=^qMBgb{Ku~4a>Yr@1ymG%z{llP%zBLUk~D38cXM5_yKxuz z#)w~E7zUVRKGat^z`6#YiPwo{wj5VA6LGp4h^XWVL{={#@HE+T_}uv(x9xggN^bLFb+E~&>+i7|X{5RV!{oHO9y)-nN{gC-wb z<-5AVXO4%D;iWxxIm3|HYsl3%9r%K5otx5>#FX-90@n@}tWamC`o{NV)>gNO$h%WeQ|6OQwqbDtQ19O*a{dnnS|na*1BA@( z_c9N2^i__a@K>N^vPO8(T7)B^ZXr$iYy@kayvN!Sy<`fYxUwF%fOnHa->q2B9UuWLH0oNdx0|MGIQ%joe@#@y0&NswSr6BP#>S=YS zDaiw%*Y`ojnvPztfVIa3)-p(C%IUo7-p%L&iS|BP={_75#LNe3Mn*Sq$@Jp=I-fyT zAJWrO)<`BJBy#_KkUhnvOtGLZTvnYHI`ddd4kRbzPpqZk+g8~jWZgA`yjRmflbB7iT;5p6I1T^ zRrPCxFy?AZb%dGtE_*i}qS|wuy0$X2v)&|Jv-CdC@@XFGIEGU`Y=G&n((Z~nA&xpY z+*{wx`!7IZcdZJc)}mtid_!%nC*Vo*6bt-CVs_{C8Z&3^I_vMaep@V%R7J&y$qvG0 zDXsLUo!}JPYbQ)V39A)`Le65$UM+gPMx~oDTwb+5e=}qMiavEHF!=quHuE~1OS^S$ z$aWGifPwg~XZ53xyQTP_s@^ctl1;kx?~vV6z1%hi8nBBqI6qZu;!+MSBtfVuP*Ho~UrR^2;H?E?Sy1-g<`AQHHg^QT8ex+~w5Q6SShA;NnJb9> zr1R1ob3_R|c@h^B<*g+v8mkpPP^0lRIbh|(*)`v`{l&T%aUBobWn2MG z+t-vYo`ltSGclRQN;YOHvKyRhs&B!u*hr0`={Zy4`EBCk! zMDY4qwPCgD!f{GGmI#z6rn|qyXe%@bZx~mQJ2FkL+LKM|tzi8w^eSFBax+HehDi=y zMK}UtCYS)z*;00nr~}6091brBi8yk zy5;8@nsm6KP>mUu`v$BtDn}F?s~)C()+a0bV`3h+!uXVLD1nREL!w0FbCi2(IGq$L zEag=YCM8kRr>+{ZLN3qk2Ews{i_l&OGZAgccITsQ`f`z!FpxgLRL7KN^N23X(4+s9 z7l-;fbNDP-(dz49W1#8Jsfuvz#2HAnW`=~MD)U_{5MHGV4K`jEa|nI zC_N`eIkPVru_KurbtCF*l@)K*0l`}i)IqkcO^xMGf{-qCp3W1O#UZ`eY+Za<3 z2dH2q1G##+;iM^B}FQLf*o2$pn*kaU7KB&Geg#-SjwdGB~f4TFN z_p(QA0$mTP{IO!?%bBhSALbxjyOs!RIJS$2uHv*YNt)F@=p@07QsmpQd~`#7hPG>T z1a9)}THEv~Jk}+zp*Sp1m^nLbdYD+Em0rL-C)p|lPvHv!)oTQa1r>%vPQe72+rnqQ?>PZNu>r3o znMq0!>h7AEtE00_boE{bcI3=;mdm?nCs)H#T8#GdpuPLy z$20XHL-`bj7=j7~3HWuJyDC1c)YhFOTsNvgPYb9Hi)M!MhAqWN_H)1ck#(y$jB&cO zw%k`Mu6?i?n9ipF(Ad+9^)eTJY5DcofHa0d{+lD=gcf&of+X-eb|c6cc|#P%*tdWH zs$wOa$bMsO>H@x9l`4GH$gb>z@D_~oamn9NELfy#sxFvxhv!QRy|tQtrvs=;VhF{ zR^KoKl|uuvt$sGye(tLt)1bQsYlNRU|Vw^%+)y9!dzR(T^cv zmZ=X5T?JmW$ORXJ#*538E{b9+qcmIng(`%fAE=idck`FME< zInd3rS3%YL?&rHy4cofvM#dezG|z za<1YbJK0O;zHq@$j|6{MMBQx@7HSE&3ZzXpjonkhJ#(1Tbo=#lOwceuv)Elrbg1#Rv4$-;5`rci^4_&8o?Rz8J6$53E9W}oMn!5DK zd-n8w?>o3!B2ve&>tF1)LTP`3kT19aOqQM{2I)Z z0y#ZMe-zQPhDNy?{eg!fwafSqLmq%GDRf=>%YpntNQN`urN8)pxcj%{G2SaJq&bO_ z1n)d07>7&n5ZZoJ{5oMrYG@#}xpo>P6S+wLGNy4n!;rK2fk_2Y$Cjr3qY@|x%w&~f z+=L{=EkrZ9mN9?0ccaYUT(Yx;N7UH{m%gxDBq+jZ3^{{U3x2w|o^!*-7G?yR8H}C{FVjUkx2g|xlhEvExUd;&09tgd~X=3y#FcdE}53DO@5auwm;l=aiz;Y2K(#AL>p5jG4jf<(|YV{?Sy z6)nS(n)z4P)Ic(eV_N&&1#H#uy>ir6I&B)^Su~H<$XbJgX?+u1c63XA$IcPXy?Gt9 z3t{6Gu0pLYt|+`|2jHMV=ZfPhp7BgPom@y~tu^n9@1aLtrrvxdVq?_~a4O%eya*fF z%S>I0=UWW+=EnY-V~HToJgN2)n)|)7z8*_n>eJ!RhG6sA(A(HmvXJe;j~LXm4X=Ai z)Hk0?6vjuMC~u*!|5$O;XHJ~7_aALu{Y08aM*K^00h&*&dS9={j58UmLSi7Ba$dI9 zgam|owK04?S4e;Ve=`#g+3+eHt%t*ieVO%8;$L6|CK=-z6IJ1k)yd+@fZS8)k(*U% z2JKR3MN#hN|7qC96wV530wU~6b68$+8-fRYytNwe;UKDYna?p ze(L`Htr?fp0xxsO(3>Tz<^Oayj4wbj`6G&Y&|L8!Aq&=nZodC%q)?e@UGOBgI1@mC zDVPuVI1L%PON2@CpY8+9K*G^KqLiW6eE1_Iupi@G`A>sacCvQghRf}Q1A_S09sZA1 zoa*M8c%ATt!Bm{DMuRig?rmruUG}TM%%u>habw{x{u8}x#$z1okgdi4W`c)NDh-3~ zL$Mc`MYa3gR}UVLdU>@eSH=$ajjDs5zVgKmQvvzEdc3Cs`&-J?KIt;|s~0Oh9CUWp zHYn$#Ftgy3Vp}s9NugrJ|H}kzrQkJ(1pU{xN|&z^JMku|G+4t6ZMR@FY-ExY5-(^a zU@l)PZ1MWCUDzg7TD?8A6gj2NG94($kk+^scz?6*+AQ4g!ZXVh+DzP{Q`f}}A+@(d zAIk4EmSns=-5ygth#Wo+ibB_y>y?q%V2$xz zS5fI7ZMXhs4i3~VYNrz0DsGphiSzGI=;QTzIYAu)VkNfM5O#pk1uo7;P z)!mv2Jl!sva%sFI`MFTa%eBa;$WQ?t683Q+vfYK3$Y^_OEs7!c2@7(6ef|Jn$R1fm z>M%aP^G<~R+hkJR4;yjVHGr-+YyU6y-YO~%uG<#;5`udmxI+R7 zF2OapOOW6e+}$BSaCfJIy9IX(R=B&nYhi_S0r}7Q?z!Dhw_kdUeq}IfSM9x*%{AxR zHvZ2xHeaG9)pM(IhTf8qz1TCc{0D54)a+Xxtf{=>Z2p0XnQ!Ib4t?(O_%LDhLez~b zbxl%af|UgoZDOAUMqVbeX0jk+&z1i7jvcy_1@RZI8LO}9e=xo+Q#^Z2I(ScgveO!V zQzKkdhH7<2f!Ie9ByJpEDYwRkRQ3Y^>jYOjDwwf8>DkfEle_QY$^ z@}*aZwVp7Hql^x@_&scx-vrFoUt@e5CE88E0yG(LIzolEddKi3SDb= z0}~rCJ9CS>wkT(T4gDT&@ODNLWzw2Iwc2xTeosL5=N;nBe%{Kx>V@UUphmab&u-b8d;~UYdpRxT0J{!0DSQwxDM>*_@*nBd2Kf`HiL_LH8yq z5WN&iKvDM1P@^BJ#B{Id*y1`4mp#qv#t4zxUDy*Rp9bbBui%c0bW)$2#nAu0gYdi# zNQ%8QfxuulI_{+k>w5$&R69Ym&7t8H@~0T_TtXsc5-3QaO@3#9Aq-P`)QSvlO$ZZ3 zK5un<=Sy|N-;qQD%414!>@{o5G zZWcSQczeN#&3Y{gkJYQC{+0CM0dcb}nj!g{!FcYUzptjcbS#7tb?~Mc18sd~;SUNS!-XQ6h@Km-_jwy<9Ca2?}^wmZ{F=Y4K)t5tz zBw3Wqlu0Lb(9*n(=Hlq;WP5#w=ce*O&xYYkFuOV*)rSD+2CdqzuYIXtiSKDAo*{d1v$GRqp4cqjtV3)sNO{ zQ~S&zkhc!*o~_l#7AO7zjrqXb%nepIt|1Xcr<5Mw?~~zq9UYD|c8X8_XDCQ=9!rg# z?3W?I2u2TyNn^~7A#{02E&*pKGn)V`Seq#WpHquP;N6?cUX6*j(&OxJN>uoKZwF6t z^NeO%=&HyHt@ulrvO{h49Nt*~KBv?svMN?*O~ zq%y}N*7f4AZevWeKO?o|bN27=QOsbxiKt!ib9G21>nUDHD-L8oKiutay-I{rvO z*d!+cL5S)$fO>ytuSGcD=%Mz@gD>OV3e-aMTzeQs5jshACje~OouMv^{;tUL!v@9r z>3v=uE=b6RdXE={4o91;HZu4*TTR=RK+7qSHlAe-KjKmxx}>&v$zG2X%w|3|#iAZL z*vv2$qncju{ea!;?yke&dcs$+ZrUw zKBmQ(8T3y$Ut~*2r9*E*3pIj0$2AUqSj@a~hWa+c=FG1;j2QsfyrX@7tYxKLKb5Qe z)#4mpi+(bS@Nt~iy0SUmZ+qym-<#xY)PzCDT4c7%h8M`YMjADH9(VrV=y1Zem%PWSvpp6Y z1jbs1_+H=FEGviWZmcgIj{Aqq3$BQT@|^K=Y&AP@y~Xe$gm66X6YpmRUoyI*t;!yL z2$y*hoLIfSdM{UU&oaP%iCKYb%H?lQ5OaI`AwHDA93i>N9fopV2jty|ej_&*z!TU3 z06HtT=g;cXp*6%7ALWQ6Q9=P<%PqzhM_=@DrGG=hKdk2d*z z8Tk(6;2u^^u29S-EU!8r0y49h*Khn;9|_gnlgU_oO%SNkf)(j*^B!*&zOL|UG4F^5 zGFYw^HAY56T0rr((yJW2CAt}mIG-tcJDvqsjly#W&Hy(Ah$*}N&Jfea8hgZ*Y|rcY z#+nUKV#o5g>0X2Qz|!)Jp8cwLm;932AQ#}%rFkbuoFhAi+YuL!65mCRem zWL~mYB9G97?0r2MQbiP~6zO);O`y0*nTt`Sb<_KK-*VDK5)ggm;xFk@O6~SY#~KHY zp+1tr@lQgY3QKdIqwiNYn&jiXb5FlhLT{sL{jqb)g5Qs}aebhQ_$mKVuGZS_ykRBa zK~iDeiz(CpZdB=+V}sxKsV2!^*s-;BGMe}i6-L~mG#_KelxKP^_SOv7R*z1{S*0_` z?OgnuHRWKHY~&U7nN#zsw(Uo;hM(>JtQM{j5p~uZZ_{VZ*ls>v??;TrA9hRb3naB{ ze!sIJS0XI?N;f7h=%`$3KW27a>wbn_J-p?}DEl`=Xv3+Mx^D5KO%kIUDa1M|Mqabs zsuLV1^)7qU$A%^Q+f~9+_r%0;(sxBUJM_P!&}#3cn_BK7g-iBQCv=lA4e%Po*X6rl z=u&QSqUwTu-cQ99|isJdaVXjK&Bd)Q8RAE|T$tp|u#P(jYE(x}^{@ zZ;5bT53=zd2aL-<)iFwT`GHSbWP2nKv{5$X17P z%7&`LFXlA?7fGLmEPBsdRK6`7KgMxU;KY~{a0fk(-Hg(t;xuO>pE#yzZ@YlM=+vYH zQ#(ni-E|TU;WX^NQKY@O#_>Qddi?f-2r4gYd0}zpkz(;ACr9w2W!A9vtv`v*lv0z* zL%yi1Jw+}Oewau}r+nkO@kOE&Oa#*e(YKRTm~JPw$M>I*7FoHwQ>G)VjnCDPaG2m} z8$^By^kf(_I&;Kp1S)xv#>8Kq)|gz+vIAz}?H0_Ml#gs;<2ktq;ZK7C-8`UTklOjv zRw+*=tmCyKZwa{K=|rrL(c$2TB91UvbxF_N>1ogLc&VS5rsNXe27 zi>HUCBb3<&7+ytkiiIV0L+H_inH(^pbzkyY_!#XOz2F-D?e$1x2rANus;Y)JstG#> zqx5fnD%Gz4@?s=d-I8PHr?+k9ov-+D8Z6ziERQb&fDa3_e`Hqmg(-zRs$AztVB9abbX)!&jlUaz~9%Q^4J^4Ft1>Q}=0wKnm;R`u!V z%@iM!_t%FG=A4r3)wAH!e9H%?uz9hTJ^iyy#m*~x-nUkS-HEFhXd|SrUp43IU(dDL zYzq=0MAK8l4qnRWP&;V`dst0|C7mCUi9BMNUaM>WJPMKr^J~2wD!GR$;kpz6{bHDi zZrS%WI_x~%HtCgV`p!*NYr-}gROfC@?H`utzbr!AQ`~%oZp6Ma<<$~_yQR{RSQcQC zu8#WdwZHDc@<-qWG_F;JSGyvMC2p|91CM+&$ofLd3H20c)GK(g)N${<{Q|)>54V#P z_E8Pg=Xq}LE~WFMa)JL8HeZoQSp0CVGRY)8ffMNz$39V>6}buIsr<7hI`fHVii}D4 zfsUI0?j}x{*K_GLm=Ro&67&q@ECLfEya#;q*S&tFryzxkbhAWCUapL&giH~-6~9%1Zc%^=v-#$PMoBBIY3n>b>gi)UO*_+Mp- zo=awf8fSgz9SNH(kAmf~P!Cq7%fK7ywhq{{=~^OUx-vn#_PDQc4W%8pn~2H*MqCrW zwzdPwoeSNszOQwkjn-UM)T9PUmu+GJA`-J&@qG}-;qxJUoSt|YVV-^Z{rImH8a$P8 zLt$1r_N(-KCEI$Up>uZ3M8s$hV{&$FybE6q2YXUF<9+*;Ow|5(R7&@(UAdX|#+;i2 zRD1PZ$N(5#s6}~UqRkyP0EE8%lMGku7=Sf0hU?|;yGALQ8$kc!5~4ut5qYU)8md>3 zg=#%mO+(I;ag6+QL9cS8*R+u)$)`biK1XkV_Zz6UTvNeH-+UFj9wObmSI22M4v(ve zuhQPo*>p?|S~Vx6-DiV*9g~R>8y8gmrrablwAnUoc1~2Ce9H;)pcE zi2D+B8ywj<@;9eByEU-7d;9M;E1<_VZnznHb7BNyy{HOj7t`DG*&euK7wa!@Wuyp= z?^1UEp(7?fBJ5frnmWet`M^w1F2iBg+qrJ>b>ZOz`5BX|RZmK5GyKEdG3#Zy61q_) z>14CJWXCPts{ppz;v&%GhOaI`&HikWrNfeFi+db*z>YnPO8-S)ptWqqoWj3sHhkn# znX=s9ru9=bAYgFRAKGcT|()jGomF`fI76Zoeq}g$Ga4-H!x{pk!q2O_NOy!y1#Ba z<=U*J>Mq1N7zZL+f39w+(7X%ycP6zl-op<$C0BgS@Dt}oIoDfC?iq^)>yC+VkeHVT z`d9EpwOTwc+>(BsB<1$|_zOl5z9_Hn6sxfsT>)nH`fAW1+%DG9mcFq1zvB`km;9h~ zyEG0{VXtk{D=W(+RFcH>P6RfA?6Hp?$@fqO7GL6Id8n=#6DA|@%|ZHc1+uizPS5la-WPEIIqV!)v6GI zC6tgm&jS|&s9B>HP-Oh%sA^FcMuyLp5Wz%OwDY}3q#t)C|E`ymFhKRrdWGn(t7b}X z!_q_;(>tB6iQ5^OsxLzFoA32v&t2-3+Yf8~@n8XAQyDf(ZxVlw=aVZdA9VBTx(rA` z>92R!EUUgiL2d(fS#gz6ni$?sc43XDn3Cor!ORFOX zOz+3o7`uC|vK)~;BVL!hu)g_*Un`V3&f{vf))!fOO8h=Kst1Gshh!q^*3YF?e)M~p zu@N`wPjH^;4P|(N<(}Xiih6b%q9~UYUHZUiudumLGoX_o5s_6og#*?N zyq5pP^|(c7HP|eMvp4&8@d{-hHiXCqKh(4&;Md>^G!Cc-i)O(cb6!@Xi;sQ+JVSd- z?)cqBa8$Rs!7}o+_W_4@2`Te{Zl51Xh2BeGslRi_v`K2R{cy~#XjSD4VY+!r=FuM< zq1pF^^Dc(>T;O+(^qPL7mCAE$9teL;ISf)DbgBsB-(Nom(( zn_Z@Nu7(Vw<*}IdSFF&;2o-meGVX?)kO%EO+^#!>GTbE}(f#M%HAa)Y|Mb?ZhEUmp zFL)4kSog7>iu)lltC+I>du#oVsKvuK-Qkv5D3Uf~*5FaD-L`p8H^z#Y+{(wcX#Bl6 zau;|uhR=#4;c5eIA2wBJb~U4qbx-qGuV-&Rp;3p|r117cPdLW7LS=CxJ6!3s#i4M2N^myUQ9i1W5EW|KoW;^n#?-o`UpAD%H>5 zmL2uH89l8@A{F$<^Cc9Wv#D+YXQXrHtR55#bWexeBhgg}jN8tl_HqkAS~O8l$!t%ph3Vb70u4qQk{I#{DO;l zR}IA@gTc=6v~ju0@+A~WYYp5AMvUqBq~)6J75Mx+Nua39!|Oj(R|BFrvhj#(L!?b{ zIz+y6S>&fOsuQx^MFon@Bi|3SQeD##*6V;iYwi%j$0?~wfo#Kff`Ji#$Y3Oo(c^1a z(8}s0y1g9}qzR~tEAvr%&QKqhA@H}P;&cB2(Kn83`9ttLYv}jk+voOKW8qXU zvvXGQ0>uHo6&F_WX|#h2v8jVe12wF!pT}g)%)^;g-wjEjLP}7g^9lM=c7bdY1~#og z>;ff{zSwu}KT>Smx}&MjO|kis0U4cT!X!$f`Sw=SxuMojHXwSlJ->%8G+s&?5@%yr z;m^ZAnwu)v1)7}BJ_d8SNzNGhI2xZHp=1V#EVoA|ba%=xljf#k6@FY?jk3Fa=gXBz z4&So)VsRU?ewb^mZF-Xxl{YQ8spU5=8S;%}Ml@O8DWTrET-T>U+u7$Y*g()sW{NPy zZY`{sv&^~@JoXP_gg{B&Zp0F-9&*p3X`id(n|5J>l)0{d-wLPG8-0><#>{Xv6p#V| z&s$5*>gJHzUh1sxcX`05JUJ#vgCkfVR&c-xD9b=EBopqIH9kjqZ9apM$M-g( zfC7LPUY}j%yyGw{c7K8Uu|W9d=b!DUK&m_FIWGp0`?SJ?69+3gI#o+Fy91?*C8IdtSDi4i+eEuMOY(Pz2umeTk(<^x9++}&S86N z8I^Qin;*ATlMcFGEXX6Q2%D_Ja#2|-shZ$xM2pf?21Jjq6UtgF*iS7{d@Y7HIUPq* zm}An|#CH>Li~HB>Kx(8v7MXPx>%f-I_RB4@7tq%1mh3>T$(00<5WIawygrvE8lS1P z+H4z121;_99~nFNDGnBxfeW3xVM9sBoUbg*7ro-d7E;>3p_IW*XLx^1e>N6_e!qf( za>(_A538*GMAgkk9=^KzjXV!})t_>j*gQ2Y=p8G zqk^Yqx-Q&Nl{xwPWxLVc=kW__OL?jDUg3z>f(&WcU^aipno2%I0v~U;^mYB!wWI`y zT(hMKRhLkDe(}cf9I2JMM`B48^)p%cNCzg`EWf*XNQZjP$2-{OMoy%nA5IpK1On+ zck8DWiGR^FG5Pkcr+pQ6CT7OcpO8I%FX*5dt{T9F0S6KW;;}YQEhaK;uG7hzszLVy z*+^- zq@2d}#$vif&XU-cH!!#@uyxWQk@zc4H+-xgN#VL}s{E1LK+nDh^Cb1k-;2Iqruv2D1f` z$y>~ak(jU)Y7wprXV>vQExOEzk}qZT*e7!*9(SixtW}kb$8aK`@UIN+Ao0{XFiKDo zrwPi}K2IB@cK`cm{X-Eg)V&z@xV(Fyu3y5GU^OrJR4j@29c3=6t=;m3$TMBx&;te1 zOLLN4MWt$}y^MHYbj77pXCbnb5RPeHro)nKi+&vISQ38$>o!smsQX@o%#e zD`yp_R}?ZG>t9BH0LWK1=fY0WrlM6gbq3hj^nEL8@9RMS{n+gKJL!b&wwCcR#W$M} zC}R+iDY{S~Y>e3eErAk89I>chEPC#A@TN-P3R#Yl`p$MIWXVt8CtIWQgsl6G3Bx@n zZ*L_QgbEvUJ;bopT|%QL)~TCmVJgJIj71)iunN z`?4Tr@@i?AoU-eai~8hW_mWxFUwru6BXuVUd~1oXa!D9o&88CcOt8?DciYh3d%t@t zTjy~{rEJAT;mCk+90&DCv!KDz?F<$?h1H#{Ymu@)+d$~?&6il57UY>8Cv`1LD=OAN z$m~FOmAn6}G&f!s~)@;2kK@B1bNJKrTe#J{ju zmB8M3(Ba)~9V+FvXhgsC^q00FW7Yo~q`pby$2nN5A5kL=%BBds$e zG~?HueVSl_f(zqpVzG~3Iq4djEu#f}ZPj)74EY?HUlLKS*kJu%kWt8g0PX*>*~m;; zMYD@pZ!^EE9fQ_xm?BXg)>vPBgNSqzxNrjWaH2-N*sE#EKuv~jN>j0bXr9+g`H}cYy zIt8miC4ka0jAJ_ul4o{}BXxk)F0M~S0#fZoFY3e&Zl(wR=akUNJ#xLM^Dh^KR+4qn zP@?*KN)F}vnAt03%c6Mm{5Fu86u!5=inzHKbUgY6&<}GD-48zBAv~U*;ay7}cAM=B z+&*ZZO5L}AxF5o*DsNHCdh?$W7c$wM<~uN=){X|(-*R4BWkIT@l-l~u2d&%us>Rf4 zqmiWSG5_^@PDI$oLsrPS|x_}^m+y#wQF82jdKLL4)s zZ;JBqNa*vMSCyq?GK*G%*j~8g4aublg)_R0;S`^=$%RAT8=$cup;vCr-0jIXKfdBt z#3CW)sJGRet*iCSTp5i-N&Uf!9|1YzZeLd$oJFJrPL;g|n5crYgg~M`Y?X{4oh1oP z<<(GI)Vd332MgNQaVEE7T+MGbLw=K-W?D0x1`qb=o%x{x!$)sOByR6Kt_rw>cQy57 zX!xO0FtT(e5S9a(fy0J5%z=dymPC#?L`f+iW7IkPWiJwc;llNwA61HG?>cahT3@Bu zFx6Q1m=FnxQ`UwMdf>C;IrWnI-n{V?79s|LN)Z`s z))*Ss3llxjWqSOU1E|*dv6d}6Modj&Z}sDOp+zZ+P?=7bTzC9X_9uvUH(sSj4C5*P zp`Sf-+OkDD(!5|dFMaz=v2p{fL*%V8)YfVoki9)9@T-a7v-*s$j@-iu3`+0HS{EGE z8|BFtMDEf98-q*>KDF=LXt}h7UtC7y9DjlJAtb-lztm^Lc&2GJ7FQ8K#VMjG9T<%) z!ASRakpSf(JcG5iph7RNpNAerN9H*)pxq;xO1D|JjKSZqa;<_OF^@a!4@iOh4wdD< z)aFOw)SVGj)+$d{$4o==9H?GHus5pCd|O*_xBNRbea5g3``5_{IDVg*Dc7e-I$!yE z!Fe9BqEa8@q<70l`ou5~$}-)OIOnZ0?^K>%^xCqRDLa>=hwkyj>xtUOU%+QapJSzj zs(3<^>nst1+5~Q2yLy_xSF1iKK+z*Y3;z){Z^Ox|k|z5JGVcVzJBwjG{*0DNDbl;K z5j#sdz*^Dbt&ettRCj(FYSga64x7lcN`~Woe*9%tTT&aF zaeFH3YtK@Cru*eboJufbG*S#xiFN;$wuimy=s7I}GnlZB6b^`LbXYK=#< zKU?5Sx7KK>6`;Rfd;>?!Qzq678^Pr6Qa|>AV3t+wiV)?J8v7;0RTuJ{6|Y8LU=lDB z2w~?;!F9$M4A4o}x}i;d$27#fM2G%(#bBl5r5HEm)b(S@7?TqvY@nv(9O4BxdK}BV z3XVFMn*hig9T*NxxG^wsH;JhwAo3mlp z$mh^eTYqWB7N0Y5Z>x_RuEmI0v(r$ydeuP>;(hqi{ck2#sh!){i?5HqC`NGRdL z@WcZ?*fTT3GERr<479c9>&`p?-PrKM1z?v7y?v|rG;m6J(Pt(sZF6qIbvq(g^B1Ka zJdwKS346%&`UTzPuv9r8>MM~g5MT=~*Ie^wEO{OCBY0v8C4@F^Z;Y2d{kb5VrXUCd z(|1MNSw$w_Ltqc)z)xxnpTv7`&ranHcE6Q&&TV&-m@13atva0RXMgd?iJAXqVkRM+ z5QuT!lbNfV96TtZ^XK$ir;Q;(xJ(d(1+h4&yrk|-{7CMpyMpQv=7lKS-zD#V++ohW zz`A%EqXV(Bi}hV?b3UvWPGn=@1OZeMw7d;=jqV7}>1j>8$Mi|Qc>Tu8O$Kz0 zZ&7XH&l@)6gjbR|B=i{YjEv4nvEHd2E{MFVdw{PeAvf-WAM|urYqJ$EZtBIrso@tI zo#a|}U#<5a+&0^UzCtD<)i2X6h%uK?-b7vI_80-d!PtSpDwqGrK+9K)q{qrMokbZb zC*0P#6WVjYvr`aK6^u8$<(#p^-sCy6jmlzvlrpKS@Jv2@rJPbfb0*QeCjRmE^~UC2 zXnzXEBPO!c*1w1Lvs9(=%@HzSjf-S z9{1hjv6^0>kgE*u+2$4V(R7tHSzvVTy~7zF15FL&38(&nwjP#(L#jc6hzab7({J@1 zlaN`cRAVg^Y|O|(;($oq8v0LSK^+Uc%_U3IJTJ^*O9O6i+R~jU&=IHM)v=kQLWu`{ z-}w~23#Po`veQ`$DM%23H+z$8`NVeB$z&9EGsC$0nkX7^`Fse)9)aGyxLRZ5zK`-x zizkFqOdP3pEnGG%G*Oe(tzBR-7p8b|>%Orewk+uH)&HJy%PO=AhjPqqUm$%u!E@ev z=^z2u4tCS-_ew+Q2MPYcwy^ZIQ@p~e^3yr6qap@_XJ+mN(mwt zxlq?IHGxCIx+K=hB<|1zou0a@0I+cUC{nZZe0TvK4jC&iJ>W1M;SK znXZo>b@Y#+*|OcM;+G0X?KpO%&>RgKO|AGrhuBMGlh<7t@jk`QshV7f$TV~TtmBYo z#*zDv8S{O=339H7S5vaM26iK)MRNv3@!GOAcjm5yyu6J+3ed?%^bg4?Bw^{2j_DE? zD~su@YO0$0*jV4$br6JdLe;J*O4W2>e?a(sdb>vS({Hf5FrQ_&(unMK#619_CCQQ{ z=OiC?E;k^h#O=w0(7rkh?yVP>eqRa$?vEqs2(xqexG0b^nbJk{Kv9%|l^XKB63#!R z$3^D}11nvJm1eHUzBVV9lw*EhyP2ik88u+}pcOgQTxI@o%(V(Glj5vK)seQ(c77vo zbxz{k7y20eZ=-gi)z6|$gzha}85@lJ-26{qg~j?oOJ|a2PTGqR#IT;1-?;cspxT~n zP3W$g*T@XMaNx!f&=AlMVE&s1D!0JspmRHpXhg0q1xaSS}f9 zXj_;{PLiXn%I99pj_KRjdQp^8Zm1o}=6E=sWwkPJ{(%7aP%+QJb9({*78lRFh~)O6izF*gzKY)7|AZ@OrU(|FJwa#}1F za+A(Vq*ehh)TiE z5ZhSx=srD35wa|2zw7L3$>qZZS2}Sy=1P^?V%zvJ(e{LK$sqYkz8W%k4E<^cL3ubS z81h!ia$~{^8b{4Z({uWVU_<<{yR=D)d(IGFsPB_gqFk^l2v=evFU` zm5xz|P7DeoNeh;9LdS4oV=R~?#p6m0Hr_rDInIynu1KUM7I_uzp612A|AoWQeU$Fu zKTKHbb(3$!?C%S0H`GUSfJ0@@p3Z6cJ*b5?X@^0VyFo@z37uEsLnX@RTWK-kUSGo; zXba~{C5mggT)2>(x5D(D`hjPVP8DlWlz!Qj8M6c|D>{?tvh&&bt(wDbkp`YImqkX) zj)NQ_g$DLHwktN{j(u0hmCBO3YuS|Gh-n)EQgRLEeL#3;S@-;5urj0ZKWah)UB7mz z8T7_9>=AK|>o9BK9y0P59k{SS0kuD&+w ziG5By!dqGX{!$1Fs?LG>996LS2m_5t_oIJkO1Sdj7imEA3(swmw(WLmCa$?NM0K~kCRyu+QB$Qf#P9t0A8W3C|LKXe`>7XuwYT z0T{yUv7Z959M2fR|E522fsxfoqkL}geHiokFEe`4y!>sneL_x_?b_Sk`xODOv{ba* ze=8%(8~T6tiO_qHZl%-N%nwMp$YW z=->X|YK>xy6!%&2v#>4Os{G7GC}-?s6=@{@pO*apbxZ%R>Xsm4wf{_pBkTD;ok0ir zu(x5DvKyb|)yJP?Rz*S<(ob5h?6)A?CzVx{#Dvk4d`sw)Jb*Ns<3*))yB0K;{3PAd zcyDUAvJ+F!im|_opce>vi2Tn*0>A$i zoV7S-*5p2YhRWYX#NO{Q|IbAPDePX9Ul&~%)t{ffXuZVCB2QoRNxJvHEJBv_atAZ% z)ALJAo>XW`e;0v#(a@(~^6y2^`u>X8JWl`a1_T*-UgY1q@t;Nf#kO8#fIA_SFS}tI z_p->pcjLbn5n}qQ$J6Hi|LB&#C&PJnFARB8lbv&DF+@onMQ`)Bi!lL7a`(HXJDPOT z=S`qX11f-N?qBwgXq~>AbaY>c_vJDjG9DOh{MJ!KKoXAo=eX+q^MTd&lmnvrvpuoU zd_GD0KzrHo{p-S&!3i|;hMa=E)dPdY1tip1fB$AWW!!|yBwp$$MJ_^Hpe2Z-*^27? zC+Wsa4XJI#u3$uRpL4rUs|pcQdL4-t&{g|#nIvJyS(}ZjrM1Q8?Q3Ogh8e1ooZbcu zYqp;<8!VuZRP{A?6Q3Nynfh~Qbq0zjBP-}z6b$>Aqd z$M`2bXZSd(9y%c2S3{H6-UU)LpP(c}mDz|`|MB;fD+@r(J`M9 zx#*se3y11;;sw#w5OLc`c?%Jj3dFMiV-IKL!4|nXj^7EGHkc1HgL(0-$_U$k9g&W? z>+ZDda`1jPAP3Fb{H%F9eTV}R(x&5()kMs!^1!muY!P}kx5NF^x!mc9TSag&ghQXc z-DkIVqIWEH_cYw3xi2A#%1ilPlmPISG_`v=@Y!c*Vh6YN_1G{AQ(6U*Nows$5~y*{ z?yqWhK|mdDR*a-1Vr$2TK!tbF*hTjWskc;Ri?5rwn1+WMkcCGUiUPl~%D>{(SoTMu z6&k-GYGsUaRwto#?1qwpJR|}uAAZT)oB@#5dX2X;p|F zR*$rY_nm{t_IO@=)bxc2*q}B_&Uv78xFaRSs6yw`{f(%U=uCE8V$B2n-8n1NjlVe4 zi^{TrJ5O)>Gy9{e=M{~Hx|%ZT0>}|%!B^gD!-gBEkSFfujMi?^WM}q6`CZD-OxGgP z9j0{#IxmK*RC><9Xz*;B-tDZa2Ft$Du2bzVTyPRNHp5f7`pQyhQ%o``Cb%a-X6=e2 zWQ1A|uOrv|Pq&$PFRS|^Hic$a;Ly<{(u?<>E(gTbJ?%e;FObq@OkvBjW1QNkTxW^w zf{2N*Ju5+Ps68N%n!9vJ_D_2dl%GT0mkFc5?|=0JE)pwLQq8yUXA$-MbXutze({4{ zTmup%lsX-!)7Pm9ftoEiLiHD_=6R=|Up5GkW0P`pnL{F>7G65P#Lt-vV_z}DU6nY0 zK1bUzN^#S#9dTuZm62|YM@;eToE(MI&?!%)RBsfx#5@9XI?3dO88o3E<*p-U16tSZ zPIresz{npd4tRryJ!;p1l%OAM`;ZCa$1~$=$Gmx+3Ix)N#4@zdJDE z{e=Xo+`F&Q8GZomOljF0iOI4gpP}l-j(m+k#g5PP9%Ly+f3nxVX&Vtb(&KFHiNLJ( zUext4-Wx0~I6JCj=_Oy)&P|N_rE3eP)gVub4)u^+r`RHa*dl=Nh0`+G^N+rio~zwG zKyR7kHA7_fT>SV0Y8{N2cM6gEK1JX`HK|U(=-w{E zZ*Bd<$ThHQ4(m9B{-FYk!@hST_XuQcwJ}yO(2>rnY@*A4#nWS!>a@=kq_NlIXBUN?z)I>!-jdI$M2uy;#9o ziT?gY{Ob8h}EL1*ibvmIFBQK->pmDqaXfo>hnzRT>m>Z=OQS z^LQYLoD^OFqx?GROd7>KyrW7-)G@K}zl2aJ1w(+C(4H&6n&AXSS4lpYy-tU_kd^3X zlqg{3()X{Zi@vkXdxyn?%`vq#z-)R*&mQ$=`ZcyM6*jM=$xAT26yKU>DXFR*7XS93 z$n#^s&F*!(V-EsDBQ5>I>)UE{>GhPCK&dtfa92eJ{p#$8vU}1)%I}5q1yQ2{AR;#W zL~J@D9LV!AGO6{HvUaf4{udQ@ZsQp{&1Y5%!P0{9rT;)fP&>mM^3z30p`-cG7Sj7{ zs2hR685jI%;%*XgT*=~ph?lvUYm{cgBm+kCnhTbK2Ss&zA%-uygr+!^>h}e{%76D83E#4tTskjdYf3O7DbUOx}J7iWW?q#3sg_oe^ z^+ma*X~H({MoiY#Z+(A@ygW&_!4QMtd_b^3o3FFlPJN`}#KF5kA9ejpY}37^{^p2h zhe%NRV)p1(E$G)T6}(Cb$NZI1sca zTP`CD^eYWR9AxnQKpoB7OXhjb#qnVprM;F{dn&aTnl9f<8Ii29UvfXz1EX$(sB*yU z)NYWcvfGR}cY>GTq}P{hSeP{If4M(P?9gsIE5X?WGAQgvoUI9zT-(Nq9S%cu!_=U! zj@i&bwdFd%;~lQt5$>OtdlA7~l(#lzr*kKmv3Cdd6n`kmjzGv#2#%m&jOqV2PM&sS zmb~IBS*2=TH)~nxOtfY<|C3AZbqkjp_!&)!ZaV6hs4-5A3)JwioK2SL`gBfju8*1 zV%JP7CkEs3pcW0=wPRgS)oDJqu}Aq4FsOx#H{|%G5(E>Oq*$^dpJ+DB=Lw9Te!G_A z*#WwF5bz|c%QFAtJCqMg*^tN#XJ&BkwEW>YGEQZ8+NLVUNM&oO`gY@4E{?db5V7DE zWo>pUJWCKXi(D`tJVq?X5bTeCJv3%==la|JGO@CrhG0i`{{SnRd7&u{kt+$E$aUaE zQYDq=(8h@Mlx4>ci*uozc*fGx+E0k$Tk{{8HrUgPMDIt8n%a+4vuIF(N7))t#36>ffy+ zc}pELbPA6kVjso?Uddyst4Fbm>iWUYIIkdW-!I%ywUn6QK*X3$?R~&uY`DCsBM`GW&n|}F_#-GQfcZ=<9g*a?@P^e996UH z?VMvl%7us6Az=rm$=1>;A>i$=-A1ly;3-=qBT%;N@9)`%+AGt+^18Bl$vbF2IcP^n z0&^$HR|meFw%akX5ZCpSCPDz=z@^W~eCmVbncN2X`A|+Ay)26dxa(I_U* zs}3=xVNfsa!Aq7*I|H#3?xo?o0G$N`gRBB!fZt9ls{YxDu4P@Yywtxk;(AT(3yuc? zWGg0O{dik&lyO5QyHh5>#!3=BLI@kMGo4}&sh5BxoU>9=S5R!mqZfhKZDSq11$BkR zT)tcKHY=0lh6pPHFB}lU!9a7=rg`Ic6LaT8n0}mU_^AB)1}l7e&n@NAR_nmqEhK4% zfP6Tw2OQ%CCu83+Vj&u83-;!{VS?deF7-cc)1-CPY{6raJO-U^DOb_zohXghnIzRU z*>ao0`u_^%2OUBB`bjcsUXn=rWrN2v7)74B+2{QuBj)&uhs}si8y8}a=skHN#?D{9 zX3#_4rv)dSt&C-Wwwc1$rN53QQ*T=d@@IQ*)a`1XCG~Uf#)(VLVvk%Dy29Ak*{u=XvydUe4rBH#Rv4ys zzrHPayH&Tqo`}^ye)E9L@?8!~4(%vz1mYsvrXLEzcD@I75!Jy;cYJbq4M`fF$b@mO zjX$Vik8nr7@tATNYJsz1279~4o9zxBI<)JjWfqjY*aKQfh&gwEEvLWEq2F3-_lM6f z99V`W1?x@5ghlwP6U0tK@)sD;>Z==@%z1*;Qv+B?nss2bv}?p8S8%R(5Eiv8JU3Q= z%1{=u?XQdWj1rp3SDc$(GG8*6T`9>qED;+H-^=)&sxW!P>jOZH^S zRKBJ&eAZT!ga-|dE2W|br#BLd5Sem&`!^Tw?C8f=Jx0hF;U)6qYjEk*F}qPQ>He`3 z!@{@MjOf@ZG7L){^7?H8+zOV5y=`64os*zBcf6@j_|k_~nXs_zM-YEOb35xx__V?4 zyGA9sy0iC41|H=5$gE*_D`%5R!jRez0&bdhctXmV;p5X|W@>2>ojqg+?i!yzA%WJ0 zJRJQ0auhCY^qn&6VP`pH$4vx{$MeyU?Iqm2H9GZpaje=G{pDZf%6jSU563lfR>JBs zKgf5_pYMe~!X9sumo(LWQ^ApmV|w{#>AL{kLK}Ydb8S?@?J@60GMq^+nf8-ON}IJK zE(*iF35<_|QC74cn{G?$psx0yP}h@e|4H%o+Cr`Ndi%lSsE-XvWwDw4=a4_;;x*74 z{50Za{=~I}G~kq9Q*mcJT~FR?UR|LGG;4Leslln6#M^7wj7e=xfQ3W!Hqz6IT1~>^ zDj|b%!XfJZwIsN~RjCV`NT>o5tNOTSht;Io7WVzAWqvQ~%{wFaZ&SP^k{=#ApVE(} z6A!}@HdnEpQD836CFuR?nqw9OqW&-YKKpqoY0a&AkJlFwCo_@OGQD&l#K-$~wIk2n zWmjllG5{vFXa*g#lS4n-{0ioqEOjs6aHV!y=PccUDqzEqM#y05fG4Kp$kZt zE=o~)30;Dy^d_AE0R<_7fJ&1Nks1h*UK3OVlqxl}fQZ!4LxKbXdjUT0^Ss~t?Q_0s zpC9{p@x!cS%{Av3W6n9oJ?^H zU`XqMU$e(wpBBlLO4a!sWw&v>)+^h;Z6F^CtemA4GoKr7dU^h8l#Nj|raSkVD#L`+ zA|qz3xOG_3tjP3=J^I&`1Oc%uYwO=!FF5b(5vd*eNDk+@QrlPn7r+MFlXS4l*Og^S zvPC;28zlI@#?v9t9j+Y0>qFsym!LJfuqy7fag$}y)ck8es1aExOK1KN`Tr|g zJ`X+bvxZ9b(zJ4x#%O&|dYGM}vCIQ=`p_tT_O40uLx7hb{Jv=o{lqO}zJX-+C3uVb zNI;XIq|t)9hbMR4b)lW5!jx>hh%d@B`h0bMjW$tjnL0lmj(&#_pmI~0y8F<}J@~Pn zy84}vn-a@POhJ1JdQMtERR(QC`ZyOK%GbV&AF^IjE_*hFbyhqw$NmHNV&D`OFNU-mh~?}=ZXqxIfnc3`ver*8pf zWWGm$l9M8>xNu%!+p!VR;hB%`*RiTcdk#RJ-AU=Jn6xtn_V<$dC48@WAiW@ zaqIY}HMS3zLjx?xqaqoXU)8SZ`};ba@$g9O(R=O1a#yx?Iy+T4p`Tnba{Al|{$j6* z)B#92D6wQ0l@!0WLqqV9hqh`uUt*Zri(k4Ld6?U&0?^)Fww)9<> zm|74<73Tk>W#V%=Kf{`nc%9Has@~_;g;>amtHxPv%efC`eh8yJ2vw%P>_QH<7U%}V zN=~a~>*$>ppdzS8i;lVPdRL2~3_9t?16-TCIxl~DAQvJ^LG?a-+?b}ruqegrL+}p- z>w_nXKs`oL=3fOASbbVu{ns9JcuJzlsNY|V&(v>JyG~DqRiWzG2)-Maa-f78 zBg|RJW{+peems~zDLo)`UNMT12G!xN&o=aSt)EhTFl>H|I1>g~<4lTm#vh37`-LF9Z=>9R|Yqjc1Aj4|JCV8k*X|zWs zw4o@RLBR3^F_!ZoaDexpCZZmevppW|=W-7<2#XNrrCvyZe3cFo2fX<86UCHl!Z;UM zCeKwq%r61etSrH<_|V3X%PI)AI5=3T*LSMo_pKxCy5VMiNkLx@Dvl{qpK1 zef9n1`IApra(LuI5@0=F@D{+4)ywo29JP}I@+Pkxd%AXC3}f8ZC1xoMJhkv@E@=+# z^cHRpu1^%so#~qdUW_O9CNn-Ra2umDbGwe0RaY@${xdqeM}4T^x=NGIZ4Dpvy62N7 znK)}pp{(I~9My_Pmi^7W8(_GvP&Sw3*^19vR6m+F$HMXV!vxj$=IeeZynR)h+tV&9 z=6coghSXWw@foZ6n$}C^w^uAm*nfQvYHAj{{IW;cHB%?YFsnj{5jCJVfZ5m(a}Vy2 zh;Zfg2|t3#jXabrAU!w1uW~Mq^jtN8z4Z9W5H-7GN4aF@LC@H@g=*QWpNHMublp;P zF+NIz37C*rntINbW$`NyNcOLn?Lxd{QhxvDXOL-Kl_;7Qf9i|VVh*Y;0|JD<^A5^{ zQcux+Es39ET|OaUKyAV}QM$5#7Eb$-(G8{oxaF+%NY(X=L7e>DN;DW_I4|k3a4wfc za`Z2@v?#@1r4&BsOAP>n=$~PLBC=YN|0EnKY|=8To3ssQTSLFf zC(i;21qkYtHYaIF4VVo7NAfts8M4R_uFv`|{0W%LOYfQ|kO*#gwuQ zqa@rmJeNpNdB>EdxD7D$J8=u|mtZ^5nz!)ys_1vW>~RJHrOT(OIR`%ZV7?pvma-gK zBO#NcX2j!Wgvh&o?}UZyY;RPL$UL>$yG0GDcUIv9ao%^4iShb@o;{^E5f^{TQk3-kTj29m+>;oVRr=%CG`8X(9YnoYNT(IkS6u)W+Wn znkv`{uu4fHEA&o=s|SH}Cd4>b)B>g?Xcs?RZe#Gw_0Fph5n+g{hMFlSgdD&aGeJXa zpX4UEu=Tnl*9cWq239);A$*4sUI+Qc#h7sCkJV11_u7R&m{CG3Y+95)=Ci!V?kO1G z`=_c6Z{K32j8n&0D^I*0WTJKux_)< z*_QF9rFpOJ@0(_U@rUbp1L(YS|3{y^3MlJj!~G8nR^LmM;`*^bM3 ziF01=k*q8w-3NJ5`oc@YY=rt4<+eSB@8!5-1N6ccryadBo@GumJs#-Hn^$r^ky=@) z@KBoHQN{>J>1AtVOT?h0gsV(uR{J(?VZbvMBWHKw=2vI6`bRU+_uV8;XFhZ7Q_Nm1 zG@EBqJV8ihB)<=F_&#>-f!We7L%|Kk(he9@zh-vi1Exo%AHat05BI#9tcmsTwPH97 zMjDt8T$|!ayA7$gamBn>ymlYGO0PO`x3x#DfP+j^vj~a(hm-T4j0?<*9K0=|caD@` zajCzh`{jLpt|NYj2hC23BtShWwN`pxuKTAR<9|?1JnrKl!;FG)1v%>D3#x^@srd;< zK`2Ar3vy>Tz#B>akk!k4SSbm};{M0|eZZU3Y_T7yAji&O1Nv)u^Ae7zEBEAx;^%>< zkCtWiCM*B%p5Axk>5ZT`1I}xi_+9#XDF!XWs3RxirNm<;h6{t*xhy*@&?|qCGSdDs zHX`8S;9lFhl1jVkZqe=ekhgj#`mRQ9>Z#n0;^Sia@SOS73L|y)X-xDf(8aQ2SNVpI z9d`hq1m&K-w<`JkdM-35z*gEtCT+>}?a14$Ek)#9U8anVps) zpU7Ap6YW^}^QV$5yX8D+VkS?IpRTUL-n&#&(w7Tk0X&zhZ78OGLT&9Vr09hw>>nMgCmE*w)U9MQD77I`PpP7d?g+CoYXTYMcS4GM4%%F-NNo)S-q{swmL zzse0$9*CXvaawDhM)V(jN3R%P_im|0O32_UtBTOJW0m5A#)1FtM$qE-vi5IXMwo%A zp@pM+PiK5H*P4A)&OEkx@1;Gx&ATVA*j9vNZ&|Xp?9nem?8KPjt5n9YdTL)n3-iBW zH?gTS-LyZu`3}E-wwB`D^5h1OlW0mbLif6=e56=stSEm*olU2FlRahsPt4{~JMFe& z7vuBZX|+5N;@Z1(Lmbwy4N;DQ@%`%$zA45M_02#l|ANcoJKNE4 zuCqsttVjR#zf!Kq6Gt5o{7a5M&W0TI=~!*Z|J|QO!np*z=S>fE;j>$90q9ay|Ki_& ziC~_)qGnOw0G9rvjt4MR5OCr%zClJ#kXPD-Qy2{YL>FgLoB(pNIvVsv(IZ(rDrbx@ zdsor|oaMgCp_0Om2NYpm<6c~!Pg_GgGP2tvK$D01dVGm-ovS_9%a*EYez-%H{ivx= z;w;gJ3Qyy>f1U=`=@~tnB)anANRoxO4z#FQ8N&#mUX&*mP8Gr4x%rL!dry+|nRW;bR~-f(jlK3fq%h z4G{dfQ{uB2F`71Q7SYH+vNxr2;yir%(`)~jCn@DsRCx<`QyWCa%)$+mYvzk$?-S7+ zMsksk2&Tu1L$ehv#N?`tMCg<*l=M>%yOJUz8&VkdXPUnFmVi(&cqA2B@BO1~)b2#o z=X#iTd_Yln9#Y>sw9seqrc0;}(^7F`v23OL%Y1FWI|@57pv7zPgv}CebI+UFr!4!b zJM|1sC|^A6T3PpDdlHfL7AVEvV`p?q_ff`HD_@@`c|)4Ls!p%@fsJTji?rJ+!Kuqc z&`Ow#KSYmtuyV7Z$kj=bZ7()RKB-7E4a|KsDY$6gl~<{2I8*9(arDYjY0JJrpg0xs zls$=GU&8vT7e;i5ZTJux7@WJ(c)9f(Jms~023Yih(fcVZyuUHS@sxjtKf>DyPlQ`$ z66|H~RP1+(1*o+TzaOFKp!I-HO5W+|_Uk^g8A1np3#xDr7;GpGb#-_RT0Ayy>>a-u zr}ixq>ONg|?N4t4^PQL9T!>d5Sf;x%6vUwOYZu|mVUM)%Zz|5{wp3aey;+4M#AZEH z2H~&xFCmbd*w|)S_bZl|(m4SU5nUNGmioY{+#su+mzhiP9?fD-TjV(7{dz--8n?bB zD(%~E3oYan;RSPufyJyE$CeWP?pvBw0i6SVU1L=cd|ayHb=8_lasB-fKafc|-exa3 zKIje`lNQL}+GIJ~)?j3f^uotP=b4!~L1{tlU}Uf^MZ86_ANirgJ7s(I2=KQ(?(1H9WA3YtBgAX6 zS#Oq8lyvJxSY(5L`3eQ&PGQs1mrj}kt?Xl_jf5ti#5VgN%x_s*T7Ybyoj$OH+s>jk zPH_pB&cQ~R6_b)Z*9-}+vkp$X*|uZ|)@&lN3t5ynv)%}ZDvi041QU1q(XN;?(?c9o ziV{N3W5#tBr`y6EzorYxPFbGPomu$$QyrxYvThPLCx0>_UBjM~+Dm+Yt%HZZtU2C) zC$6}h@O3XBg_4^I6*MC2v{v3fVPmsbWD-zSw#jelpbSF9_Biz(U%mEbqTM8uL5&fV zM0+ExBsZKp*#Xqx`C<<>^+D%`q#edM;P>4+Bp zpz%xI%R`#lZ|e&k+LT$>KHH6Ybl2tG+nyV8^z!J%N`)OaT;X0G3sCD`?VYg^T;6qH zm+=8vOcF~itd*>0^4SO4Wkd?yn%=Ok4ag&Q$F}Al%1#?#xbl$RyX|S$uy>bPb-6AsVnmle z4;tm_GOUKoYjV*@Y&ZLTVB(&j)F+r18;9PG^W=u_-R&t_cT6?^_j=i6lRjtbzt1HAJCCO1L9q1civlOVg%yu!& zIMq15a-&f^O}I1#Cbwu#O8CT~QU&T@u30QMdph9&l|i?~#NFZX!W1$VpsWo?rL?v9 zPg61s+Ale>`|><-?12?{sY9C}3UJAl_ivEsoQXZAASspNG`O(Kk847z0pYVmFNfl5SqACoU{vD?M0n)*)wsp{tldQ z#F|0L58#f>X$7^gAYMY5$UXk4Qr@cHx%X{1yngk&!*NO|9V&uV;2j?74mn~T<;BTa z1JLSCOI)A4IKLHda*T&drXkmEhrpP4nqU{PeJ0NZRR+hWd{uZGj#Uy1^(do5g z3eg`WVI5jw(5^sCq^zoSR}5|mEsRt5(yN-iMi?bZ%)Mz|dOx{PmhhcZ=H!9Wvf(!m zls0@8mZ|{r&1l;I`cu(H{+#HuxHqA^dd)fsSa8q6E{qmg7vyL_y`nNx_N-844~rD{ zT?=AmpKB!fbh3hO>44Us75&g*PZQgbWY2?iOU>YZ_wn9%u3ui?E%(FO1Pys0^wk~a z=#^R2)!pwo@vQjEw7YUSuqut}^!n=DOhzcU(b4S|KAb+EiW{#tUWzSA>T%dMW4Lna zEY=nDGq&)Iu04rz^)YmWcgX%u@)Ml=LGO=!>^R(i1S0F9U*}})U1{1Ca#ZQOeS(Y- zUp7P9h&STq5}8y6Ydt??{+>fow z6GN+X*c*mfhb}WuIvws)`ZQEd;o`MM01K0h3l6`mg7unXAbo-S(ygzDR*#yuJ`#u) zimWH>>24<5be6DT-@lnm_YG07`>>gx3GMA+7Fd9xA?3w3nQV+eDT^6?X$%{qEho5W z>f8Mx$f1azB_A$Je0KX)7?fvFvh<^lfhj_ea^J_1M>0+IaUejXoc%MKsoNyXg zW^^Ad;^in0s%VsZU>3l&BnGHW%3})FYLCQs_0YRv zQwB{vhCpP|&LN9qq>D#>oLmy9tPSt142p?GI-)$Cw8N{rYOSP`O=EivV#0&6*}K_q zmockgK?U(7A^Bfso`w+F2J32r)WnTQ@H7~xco9KFq?G2qIHsJi?fuzzZ$ntzsmXTB z$;5*Nt+=)4n^n=>u9yo69o-onTg;RRX!Lb}B-JgB+@^@F(T}Fe)Qf01aZ;aS&_W5J z8iC45>I=ra3Oa>63Kq^D&LXXo`rhHf>wvQntftwPAa%PMvwT+(zgG_ix?Td5?`F@d z3qZxi&18T`6dFT_lun!tA8>Cvewf14!= z$MIX=SSE}7$<^?9`FnT4W~D*}bOX66=0!x%;z_TP2e{9+Oonf~YzV~;5x4pf7& zp4-+NL;8i@Fx;+7srMsQc7wke#JbJyicco7sH8yScYpFg#LEIL$HgqzS&jzq?9Sl; z$jSp5)0@NTurg>Mi&G_r-0R8$E`8HnNnDTh83!U&J98};Y5z#!Q%KY!+E zV2SlRbu%Od1m7jm!~jBVP`VuWenw_5ER>}_hztt~%JZX_v})*+?`Qztysb$C3ncf^ zEufAm4>&cH3dqf+5}}*53X%RZCYEc?nzOx$tgLGEGxz3mX&DrU;;4lAi+|<&3s}jR z^w?t-PqB_6(^gAwG5`bd!H(EvC7p)7x<0t7WSF&z23_J{1O;{5kkNtpE1Da0IZ@+% z>-=56_g)Lz>~y93TH0-u^rtaU3SRkCv)>2Z*$(Gwzm}609_;f~X2{Hex6*pzvE$bt zGlwd@r8P2ojhk{MQUgSIaeYwBzKE6J+)q)6%P7dVn^@GjX`N)a+oTEa&5btCi|zlQ z&Rgi_7(CZ2xmp>r-HBu7wBpy7Oed6!An&~`u=;_Kgr_VJEQ)Mj&M+JH;AL&=?O3|6 zInTV!O?V=g@+T=vkKN}9BzKAZE+8KEMpj5c{zumV9BX({pS#$!st0%$nHhDSRg1>O0Eb*sY*le%$!XyEe{J zlSrcnNO^t1m?k>lcev(n=SI0~ePsvt4A3eYG zlRVtILo~8^9_y0r^98LJ=Tb-(1UC3fHWpMT zx;$Vz*5DWH_T?YV`zckgqoGD-*^k)@*~>%*96OpTsVZDi>9r{WJEVXiR8>(}9_ zF6L(KqHZ>)gaKVJ^*V*l)rNUD9%okBL`{YGO`_p9zL(Jq#11pBwn;8YIW-`fI*3c*P;G&~ZaT6@ikx@NPK1BiJiJfXYT(O3_8lttV4&J{-HQne~X3cA$2v$(g^Vamb_K;yYbEW`C&>&U$(ZIpZ`T-)>KU1 zaz#6u9aZbhtGm*}l?Ea-Xmv>ef3VUi{BVAv`fx`Ko_s-YyiTgpI9im`2|waIN6;u< zq7Gi{XO39(!Fj-w9KZEAjZAr2YAfX#F$5IX=jqsLFw zv;|HUcJsUMJ6HjTC;yHE(u*-Lu%a^@G&Sw?xP6F21P0lGS7qdLB5xI&+FCxq!%`{P zBbgd9WfBnzt1*2pLuf@Bs>K$oQW7aZV80~kl@5RE#KYI%JuHNZe}8<7Rhiz1C)TY6 zz$NIe15@ZPn`Q<-e3Q#_Z4MW}dvhdzRVmPnqG3xf-WWURx&|Wq5}52#no7ue&7;*N zA0ciRCrHUcjWezLK`$8-gI(+kX#0n7Ph#-~nX6Y!yzQqiXs4~c@F%hr4XE?r7R;>X z+d>@#=HH^d^UZmNlZ>iBnwhXw;S>cABesHYR+X6k&cU=w*Xbd)-Nw1bExN46j?t#& z)`ixZti~TF^=Z_CbC!e22r|`{!(gTINqzV0KgUd@?@O{(8#W71OE@eX?=f=~(2Y0^ zYwrT_EhoY*#EB>m!~kB#w5o)gmA>Aa;);Ok#fU040;;Q?U@o?`E{;pEws~@hu1(C_0bdMw_%ml=Cmf4%`NtA$nbOF~ z6Iw1#3lz;jP!9%uB@Vh2G?3(BilLnP?bzidXvt_HzGN~XDH-{8Yx%s2(MiLcN|VNR z1@uXMX)yrCU@mpGdWWfiWnVQMvordoGX5MFp!Ho``#J%>_-@b>A(uHJjq!UkLVwt z;!ko1%fc~BoSV^hbz^AAUCT5kZNZ*KsYFJgw&o*?JTO~o?Dr)lRLyC@$8i%k_AUn; z8(d}0v9nVwVAAJQ;fAX<`@s8Q6|Qc5vW0E8ql=Tio7YIK=E`cDpSrwXNECnwj)T2d8!e*QFwPX&pWEPSFD0 zSFu&SUX^SIZpa=|x?A0)9tRSRf}(^sV3ItO6VBtFFd0i5+EzXWWZJ zv2lwF5Wy>^ha8i*Y#Xpiu$ z`_^P3-fQopj>`nmDMwqW5qaDi>%neLPl($A553ivtFqZq>tYYmwGMc>%=#8KwwhA7 z?<@}&9GRt!44lc$`W}9YA#vbqO-U{D(F$o6)7mq!02ZnFR5lO1>O7qv*i z)ISCwZZ%#F#^2x{;DYBmzGT>3;P-s-UMSKrFPs8A_*qEZ>q>_&?d%*su20`(FEHP~ zy87G=i{NKG&}s5z%l%J=#OF@9iQ)*w(M5>W@<6@__y)1wlCW0LB#U=7+k1OKo6BmS zBTrt@1m850OQR&zJ0EM~93N4nH!5hM$~hTD4SR(DJqpC;ZPX^!BAvJtIpr1u8XVaT zA&-;M#CJQ6)RqSAM-Ccqb#5E7WNr=j&h!*b4!L=BH*bIEnR;X7fo^!R+*|xS zq;QYZA&cdK!0HRdOXfEsHOP7a8N_(f@3I_LF}rA;Ta!B4e`PdYlRL$VCE4IbY~9SU zHa2(OymB&YcbDn|WePi|6$C_QBv%!+4*QML!0tH6^T0lvukg>K%;TcaU`_3VQ#LsA)C-aG+pD#|Vobb-0xt zFVcN)^6}47SKR5UI35zUBhiiLkWQ?gG2&)Iub^0W-Xo#72i~jF+R?=P0AdufZ@=KB zC{PD$a~<)TOCUTB8FOHwPi=N!@{x;}#!%7?`K3VNe3z6WDMB;>g>x5@|C#c(%F2_< z2lT%8d1xV(NxG+ETt!e;0WnNjwagP=BSIKje4mLZGs^6CdzVvvYX2+fxK>!-O7*bp z|3>MTO$TuK5lnkaofU*)lL2&2UYvSYYE&A9JKIr&Yncpw{!`DS_i*?YxfOfFqIbNPCmy^g?G&$bOWX=GaS9DdpV+@M1Se5EI-)Y4(%%hjz-^BA1oQiNzb8>nQxiWB>uA{ljFRj1V^ zL*D0s`WCV`-X=_hu{*N%EEy-&*UFM<^7keWy{knwLK zh4w>tq_*Ros1ySSn8lxdMot=)SWp?Nw9qxz zR;<3rN8|5UnzV$6Dt(nJo{8I@EMrhS*nNbmW8L_bK`&wtE$`o)nb#E2BgiI3R(+b8f_k#6=&>`M50SjaNw>87--ExPi_Ufw?K zis_?N6FKj+8q67!4Uyg4vTqYgI#D5fJrR3oq-2gdRg;qISn=F$=)|!bo;CT*V>)&p zJmyxzqb`>;!a@t>Ew`t|W0p)eVr#}IgGv;1SbvOgI_zvt{T_I`+T7YqXw90SWs#c{ zAhsF&-l>NHEP=M@vmmYk!z|pml=D>8vSD2p|r+h>zcc6cAe83F|!5 za|6kQ6fRYm?`QE2lnl?6>sK^4ZIV^{KjB9OGt07etZy=EG>kpM{iZyxQWyB&tmT(Y zC6A+mLl7)Z^o(BqJxniwU2gnPp}ue)J~RcC?bs(oFwAkl4Pj1$3Ss#m zUOU6Y5WmA6WHeNj;~$Y+*?nJb!+WFSjK+seeocTK0kIYt-`QWgVZ~d^LE8ayVk3L zY5**4+YoM1jXTWmZ42`2sw=V=)bI7%KqNEqZhdZDg`(| z5|>cza%jsv2vmGZamNROzWHiQteG*vERs5K)fBCQKKwQr`E671CbSmEw&?|DtVDF>un;LG&Ol3nAB!)o4? zA|63~N=~bHytlAWa3+@kbnHe|IT`9g>`C$}&~1&Cab)|!8G6@7Ai<}mWoTVUF4AM? zaEGTl0Mq^o^{Hh(*n2f)?mMQ5_q4`k8dV(2(W%OH_jf`_OPDD*z1R|s-{@q!{T0WV z`#RY|m8e-#SmJayrdzyfWE{Lief2XW5dJ8nFrM_4DdG3YL6LQSAsH9r>y|h$YpyJf zIoy_PEM15NWU{c?0H-l*{G_i>?|p}prb492xW{)h4d1o+)>xabo?6s6gbx?wB&&g^ zO{LwIMQ@%N#Aktd%`E5GpRSzjP@3L;YjRTuBt!K6Hj|unuqB-i+Ic$=IIeEKw`>l@ zXEYH;{X5ee&1B1=C>xSFl-zZPMpJm2+Slf!K885oTqI(@`8$}BxcLBa%dxxvr?RRX zb}MsLxFs5=SvM`L?<-%S+^xiA$2l;59Gw+_%+9_F#c9o*f5kRS69V{2q5Au8dI%j8 z6eQ18D`^s$N&%ZUJnggxcpC7}ZJ5@>WqF)vv`Z*4FQ$?N5`v3;c@3-+Bj9~ZVU?q_ zrapdUnt)^sUMOEJZQPAc+w_XEIkx+3Nx4NkCSozsa@OimdDUva3E^kWEH7DeZz;Gg zr106?tO9G@Vn{!4!0OJTfwI!2M*<1NDEfB74Pcq1S5D|Sdh~0(9TTaL!kg^?#svQQ zT(vpKU-n&t@8~N`LpN4#ta4-K3Q4ISoC%>g4IzhK-0&#=dJqwNyA&qvh8W8Qe+t+) zrSr1WbbxV3!biMggVq&fv$E3Or>EccfbMG~g6_6#^txyjlQ?CqF6pA~i#J&@u$lPk%a7SAu zzUt?KulYL{7t2X(b0mir3LGsj)2b~lS=5+{3!}wj<4V6!J=ZlGCN9I$5M<{QCmAzc zYH@WjVsDi92BT$HW!OD+ONZ8yRB=W!${;G5-Q9#a%cX6+^(56IYqK(_uGEfOWo%tY zm)=O`zZWVQ?C-VCW0%>bnO~$m)smgd>Z>~tp_FFhHdxM2fr_I{w3|3~2fWV});KOu zZuLkt&yr2vN?y^OqiZ8D-z`|Y#3JxLcVs;`fnwPm-SLZGaQSVwWvwY3KNsiJwMhj6 z);>KTrH6g&eo;m8atTXASC$FjQ4x{*kh}ConNUlQ?HRiR|1V?`4MblzRpYJv$!h&` z3-Oa(-_lAmtUCLtlN9%NG1T?aqGHMeU!I0U)hkE@p|+eH^XKTcV~+=2Y%UzcyDWPc zypcep3}EGIozf}wy{Wo}s5DI+%LeZ#^!1Xt;BbzkWl7(CZ0<9mQEDwr zBo9`eN~gQ1%+wE`w%lT^Y5CZN0HzSf>TmR`bWC!bH_Dm|-$$`ys5YIEH(Hx-Q83IO#3Z|!EJ`ZJMh z%b|?k3V4&>h4o%8J82rUq}t>QpaF;CfZ3%to)qq*BB=v;zph!I)EAC|PixZ8Q2sUd z=AWyU%W9bwA#BlAt3_7S7FkU2fc;>?vPh<4Qy?;#>SEvXe?A4o> zIsE6SZ#`GF<|_A2%-NxJY&EE!?GXF!I9OgUnVHm3#~X@&E$(QN48b=TFjRcu}>85HV&^wk0V3wq|DO-Z1R8X$sJq*`dyi0^X$2@bCI)jG+yNS zY(;9ijz$_UNPK4F*p_+Nj!J#Gd%asq&}rBbxgB&~8MO4blVoH71ZW+&(O>7TCKO!D zQn1}-9J#GQC!lecekOBX767eWx&B6(K$@4|k0|Z^OmRy?XG;ETjW+D3l7Q6tt}PQd z72nUc2%iHWHl9L)?!7_J$=w_)Uvdt6(>`pAgP(K?c{{|sH0#|M;GB9OX)*@frmn0e zQ}(EjjnGsi_LU?&{GcyFleS+>L_kNjUzZF{1C#g8>l@3d;+w61;^P@-G6%}n6*SI-y#*nAuG2Ii5%@^}tXsK+*pA4!t`nii!7wC3H^J8) zTIlib1|;@4NUL{|+7`OuP26EF$+|W;hR#Ozq$u`JQom zBWV`r*-uy8nMLXA;j+G48CLHEm1{5)2n>k~DlOwju^?mqHXmy0+@6Dg6^0hsU;LO; zZ@Tq~jk)HEwV_#CI;RP%36b;LCO!)>Z%{@x`kI5z17-;I z&Y|+AQW>Cr+W=R)rz^KY=_#soWKE{-7K6D0?o5^QMEU%#hJAq?NxpbNkht(De7k5B z2$bZ5FY1mjk%f}RE7BzD-0aBBo~0)EM&o#4ib07Ir3)~H$g{zJuTdtMTyWR7jy!%7 zJsef$ibj_}mv^6}FY;d0!h?BB@D@f|^fp0fiss~YP;pFiR{blwJp4uO%8{A5qwHCO zyGlrZq*6-oLQ|+5DIZc$^X_*AK3Y9fI)xVLcb^|I3aQRZbkz*fdpzrgVVSdtuK6hy z3I8%}F~KD;^mlasxh_+ZBR{19$-n&7Sm>P;n0?Hz`xIWfXl}Quu7xXx?3LBmDIK7j z=Mt=$ahEjC6Iou>ATS#%qMX3?SDt5zl4&rNu2(79KX{>QyakU>9VBfO50ZkWrL4w` z5$^~eSTFA77>MFYcw$@LwRhB&mRz>F3$7>bHX61CD(l)%>bJU}z!=|xMk_~v z7Gb;CH_|WbLxS~*c}7=Xn|nP0kK}59zxUNf7W83y1MfvPub->(NbvNp3g=FIpz{=_ z6e;$3w{(;=4`n2~5b6SxrHD2sRp@P;e2qHUtwQ*ufn89)+WYoeJAi-J zI=ya1RhYBYK$7);Bnv6ofBH4$2x`B@HpX zr4yJ$rIu_LWZ}&(;t12vHC2OuF&m>jN;7*)2dO2ht)#I_4b5HpBB~0L!!QQ37R7Z1 za)r*m?mmn3JzrYr0nua5sdbXOl~kA^J2@6acs-lUs&Wd0yxo;+&AQ*~!+yWVU2#6z zBxpsFeQZ6$R$)eFKTzomxOR8*uD^&Lec}duD6_-BXO;!A1`w^_V_;vUngi{LvPCf=H#O>My^PI7mSgOomD?N zj-!T3AGr&s&UDf~pqDH%tFYv({Iz-7?z{!!vYq6n);l^Uq{0-Hi)I#j3hk?A#TA+mKhfMKB0e`?NO&1P`bX%Y8>elxqPJ zEKh$r8@`n6H?voD<-YXf;N5R1HTY^|+hFkbr`}o%a0>>FeKCUyGimNEwgT(vOasSN zj(Wt8yOqF7_nTv#4}#|LAML7Jnp_bX4hjM&s`_(O1BB=9tZP56)z<{LNq*RyVznnn ziQ|4idj?N`FEA(jz=M5*y%!bkxs2w`Cy5bFiq3MToUu)#9-7?u*CYBEiTC4b47&V} z4-GzW>h$Un(}2qJ&O4jZkQfKk`d3i$N5T7c-kaO^R zTPCKkHx7JJdGx&)Q+R@C7ThoRPbHZ&v^n-1m0o*V_PFUwHG9+Y5I}9Q zC^&AE2+@7F74Bl*_yfh6r6C8fS=IqI%cBDp3U4~j=X799v}}HOd+__50-{S%7lQkQ8T}056CY#uWY#J0So2k zD$UrY-=_ejy##N7o-<8{5&R-hYGR~Y`yb2~u`<_b*STF#W2W?UDY5Um^t4x5A@`t+9$mw0srdCP~l&8^P%9MJFNBrY8!&5=eI1 zP$A&3ngmv!(Yd(7>P6y;vQ1h{4?x%9BssxYdkL|~JxguaA0gqJ#Sj3&Z7?Yeihi45J{-WwCjg|tf8>F; zg8%|Nu6=?)dbBMNHwa*B{s^*77OmA+z0wLVx0!S-Jekr9{_bJH_**XwKFxci#B@}| zzuJ@!Bm{{9a%wye23w058C0;cz`2hO(T*F1g67h7$&RL^!}EU6J^~rJYhj1{q`N6+ z0dSn1?3}*%TNgQIPN>)VzUfBCFVq8J;eVVp!P-~$r0KN7t(AZbLW#lNHm4-qNI#&3 zO5e8_LlxZdOAoUTE*9~&+JP83A!Glj(0Q3W&rg$D(YAB%;i#0t7=I;jyQ2~&K(Kvl`&s3oTv1}yw-Ak}y{4XLwYQx|`ueme;)L;GVp)p2? zonlvESsw6SakcaY3mG=-i9gt%!xWgugJ{wkj2m>UjC8>00xR@}hnSatk8Ud2G#G1) zd=mWLCoaXj9?~G?wx{1uv=q=~J; zsslUFd z8)xpCX;);+`FE~ApUbtI++>LTN|xvKeRTW=)Y zW(0fA+&(LyNtL8+Y|#9_+WYc&sQ16^IxUh!MGmr@Q<6RVPC~NpgqVsUV=LPj44o)i zjD4NLjI5J7l5On9u55$BV2oiHp6`sh&+^>A=lSoxe}DY`^Low9*JpWuKg;#L zuIqiLjZ~0cV-{lke=x}d0*0v})kdr{U@={>x*n(y za8ys4{xA{j1F*vyC45b8Ify}jpP6TXtLd%cP;{T!d2g8mb} zjJ}cZn<#$FA|}b*Y%-<|IpA54=dDCMCy>A98-HKIQ27x{OYb8ul0Q<}JB-A5;eMs_ zaellFbb5h_9)NsCQp(Z@+vMO(7oTmuPx8(<`Cd_Q<^WqoriH;a$JjvStK~&$C#h0p zAtJE@d>2<|F65Md*+d0)B+5ev5eP< zqa7ogpMNtLNH3g{TWQ%Eo>ogq$^vnj^nX1S>we|8EVd%MOVBSI0Q_2-a4oE}dzX#>T?R{k9H^^^<>I%Nz86E< zRwF&lAix55+9M=Wmg9PDf|~tKR@B z>eYplTx?Ap3{j!?i>oAvl?~@6ram_}ov!idd)hmGK+G%kVjjm4McpjJjGm3~Qf76P zO;*WqCw08Q`eWhbTKW1Ak=VOiN)ZXFVphA2tt|TzJb^{C!7#&x?ct?S4sbXNUA{3&+yYM4lS>zB2D6!Lzmq;%@s*rIFh6NmT{HXam1ScOl+rIxpV62 zULW4gcN;-Il9pk^8gL~Il*?dW(EIU~F?ixTk_5`fOs@3XoR5Ed4v=sHU<9vNX0&A$ zEF@h}Z11BfPwKhWAWM4pAGF^2%SOTB%ie#LIW{!=71r6*Rd7Y4sQcdUyEEII)$L;} z{yt~6L#sBzK^WC4vSq-^qG z!JXI{J|{$26Tfa<;r#WEF?@X$U6cnyi!H+1VB$P6j-{_IX0@v3n$jqKSBoxsn<&c8 z@1zt$yt#>Od2`)ro#+!)o^6h%karZ_fIs|B4v;gQ@*}8H8sF*(^Mgsc5j{9Up>Vhi zlQKxy7I3guY{y$Ol7oTzfX+~*Xwi>xFfiNt>mK#-7-HeXp2hfWgwdB?J^2wp@`m-2 z85$;Sti(YpIB-Fcvno|*^|^3H-FyM{OS)NY%y7AO{+hmptruZ_8DDF1tk1MN-cSVk z`0-(ZYwVmO{#~6K-`3*&elh9#^coDlR;*=>(aljU|A#Hwp~ zHFkRzk_wxYB9*8_MetvaZs-e$El618U@YR#J$Ph3`F#B>u~L&&iYUxSaIkA|%O z!ILgqF`bE9yH6C!rpJsH$FH8uPeI&AhLvWv`OArbxlP*W#!+d zTUAX$5(68gukXFTy+!ZLfvSJJpeUOtyKtr7B7Fgb??d3el+N!=2Mn&f%-^PVWV!o` z4_4KgedgSbj(TeFNW^hRmCim_Va5Bh0F>Sr8yg%RvqXh0ZA}Dvjjmzh!iKV^8tymt zqOlgKR9#Zij}E=h?F<>7QA0y@Ju-+htQ9HGyHZ1pZ^V~sPH-1Guq0WcW$5Zp`A^)Q zV)xklcgdPQ#}MB7v@0QLBi(E934!`}$(!Q+Tcl=`EA`N$*kAUS?&g0i-C^Ozh-vS?h`)K`3w#mQ})_H}*^|QHHr!=f@72R&hg!tqbcw3q&xLq6YhOq=IHnMaKlv2 zH};OrPum1HcL&#kT%UWyR#rqAjLE7B$k{Vwe=S*SSPuf8g-mr|S=1OVnR2BCSf_#( zK$}5M7l8aBKMOJuqCCUpD18RG+=r=wTJJSAr>TA_3!+Y{HeB!1r4R9 zS+)Iy2uylc(dHEF6f>d~CVsqssmQz-tL%Jz#?4g)P68;#Zxf#=Zb)e70+*8Ef~k^; z>BWbmuj~~X^hADhj$0rn=iH{CP)3L7&3;cOBK53pvrPPPl2@sP zsrMFGOQzt+Pt`NHk_C%Gn-T9LqZ)c%e*C4}*Z*F(Qa@^4%y8z2dB#-o`unrzR*vM@ z30DRWoPiA0fx8E9WK6;JGTr3iO&X5vN(I%2_8ndXdFX=09|v#lr#4Y&wlw}b_&j}BGNZM# zm+Ucb(AI8_o$u#KbjfTk29)UF4YIq24QX#9PvJ-`URN|)wDaAitf9O0Azf96DmDlm zyXe~DR-0t4`1=k>9C=KHnEf(u%}+L9e$kyz72fSv_Y7^T9JPLSU)ZH{1jv70|I3xJ zsoSHqCZm+_s7y>&R@>cHa$&Pkow_yBM8(fFLacU@`b*-hFndPuhV3}t;}{yiBgB`7 zfix^BLSsLN_L-z39o;i<#+o^lpB_nyAR$ZD;$XLo?x%tg1*r>Y+*qdsuB@%;*Rk`wyR>h#5+ulFZ~03_!z=zB*1!T2vV#benMHcPz|GT&;mz zWbNIIMH8+Eo4j*gD%~0NP(e?rb_7G-^E|3%_!m8R3jWJ+C9z!bnkkj1sN}?>^iS6f7+hvgi{#1zD{;8-rn$?&*oxCBOz-Ow7RYT6wb?^Y`c$&3sZf6BpnHzP08X_5Ey1LBd^ z@kEGgjWT87h>`+XZF>OfeO4pT?NygajEd%)GPdWv510hH>&HThwWcnFFr0U;{1KVy zY;|&fKfV$ammq^T1qWe^cl-!)c@noz(qFwdlmCS{96V-7x=;PUU8rW-oT#3A6upm0 zM2Y~#M87{{?sUKZj(xg(galY%VCR<&=_2|w4ji+soca0wDV>ATg^dU5-%E_a1YDLg zkdiSHaK`7CnD#^Hr(bhyT9wo_=7nOycZFiY-qb?usEluz@&C`M0{=DG1UL$n<>b=! zaREGxW*zwGCd2irelSnhKqsQ$Pmq!Ep84aq(6w35qnYUT zO7peyylH%Yq<>c~ev=(~+H%8a;EoKJL+16TfV1&yK4%LRzqZ$~ubn?>{8>7#sV}6N0#i?a=kTi-IvUAmel1LB#;_GB?H4m0ym|O`Be~w(^vi>gZ zJTM6$wENAvsr6mddBFC^IDX*#;r(^*$p7xwPFZWwEyCz?v9#$`1FTZX)*N^JURVt$6+U_LKj&2N^Ko3hHry$5}G| zY=?yNDD%EN*6cog7L)Gs%8DX@pU$?Eo}u0Mn{X_%WToXnrjYw=sK#y8=7 z#4C9lr0G_&fCFOWcj#qNlg`{Qvio!%S-3jF=Vv&MLOfx`4AxDMfIO2>lLmjus>g4yb z-AFb@sLarXav}iP-m$+C#5VU3zc+KvuIM1to*FzlO4Fn^k%TmfABpyu<}I`UumW7@ z<6V2Q@%nO;Wi`GELVY7yUf?UB<;GbN{!Pu8F* zvaAr!`l)Ef#N65U194$TfwAIn-*z=WsQ!fd$R{AvXqL&gXM@IvZznb6LhGy251;y* z;K^RT1TMaS?(67KDWWTovdi2Jt)_$r5`oJCAcI2j3KzRxRVK!{t6cS2Zt+EfxI^SZ zZZQEK2!M0fO~AR!MxsQ^Dh{IHjSPkcbV;zredNKkc#f2Is1};MvN?!HW~iYqM^j<; zMe0f{4l5&O+**B_Dh+SI&2_QYoiul1_~+T%w@%GgbC>H_BPXs^$$6KiV5?8iM=}~r zznaj^zB-W_i0z57^RL)$ZhK{@$cqkD*{AB;hpBY-2IS{ac+1>JWZRzuoVrM?LGotu z04=}?=S!MC@hv_nyRtW=(i1oib`Q$LcE3+LimASaNpCTG;g+{kcN3hOKJbE*xG+D& z>yO<=2t6zaAEf}&vf)CB5k<)IO32g1{?KUt5P}#`bMLLm&FeT6p}MuL&CT zZ~_;G5Z=y-JoklR@Ri2vQ;rJ%cDMiCI`cKu#X=qhXlY=2Ls6PqMbw&l?IrDe%1+Ku zEE(sOco6MDd0m*BTIE5S6_AJD6Ye(vG-;Y+S?ArAeQiXDHImDq;(6^_PA}WBGM+VT zFl~o$Fui)&zvu5TE-Z0^qG?Yfn0Spf=vN5H9dtl=FKrfNWK>xchmRL=R$NOs_Tb~t z4A?f%CWj*rtZ1 zx?yNFPO{6yIWM0v{L^(-r!RJ>aEZ zdV~}r3c~Xj5?=t<9L~=0S$>?}c@<8=h(XKVaG6*Ja?ve3NUMYAWLKZX!vaXhW5~i| z(j({d$x>U~xbn1HEe^1nw_X{`UN*iB3lh!qnwZ>>h~Iizr2q=+lIHj=Z9HnR`%dGv zeb+L*@2+L6w{I3=dFmD`p?tDXLVt#rIK0)Sc#352|Dl$xJ^`sF{6(ZdobQH$oj$7} z7U2D7ZKUv}e#e7DV-aI!3^@2H1)EbdMjjk)%U#9+wi=Mv%m@q3b&0(kjWExG$L&Li zGbTac*27m~&mO(<&08BN_-4%CH66pHE|D<+sB?%KOG_kbWS}?Nrq(v_Qiq(|5{|df z%jZUhEf*^YHZX+2QQ$fJ(4b*pnXi;cN+Yi&4kZsacF~KNQS0VBG6?1X>}-oux=|qJ;WsAdYCO&gD@7(mAub{KkkZR%Wed zw+9h^62}Lvv?15%*Hpu#$f+oO;WXibG7sXzZe1v@k666wA-UP`-fiJSl@Fo&ws!y8 za)!aO`n7D(-n9`Ea4_Zz6Yu}mK5ZMa@1FL1EJ2<>s~Vs&JzyX%#&fp_wkfKQJsuOg zul)=7SO~h^JG0-CR5kycXv>PEZM?8Zs||_^a9dDf z4fSnMP>!7i&*2_f$_M@7%wu+IE&?(;?*JsWoO&AS-RcN0lS(T|`2o{|=3ej-XnX5B zR!+cYikRCCN?&Qf_N%9;%H^)#M}AaN^zctBLnRqIyx0g|x&CD7l9|NTk@?u8{j%1f3CuyIsL#)QCK=9dSPPax-B9_&0XNU=q1RaI^LAkg+{8)nlj+(G|%%t@al^1c(s`%9j~qwPqX3B znGx~Y!=-d(M}Rha_VH?223}40=#ITLgJogjFR8m6Et3#pSKAO|T)*s%R}8b*LTCN@ zu;3G@K95;oiRAetUxsZyTbh!v_1fVE-gRtSZZ_(f$$^xRb;GtRyZSYx>dcwZpd_?o zXDX?@+YHE=j9yF3&jzVwMV_X?7f`m_dKtD=iHVH!)q?`M08T`j4=^y&w0@rWZ55;959Mi*Gj)HVcQy#$K`&`1Aol z3Br}y+3OEMJw{bV>HQWaF9nRm4B?QYc@RhsQirp^2uHl7G~2{5!3d$I3w4z zkmqC%CNPNNIJp?B&Y8Caq$%PE~1VjukW#W=d zFvY`{0Sh!?^=z=Kpub;!+oay1le>;(f}&aJJb^q#eR}zG$@6>tyex?eBx2w~fh>sb z9>>wAWG+v~Oz}@D0Z_YgTB_8KtB-+> z>-00w@vuH3p#GS%ALO@Z53mqmt&+mjjhO8UwmNJnD>uB$SPKZ7G8%Jiy)}6|Gu3sx zmcRF^PkFxVgppPD9cUwM3h*Fu#YWXt*ejG3LygMvvezdf#^u}8EA*w*2Mzb!xGNbJ zwCt&j&E|8&rC3!pP)_>&-^&vc6SHoD?`{(!o-My%X4mOoRMEo(r6vH9hjV8*Zp^f* z<^?dIWVXAX+8e~-_jq}@e25e0ntq3xP`uRf!V*CeW9 zRO;W2kd`k)!4hH{gHGit*uiCr;9Tt1p(@mWlE{2hFxuZH*bobq zHY4+xvtci>n73N7RZ^R4OQ!_COA?L>w_4f^3#HfIduN636u_m-vlW<3P{{eRpcd7j zoku)6{RYW-$QL0*qgBsG<-H~z#0^&JVgyv4+$6%Id^=+xOyikg|$1gN_SP+n1&w`-jO z(5v}8EuE0nQ~2qZzNV05uR77#dz~E*o0)y)Ng094_(9H6SVIz}zQ^VL_^8L(lzo^T z4(B5id%tdB=Ie$`cN0>}4tdNL`V`CX3p30Tb%Yq_{s_UMM@6XQ93=Mjv0rSX&c=$t z^7S7G7TLr?L!qq`(_{`1V#5KR6=#~{|AwhLWUtrd ztMdTBHgFaIO8CAI3ymag{Kf*DI;RrWkc(ZIkgD3-<3LBRvL1z`5YtRYR4l#J@I77> zsUD3A0h!&dHud^L+ez^SsScV2QBGSrAaCUY%lRRp<<_>r3N!W8txm?xHad`T8s-A# zAwcC4chkK$g`2ptAzf(JCW}zC z451urm$YxVC!T-rVS!3%|7rkn>V|7w7TJ<|v_Ab>j0w^``&CB}Isp6ogOOm%PrszB zM!mv{c(t8C8Lgmgjo1T>HBCvH<4%o-&1c5wXUcYIcUf3=TIz^eLN!sA^|~lG`{NMr zv+jk7mSHa|qKj3@$Ysa=y;siIpRH}xMh1qfymAfh7Jsf6_88wV^!1Kk^W0mz@3;tO zTx84{-jS0RqD6JzG`8}x_CME58!?HeIMqxM-$4xAyL(r;W)bLv;fDH=IdyE3bf=vIA? zzCFjJ@PP(YgymYhcPRprp^L?8z{q+zb%{FfOm^RLlG-K*B6(1t~~yCcuH1N<6&kE5)zvjpx& zReb1r2%xwA7MMp-YJSPBz26lFdh0xtp0``7mCz1VtZcehn<~owlYOGvhWv00?o90Zv7awn`+)922f*;X znq)lh=Rf*IpacX&bmkD$oX47lC*xU3xB1QGX zHW;%Ukx6*q$Mg!2f3T$}z0F^c_s&g;Q7P_!Ye&7~Qxj_Hbc9nUIkPLX7FWw(jYls` zu=)3QU^|zEf0zw69gRCFAH8;0!@y_9i9L9l@E51Sp@9YRNRi2!AS(=9jZSOz{m4QJ zvbO+Sb>=Qx7l(Gf{IC4R%OCj-#d9OLwF0 zlobwX8WV3foR*RGNfZ7?8eTh}cn7*^?K5h~COImF*JDNQ=7k6NINot$gcl=A7B33$ zjH<}NjuYu?xduRHqN6XjB0pepT{jmzdzN)D&F{JoXXp?TihK;e-$%KdP_^b)k&sRx zq=y@a?^12Mpny6F!5eF5CocEJa-(0Y=AMxDkcr95{AVFm1jUJLn_mDr`#!n9VKpoi zJg^0^uPK8$<=j(EZyk7t6fUklV{l>qg|s0GXXj@6S3g6JrOfAt+T;Bef2VZIe*T0b6cEOF6|@Vsme^*S8&*z))TXRSdJg1-JX?OtLKqb< z`;kQ1?MbEi)bX|-Hg`zNX^D3e$Om=3#B6v_8ZB#H&$G0w^^yq=**|$Q)=;K1`b(+-Jm-w<_R;d%1oNbLDgB7ADVGwV}5p z|8cSTr#mEhx!AW$eM5+}50+c48kE%W@W4om42N8dYEZmOs-hu567m`qI6{Wad zz9J)^Ug7`{*1=l}T(zIT;(5s+Lu{j|BL2ywNeH=))L&rRI(YrsRaNm<)`ONO~rW*NL5l0JQ6}+EPe?2miV$~{bC_XA6 z|I>P*4JLg7$d{)Fvst7Diqr^Y-P-P`bJa{jhlXc)Yd40m&B#ATkWkki99(+FL1y)L ziUh{znP*vo$FHm~ z(m}~l7NpM7-q+~H9s6JDZ?oXI4#T+dkL=m0_1|RYZe+ZW2r*#w+)w1(mtt4}3NBwL zn%_jJcsvem)hOB0ZspNrq5qhDpC1N~c@L()g{!2cSxnQkLlLJdn#sjSASl&bA` ze9Le1o^u}FX~XQJ&8ruO8}?4?G|K1o^z@M1S&#+xV>%w0_cnjziJZDOXo_VKm-foZ z%*{(3s&|K4i6ynzReJ#T@EfT6 zv`(@N{+Y5*`<63-OZ=aWxSA?STL(xk4Y?c%r9R+dMmt1G*GMGtx5?a^db$PDMQywCA?(Xx!vyW`8O1&pp+eEP#KyxSq#v+-nsk^7+K4ZSG z4J%w;6TdJco>u4HcW_Jl)gd<*M5bX7xw<^r!n-oNd`ZGaocTH7N8}8fgk@F zo-PR|5zBS8QRtoWPl_lPzMbvp<$2PrC%e1Wp(zf3h6sIzA8@yaY$;A`2Pc;7?1bV^ zwT`5spj4`DC4gnN!vf}3%qQaGz}V*5rJAHUpUtGb{WP*C@D{ivup&Mi1vPS?7_kw6 zQ*(Eb`n9KNtiVt$AN|Y7m6KQ9j=s>mzfkG(A})a1uFT52{hWw-Dmol-=~Eg=ARIjk zG%}gwyB^shMBTPs-Oo`TJ`GHJu_rsYVUFoI!syBscI#E3!OauD>s_3io|kP>bK%LLx4wQF zM|ethK(ezk`!2?!iHVNLh^7MJ75Ncpo#@kW&dOBPM|llvc``Dxa7%+k=ATCV=WXxU zHEr3-9W_Ujn)|k&B^Cruxe#QY0u9@jZ0rEdzy9#jGvIYA^y8AG&K|#shKc?4vB~I@ zV@&QifsjxMp|%slwDsvE>;HOJrK8uR{KAq+?Fz`4zeW0Kog=r7w(b7Q)#UAqBo|0O zh0vGNQ9m%VNkZObLo|SDyOlAXq$87{@9dDxXTWS6HU|f7G}$I3C(k%sZ7C-sJ%Od| z%yA&N3NJPG&CBBDJQrmFB>=ES0yUemqkyW^Pf_7^{}?^dW3Hiyi9jM*BDcU3F7|z| za8Jn0BtGv92&vc@fEi9PR!CAlSsh5zH?I7Bj0yz%OC}8b#&^wNFjzyb?(7wtz#*p! z#Ni?u)1D3GH#R#w^W$(`OLj1p%WwQOsd+%^2GCH($>;$F2upo-PDDlo|G@ue!?Ax@ z;4EySjDO}8T=366oTySHz5$ChpiGKA_qUoR55h(|_IxZlENcyU_ZXsm>o)exNael1 zF9kQ5%%de4yXpSyAyB4DjIE7v55nqdN0~6@;J}s5{Zej~^ipo9sj4v^V1pva zF@AD@Uc&2Q$UEa_@cZ&(}d-??txf7(Wm=Kt;Lf&ZC>|IEUF7B0rV h^6y;bQ}S-s9@D{PFJ&3?$BfIWzOIQ*+0|PQ{||e7d|dzl diff --git a/src/alarm_clock/vr_alarm.cpp b/src/alarm_clock/vr_alarm.cpp new file mode 100644 index 0000000..852650c --- /dev/null +++ b/src/alarm_clock/vr_alarm.cpp @@ -0,0 +1,187 @@ +#include +#include "../tabcontrollers/UtilitiesTabController.h" +#include "vr_alarm.h" +#include "../openvr/ovr_overlay_wrapper.h" + +namespace alarm_clock +{ +using ::settings::BoolSetting; +using ::settings::getSetting; +using ::settings::IntSetting; + +VrAlarm::VrAlarm() + : m_alarm( getSetting( IntSetting::UTILITY_alarmHour ), + getSetting( IntSetting::UTILITY_alarmMinute ), + getSetting( IntSetting::UTILITY_alarmSecond ) ) +{ + ovr_overlay_wrapper::createOverlay( + "OVR-AlarmOverlay", "OVR-AlarmOverlay", &m_alarmOverlayHandle ); + + ovr_overlay_wrapper::hideOverlay( m_alarmOverlayHandle ); + + const auto filename = "/res/img/alarm/alarm_activated.png"; + ovr_overlay_wrapper::setOverlayFromFile( m_alarmOverlayHandle, filename ); + + ovr_overlay_wrapper::setOverlayWidthInMeters( m_alarmOverlayHandle, 0.3f ); + + vr::HmdMatrix34_t overlayTransform = { { { 1.0f, 0.0f, 0.0f, 0.12f }, + { 0.0f, 1.0f, 0.0f, 0.08f }, + { 0.0f, 0.0f, 1.0f, -0.3f } } }; + + vr::VROverlay()->SetOverlayTransformTrackedDeviceRelative( + m_alarmOverlayHandle, + vr::k_unTrackedDeviceIndex_Hmd, + &overlayTransform ); +} + +void VrAlarm::eventLoopTick() +{ + if ( alarmEnabled() && m_alarm.isValid() ) + { + checkAlarmStatus(); + } +} + +void VrAlarm::showAlarmNotification() +{ + ovr_overlay_wrapper::showOverlay( m_alarmOverlayHandle ); +} + +bool VrAlarm::alarmEnabled() +{ + return getSetting( BoolSetting::UTILITY_alarmEnabled ); +} + +void VrAlarm::setAlarmEnabled( const bool enabled ) +{ + setSetting( BoolSetting::UTILITY_alarmEnabled, enabled ); + emit alarmEnabledChanged(); +} + +void VrAlarm::checkAlarmStatus() +{ + const auto timeToAlarmActivation = QTime::currentTime().secsTo( m_alarm ); + // Allow times to be set across the 24:00 hour line. + // Setting a timer at 0100 when it's 2359 should not trigger + // alarm immediately. + const auto secondsOfGracePeriod = 2; + const auto activateAlarm = timeToAlarmActivation < secondsOfGracePeriod + && timeToAlarmActivation > 0; + if ( activateAlarm ) + { + LOG( INFO ) << "Alarm fired at " << m_alarm.hour() << ":" + << m_alarm.minute() << ":" << m_alarm.second() << "."; + showAlarmNotification(); + setAlarmEnabled( false ); + + std::thread t( + []( vr::VROverlayHandle_t overlayHandle ) { + // This will freeze the overlay for 3 seconds + std::this_thread::sleep_for( std::chrono::seconds( 3 ) ); + ovr_overlay_wrapper::hideOverlay( overlayHandle ); + }, + m_alarmOverlayHandle ); + t.detach(); + } +} + +void VrAlarm::setAlarmTimeToCurrentTime() +{ + auto now = QTime::currentTime(); + setAlarmTime( now.hour(), now.minute(), now.second() ); +} + +void VrAlarm::setAlarmTime( const int hour, const int minute, const int second ) +{ + if ( !QTime::isValid( hour, minute, second ) ) + { + LOG( ERROR ) << "setAlarmTime passed invalid time values: '" << hour + << "' hours, '" << minute << "' minutes, '" << second + << "' seconds."; + } + + setSetting( IntSetting::UTILITY_alarmHour, hour ); + setSetting( IntSetting::UTILITY_alarmMinute, minute ); + setSetting( IntSetting::UTILITY_alarmSecond, second ); + + m_alarm.setHMS( hour, minute, second ); + emit alarmTimeChanged(); +} + +void VrAlarm::modAlarmTime( const int hour, const int minute, const int second ) +{ + if ( hour > 22 || hour < -22 ) + { + LOG( ERROR ) << "modAlarmTime called with incorrect hour value: '" + << hour << "'. Values not applied."; + return; + } + if ( minute > 58 || minute < -58 ) + { + LOG( ERROR ) << "modAlarmTime called with incorrect minute value: '" + << minute << "'. Values not applied."; + return; + } + if ( second > 58 || minute < -58 ) + { + LOG( ERROR ) << "modAlarmTime called with incorrect second value: '" + << second << "'. Values not applied."; + return; + } + + auto resultingHour = getSetting( IntSetting::UTILITY_alarmHour ) + hour; + auto resultingMinute + = getSetting( IntSetting::UTILITY_alarmMinute ) + minute; + auto resultingSecond + = getSetting( IntSetting::UTILITY_alarmSecond ) + second; + + if ( resultingSecond > 59 ) + { + resultingSecond -= 60; + resultingMinute += 1; + } + else if ( resultingSecond < 0 ) + { + resultingSecond += 60; + resultingMinute -= 1; + } + + if ( resultingMinute > 59 ) + { + resultingMinute -= 60; + resultingHour += 1; + } + else if ( resultingMinute < 0 ) + { + resultingMinute += 60; + resultingHour -= 1; + } + + if ( resultingHour > 23 ) + { + resultingHour = resultingHour - 24; + } + else if ( resultingHour < 0 ) + { + resultingHour = resultingHour + 24; + } + + setAlarmTime( resultingHour, resultingMinute, resultingSecond ); +} + +int VrAlarm::getAlarmHour() +{ + return getSetting( IntSetting::UTILITY_alarmHour ); +} + +int VrAlarm::getAlarmMinute() +{ + return getSetting( IntSetting::UTILITY_alarmMinute ); +} + +int VrAlarm::getAlarmSecond() +{ + return getSetting( IntSetting::UTILITY_alarmSecond ); +} + +} // namespace alarm_clock diff --git a/src/alarm_clock/vr_alarm.h b/src/alarm_clock/vr_alarm.h new file mode 100644 index 0000000..6bc0b85 --- /dev/null +++ b/src/alarm_clock/vr_alarm.h @@ -0,0 +1,65 @@ +#pragma once +#include +#include +#include +#include +#include "../settings/settings.h" +#include "../openvr/ovr_overlay_wrapper.h" + +namespace alarm_clock +{ +class VrAlarm : public QObject +{ + Q_OBJECT + + Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled NOTIFY + alarmEnabledChanged ) + +public: + VrAlarm(); + + void eventLoopTick(); + + void showAlarmNotification(); + + bool alarmEnabled(); + void setAlarmEnabled( const bool enabled ); + void checkAlarmStatus(); + + Q_INVOKABLE void setAlarmTimeToCurrentTime(); + Q_INVOKABLE void + setAlarmTime( const int hour, const int minute, const int second ); + Q_INVOKABLE + void modAlarmTime( const int hour, const int minute, const int second ); + Q_INVOKABLE int getAlarmHour(); + Q_INVOKABLE int getAlarmMinute(); + Q_INVOKABLE int getAlarmSecond(); + + /* + Stopwatch + isEnabled + enable + Start + Pause + Stop + Restart + + Timer + isEnabled + enable + Start + Pause + Stop + Restart + */ +signals: + void alarmEnabledChanged(); + void alarmTimeChanged(); + void alarmFired(); + +private: + QTime m_alarm; + vr::VROverlayHandle_t m_alarmOverlayHandle = 0; +}; + +} // namespace alarm_clock diff --git a/src/overlaycontroller.cpp b/src/overlaycontroller.cpp index 901e603..a634f79 100644 --- a/src/overlaycontroller.cpp +++ b/src/overlaycontroller.cpp @@ -46,7 +46,7 @@ OverlayController::OverlayController( bool desktopMode, : QObject(), m_desktopMode( desktopMode ), m_noSound( noSound ), m_verifiedCustomTickRateMs( verifyCustomTickRate( settings::getSetting( settings::IntSetting::APPLICATION_customTickRateMs ) ) ), - m_actions() + m_actions(), m_alarm() { // Arbitrarily chosen Max Length of Directory path, should be sufficient for // Any set-up @@ -292,6 +292,12 @@ OverlayController::OverlayController( bool desktopMode, QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); return obj; } ); + qmlRegisterSingletonType( + qmlSingletonImportName, 1, 0, "VrAlarm", []( QQmlEngine*, QJSEngine* ) { + QObject* obj = &( objectAddress->m_alarm ); + QQmlEngine::setObjectOwnership( obj, QQmlEngine::CppOwnership ); + return obj; + } ); // Grab local version number QStringList verNumericalString @@ -1185,6 +1191,8 @@ void OverlayController::mainEventLoop() m_audioTabController.eventLoopTick(); m_rotationTabController.eventLoopTick( devicePoses ); + m_alarm.eventLoopTick(); + if ( vr::VROverlay()->IsDashboardVisible() ) { m_settingsTabController.dashboardLoopTick(); diff --git a/src/overlaycontroller.h b/src/overlaycontroller.h index 46f8957..cb2bc20 100644 --- a/src/overlaycontroller.h +++ b/src/overlaycontroller.h @@ -1,4 +1,3 @@ - #pragma once #include @@ -43,6 +42,8 @@ #include "openvr/ivrinput.h" +#include "alarm_clock/vr_alarm.h" + namespace application_strings { constexpr auto applicationOrganizationName = "AdvancedSettings-Team"; @@ -152,6 +153,8 @@ private: input::SteamIVRInput m_actions; + alarm_clock::VrAlarm m_alarm; + QNetworkAccessManager* netManager = new QNetworkAccessManager( this ); QJsonDocument m_remoteVersionJsonDocument = QJsonDocument(); QJsonObject m_remoteVersionJsonObject; diff --git a/src/res/img/alarm/alarm_activated.png b/src/res/img/alarm/alarm_activated.png new file mode 100644 index 0000000000000000000000000000000000000000..58bcc95fb4be2d5ee1fcc1d7a395c7f356699c39 GIT binary patch literal 4703 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 TQq;aEBw%4;bF1=(NA&*y5I+6V literal 0 HcmV?d00001 diff --git a/src/res/qml/common/HourComboBox.qml b/src/res/qml/common/HourComboBox.qml new file mode 100644 index 0000000..21ba543 --- /dev/null +++ b/src/res/qml/common/HourComboBox.qml @@ -0,0 +1,50 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 +import ovras.advsettings 1.0 + +MyComboBox { + textRole: "text" + valueRole: "value" + model: [ + { value: 0, text: "00" }, + { value: 1, text: "01" }, + { value: 2, text: "02" }, + { value: 3, text: "03" }, + { value: 4, text: "04" }, + { value: 5, text: "05" }, + { value: 6, text: "06" }, + { value: 7, text: "07" }, + { value: 8, text: "08" }, + { value: 9, text: "09" }, + { value: 10, text: "10" }, + { value: 11, text: "11" }, + { value: 12, text: "12" }, + { value: 13, text: "13" }, + { value: 14, text: "14" }, + { value: 15, text: "15" }, + { value: 16, text: "16" }, + { value: 17, text: "17" }, + { value: 18, text: "18" }, + { value: 19, text: "19" }, + { value: 20, text: "20" }, + { value: 21, text: "21" }, + { value: 22, text: "22" }, + { value: 23, text: "23" }, + ] + + delegate: ItemDelegate { + width: parent.width + text: modelData.text + hoverEnabled: true + contentItem: MyText { + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + text: parent.text + color: parent.enabled ? "#ffffff" : "#909090" + } + background: Rectangle { + color: parent.pressed ? "#406288" : (parent.hovered ? "#365473" : "#2c435d") + } + } +} diff --git a/src/res/qml/common/MinuteSecondComboBox.qml b/src/res/qml/common/MinuteSecondComboBox.qml new file mode 100644 index 0000000..d66cf0a --- /dev/null +++ b/src/res/qml/common/MinuteSecondComboBox.qml @@ -0,0 +1,86 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 +import ovras.advsettings 1.0 + +MyComboBox { + textRole: "text" + valueRole: "value" + model: [ + { value: 0, text: "00" }, + { value: 1, text: "01" }, + { value: 2, text: "02" }, + { value: 3, text: "03" }, + { value: 4, text: "04" }, + { value: 5, text: "05" }, + { value: 6, text: "06" }, + { value: 7, text: "07" }, + { value: 8, text: "08" }, + { value: 9, text: "09" }, + { value: 10, text: "10" }, + { value: 11, text: "11" }, + { value: 12, text: "12" }, + { value: 13, text: "13" }, + { value: 14, text: "14" }, + { value: 15, text: "15" }, + { value: 16, text: "16" }, + { value: 17, text: "17" }, + { value: 18, text: "18" }, + { value: 19, text: "19" }, + { value: 20, text: "20" }, + { value: 21, text: "21" }, + { value: 22, text: "22" }, + { value: 23, text: "23" }, + { value: 24, text: "24" }, + { value: 25, text: "25" }, + { value: 26, text: "26" }, + { value: 27, text: "27" }, + { value: 28, text: "28" }, + { value: 29, text: "29" }, + { value: 30, text: "30" }, + { value: 31, text: "31" }, + { value: 32, text: "32" }, + { value: 33, text: "33" }, + { value: 34, text: "34" }, + { value: 35, text: "35" }, + { value: 36, text: "36" }, + { value: 37, text: "37" }, + { value: 38, text: "38" }, + { value: 39, text: "39" }, + { value: 40, text: "40" }, + { value: 41, text: "41" }, + { value: 42, text: "42" }, + { value: 43, text: "43" }, + { value: 44, text: "44" }, + { value: 45, text: "45" }, + { value: 46, text: "46" }, + { value: 47, text: "47" }, + { value: 48, text: "48" }, + { value: 49, text: "49" }, + { value: 50, text: "50" }, + { value: 51, text: "51" }, + { value: 52, text: "52" }, + { value: 53, text: "53" }, + { value: 54, text: "54" }, + { value: 55, text: "55" }, + { value: 56, text: "56" }, + { value: 57, text: "57" }, + { value: 58, text: "58" }, + { value: 59, text: "59" } + ] + + delegate: ItemDelegate { + width: parent.width + text: modelData.text + hoverEnabled: true + contentItem: MyText { + horizontalAlignment: Text.AlignLeft + verticalAlignment: Text.AlignVCenter + text: parent.text + color: parent.enabled ? "#ffffff" : "#909090" + } + background: Rectangle { + color: parent.pressed ? "#406288" : (parent.hovered ? "#365473" : "#2c435d") + } + } +} diff --git a/src/res/qml/common/TimeAssembly.qml b/src/res/qml/common/TimeAssembly.qml new file mode 100644 index 0000000..9574ade --- /dev/null +++ b/src/res/qml/common/TimeAssembly.qml @@ -0,0 +1,49 @@ +import QtQuick 2.7 +import QtQuick.Controls 2.0 +import QtQuick.Layouts 1.3 +import ovras.advsettings 1.0 + +RowLayout { + signal timeChanged(int hour, int minute, int second) + + HourComboBox { + id: hourBox + onActivated: { + parent.timeChanged(hourBox.currentIndex, + minuteBox.currentIndex, + secondBox.currentIndex) + } + } + MyText { + text: "h" + } + + MinuteSecondComboBox { + id: minuteBox + onActivated: { + parent.timeChanged(hourBox.currentIndex, + minuteBox.currentIndex, + secondBox.currentIndex) + } + } + MyText { + text: "m" + } + + MinuteSecondComboBox { + id: secondBox + onActivated: { + parent.timeChanged(hourBox.currentIndex, + minuteBox.currentIndex, + secondBox.currentIndex) + } + } + MyText { + text: "s" + } + function changeTimer(hour, minute, second) { + hourBox.currentIndex = hour + minuteBox.currentIndex = minute + secondBox.currentIndex = second + } +} diff --git a/src/res/qml/utilities_page/alarm_clock/AlarmGroupBox.qml b/src/res/qml/utilities_page/alarm_clock/AlarmGroupBox.qml index e0e25dd..7342b52 100644 --- a/src/res/qml/utilities_page/alarm_clock/AlarmGroupBox.qml +++ b/src/res/qml/utilities_page/alarm_clock/AlarmGroupBox.qml @@ -10,7 +10,7 @@ GroupBox { label: MyText { leftPadding: 10 - text: "Alarm Clock" + text: "Clock" bottomPadding: -10 } background: Rectangle { @@ -19,164 +19,97 @@ GroupBox { radius: 8 } ColumnLayout { - anchors.fill: parent - - Rectangle { - color: "#ffffff" - height: 1 - Layout.fillWidth: true - Layout.bottomMargin: 5 - } - - RowLayout { - MyToggleButton { - id: alarmClockToggle - text: "" - onCheckedChanged: { - UtilitiesTabController.setAlarmEnabled(checked, false) - } + property int activationButtonWidth: 170; + property int startStopPauseResetButtonWidth: 220 + + ColumnLayout { + + LineSeparator { } - - Item { - Layout.fillWidth: true - } - - MyTextField { - id: alarmClockHourText - text: "00" - keyBoardUID: 602 - Layout.preferredWidth: 50 - horizontalAlignment: Text.AlignHCenter - function onInputEvent(input) { - var val = parseInt(input) - if (!isNaN(val)) { - if (val < 0) { - val = 0 - } else if (val > 23) { - val = 23 - } - UtilitiesTabController.setAlarmTimeHour(val, false) + + RowLayout { + MyToggleButton { + id: alarmClockToggle + text: "Alarm" + + Layout.preferredWidth: parent.parent.parent.activationButtonWidth + onCheckedChanged: { + VrAlarm.alarmEnabled = checked } - parent.parent.parent.setAlarmHourText(UtilitiesTabController.alarmTimeHour) } - } - - MyText { - text: ":" - } - - MyTextField { - id: alarmClockMinuteText - text: "00" - keyBoardUID: 603 - Layout.preferredWidth: 50 - horizontalAlignment: Text.AlignHCenter - function onInputEvent(input) { - var val = parseInt(input) - if (!isNaN(val)) { - if (val < 0) { - val = 0 - } else if (val > 59) { - val = 59 - } - UtilitiesTabController.setAlarmTimeMinute(val, false) + + TimeAssembly { + id: alarmClockTimeAssembly + onTimeChanged: { + VrAlarm.setAlarmTime(hour, minute, second) } - parent.parent.parent.setAlarmMinuteText(UtilitiesTabController.alarmTimeMinute) } - } - - Item { - Layout.fillWidth: true - } - - MyPushButton2 { - Layout.preferredWidth: 200 - text: "Current Time" - onClicked: { - UtilitiesTabController.setAlarmTimeToCurrentTime() + + Item { + Layout.fillWidth: true } - } - - MyPushButton2 { - Layout.leftMargin: 50 - Layout.preferredWidth: 120 - text: "+1 Hour" - onClicked: { - UtilitiesTabController.modAlarmTimeHour(1) + + MyPushButton2 { + Layout.preferredWidth: 170 + text: "Current Time" + onClicked: { + VrAlarm.setAlarmTimeToCurrentTime() + alarmClockTimeAssembly.changeTimer(VrAlarm.getAlarmHour(), + VrAlarm.getAlarmMinute(), + VrAlarm.getAlarmSecond()) + } } - } - - MyPushButton2 { - Layout.preferredWidth: 120 - text: "-1 Hour" - onClicked: { - UtilitiesTabController.modAlarmTimeHour(-1) + + MyPushButton2 { + Layout.preferredWidth: 120 + text: "+1 Hour" + onClicked: { + VrAlarm.modAlarmTime(1, 0, 0) + } } - } - - MyPushButton2 { - text: "+5 Min" - Layout.leftMargin: 50 - Layout.preferredWidth: 120 - onClicked: { - UtilitiesTabController.modAlarmTimeMinute(5) + + MyPushButton2 { + Layout.preferredWidth: 120 + text: "-1 Hour" + onClicked: { + VrAlarm.modAlarmTime(-1, 0, 0) + } } - } - - MyPushButton2 { - Layout.preferredWidth: 120 - text: "-5 Min" - onClicked: { - UtilitiesTabController.modAlarmTimeMinute(-5) + + MyPushButton2 { + text: "+5 Min" + Layout.preferredWidth: 120 + onClicked: { + VrAlarm.modAlarmTime(0, 5, 0) + } } - } - } - - RowLayout { - MyToggleButton { - id: alarmDontAnnoyToggle - text: "Don't Annoy me" - onCheckedChanged: { - UtilitiesTabController.setAlarmIsModal(!checked, false) + + MyPushButton2 { + Layout.preferredWidth: 120 + text: "-5 Min" + onClicked: { + VrAlarm.modAlarmTime(0, -5, 0) + } } } } } Component.onCompleted: { - alarmClockToggle.checked = UtilitiesTabController.alarmEnabled - alarmDontAnnoyToggle.checked = !UtilitiesTabController.alarmIsModal - setAlarmHourText(UtilitiesTabController.alarmTimeHour) - setAlarmMinuteText(UtilitiesTabController.alarmTimeMinute) - alarmGroupBox.visible = !OverlayController.desktopMode + alarmClockToggle.checked = VrAlarm.alarmEnabled + alarmClockTimeAssembly.changeTimer(VrAlarm.getAlarmHour(), + VrAlarm.getAlarmMinute(), + VrAlarm.getAlarmSecond()) } Connections { - target: UtilitiesTabController + target: VrAlarm onAlarmEnabledChanged: { - alarmClockToggle.checked = UtilitiesTabController.alarmEnabled + alarmClockToggle.checked = VrAlarm.alarmEnabled } - onAlarmIsModalChanged: { - alarmDontAnnoyToggle.checked = !UtilitiesTabController.alarmIsModal - } - onAlarmTimeHourChanged: { - setAlarmHourText(UtilitiesTabController.alarmTimeHour) - } - onAlarmTimeMinuteChanged: { - setAlarmMinuteText(UtilitiesTabController.alarmTimeMinute) - } - } - function setAlarmHourText(value) { - if (value < 9) { - alarmClockHourText.text = "0" + value - } else { - alarmClockHourText.text = value - } - } - function setAlarmMinuteText(value) { - if (value < 9) { - alarmClockMinuteText.text = "0" + value - } else { - alarmClockMinuteText.text = value + onAlarmTimeChanged: { + alarmClockTimeAssembly.changeTimer(VrAlarm.getAlarmHour(), + VrAlarm.getAlarmMinute(), + VrAlarm.getAlarmSecond()) } } } diff --git a/src/settings/internal/settings_controller.h b/src/settings/internal/settings_controller.h index 80dc50e..40d29dd 100644 --- a/src/settings/internal/settings_controller.h +++ b/src/settings/internal/settings_controller.h @@ -546,6 +546,10 @@ private: SettingCategory::Utility, QtInfo{ "alarmMinute" }, 0 }, + IntSettingValue{ IntSetting::UTILITY_alarmSecond, + SettingCategory::Utility, + QtInfo{ "alarmSecond" }, + 0 }, IntSettingValue{ IntSetting::ROTATION_autoturnLinearTurnSpeed, SettingCategory::Rotation, QtInfo{ "autoturnLinearTurnSpeed" }, diff --git a/src/settings/settings.h b/src/settings/settings.h index 9368ddd..7e9cc4f 100644 --- a/src/settings/settings.h +++ b/src/settings/settings.h @@ -109,6 +109,7 @@ enum class IntSetting UTILITY_alarmHour, UTILITY_alarmMinute, + UTILITY_alarmSecond, ROTATION_autoturnLinearTurnSpeed, // LAST_ENUMERATOR must always be set to the last value diff --git a/src/tabcontrollers/UtilitiesTabController.cpp b/src/tabcontrollers/UtilitiesTabController.cpp index 91fa32f..393dc7e 100644 --- a/src/tabcontrollers/UtilitiesTabController.cpp +++ b/src/tabcontrollers/UtilitiesTabController.cpp @@ -12,13 +12,6 @@ namespace advsettings { void UtilitiesTabController::initStage1() { - auto qAlarmHour - = settings::getSetting( settings::IntSetting::UTILITY_alarmHour ); - auto qAlarmMinute - = settings::getSetting( settings::IntSetting::UTILITY_alarmMinute ); - - m_alarmTime = QTime( qAlarmHour, qAlarmMinute ); - m_utilitiesSettingsUpdateCounter = utils::adjustUpdateRate( k_utilitiesSettingsUpdateCounter ); } @@ -202,53 +195,11 @@ void UtilitiesTabController::sendKeyboardThree() sendStringAsInput( commands ); } -bool UtilitiesTabController::alarmEnabled() const -{ - return settings::getSetting( settings::BoolSetting::UTILITY_alarmEnabled ); -} - -bool UtilitiesTabController::alarmIsModal() const -{ - return settings::getSetting( settings::BoolSetting::UTILITY_alarmIsModal ); -} - bool UtilitiesTabController::vrcDebug() const { return settings::getSetting( settings::BoolSetting::UTILITY_vrcDebug ); } -int UtilitiesTabController::alarmTimeHour() const -{ - return m_alarmTime.hour(); -} - -int UtilitiesTabController::alarmTimeMinute() const -{ - return m_alarmTime.minute(); -} - -void UtilitiesTabController::setAlarmEnabled( bool enabled, bool notify ) -{ - settings::setSetting( settings::BoolSetting::UTILITY_alarmEnabled, - enabled ); - - m_alarmLastCheckTime = QTime(); - - if ( notify ) - { - emit alarmEnabledChanged( enabled ); - } -} - -void UtilitiesTabController::setAlarmIsModal( bool modal, bool notify ) -{ - settings::setSetting( settings::BoolSetting::UTILITY_alarmIsModal, modal ); - if ( notify ) - { - emit alarmIsModalChanged( modal ); - } -} - void UtilitiesTabController::setVrcDebug( bool value, bool notify ) { settings::setSetting( settings::BoolSetting::UTILITY_vrcDebug, value ); @@ -258,116 +209,6 @@ void UtilitiesTabController::setVrcDebug( bool value, bool notify ) } } -void UtilitiesTabController::setAlarmTimeHour( int hour, bool notify ) -{ - if ( m_alarmTime.hour() == hour ) - { - return; - } - - if ( m_alarmTime.isValid() ) - { - m_alarmTime = QTime( hour, m_alarmTime.minute() ); - } - else - { - m_alarmTime = QTime( hour, 0 ); - } - - settings::setSetting( settings::IntSetting::UTILITY_alarmHour, - m_alarmTime.hour() ); - settings::setSetting( settings::IntSetting::UTILITY_alarmMinute, - m_alarmTime.minute() ); - - m_alarmLastCheckTime = QTime(); - - if ( notify ) - { - emit alarmTimeHourChanged( hour ); - } -} - -void UtilitiesTabController::setAlarmTimeMinute( int min, bool notify ) -{ - if ( m_alarmTime.minute() != min ) - { - if ( m_alarmTime.isValid() ) - { - m_alarmTime = QTime( m_alarmTime.hour(), min ); - } - else - { - m_alarmTime = QTime( 0, min ); - } - - settings::setSetting( settings::IntSetting::UTILITY_alarmHour, - m_alarmTime.hour() ); - settings::setSetting( settings::IntSetting::UTILITY_alarmMinute, - m_alarmTime.minute() ); - - m_alarmLastCheckTime = QTime(); - if ( notify ) - { - emit alarmTimeMinuteChanged( min ); - } - } -} - -void UtilitiesTabController::setAlarmTimeToCurrentTime() -{ - auto now = QTime::currentTime(); - setAlarmTimeHour( now.hour() ); - setAlarmTimeMinute( now.minute() ); -} - -void UtilitiesTabController::modAlarmTimeHour( int value, bool notify ) -{ - auto h = m_alarmTime.hour(); - m_alarmTime = m_alarmTime.addSecs( value * 60 * 60 ); - - settings::setSetting( settings::IntSetting::UTILITY_alarmHour, - m_alarmTime.hour() ); - settings::setSetting( settings::IntSetting::UTILITY_alarmMinute, - m_alarmTime.minute() ); - - if ( h != m_alarmTime.hour() ) - { - m_alarmLastCheckTime = QTime(); - if ( notify ) - { - emit alarmTimeHourChanged( m_alarmTime.hour() ); - } - } -} - -void UtilitiesTabController::modAlarmTimeMinute( int value, bool notify ) -{ - auto h = m_alarmTime.hour(); - auto m = m_alarmTime.minute(); - m_alarmTime = m_alarmTime.addSecs( value * 60 ); - - settings::setSetting( settings::IntSetting::UTILITY_alarmHour, - m_alarmTime.hour() ); - settings::setSetting( settings::IntSetting::UTILITY_alarmMinute, - m_alarmTime.minute() ); - - if ( m != m_alarmTime.minute() || h != m_alarmTime.hour() ) - { - m_alarmLastCheckTime = QTime(); - if ( notify ) - { - if ( h != m_alarmTime.hour() ) - { - emit alarmTimeHourChanged( m_alarmTime.hour() ); - } - if ( m != m_alarmTime.minute() ) - { - emit alarmTimeMinuteChanged( m_alarmTime.minute() ); - } - } - } -} - QString getBatteryIconPath( int batteryState ) { constexpr auto batteryPrefix = "/res/img/battery/battery_"; @@ -431,136 +272,6 @@ void UtilitiesTabController::eventLoopTick() { if ( settingsUpdateCounter >= m_utilitiesSettingsUpdateCounter ) { - if ( alarmEnabled() && m_alarmTime.isValid() ) - { - auto now = QTime::currentTime(); - if ( m_alarmLastCheckTime.isValid() - && m_alarmLastCheckTime <= m_alarmTime && m_alarmTime <= now ) - { - setAlarmEnabled( false ); - char alarmMessageBuffer[1024]; - std::snprintf( alarmMessageBuffer, - 1024, - "The alarm at %02i:%02i went off.", - alarmTimeHour(), - alarmTimeMinute() ); - if ( alarmIsModal() ) - { - std::thread messageThread( - []( UtilitiesTabController* parent, - std::string message ) { - auto res = vr::VROverlay()->ShowMessageOverlay( - message.c_str(), - "Alarm Clock", - "Ok", - "+15 min" ); - if ( res - == vr::VRMessageOverlayResponse_ButtonPress_1 ) - { - parent->setAlarmTimeToCurrentTime(); - parent->modAlarmTimeMinute( 15 ); - parent->setAlarmEnabled( true ); - } - else if ( - res >= vr:: - VRMessageOverlayResponse_CouldntFindSystemOverlay ) - { - static const char* errorMessages[] - = { "CouldntFindSystemOverlay", - "CouldntFindOrCreateClientOverlay", - "ApplicationQuit" }; - int errorCode - = res - - vr:: - VRMessageOverlayResponse_CouldntFindSystemOverlay; - if ( res < 3 ) - { - LOG( ERROR ) - << "Could not create Alarm Overlay: " - << errorMessages[errorCode]; - } - else - { - LOG( ERROR ) << "Could not create Alarm " - "Overlay: Unknown Error"; - } - } - }, - this, - std::string( alarmMessageBuffer ) ); - messageThread.detach(); - } - else - { - vr::VRNotificationId notificationId; - vr::EVRInitError eError; - vr::IVRNotifications* vrnotification - = static_cast( - vr::VR_GetGenericInterface( - vr::IVRNotifications_Version, &eError ) ); - if ( eError != vr::VRInitError_None ) - { - LOG( ERROR ) - << "Error while getting IVRNotifications interface" - << vr::VR_GetVRInitErrorAsEnglishDescription( - eError ); - vrnotification = nullptr; - } - else - { - vr::NotificationBitmap_t* messageIconPtr = nullptr; - /* - // Can i even create this object on the stack, who takes - ownership? vr::NotificationBitmap_t messageIcon; - - // First get image width and height - vr::VROverlay()->GetOverlayImageData(parent->overlayThumbnailHandle(), - nullptr, 0, (uint32_t*)&messageIcon.m_nWidth, - (uint32_t*)&messageIcon.m_nHeight); - - messageIcon.m_nBytesPerPixel = 4; - unsigned bufferSize = - messageIcon.m_nWidth*messageIcon.m_nHeight*messageIcon.m_nBytesPerPixel; - - // Can I delete this buffer after this section? Who - takes ownership? std::unique_ptr imageBuffer; - imageBuffer.reset(new char[bufferSize]); - messageIcon.m_pImageData = imageBuffer.get(); - - // Get image data - auto iconError = - vr::VROverlay()->GetOverlayImageData(parent->overlayThumbnailHandle(), - messageIcon.m_pImageData, bufferSize, - (uint32_t*)&messageIcon.m_nWidth, - (uint32_t*)&messageIcon.m_nHeight); if (iconError != - vr::VROverlayError_None) { LOG(ERROR) << "Error while - getting message overlay icon: " << - vr::VROverlay()->GetOverlayErrorNameFromEnum(iconError); - } else { - messageIconPtr = &messageIcon; - } - */ - auto nError = vrnotification->CreateNotification( - m_parent->overlayHandle(), - 666, - vr::EVRNotificationType_Transient, - alarmMessageBuffer, - vr::EVRNotificationStyle_Application, - messageIconPtr, - ¬ificationId ); - if ( nError != vr::VRNotificationError_OK ) - { - LOG( ERROR ) - << "Error while creating notification: " - << nError; - vrnotification = nullptr; - } - } - } - } - m_alarmLastCheckTime = now; - } - // attach battery overlay to all tracked devices that aren't a // controller or hmd for ( vr::TrackedDeviceIndex_t i = 0; i < vr::k_unMaxTrackedDeviceCount; diff --git a/src/tabcontrollers/UtilitiesTabController.h b/src/tabcontrollers/UtilitiesTabController.h index 5106173..4b0affd 100644 --- a/src/tabcontrollers/UtilitiesTabController.h +++ b/src/tabcontrollers/UtilitiesTabController.h @@ -19,25 +19,14 @@ class OverlayController; class UtilitiesTabController : public QObject { Q_OBJECT - Q_PROPERTY( bool alarmEnabled READ alarmEnabled WRITE setAlarmEnabled NOTIFY - alarmEnabledChanged ) - Q_PROPERTY( bool alarmIsModal READ alarmIsModal WRITE setAlarmIsModal NOTIFY - alarmIsModalChanged ) Q_PROPERTY( bool vrcDebug READ vrcDebug WRITE setVrcDebug NOTIFY vrcDebugChanged ) - Q_PROPERTY( int alarmTimeHour READ alarmTimeHour WRITE setAlarmTimeHour - NOTIFY alarmTimeHourChanged ) - Q_PROPERTY( int alarmTimeMinute READ alarmTimeMinute WRITE - setAlarmTimeMinute NOTIFY alarmTimeMinuteChanged ) private: OverlayController* m_parent; unsigned settingsUpdateCounter = 0; - QTime m_alarmTime; - QTime m_alarmLastCheckTime; - vr::VROverlayHandle_t m_batteryOverlayHandles[vr::k_unMaxTrackedDeviceCount] = { 0 }; int m_batteryState[vr::k_unMaxTrackedDeviceCount]; @@ -51,11 +40,7 @@ public: void eventLoopTick(); - bool alarmEnabled() const; - bool alarmIsModal() const; bool vrcDebug() const; - int alarmTimeHour() const; - int alarmTimeMinute() const; public slots: void sendKeyboardInput( QString input ); @@ -93,21 +78,10 @@ public slots: Q_INVOKABLE void sendKeyboardTwo(); Q_INVOKABLE void sendKeyboardThree(); - void setAlarmEnabled( bool enabled, bool notify = true ); - void setAlarmIsModal( bool modal, bool notify = true ); void setVrcDebug( bool value, bool notify = true ); - void setAlarmTimeHour( int hour, bool notify = true ); - void setAlarmTimeMinute( int min, bool notify = true ); - void setAlarmTimeToCurrentTime(); - void modAlarmTimeHour( int value, bool notify = true ); - void modAlarmTimeMinute( int value, bool notify = true ); signals: - void alarmEnabledChanged( bool enabled ); - void alarmIsModalChanged( bool modal ); void vrcDebugChanged( bool value ); - void alarmTimeHourChanged( int hour ); - void alarmTimeMinuteChanged( int min ); }; } // namespace advsettings