From 459289df2d708651be01af7abea4b33d20cfa27f Mon Sep 17 00:00:00 2001 From: Asya Vee Date: Wed, 27 Aug 2025 02:08:23 +0400 Subject: [PATCH] booking capacity check for time slots --- apps/pocketbase/pb_data/auxiliary.db | Bin 1097728 -> 1269760 bytes apps/pocketbase/pb_data/data.db | Bin 229376 -> 229376 bytes .../1756241295_updated_timeSlots.js | 38 ++++++++++ .../1756241390_updated_bookingTypes.js | 66 ++++++++++++++++++ .../1756242359_updated_timeSlots.js | 27 +++++++ .../1756242388_updated_bookingTypes.js | 27 +++++++ .../1756243147_updated_bookings.js | 22 ++++++ apps/web/components/BookingForm.tsx | 47 +++++++++++-- apps/web/components/DateSelector.tsx | 9 ++- apps/web/lib/pocketbase.ts | 24 ++++++- apps/web/types/bookings.ts | 8 +-- 11 files changed, 255 insertions(+), 13 deletions(-) create mode 100644 apps/pocketbase/pb_migrations/1756241295_updated_timeSlots.js create mode 100644 apps/pocketbase/pb_migrations/1756241390_updated_bookingTypes.js create mode 100644 apps/pocketbase/pb_migrations/1756242359_updated_timeSlots.js create mode 100644 apps/pocketbase/pb_migrations/1756242388_updated_bookingTypes.js create mode 100644 apps/pocketbase/pb_migrations/1756243147_updated_bookings.js diff --git a/apps/pocketbase/pb_data/auxiliary.db b/apps/pocketbase/pb_data/auxiliary.db index e1b32860e8de0152a61bf4c730af9b353751a5e5..515babcb63aaa8bdfbaad048d30db08159f6fb5d 100644 GIT binary patch delta 48197 zcmeFacbpW();B&Ks=KGVr)L+*C@x4wm+9&03E;{isF=whqA)qgo#ToT^!{ zVElp|XRqo9M(K2fb#=p7V$_y-8;sm1{GB?)QMZY8%ZX;eE6f$n6Q&Ah3#SR=gfW6D zj1qy@Yx}5CH!t|1Na}XWcej1`f z+M5v_-0nd1xON56f$b+CI-q?7q7CiC5k0nj5TeJlAB*VG?R^pL*WO(>PDk`@mr$fn zJBMiRb`sH^Z5Jcjy)BDqx3)N<^=$z}>)Kq1N^NrxHMGq@RBW5HE!+>%N85FJ=_>+N z(O%<1BO`rfJk}UAPBMOKe93s-H`6oNYWPZrXAUc*A}!S zqJBH2m9@VHc&w#BJd#M+g5H=Zl%$s#uhaEDiW*5+oLPS&;VG4DftcSC?u8`H*D{22 zo`luow<|%5obs254g~l$z#sDlLUvm)lg^qGF_UgB0xW|yL`j%Jax9VyMstZwN+xY*<@EE&y(jJ5HgM97(g1|_>P;!6*<@BvFxgKqTN}*sXp;&316xtkYlZL+ElR97l+~fr>6S!f{);-rFY6-L{SxdKDm^MRiZc@7ql%D+dnH%_PB6dXVsk zaGNlN|Bb(upQQgqzd?Tv_Y=1cnCQ1*-&MpQgR#xnUAjRUrhhm~x5D)#ktx5hif|G% zUD6HeNdC}Jo^%B$HxSeZ;)$@ zJB@eIH&X#4G%ln)#;9?YaXi)C*l6rS_BPVeH$ddZN^eU~Nt@}SbRA36|CW|g8<`{- zp+`$eHY!~pO_VIsvGhMA-tdEAui*udW#$;R8`d+M$rB8h8wv(DNs(W)a3iQI$Q_1r z3=U!m^$B&7zDP|q4CbcM=Njs$OT=Hn0Pz!cA=@bKCSMmH7B`AlfbWQV#7h`X3=&_1 zdDL!k8re$Mktd5|#SzqSv4^N*z7f6@-Vk;QcL|VsSXd}TnbVl1s3)1gJcW9YzNp{$ z7Tm~~ft79<%)djtMO;hH1o!gK@LSoth$s2$`AhjU`z1S`?ZfWmbo_3 zBEcU^uiypx1JK4CqyJIAPyZrwo&J9C9`iOhQ-3q{tA2&Pj{BASgxgJB!adAwWTV^_ z+YtocHAYpsk!5M?ON-%l@!e_NMKzc+PFM+rgu-c|6%? zh{<6O#}b8*tz^&VlL~l76Cy|aA;lbu#QlLt+LZ@S!j|#m&U!iQF()l0zpAP^e??X~j-cHP7T}ah))bF8awbzI5pc!8R4h~WWlhCGA)X8tQ$7Vu!OXh6+2xI868>Z) z?k#%2hcJE`Ill!9FpHEIW_2PEn&mZ&>xF3E+Q*W)ZE zb!|t%mWkva^>QHYRB~Rs5-@udQ;?y`D^4fV%<0Vay4#6M31TbRkGzI_g6aj9GZuZj zKBsr;&(hoU1N8>feSFBh#68H}!mZ*i;(W}7q=~r<6xe3q2Il|=7{r{;wm@zY+0eqB zNFPOhMg2j2PQ3=UQ;$)1P*+h4s4zL3nqmCX_=a&OlQG_yZL zCl?#o;|!AcGuI7XF^M#v!M=*dY?A+)e~W*T-^{P&m+>iXD1QON6VLDyd4>I*BKiKz zvE(LRum4{EzW#aree87oI`Rqh5z^!}%s0#)=4oaNb3KeqCeNr>5`}0yWh#W+Nw=?9 zAnt|FOeSZ+si%`YVBcITdz01x2?`A$!y-DVHze_4rhm*JUb&$lKwYQ^@g% z?GLG;WGd_}6)d43b$0pqspL;Y5AB^=d`@RPZuXfH_irHU!D z>awKO5}1M0dWtUDWlqYLk{XQL>3x-Pv{ciK zmgI0gY)VDckX=ruz#@%lvpU_yXw(t(W)!cS0y)ea?I?QOa?l-3q=F8A0HigplJTK2 zI+swK$zm`NBEQg>7Qf%DC>f90=~RMpjF=6_qKZ91gH(Go>~h57v0}+@&j-QPHKq+W z!}T-B8}V0XamTD`Jdg;d3m%6W1V7@^1WU3tiT)yqeB2oaKVadhY|fdFm9n0&4|NFO z8(f%xHL0X>8O0qhB&=qzAEzuOA|556`U+V~!IuFaU}j8J+_Ahps%AsxgaY<-Z$Txt z%0;v6HfIsB+8i#hOG|1^2XdLLI~B;;Y;K1ayomGXbH1D$&ZN^Rhcy!dJ2a-vVG2b` z7JoQwSFGtIcm!v6B{HZ(4wz#e#bdF9jX0$mc4w_2b0nX$qy8G)+MODP>atMGW}lDFki7QoIyNCsJk;eSC!(v=!5d zw8xondXj#+51c=dJfYrVP8SPKUoI{OGuEsfOokgLk|txq?@IUrYQ&X}#go*TaQ8&= zyt=H(mv-bVQG3W6h^h3}^1Aa#&kSmS?)fsinfzsCKl&fKfx3-4@&~eo)Ds=VG4xDo zpKc=+1~QbIDRakw#CdStFhhm}JK^e+DHL8@4KJ#OscM+i!Y@ehL^b{Z4jE7e8+9JI z{!D6KmGLVY7Nc=OPvTb`7EO)imzQV1N8L&sVv^Kxha%riP(u=`M? z{8AI&7ni#Yp4`MQC&5#PKoUH6c;vdnBa;tB;2&dorc588ejnSy+^Opz(hPAu@eH|> zyo(-0*HOQs8QN~@VN|sp)O^DLu}B4}Y1CM11l66s90>G}^gjAUx(uEHTfz0IUhV~MyFSIO=Z@2_<(6}K&c*j7A-Rx@@c@mL=NaxLCy*vIW->yM z_?AD9c!&Ih{G2Y*9)1FSF8K!Spl=dA;8?DN_a%L zjkAk`#X8|v$jS7vEoJ%#(W6zup~puL|G9n{^BVIQs?o}y_ANX8DT~Vz@~PoS&TNT+ zYcSIr%(*>gyFV5(n;c01HKq-94H=uP&2TJL% zHLS=H6^$w*I?f%~2e!^4uQX;{=|IS0k#iwSE)33r#`DON;Rp*ot=?`nC%wgJq!5S% z-8mI~5GyUHQ~G8m8Gv;v-2={*f59h8AxBP8K?441 zrTf&|gPw>vnF^FL>9CS7(62yxCYr7~LyF%k2Nl(wh^uKE`77Kq1I-JboUXMK=a20J{3)rkN?O8bx zaOK?bglu+r(%|+=_F_~?xcp&r)Sh(bK~KztdmVK5G0vFZ9&|?YfoQ?vOZ&mAShPE0 z@mnofITMMdO(memOouz}_PCWuTt#zoKX|`9YBYTkQSV5|ve|1+ha4WKDU}5K;QTT4 zRCw$RvJw6{h8_cdm`*m1aoWsj6B@j%kx(q?GJ^w}NLwKmvREzdtRv`BtqJfkE|{-q zai`RzCt5H$voa{c7p9XVXu~|+Sh)K{dh9f3DW7nboQ0Uh8OT~A3|A2q@}j2V4m%S5 zf>#E=U{NI{mWo+o5xZh3C{geeW`^CFcoYrsehV4_)1YK{PB#sDn&?ThG}z(I%0bnd z_j)3wQd|YgB~CZO9dP)=g>1$haXHa+h;Bg49xiV#lL_Zi;Y224E5+!(T6TNX>PWjo ziZ>E9XT2HXXDNxKizm^OuztfHi`l$ccgPv{#nIx3_(a;Q8v(N?(L*Y5!WB||c2`i1 zq_WN^`L^^8g6};DC;fSE63r34)>1NNq1w<;P!GR5iS}v=p4-ZE#?rSnpV5O}tYcqf zo0)r=VPGw&qZb=9cyQTen1FgwJmhGDj5fq@v*e z`;1I^`&ZN%BwYVBl_93%0DkZ#l|vBf2tK9SiSalnqp|2Ts=Vi8>U4^@zk=LTL8uR? zN64kC=BBm>y2BD>x|bLuQaYOUJ7?D6bCo; zG}ak;q*VAr`bqkiv|su}+KW^RuSqXS&q|L=4@=vn&C(sx2BassTDn47E-jT7NF^yF z#iW4b+PJiip-5>CP5U% zW=;A(jb)~p`Qz9T8_C(a%3_EG#=E$Y#;ch7-J3?&oiE4G#UFbYvGUu z(iEOqCQcWd#gWX@aQ*^mNDJGS-^Rw+Mf?r?WqgK7@pJhzc$IyeZy*=*f~Fu~w&-8f zmzfLnHzU1J;3d zkOwYsHn4-^fJFaHe?-4bKSIP@@-}ZNR}3YxE*HQH1%Eg#Cmd;0G+2~Td!?3ZDg6QT$&{=m zw89El9Cm7dg&Bj>qRdfs0S8*SIo-jKBbs()ffKr-%qX}sz;uVJqD*t0D_x2v(ZG@l z#!^L7c81W;KDL$F|TuFI>G#Y zjnb`nuW($Mw8N3*B6XOhS2hUix54iy)z2zDFK z&3poUd2vhk78b7Rx^_rBWc#H0uKQ{IEsFZ4%5A;C#X2p zk9>wq>t5Df1TWmh9|z@DwukmqV@dF@YH{wvVGpnc)z?wvX{StU80Aa^N4evXh_{;b z>#}?qDkdDagq>R6znDFjfZr@)@2H|1s^L-`!aj@G#T5?uJr2wJd$S{`^5sXdj}io| z-gQwmY^jEcY8b>}Pw)}1`&BnUTiHeFCA3VvOI=2(@aP@l(S3#P{0=^%+er2yo+5W5 zHTBiZv&?Z|KK&M2>|Frw+bQ<%*fHM1g1gWYJ%1Wpy_QYEN6)8^CyDK_wT&GN?`UPG zkl<&nHc+@9KNol~O}F~t`bF%7<6ZH1I2iNK%@h;fhNgz0rjW<(ie^LMe8Qw;QbULM zg5HQH-4yho&w2GyR4Mjl>|{a{zM=fUef;Tlc=8SreOb*xIBpuZf%Xm{UXJl?Hp7ExSO!C+Jr!&q}W^N|y3H-W6Bm(P3W-_NNUg>OgLki^jvp58_WFXq8xlUZ`2u#{O9zj=$Y)1kJ$1zb)0Y( zqe#U%H|0%cgDLO-##?baV{UIG;?$Pnb2IU4lTCZ)rn5+k;Z6k;TE_pJ#hvmx zGygl~$tFC1mk>^Vj_%E&#(1ZbZXJ&s-7$wZsD`G)8tnQcvfNA_%k)Fv$cPbLlO0)U zhh@8=`mx+z4R5N3*H^e10BdCds+*w|PuM9kTB1rXQx!4d^TA zONh(i5GOORMdGP`6hnSX{7Ak-K1=K)&mb>jDYlh;og2l$6yJ3%Xhe6< z08eACJ68qaNAbg*J+??Z;jpKIksOFWDgup+F>FbR(POtnS0L z(mK4d$*frX8P#S}Re;y1VKrz8n@!eKKt+=?J2|&}gNq5$(EJV>oR0Q0!TPW@W6NX< zN+{_psa`iBz%_nme0>1fCRN`oQn@ zAaRiZGZsF#haFLVJ;0o!*%Ni2!l6;-!=P5^P{9{ND>I7&P0<1Y6Zj1?ZBB()%y7;Xl#3--!j$)T zGbY*z>t12|z*TRvFX1U$*zdP`TnILqT|p%VHoyz_urmj{OLEDZNg~xmB9U-{fmoCy zmUE<1YTm1aLSYZE!_DZKw(n($I%LP!)zNkxn`B;OhJuCkyR_YSzO=%yQ~X{WD$M3D z*YDuI<9d<;(Wsk@2FBxH>l*f*a<6Mxfx-h7oIT2TE50JGEu)d^009@SVc#an(H*-_ z{s;R1V)^9Z#tZ;FF;#c;eSn)pkZ7g5I;RtQ zd37i0Zq-Rk#RcLx=`>=H?qhiLI{hGyxXDN(7pRk~ffZ$p&JdaVK27PCpRtCb&k}@Pyt-f)}+&6N$`` zmGIib!BueQ?Ro^ZmG`aJpUcC|*8-GfS9#oB`mJO&_GUHBYt?XXHGBuIzL!6V*uH(U zo;DHpK(JRo)TM8vHc%`19{RhGnd&xrAZ?(2qCTWvqR*n&)9pfu{vJ#Oihids37{7M z4uC!SS;7Y9JUz`!U`8>0na7z;{BO)P+&9c3wkJDX7{je%KVx6zCKFMqzp#>f8!p(Z zA7asu=T0;(KWMjLH9jRXk zckR`WAoURbvR6OQq<=%q(9er=#WU%gXa&poAWLvQae$N*4Z=^PPWX@k!b`}0|A6oS zdOdHHef#ubwnZl(3yYk#V*^k&R4RCF=|nW1wOfLI@QL=hWS#k}FBMBC{XuIc69w;L zrZpc8N1f4(&uufCqu@1-nG1xoDTgf+@miF0)(2kEm>Hyubf*i&d>DP@NiX;Z&R#6# zLrSdZX|cq@F0^iWyduEHr|8&_bzTb0!l`WN5nqGm-MoomP;& zBp=Jz>|n9R%$w3Cdnj%WSk-XI761!1W+od+AUnD_oG2-wk{=W_X4dTYWuwSZC3190 zF-2V9Je=Q~Ogi(KyFPMJ)eLMEC{ zE1vYRTJD@Zl}2NYMRA+L(X0pj8=m&HzOq=&#{7edg z64uQ#4!Y`ip6AhGog-f+*N_)nW#zBE?`{4>)H9q8CmZ>}u!-awU{d03B>1TsK2{C4 zSHn^@jKfDM{^at*6o1O`deoiu*Ui%DWiArTJr_>1UcRe|iPq_n4q@yw0RsqeGr43z4$u zDc$F2j?iHEhoNK`D!wMRijAnymkKKX0l$(zQUAGq4f?VUaMyEZu>WQ^u#=fTm^+c? zA0X4jTp-d9Aoa;n)D9|2^+hYX3^{;!iMWUuhHkJBUcOG>8_Eyx-8C|qr0<2OPeFal zlQ<3^*}_jPU%!?Ap3ve`%BBbST?}+S%1S1IPpx6Hegw^LO$gez^WK{YJe{KNxBGZblXtp59KoXo-4|@=@K$N68S` zlX#qn5q)(}>r!ybPH{$=|A)AUsC4h2R)P;J!TXh9Pi24^_!cja^k{lvwqy0V7xX`3 zavKOmauzuvJG_N#EULoQ+x4SK&{2`_PdND%z8M-{;bqwT8ec~oz>M;w*LaE`flG^- zU}C+5dg;N3B5>;K{1YUYSK&0j!XtRr;gK1KM}{AYz~#I7G(;K3X~bCW`35q9ZQsii z>rNw8U4w3}j`~EpMmp8-9dRPD5}1h(==bU6y17(Vd|#X{ydaE2K7%J99bF%8r7v;F@*%$t3usqkiJ0B)Fy0Jiukua3v0VqXGJLUC*W? zR{rjcmZ>-RhIZ5f8Sq_#Zgs*fkMZM&|9{u@VG9X}n%@)vPC=~*uKv)_3+~;_+u>82 zd9)ILv|6%n2Q`yRcEUUr`s$sDj;v$zbD}~D^Y2JjJi5oRl z=|7E+8}G(*_ZU)+PB4x#_SHN_q&>)66wB(;8nYEtf2cq_ zhM5IpF%)ZffZOv#2T@BkZCF9DagqX_zE+_ zW_!RCjU}?CY`hdEvGO+^vK8IYd^BNkSmM4AaKpMU(EavmuO;m(59^K_V%lO?RcAhzhy~?>tH9`>>kDC2T`BAL21-uU^!(mzn*I^K{{ecg zRbL3bjLAYN=*;?}>0&TwM#Ja&FNEPEwA-ih`8cw;xjnKcTr?HIbrohL5wV)puq!Jk z6E>tydHxIZWcxl9y4P#IiiJohP(YT)fMTUCf!}>0oK*QfVqtel^&=yo3sp>jc0u_| zRDkuUVqrZhKRo?QVPu^@oU|t$dAAdpu|sBR5p35=`Td6oPk$-&9PD+464sK>l}F7p znI-Xuk@CcoA$vF?o5OaW&r4kg*MB1Pz^y0cPP(E&B@jSvefg4uJPAL5+vJQXnT#3v z>tqTEx*0QVDfF==y%tZrn0H6$5%8KXh4boEi`S+^lPR|)UIgt`)8@0~kb9Re3EOExNM_i>$*F=j7lF zYQAY}FqaPGO9c~M#!1uRj3sS1+pNd|E|8-kmp=+F#z_+; zuRVf1$>KhxlsD1XFDjWx7BgxrQId;_$rGl}fp>j_-b4zuUpQgE&3KnVyLD2JZ5VUP_Sjc&=0=;G5XlA-Y>L3=5wL@q@=s(^|-QLd)R5R=JGUl8%?@{ zZse>M&3bK_M7%(Khs)!(_*7@u=`IvyKueBVhxosUeAcA|40?3Km<)n~3>Ipyf*BoQ_yJA9o=; zd$44ptuTrz`P@V{DFL2B*#1gGGlwl8;(4ayAOE4@4rX2Ggh$lbxoh zoL8pfgqc`KR-F--Ih9T&W%@0+avy55zkVeQ#vgSe9<`+7sI5mF-bf%$<2p~oe8}A@ z?(zjaLF7mYuI*?Y*1eKEVv3{-R=es5g=0kr)eYYxoK5T6+;K1JuR=C6T?Z{+3$sRh+@(~~Do3NqQa%;}4OoK9Y*yV-C1s1d5;iA=Ki7oQ z;t$z#p;9CeNCd6AH{i~1PnwI>-kS|u zv&neanFm3*_g(g+?FR(9u1rq?XAtllLKMm~HW`|THKfQ94!kR%Tqeb{4K1hXc2USr zY6In>8p!v!J=`_qT5>k9(LeBy>5m~#Ku&5;Gi#X?Gf~(gECWS)7)hbE)m-Bv?1$_H z!UXa78{_w~FEn>!V z@iMFzUt?$;Gif^9y^24!fUS(E48w)A_*;gdJE&30L7FySv7U_rRKY#%G0~yR=RAvLJsLjkH z%=64YnU9!nnLk*8?adBm&FonAEcO9*8#2{zWY@FTu~+GPNKZCeO2edq($QwAr&K5L5^eYct+f7S z*l+j*ZCQBR@S5Qz!?T9R4G$wn=go#Y3>yqL7_K&4VOVZh+VPWV+D4{TBzfTqVY#qW zSU~*(f9u9HIUeI5K(1o9^6U6(`78MqXfMG+{$f7IC(u&O!(YhH;-~Ou@u%|5{AgZ> ztZm=(BlKURCEN#a&?0d>^%Pnb`4)-&hl$ULkBcp0K}?Dvek;Y{4K9^!E&{&hHA+F) zZLxSegRifKI~R#f4t#yhJ}sd4;>fk{a=_xpOIwEWwex7URew9Jw1# zStgE$XDt^S%TFv5rx2C$-v|3$CO$JrdV{=;VYP$|<|F-pc1>YQVoE@!O&rw1KcKsm zp&7JzMNTa!4T=}QpIQp=2d2Mc`WvRdV)_fFKV$k6rvJwDM@)af^m|Od!}MR6ev9b= zOuxbOYeZW}q+8K$wqGj(2fmcvpzFaGnDsd>75GeCO56ZG#jH;-{TS1aF#QnI4=}|| z1K_5CyiGKzxMcv`G5~HE05=SP8wPj_P%S9Yn>gt|F?|Em*D-w!(^oNl1=HP_?!xqC zOkcwEADF&~=?j=XkLk0RK7;Agm_CK+lbAk%D0=?Kabzc^J1~6=(?>CV1k;BxeF)PB zF?|5j`!OwJx*gN|FufPkZJ2JwbPJ}NF}(-VO&V1~*9#Pn87 zZ^3i}rZ;1HQ{~mIuLSEV!Ht#R2GkNKXsPHPn0CkXC``K{3V**04LQi4sXu83O&S}V zD1EMDX)p#yMq}!be$!ZX9I;_)HTKZ4YgURqXyc_i7WP>w#%H39ekfIcj30yP(Z)?0 zs~?W^#k7y{A&u1=M|v5b)gnD{q=#{j7QsaXxQL(|(hsoZ_g9L8O-xT>p^jJxITJHN z)P1UJMiBn1_;_IFj_aWDY~wb~HR0Cs9y2q-PzJliKhN#f3;1;02=-p~B;kvO7}z_Sx=JJktywjWR z(TWis`AQ6Q$78-=D(dwNY#1`6;gDZJ!~BMU2lp=8F*xi9rP076eGP^WNyk%}rb9v) z?r&}${IA_yk^j3lXW_mN4a1=KL&J+O_JLsod|{vA;x!)|hQg8i3`KlF?K2E3->}~> zj(~TJqlW!Y)Rp7ETU_RE>gvDxqW;@A|DSmB8m;6AJ?_B2v=Z>;|G<;ixcPr>qTp|C z{$FgO=KuE1k!kl-v}2ATU=n%P6QAP%>h~LB_^N#7*M|Er7OlkRPM{{DPZ{+eMdlc! zE#-pjLMR?E3~FKCmM&#ZlhVvLXcmgJqudCoftz-ihV&-Gw!@;`vS@#> z_>1_lwgFDll`>1w_SX(^KHG>C(wjA%DI3)`y>erBjT3c+DiXNm^u|$x^bu@#VFu&KBg+Q=Wbf+>|e?X4K-2krxi>9>2 z>&wTS1zQj)y1>71%A8X0rjQ3_FsN8PG4PhgEZW?zM934)guKq6*#Tb0`?iqA!W<5| zTpqNsL9zM())E$xdaQ&Nx+&zeYRY)P!#KYy8CMmgI&c=8mS`3{gzw~6yhW>;OQVvy zLpE?1W`^R5&6g@=)wE(yo4_qNyG8Ye3m&i4<}ycoUT|}Fss$BFNhMP5LN0Fel;VXb zxE?2U7F5}vL?sBxaYqnbr7@AKt1BKXsv(oz6A7n5JHAt1QLV8c^71s7EJ(9<5zZb^ zy!k{v63#f|o`?lt6=^{Zh5W@>&YhE;N!1O!DCLP{DWj&48;U2O6p+>|0bDqL$s7uV zWRu_JPRVGi>IE9JlvdEbvr^XL$|H?V44hkj;4co z3-1UVZ_&>qZv{i>N!)z)Hs%$yqkKT(mGU3W(kzbGiNmYL3urpPzDoR23BITV=i;Dz z&sowGrG-!Et|8iW{P|>mw4#yuqj^^UFa5jv=fqXy7X7_w`)2CU{#8SQotY)?~5O?3)ry1&dwkY zu;WODJ%R1hf_8>J&3q$HX5JQm#=Aq;GRx4)`htUc`ybFO_eHeh>?UwIaUUpDHpz-7 zfPzYk11Q zOhTteXs_)r&MO)-hHT-*V!l`^1YEM5p#KnmHoQ=oLse*JPD59}mrHiDus)(7osQ3u z@*}GO+BFJ3D-V8!ZQ^M0L84Ihz0DSgmV~KLMB7@O9tBy~Giipc+|*ujsmTD^Y?6%I zWd^H@<3)4EkG9N~ysAH+wShly%A_NTRDh{m-i=zE6a0>u!My6QB~wSKORWs(d_|q;Mwo8Xe-NhT@QHCyX=@g=)Fxv>guj8 zNr-t8d>N^hM#L4bHR5syEJ>GJM*HIbsR>11V!?=`=rUVV8O5)HH#8=cKNiN8bMLV$ zh%&uO`hDy;B&8RzPDiXGo5{U&1GRwNi?)QUV{~Aiah|jT*~k}&d&Op99lZl>Wt*qp zp>N<8P;T-7c?roAkQf9{-X)z3=e;l82>fUkKL^=*W4xTATfMj&IAk+~r!5rL!Hunm zu&u&+V&-AcvPHr=5`@dhz<3e?{Y$i%`w&hd7ypB{M-rT;-EN&mZXoGLa0u&OlhzZr zYu5?5=W}G?*{m@xC^x)^B%-A_-0_}tBTT+3oey6c$W4G3zK?c&;45Z#^@=37Z{I7? z&2&9-v4Z?6_GpGOkS1d4wgHLZ$enl%yN3kJtKniCmK(2NA0*08UCCa^i`w}jJs6Qf z8%U0VqRH618zb`n;7`%3+`qVcxLF1pv$kwC8Q%b!-y8DK_?T*AKs&nrS}XUBXx~h; z%{Y=IbTDc&CI}wBXEPRwTRJv1PbcZ8JMNiyGI$oHZiUD#=_Fu9my^o7Pu=DmO4vIQEJl~bijV$% z=<*--01{dwE$-=;KEwK z1%Clrs&}9B7o-ZDUkjL73z$(0nEp4wWc=*Y{szIo)LOulTEJv{HW36XjdRv4G;-yB zi;Nx?E?8mY;3q4MeaqYlFi#! z8R>PD$~quxs`JzAJl3Ht1)gExGF#nX5}AIJ_PQa&XE-R|ZL6DU?>2$zuA_NsA9X*q z5_udoQQcu+FX~u;j{YaT32io+Lo1L=)R}qC!U^mLNNvBWJUUT#HK{HCheG)y!^@Sc zZXX(kljL>J%d2|EWXVH|lN$g0jWr@28Roy(2n77f14*wl5p-7)#1o^Zj((n`4Cn7XmFrO~89=Zolr zTp&n>@{M#IL5hyiiaOdNH!2p}?DE8N-Thp5txsS`lg^Oh@8oV^o<`+0Y2`hd?7L`M z+YEHCRst2c>wzOMSq44f<|*8%wA^SlL1L=VhK5SM8(gr~c;7JeYAxz$+05BG6|$)WPk z0*5Xg+N5+j)CaCUpYIFj?E%w)+Gtj+aKSakd!Xq)@d+#ey$oxkYBkMXGQMq!_Go7= z%Qu<2oB#y(O(c54T~{0LWKcDj%ob=mp1Z7Un#i3)9D1clifW&|gm0UyN$Ig{OjFlm zG~na|=;)Yc3!lLC1I(y`6u6)jY=QG;^CMtlD*yg*M>LRw?{l0GiRzCbk<PG*29Z%L8Q8NF8ur59%H`k7tKfN@Y9r`8Z6o zd2*-Ds2iaZ=kvD`9~qA$Snfr``MMGM+l57v9b`~f`6Brf`iOOSU?;&Z)$pt8Kz|#8 zY_PtARkr`g-bUbw0Q3JQRR6bcW^4IBxtZ-q1?v!R0X_-YED7$wt&|1dwq8Up%4^#? zFKjr%g7BA}ns6s%3nbW7ZQwVz7U@M5+eLFbd-{({bH60E~%dxEuMBh3u zB{!Op+dEha59}sKRtAMWcXtj|w$T!_>4DqOvYsI+z%4|1R*^=1)iYDl%x z*ashM>^3x6bKp115>cIDwBX`yX8sM%MY~L*+Xn2NN%UDXsV$DC;OQmdrmkmH!qrKp z2V8e8IS$wwttu*MFM2UNU^cvrKLPt_S#7l0?Xws2Z87aRhb|r7)b&s#NaziC(l`S> ztE!@TnuO+_d+UuBxGQL=eA!hosJaHVMNv7XE>W6_T{ZErbt8ES-DpE|FEo2!44Xd@ z?>(#tXtuLxSX%_;oxa4;bi__htyK+f}Vw32Bv~EfBh%CO0W{Oq);AXs+gf^-mkxDwAnj<>gmC zG}Sy?vwGEW8+1tP__cJA#2KzK3>5DXPZXXLX7C^K3H|T-HhnK{LwP`haXQywN(_ZN zF9E6Yldnr}0&NA?A0}RxrVmE9YK1<}btX5pd zGH+8CEiYVu8G(ETI?x6~+1hB8;k=#X((>M?gwu&(mEzj9e!+^0yO?duXf-%^>ENa= zXPCnEcXMN4^G$@6G+7~`2-iZ>YiKcWa1l}wVX@9$Y-mesB1SG9*@T>H4?9;;Ytubp z-8kX`3e9h|_PC^DNB6I)>kr%>?6PC_;tShSnt<>!LsQoiTD650atPRCxCEW!2%V1$ zOUrd0qJNhbg(aNdmaIr%o1$Gb+m&{(>vD2FX?K)~TiNwpGn-J?IKC}`GUG**-F5ik zT9tJjdh53VYoiGb3d!X}bx`TmS&!AvQhV*an58=HFp1thkoU$L+IhXq+vvpIGkB=~ zNH246@-F_E@}xS0h0%_aKs!@D#_BH;+*=JdSHm^caA7r^kF`(bbDk6XlAv`0y+{wg zeOjCV?>tAEx#kD9AN=Gg@d6UWs>!En;Z)*_G75eoa0EW|f_QsRtu3*{44pJXyj%Yh zyPxSzZ6{_RwQw`hck!IIiz`*AZ%TIYXNKsG)t8_;%Bz=gH+5E_W3(!x!B*DZ;6H9lFBQrHpGeu8(N4>YAaPcMrW5Jt2EsNYIZWw%qn)Y)|YMN z)gORKUCW@Lj*)9CYGoLVR@2Tdhic&w4o)f&6IjKnX*V2DKAyY#P*biHLK`LJwu06a zv@fdb&dEyWx{79RMDq((Rw`P89Zwqu5<|4%yea~9NrT(+xMNkDx^76&R$l01SVoRw zER8m_PaAHz2KDe-_j;HFlRSITkhUC_U~95WVR-xkY7p$bz&H$A*Bkn_96aCqi6a$jod|t_9px3%Iiua7RlmEI zS+1!CTwM!*wSYC9K+BOoGjLTWawKqNEufyI3)I)rouR@MSm)B-NA z1uQ=tXgT~R7TOO-4hPz50hiSRF0BPD>k70S`hka~U6Dh;l3KvxBY{p6%A#7p!Xp9P z|DvuQv>u6c%34qh_)FK(nPYyf9GCnRK>e?F_ly6ERDg?W0i{|%u@+GHJ3t%%K>qI# z4an63vbBIrEg=2(K#K{a{vI)bWGx_33y9YOVzq#lXe}gC3kcT&LbZTkEg;al<%nN9 z>1;#(T3NJT#QFa3I_=+%%+Wc2`n4AD3j$jH_P17ku9fAdTEM?+0YBCPe!xJ>-wZ$B z*UIu;E#P0ZfNyI72dY5JUw&uin_5}Et_6Hm3)o)^`0^moa>TFPd~pyt0{Hw$ptGfT zYXLRw`tHMWwBX;^>6GwVJaHp9p z!d>;o2?sTJs$;a-)@Va2^(AsU(YaPlblJtKE!g|Q>RMG>?IQag(wS;&Rn7RRi7+>s zZ3%DTZ>iz&G;Pba?BfCzaF`! znPg@TTz5Y;fKiZ{(Q1ROE4Zo+R@34kL7HXSZqihm^D7lHys7Ih{EEo}*}-RMN>QXg z(2Uq!Rhm^XR#g*oi6&+wQe}C%oc5~ekdsJpr`XD^D~JS9HCb2H7fMA1uX`UUY8T}b^@f|STwDj z(H>9Jbt+wcr>A0c*!(?rDsnn-$XIoJ8Ju?q^OUA(>y)9`P)+OGfhI$1dR?7G;p((z zVSb#Lj#OPTvRNQa&1G=GGvudL8A!*WX~`|Kms;9sBx8~7(r8nz%Q;jP8_cR<#tY$s zhnU3xRSdF9Y<37(&=82s?`M}E`$Fu4njtDxRib9bZ>O|M($ubM*WYk~_5Il!aU((v zz@*vn&ta-c_)b$t( z%{YHQg_PxRz;DE|^4`^Try-L(t}wHLnk;Hl`gTKSg>^mO5E5@Atr#-Z4TcS?DJw18 zk$!RY8bcE4gRlgo7*rfqt-8d{>gsaXI&{u7_Ja#{3hyFax$3Z1tVF2B53i_dX{xf8 z=-UPDNqQ`EG#AFF#SrO})~kZx&mJCAfrEy!%6 z9Q^q$?bo*|`mJ>j2op$TIl$gOJ3JKj{yCT*=}H%~?Ru>~G%B`E|1TnJGz|Esg4%G6M*~{qmqqvd8!fe~wO-DFWbFlt) zFy~0)>=E03wBws5!*xH3`j-FI-nW1`Rh?^3lAZfZGEhZs>Tngg49U)YFd|icPgO(& zDGH*QOfs2FCX-2Kav2LFP!QbIN>P`k7ooPc`r8(@I(n>C&~v=BwVgrDH|Kx16GFKW`21w7F`Ao-N`L-v)>cge&m@I?EMIQ zClBWhtEX1liKoe~X`Zuy)lao2YJ5ZODtC(yF9E`T<4R>Tx@uhnj$BoVG%RevpzgE( zsH+xi)lK?;qN`3Ap{rnV46qA=@Ua$MwO=1RwywJ4zIvF-Xv~*8%B+kMv(6VzX?*d; zdY$=$p_A=?+&)$3W1}9hLZ$n(W!514qpZWz4|;OH7nZXnN~1dcT$%)Gyrr3J_bO{6 zoBObJs@~%ja&zY@>mx%#oHqgi{6$G|iaB_4SWCppcC~^=6N>JIhUNe)`^`w2Q#}Q_ zV8covBX5#`0+u3~MqNR~P~i+wOC$U#&Dt;kAiI$X7r)f!_#URU(>{ zGQvd7jd{?-%Pt73VWTp=db!0NfU_gFjwxgKjhwP+N?4l)Z+K^7z#fUM`?YiG;K837 z&n++8Y7_2DHu;p}(FB&u?r=#HG9{h`E66H#@Ehhf)->HZ89Od+T)6gzh96cemnZY_ zC}f=Mr&njxEvjqC+2&cAjZ1ZlAUo&jCT`X%Cu2fy$SLQBecGg27Pjp%{ZZ6)BRQt< zwe|#cR>z7NB#eqd==H%|;TPD{oo)KU7iKrLclScpX(`Mh4rg??b?0Lx9-6}*Z?ivyaqm?oigDi+c5CuNR&5ha+?3BZtxFA? z`G)hT?GNq;O~Um7+n)(&lD0ou4lRD*7|$|~Terf)(u4VYyW{G?%b#$_Ix=^u!YM?? z`O7RVYOa&Yw2zjXH57i7@X?XAET$B$9>+;wnE6Y?0n5D&Pc+=!u(Lq{6J?~~yoNx- zQ1HNnOwnL^nr9OX8arfV{5X#km`^3cO}{i0T5;V7kx7h z+9hAK7)!~;QfrU#MgGS&udlt=lP|_1d4zKI8=n;4>`x^-yE^h9w(63TMq5hLqz?9gSDF<{xa3~Bljw zYIAx0b?>u3oi0sqCc9b-$-am?R*V*1hJ#F+FU@W2^vG^cCkWs2Nq5?1c%3!RmnKB3 zG8)k{CgfIshu81!?aU_oI`ntbAKQ@zCY8q-=F7HyAvQ$+-o_IonfOs}Cq zeAA8WEIv8Y?M~(65eXi3^QG;_Q&ljLNkl@$9GG}}({bHWwm*QJV18saBKD_fpxD zKw781l3d7kb*FWw(2u(0LLt}ckAq~qy*002DgNjNzhHkR6OXp{_2#9y>{Q;0&LfR$ zEP0Evx8RXug=7F3U}v-4r{kw?_DR#(B%d^HUTZey1L?Xy(wz=O<7wSO-e7A_M}IEZ z)m@6@x)NP^i3o*TdtykR0`j_4FDMSZa6Y+%-}N|;bZet#7vF2Vjy>SPOKK0s`mS>O=CRhOCzjPmx%Q)pnE}7U|V-0*Pilp z%f)W}6|4tOFugSrkF^%NqMpt!x#Y|1D3MQVDB^eJdg4KEe;$b%q#v-KpC+Bf{uA9f zrPUt_=1XmPSATaf)ElgOo9~W{`chrJ&w9Oiv$RBC!dcRq(2rZDOyv@hpTV_3tHNXd z+FMNv4FNZt#lHz>@ro0;%)=*KaGcxZQKks7*cmQ)D}$}suIJ&NiSytAor_I+)x42G zeiy}gS>2U*xi23!fL3KPzYBhf2jhFiSJ%8@zn5BUpB%Mi*1g&QB)t9MzJAZ*HEyhEcY8X81g)f zsm;Jo*{7BVkT!*$s@B@8TaFV1k_}xf(J-8)s{gPJ^|ZKgw(^r=V}=;XUEyv`FtgYj zyWX}RFodA9Tlb;8ax+U~S#1Sdu{p{qXa&cGOT&ImCRx>^_s`bv=tBXv{}me>JiM(j zAQUv1Pw)i_U@n-I>HJZ+LL#6^IxDV+f^9mx;5ePn;C6e3N953nh!i!VB|m(Njmk8B zC!?CM!(RIDF*u+m^{vgvC%wSE0OWYu->&BHe5qzSnIu4z=xz60o zJ00GG+s;>JqWv$;xqenyOLoY2Q>*{K3@ZIJ2I3P;=u>rwnOu&6po1qI$f3pl(7u~p zaF)(H7TKky$+AYUdKN&j#EzsbV>K$Uzw^B*LrIq?qg2fX$4$}Zm8$v0u@%fuf9H2k z8pAqG2r;o6a*F$AzECFaf8* zIS_tiG)QRE3b6$@ntw$qepqN^*LN3u#-JNKa9zU~A?ZCWG6XL761FO{xuoa2o}z}( zhPfYu*$lg$wGZdsHmU&eF4i7@1JEInYmwb7OG7BvzCw?UsM)vs1TpM)i|5OBj znp15!Mc+sX^~#e*BLPSHVtMLReUWmivHOlUOh@1qS5k0=$EVVkXGEMfyuN%YZ7VWG zs{I0KdotTM+W9@QqzPe*xG7TOgJ}i9xzjBZjmr(U>2=)f`6eQbrYRnBBlm^1i4VBm zc_A6mTx{J*$ZIAdd>|=(FsL@WU5E~vp~$$FNBC5wiyMmYnWTo6Jaj#R&JNyfw6aAf zTfVJo0jVJhjQ*_RhR794cuiVw;iNzjH3(6G77vv0K6ojZ6qgYElfofw z7Vzzng^O;O4Yks?h*|jalVw@G6!z|A%3OYF`=&MFitKqjWiCnle;nxvP48@2)xB`W zpg>7JUp4s+hiq=su=Xd zCcSaC`8H{};Y#OB$FhdCmbJR)>c3}yY8u#d5Z3)&-QcrF%rhjz-_~8o1H5$~aAa%V zHJ8{!4?8c>oAjKQrN}P$vw7vbP=UA(UXUd@~BsH9*a^ShWI2Sf3LEZunO48;G5HUr&1G-fbjM09! zKi+W1@bOkm0hsD=3xV=2MB|mpP`2(q<2Kmr5s3nKgz^pWc$T3lB*R@}k>bY`%598= zdo)b?-1;QqS=j2^%%;J;?K(lpFmyHS*l>yP;n!*2Xtl0F(ZuHscZtCn9eq#{=sMJh z3lTA9#mgUoTd%q_)L!D4&-o<`cn)^R!==E_jIZ-Z#^DykUe2srS=Vr$eSwvk-!i@= zIdm&wCtL`(in+=e{1!u3Aq2FLkLTT;y*ZE(`g?h_WDDDQqIH1p=t6AQHKq;RSlwA^ z?DKPDAF_cU@JE?X9R-D$mgbP{TB=)SbVDThIA_8}H5w8(s9ub>WKmA%kH~|5-0ht) zH!>L@-C0zIb&*q7@Zu5B-uBMUpvRx% zZ%ah&z|SWDb{XSU!}3yG9zZzkbmcUsDi&kc-O{{*Ec8Isor0zJ!?T=G8TP)BYvvEc0^das8j_=E41G+E}!GcDZdh zf_0`d$Uo2@EU*Lrq8rQh{o1jZ2N_;ufL4~w)uMS4!TuIdWB7b{y~~yV!=KK8iBOfL zlCZC^IXut^^| z!Tvl^lBjbLE%+cEL9DSvISa3cd%d_*?MaWEOm(*>Qn^;9D{+JQoeno-ydNiE$oOH} z8|o$A1UE^qR?g&)!6j12)1HY(vXMMg7WKB#J)E zFXf`BublXg^8T?SpV1>YPSGPi688GY9wfsM@s;H<4r4I?=>_GVj%o6xi|hA2YeIOW zYkSXg{e!L(bTf78ELLwoxZ9ZPo~v`rvhT7!W!ab9lph$K&ms&)ep2M{5US zdtQ+yGWZ`fagPM7_MpZAiw7UV6;26$9uOXM(@R=}hUg_}Qyy}?c9=D}Z4;PlrTu(# zbWlV$!$s{0#}c;t3HyPe7lsghH+mZ{>^${_`E!YUZ(lT<$Oi&Z$P%t3FW=Qv1LEko z@qTmFJ)spI*y&Qv<@dzB_j)yHn#ATKbI`U^^7uod3C-a3auNa8B^xeM&Jo=c4ac=f z?cpP3n9UkD8)XDGdf24v>aS+|HXF;{8t51_!6|x7%I8GKc*4k_lnIska-P;qPb$ZH z#yW4&yPLVs-xgu5RE3fk8xHtrpcno{?FG4~D_iijb+vazJKNicEr)wz82s=(AWuF1 z)7-6*1`fX-EHGkohz0gMd%^OWxe-37>H<4%!(wF_HGL^g!j-8kMbBKj)3Cq@J+I5n z+?$YHy}}jD-{M0gJ!cJaDV)8CdN-184|YVl3W=_wH=Yx|Wa!;pdITzBN)0)m(%o@4 z7EZ&kT;beBH1w)6XNtZ(_%*w1^1A%Kpl9&VcWo7d0WJ81Jy_)}3WbBoRIr%nO!oO= ztzA80k>vJZj9WjX)1k8(tGYM{=R}eWf)Ohc_Pa~6J1X}9{P3BDYv4?F@T*9{!HJxF zBtF^Bl>L$6v5F=K-6r<6gNCd1 z#zRDjs5ic#mcQa;iG%mNX*fsEcD-fj1rZ}J*h{Y)^5S3bzGirhIbJjTQD1kxdeP6R z9An%jM$4^mE3tpg@-jS@H|THW+p+7xDY9H4k|ZuAw3(vWo?yd7w(qOPv-BW_T5`np zb%va?cd5Iv0N=vn^?_kZA$}yzFjdsh9#_06nKLr6QSaDQ(>+awK#L6C1GwT~GOQ@e za5>Qe zWPCYur<1J(i8UKU{x-j=iwA{(WZNi&Qmnky(;b*(@9WH~Yx}En}y_g-8^cr@p5aw{siT6^$luMTnqgj`JRIR<&MkYc)YvKP?n_N9D(}> z6pNT>ME=6Xc_N^&p7`;NlC~77Sw|e&NG7 zs`Z3m3!b#C22&a~)Hqc<3a_$?S0@^Pv1y}4A>Nnc;mxg03#=|E+!HXviR9p4A0!Hz zqt-ag35;_e0^XM>tIEPsRcS+LL_XiatUDKYDYZAOnC>twYjuDIL_5)GF^+-KyP zp7wd7=|Zr}*O!ztD)rmY?hJgqv_^;pj`RmKG5uH~#fxg-lm6?LS51?p!5i|#(7U$+eVd+bbmV$%0n)0_2sX|jOg4|^#OwoF!qbGneiHc(6_ zy?$@B4=K4YIf#jfA3t!6;(OBydOIu;aO#E+I;I;=L2X>Lau+^rs&rZbIlCPWL2?i$ z7_h_*liLlqf%Vs=5UC6ACs#pkg?Cz}9SPlICDDf3O<>BvR?%M()=%45y!s%H9}quF z6{1x#Y`hFU>X}rVC*g}1`@F??FCROrKzA4n4j#(c7M1s};!@DTV8TcEQ}78N%D9ok zPtGMnZ4p0&|_=A>Cd4UEQRc zfUZuJyV{%Z_jt1TUQe{UnDLXIBMl!bq@$My!8p*Z`b@in+^x#vhNsqP3g}pL>vLP? zhjZHeir}nx3-X;Oo)?r4?Sl9TFB<99KM zD>@;gur*Q0AxA6fLXjW_3_2yvZ-sYCT1x`Y_Dj~4{P^S%8VF5i@XKYHcScvaGjf`ws_e+U zQdal}^H3_zL*s=Sf-^f+`AYIrJsyiDwU^$XSqE0JynTnI)pU=s!O)_c14rQ#D9D1C zQYZjTlbc;AO+aEdoq}2nKDcl2{%4Jsnx7FHUw4R;!v#VRiHnsY7O>pLj&P*klg_4* zT_Wi5;ss(H2n`n>WYCgf_bsTb_?E7sfoV#aDkZPU9uLX95NZz>azXObU73Sw=vurs zXs9_!3fEA3qiMgdJCW(k7286-4z}PsriErqKaUIXRJ%@+uIBmsSko;gRXeTT0M>JK zJ10=0F&OCRM^;Sym&z2nBSLq=$DrhwF-=BtPUQ;(A4hPO1@Q_7BM~WaR=KLgAj5-^ z^M85=*A%2B>MEgLFCxV_ixNeOX>*7O2DBmn6Qdi7D6eqM8RBT8K{<(bh`dQmG4v6i z!$#fHd=AGg7a5P!J|R#G5v`fly|YNqkQ?@v~15afr_}tRFlqHU3aY zB}DFFJoBX^tniRKYACHqh``*pgYD*Us__>FD82bMM#wfc_d@4>wx-iDpUq$DJWO(n z0s#X!3qfg197J4Gk}Ss4(N3&d`I0Y@5W-R@ZRKEKa8yv2Eq5Ue$RHM4C`yJ{h_vpn z!#q+3kL=&RXNyK_ECxgnF?JXb{X+wyn2g1fJ-CMqvg>jVA@a_90eV0eh{YtOdIBC_ zF}OXnJzs9#L4@E$#6uiBt$gSGvgs%$1MFCM^sC8I9b;OqFxRR8htr6RCMIL83aJ(e zipfyx5`C=-U9F0`8WqOB@rn^iP(G}6$p^J6K3)Vq0`Ny5LHXn&@DYH26bZ^F8G(-g z{3;TZPc{M{arPP#lw*&;S0{t<)mj7Mm0A@qYbz>9Q2wB;Aq^VE!2iBh#qVlWyi}{= zP<6#X`AH5|*OV&`)T(%~R>cdoDt>!(g-U|*o1<$)1pcpURXks-;<;KC&yG|m(gBUgX~W&g-EF5|vh6~Cxe@no%vpVz7w_*t!*pVq2)qE^M@ zwJIK~Rq^OiBq-%k_wThX`L|jXkJPGoxK_npRE$i5vZvN157nx8uvW!SYE?Wy6(f@IYE|4thq}5ob@lcK?QdA`HuV}x zb!%V;>KMPVxK-l2&)nt^tgw~2?zoK&jK=&R{&Ca*$C~O9YJeFAkVJqaSR{;KI0Uaa zwzI!(E&IV0j+4iXaKy(!pB;I}a=d!V=jRU@-XSo}K!dumu$6cRa+?ETccMGu$;X18 zgxu!YzThr6e1F_WKGrmg;*kSTdH>Gg`UsEf{}`%{s(#?xZuA4xY%c7ZH-)!yLK30v zh=ocWrF35`)tl;xRqWznhS@&pshXR3-WrZv&~JayvsH)Ipz-)zIF48 zXAKuvG&w&z^zfyv#A(7iLz_g8YnMKLXB=}1U79$gtX<>W@DX%`TuyWzlboRW0rvsu zemM(%X)9-5fpDA`P8TZ^1oBhi$A4h?qXcNj7Dvn(;mY*2sdhT*j+{$@k zXgSFGJ35N#K+YRQF2$mtJ^3WY`*i5ceBO_>Ap8@CJoku`;Xx6CdQTkY-?e^F=lrYl zFV44|uR33H{?_@7bD#4G=OfOaIPZ1diCE%WoI9O6oYy(8ac*Y&*4Iy)KgQYUv^gcm zhmLn0e|Eg#c-e6fSulU;c+&BhW3S`Kj(Z%t9k)5Y?f9nSM#oniTag*_N|^9^9cf3x z(TZe#mPXTBHu}o?zJURI(cXjT;i!ETB8bnopN%NukX=S3@l^YX_Az#+-D20-{%ZRV zL=^wQ_9CK+_t_ptWbysBA0fK<7TZmTFy3ZUY#VI@wvsJp>$1gdm)Ta>me|g*ooPGG z=Cd{1PO&xF#@R;O>^2Ecs`+nlabv?f=J_H=`|F|@Ie)vT+b)W)P$7Lo6kli8UsXTT zEItI7>FRo<12*XNlBtdg$ z7e%q2r;j&TfCGAynLd~Zjf4`Rfe;BF@l_p1aHzeZv1D{43#mgzpl*L-;n~ ze-i$M@IMIu%yGbYggzW5{1f3@gl`hQLHHWs9|>O}e3|eMguf^J9pOuahX@Z69w2;? z@CCx(68?s8;MY_dJe1P!Bg!dEvE8%^F_Yw{g-a~jd;g1OKBD|CE z4#M5W0sdZpNFRPc_>BH;$Y^@QsP zuLKV0jp7xor9Z79`~u+>g#Cmi!XjaTFi+S=*h`or%o6qxW(d0p(}Z1wDZ);U1I8qM z=palGwiCt)V}xylQNmWj2;t>~ml3Weyp(Vi;Yz|w2rnjFLHK#X<%EHYs8~k0l<-2r aC4?6cE+#yma1r5o?22pZPczZK=l?hAm4o8| delta 12192 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 NG>;+xeE1CF{ssJGoG<_Y delta 1269 zcmZWpUrbw77{BM7(m%IIyvA z8$w{nGO%XH#Jw1t$>so;Mz2pMdzy(+o_sK(QD=P72a;tzY+3M>0>*ihdvfxf@ArMb z^L@YXM*hQZZY?Z<%3J3?W>8zje8J+LDXy`oqB!r>Y1C#(7cA^d z(Zm04o=*oC(?MXQgYcsP3m7ng0kc|MbN2w_sdwSeCc1Enb_cB9z_mW(Y99V(#vM!W ztt(4VE^T)4FD$egm%j&IfOqyFT_vYPUQ{A{EF!9`AZtQglLStVi^jvt(CqdQf)(~V zz}3gpIcA*0_B({d%Qho(9gYFlDBJW}HgX|5l^K6yv>8`zz!O)tpgAIIlFUUVH8sIc zOirrutC{ne*{Be;T5~#A!6d*7&xV?9i4Xub0Pqi=!Vdi24R{QVWhb$46E;>UtSD)M zsGrz(K7HV9Ej#DKgrp#8lE}qm>G2#i>dNUO$ejTC=>!4dp-p%kU)q4zBIT%x#w(l@ zRZi!cv5qlc84p$|m&TjhpbpQcbE=O;ow4^1qtU*4!7LkxH8yDW|dl0gI+Ctf>b&B~Gon_v4+;d=R-S(Yj$8z1QR6HoGx##EwwZ-CF z5XfR2Ye8F(UI;W=e1QO1cH-?@V90p89*qP1R|5)_mLN_B(7f>|fbIf%J{z|9YHGk@ z#PBzvRe&ajbNJ5&)Py&h(d&%kYq;uLu#(Uu+{He_--2F(%(?7TdSq(o&6&v&X{`TL z;a77tz8yv)O#~S7`Tbyd1V0L+TH{_Ad6CJsU|Jy)k~bMEGP-MGtAf@`cBeaN_11ha zS`sZqc@irtxdT%NUW}vl!fvYH;9AidBJ)s>mmffSpIiG9)bL~*deZpnB5Vct$CIei zPi8?OJ&SQtOh`GI2Fhgbr0kt8&e`sGh75shXY@JX=uad +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_586073990") + + // update field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "number3301820327", + "max": null, + "min": 1, + "name": "max_booking_capacity", + "onlyInt": false, + "presentable": false, + "required": true, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_586073990") + + // update field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "number3301820327", + "max": null, + "min": 1, + "name": "max_capacity", + "onlyInt": false, + "presentable": false, + "required": true, + "system": false, + "type": "number" + })) + + return app.save(collection) +}) diff --git a/apps/pocketbase/pb_migrations/1756241390_updated_bookingTypes.js b/apps/pocketbase/pb_migrations/1756241390_updated_bookingTypes.js new file mode 100644 index 0000000..00bd671 --- /dev/null +++ b/apps/pocketbase/pb_migrations/1756241390_updated_bookingTypes.js @@ -0,0 +1,66 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_43114331") + + // update field + collection.fields.addAt(9, new Field({ + "hidden": false, + "id": "number1421793101", + "max": null, + "min": null, + "name": "min_participants_capacity", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + // update field + collection.fields.addAt(10, new Field({ + "hidden": false, + "id": "number3301820327", + "max": null, + "min": null, + "name": "max_participants_capacity", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_43114331") + + // update field + collection.fields.addAt(9, new Field({ + "hidden": false, + "id": "number1421793101", + "max": null, + "min": null, + "name": "min_capacity", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + // update field + collection.fields.addAt(10, new Field({ + "hidden": false, + "id": "number3301820327", + "max": null, + "min": null, + "name": "max_capacity", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + })) + + return app.save(collection) +}) diff --git a/apps/pocketbase/pb_migrations/1756242359_updated_timeSlots.js b/apps/pocketbase/pb_migrations/1756242359_updated_timeSlots.js new file mode 100644 index 0000000..515f381 --- /dev/null +++ b/apps/pocketbase/pb_migrations/1756242359_updated_timeSlots.js @@ -0,0 +1,27 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_586073990") + + // remove field + collection.fields.removeById("number3301820327") + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_586073990") + + // add field + collection.fields.addAt(7, new Field({ + "hidden": false, + "id": "number3301820327", + "max": null, + "min": 1, + "name": "max_booking_capacity", + "onlyInt": false, + "presentable": false, + "required": true, + "system": false, + "type": "number" + })) + + return app.save(collection) +}) diff --git a/apps/pocketbase/pb_migrations/1756242388_updated_bookingTypes.js b/apps/pocketbase/pb_migrations/1756242388_updated_bookingTypes.js new file mode 100644 index 0000000..c51eac8 --- /dev/null +++ b/apps/pocketbase/pb_migrations/1756242388_updated_bookingTypes.js @@ -0,0 +1,27 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_43114331") + + // add field + collection.fields.addAt(12, new Field({ + "hidden": false, + "id": "number2396794873", + "max": null, + "min": null, + "name": "booking_capacity", + "onlyInt": false, + "presentable": false, + "required": true, + "system": false, + "type": "number" + })) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_43114331") + + // remove field + collection.fields.removeById("number2396794873") + + return app.save(collection) +}) diff --git a/apps/pocketbase/pb_migrations/1756243147_updated_bookings.js b/apps/pocketbase/pb_migrations/1756243147_updated_bookings.js new file mode 100644 index 0000000..c839e41 --- /dev/null +++ b/apps/pocketbase/pb_migrations/1756243147_updated_bookings.js @@ -0,0 +1,22 @@ +/// +migrate((app) => { + const collection = app.findCollectionByNameOrId("pbc_986407980") + + // update collection data + unmarshal({ + "listRule": "", + "viewRule": "" + }, collection) + + return app.save(collection) +}, (app) => { + const collection = app.findCollectionByNameOrId("pbc_986407980") + + // update collection data + unmarshal({ + "listRule": null, + "viewRule": null + }, collection) + + return app.save(collection) +}) diff --git a/apps/web/components/BookingForm.tsx b/apps/web/components/BookingForm.tsx index 4ce1370..98f2829 100644 --- a/apps/web/components/BookingForm.tsx +++ b/apps/web/components/BookingForm.tsx @@ -119,21 +119,58 @@ const BookingInterface = () => { } }; - const handleDateChange = (date: string) => { + const handleDateChange = async (date: string) => { setSelectedDate(date); setSelectedTimeSlot(''); // Get time slots for the selected date from availableSlotsByDate const slotsForDate = availableSlotsByDate[date] || []; - console.log(`Time slots for ${date}:`, slotsForDate); - // Convert to TimeSlot format for TimeSlotSelector - const formattedTimeSlots: TimeSlot[] = slotsForDate.map((slot, index) => ({ + // Get bookings for this date filtered by booking type IDs + let bookingOverlapCounts: { [key: string]: number } = {}; + try { + const bookings = await bookingApi.getBookingsForDate(date, [selectedBookingType]); + + // Count overlapping bookings for each time slot + slotsForDate.forEach(slot => { + const slotStart = new Date(slot.start_time); + const slotEnd = new Date(slot.end_time); + + const overlappingBookings = bookings.filter(booking => { + const bookingStart = new Date(booking.start_time); + const bookingEnd = new Date(booking.end_time); + + // Check if bookings overlap with time slot + return bookingStart < slotEnd && bookingEnd > slotStart; + }); + + const totalParticipants = overlappingBookings.reduce((sum, booking) => + sum + (booking.participants_count || 0), 0 + ); + + const key = `${slot.start_time}-${slot.end_time}`; + bookingOverlapCounts[key] = totalParticipants; + }); + + console.log('Booking overlap counts:', bookingOverlapCounts); + } catch (error) { + console.error('Error fetching bookings for date:', error); + } + + // Convert to TimeSlot format and filter out fully booked slots + const bookingTypeCapacity = selectedBookingTypeData?.booking_capacity || 8; + const availableTimeSlots = slotsForDate.filter(slot => { + const key = `${slot.start_time}-${slot.end_time}`; + const overlappingCount = bookingOverlapCounts[key] || 0; + return overlappingCount < bookingTypeCapacity; + }); + + const formattedTimeSlots: TimeSlot[] = availableTimeSlots.map((slot, index) => ({ id: `slot-${date}-${index}`, start_time: slot.start_time, end_time: slot.end_time, is_active: true, - max_capacity: 8, + booking_capacity: bookingTypeCapacity, booking_types: [selectedBookingType], is_reccuring: false, recurrence_pattern: undefined, diff --git a/apps/web/components/DateSelector.tsx b/apps/web/components/DateSelector.tsx index 5a4660e..f5ae5c1 100644 --- a/apps/web/components/DateSelector.tsx +++ b/apps/web/components/DateSelector.tsx @@ -35,11 +35,14 @@ const DateSelector: React.FC = ({ date.setDate(today.getDate() + i); const dateString = date.toISOString().split('T')[0] || ''; + // Create date object from the ISO string to avoid timezone issues + const displayDate = new Date(dateString + 'T12:00:00.000Z'); + days.push({ date: dateString, - day: date.getDate(), - month: date.toLocaleDateString('en', { month: 'short' }), - dayName: date.toLocaleDateString('en', { weekday: 'short' }), + day: parseInt(dateString.split('-')[2]), + month: displayDate.toLocaleDateString('en', { month: 'short', timeZone: 'UTC' }), + dayName: displayDate.toLocaleDateString('en', { weekday: 'short', timeZone: 'UTC' }), available: availableDates.includes(dateString) }); } diff --git a/apps/web/lib/pocketbase.ts b/apps/web/lib/pocketbase.ts index 63c28be..7c7233e 100644 --- a/apps/web/lib/pocketbase.ts +++ b/apps/web/lib/pocketbase.ts @@ -1,5 +1,5 @@ import PocketBase from 'pocketbase'; -import { BookingType, TimeSlot } from '@/types/bookings'; +import { BookingType, TimeSlot, Booking } from '@/types/bookings'; // Initialize PocketBase client export const pb = new PocketBase(process.env.NEXT_PUBLIC_POCKETBASE_URL || 'http://127.0.0.1:8090'); @@ -122,4 +122,26 @@ export const bookingApi = { return availableSlotsByDate; }, + + // Get all bookings for a specific date filtered by booking type IDs + async getBookingsForDate( + date: string, + bookingTypeIds: string[] + ): Promise { + try { + // Create filter for booking type IDs + const bookingTypeFilter = bookingTypeIds.map(id => `booking_type = "${id}"`).join(' || '); + + const bookings = await pb.collection('bookings').getFullList({ + filter: `status = "confirmed" && start_time ~ "${date}" && (${bookingTypeFilter})`, + sort: 'start_time' + }); + + console.log(`Bookings for ${date}:`, bookings); + return bookings; + } catch (error) { + console.error('Error fetching bookings for date:', error); + return []; + } + }, }; \ No newline at end of file diff --git a/apps/web/types/bookings.ts b/apps/web/types/bookings.ts index eb6fe27..974305e 100644 --- a/apps/web/types/bookings.ts +++ b/apps/web/types/bookings.ts @@ -9,7 +9,7 @@ export interface BaseRecord { export interface Resource extends BaseRecord { name: string; type: 'wheel' | 'workstation'; - capacity: number; + usage_capacity: number; is_active: boolean; } @@ -23,9 +23,10 @@ export interface BookingType extends BaseRecord { min_duration: number; price_per_person: number; resources: string; // relation to Resource - min_capacity: number; - max_capacity: number; + min_participants_capacity: number; + max_participants_capacity: number; is_active: boolean; + booking_capacity: number; } // Time Slot entity @@ -36,7 +37,6 @@ export interface TimeSlot extends BaseRecord { is_active: boolean; is_reccuring?: boolean; recurrence_pattern?: RecurrencePattern; - max_capacity: number; } // Recurrence pattern structure