From 5b9f42da47b501889af06344bccb06693a6e4070 Mon Sep 17 00:00:00 2001 From: Mikolaj Kieres Date: Sun, 30 Jul 2023 16:55:41 +1000 Subject: [PATCH] 1.10.4 - Fixing an issue with (#213) * Adding cache service to the Search API. Adding service bus send policy to the infrastructure scripts * fixing tests and infra scripts * adding a unit test * adding KV to the dev infra * renaming kv secret * fixing kv secret names * using dashes instead of underscores * adding permissions * dunno * switching to access policy instead * fixing an null ref issuye * updating copy for the playthrough history days ago * adding run script step to include dSYM files for iOS crashlitics * fixing an issue with not being able to update scores when logging a game in the past * adding first test (wooohooo) * adding mocks and updating test cases * adding commant * adding test step to the CI build and adding a score save test * creating multiple jobs on the CI pipeline and adding publish coverage steps * report path update and jobs dependency * updating KV permissions * fixing missing sources for code coverage * small improvements to the playthrough saving and code coverage generator task * adding playthrough service tests * adding a test to verify player scores being saved * small test update --- .DS_Store | Bin 0 -> 8196 bytes .../search_system_containers.png | Bin 93194 -> 103957 bytes .../search_system_containers_c4_diagram.puml | 2 +- .../Endpoints/SearchEndpointTests.cs | 4 +- .../Helpers/WebApiApp.cs | 4 + .../Services/SearchServiceTests.cs | 43 ++- .../ApiKeyAuthenticationSettings.cs | 2 +- backend/BGC.SearchApi/BGC.SearchApi.csproj | 1 + .../Models/Dtos/BoardGameSummaryDto.cs | 9 +- .../Models/Settings/AppSettings.cs | 6 + .../Models/Settings/CacheSettings.cs | 21 ++ .../Models/Settings/MongoDbSettings.cs | 5 +- backend/BGC.SearchApi/Program.cs | 7 +- .../BGC.SearchApi/Services/CacheService.cs | 88 ++++++ .../Services/Interfaces/ICacheService.cs | 22 ++ .../Services/Interfaces/ISearchService.cs | 9 + .../BGC.SearchApi/Services/SearchService.cs | 40 ++- board_games_companion/ios/Podfile.lock | 277 ++++++++++++++++++ .../ios/Runner.xcodeproj/project.pbxproj | 20 ++ .../lib/common/app_text.dart | 8 +- .../lib/extensions/int_extensions.dart | 2 +- .../lib/injectable.config.dart | 249 ++++++++-------- board_games_companion/lib/main.dart | 4 +- .../playthroughs/playthrough_details.dart | 2 +- .../playthroughs_history_page.dart | 17 +- .../pages/playthroughs/playthroughs_page.dart | 8 +- .../lib/services/analytics_service.dart | 2 + .../services/board_games_filters_service.dart | 2 + .../lib/services/board_games_service.dart | 2 +- .../lib/services/hive_base_service.dart | 10 +- .../services/injectable_register_module.dart | 4 + .../lib/services/player_service.dart | 2 +- .../lib/services/playthroughs_service.dart | 12 +- .../lib/services/preferences_service.dart | 2 + .../lib/services/score_service.dart | 5 + .../lib/services/search_service.dart | 2 + .../lib/services/user_service.dart | 2 + .../game_playthroughs_details_store.dart | 2 + .../lib/stores/scores_store.dart | 4 + .../utilities/analytics_route_observer.dart | 6 +- board_games_companion/pubspec.lock | 88 ++++++ board_games_companion/pubspec.yaml | 1 + .../test/mocks/hive_interface_mock.dart | 4 + .../test/mocks/playthrough_hive_box_mock.dart | 5 + .../test/mocks/score_hive_box_mock.dart | 5 + .../test/mocks/score_service_mock.dart | 4 + .../services/playthrough_service_test.dart | 159 ++++++++++ .../test/services/score_service_test.dart | 77 +++++ board_games_companion/test/widget_test.dart | 8 - cloud_infrastructure/terraform/dev/main.tf | 117 +++++++- .../terraform/dev/terraform.tfvars.json | 7 +- cloud_infrastructure/terraform/prod/main.tf | 9 + .../terraform/prod/terraform.tfvars.json | 3 +- pipelines/mobile_app/build-pipeline.yml | 74 ++++- 54 files changed, 1283 insertions(+), 185 deletions(-) create mode 100644 .DS_Store create mode 100644 backend/BGC.SearchApi/Models/Settings/CacheSettings.cs create mode 100644 backend/BGC.SearchApi/Services/CacheService.cs create mode 100644 backend/BGC.SearchApi/Services/Interfaces/ICacheService.cs create mode 100644 board_games_companion/ios/Podfile.lock create mode 100644 board_games_companion/test/mocks/hive_interface_mock.dart create mode 100644 board_games_companion/test/mocks/playthrough_hive_box_mock.dart create mode 100644 board_games_companion/test/mocks/score_hive_box_mock.dart create mode 100644 board_games_companion/test/mocks/score_service_mock.dart create mode 100644 board_games_companion/test/services/playthrough_service_test.dart create mode 100644 board_games_companion/test/services/score_service_test.dart delete mode 100644 board_games_companion/test/widget_test.dart diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..feec76dfdae29f209158fdf833bde5c21fb8b235 GIT binary patch literal 8196 zcmeHM&ubGw6n+yUjaZ?F3dPfcKM-1!9)w=R7^9`0)LuN<{Hp0Os7C zR?uq&{{!(}0-h8Rp?4{sJo&wuN%A(k2}uxZe zL1j626iq_majvnFvOT9D73`^2U0yGTK_jN=IvfLz0mp!2z%k$$_*WRfoy{dP=$54hvCRtnXbU?)UPvBq1JKYR2{_EZkj(;9;)(~9_r*Z>v*6A)zK@kjWL$>sK#?J-aK0Ar6 zjD6?LUiX}g?OR4ZjlGPUXqV$Yf|d1AHxWHYjWw6+OLYHdvX+dc^R*XC!h90-Xw3wC zjM0^Y!@waE$^z&ASBHQ9KR5xqNE`!>ffxfSonO!A&~0<;m;&e89%=!V3+uIw)Fx=W+Sg!|gv|9X?S=8rS* E8)V|T00000 literal 0 HcmV?d00001 diff --git a/architecture/out/search_system_containers_c4_diagram/search_system_containers.png b/architecture/out/search_system_containers_c4_diagram/search_system_containers.png index 7b25879e527ad6220c77d38f2a45e0e2323ca571..bf48d5b64a9f370f53621410078349f1f165a73b 100644 GIT binary patch literal 103957 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

?c z>q)q20$IL=Fb^N^(Zk#s#Qj&#?6{#@BJ!k6I(!6wAU9MNcRjS^!RW3CzIl}l^Bn4) zBgHMq4w5FejV8joYu2BmG`Eg0%E~9o<@(x3F2nB)^4Ot3@e@Ti6Vgv64vHUfY098V zLlB)w;+&v0>4=&k@=*2R%>i|O{9@?#Fw%Yy{bieVDkp;%Dt+v^5cV-9$!Pwm6yigS zg0@Ko6o|Xs&Kp{oJhsf=Wk^1Otr&7Vc?=hdxwD=SeU1vt36}Y*dBp5~)C1&CAEB*n zOozr*eb2}5HAhDTu_pa5ZoZv?FMCq1W=phthm0U7bo6T?8E~TGlFxBcy`b|14aUcO5fF%9>`AnE9X>t-Z})kfonPD` z+(Vm|;!jam&*`{&rh;Lq;oiF*l-aA|L3dH_onY$R;K-d}ls$|3(Q^5n{pI$-qL=h# z6IQ|GhinhUeEdn8JoYz>gkujSRgNz9ez^UW?LTuE$7^^mdNf*S?q6AcFCju6!@PPP zZsp3pbu?o9S~0`hxpY3J9zv4p{$VG{{yhP$V^x*LT>a!bIlEYT_OwdbEi&|Fla&pK zWK{*mY?29WWwSx`9fYW@b|%MXy=M8cr=>qhCK~DP8G`nc%3kGvD}aFTf)E!HP;}DT zZ-#SIG-!EjEt&SCZnC@r_3}!B?kCI*E5{;;-8NRsBh$ceHzJV^Li@#KzL!mz@q)SR7J^{_Ul8Mus0;k zuTOLm{a7Q&@HLMG0WQY<1y*E zfMfo*2M(Q;{lT###;3a&f5Tu(OBSJx=6dnmG+}#Q{00y9>H5;|$Z{);WeSXc11rdQVi>Lk93KC#p(Z*6f z@jsQFq@kf-n#lfIhF6X^SU(4kmZ}WOThl)V?bbFKk$8N6_^e{t_ce<@)b*X(P zRciuP7DM~{jHB`%%b^#1S{a2XNGkimv`m>`UH|{A>QWx~5p8)2u}&j>Pa{84$FH?u z!@-`V?1Z}eB-P2na_43IU6so)nk$K3)_xl*@*>ISga`om!$W@KCW3uTIfE_#{GJ%w^YISaF(J zIjhsOzoxTqT{>)4ZFqF(JWbn2%Ly9sD#GOWV3LS;ttS7kTP-q(8nKU81UUx>v3oIH zS)_r-Q*ldOTq*xPY_SxWg2d&rOhCzQ2y5Um&A#uZh{XKvNkQT9zn(_!cNlxvig)t9 z9+ielpsH8~Uo(QC!x!f7)?fCICMPuKTGr_W8H8&I!my>}6X=XcEvuB8{dd24C);VewO zT-pjqf1WtvN-Mf0pl7A;JZUQ&jPiFuiNeEni6R##2Mp-$2Ua+UU`!_{i7m zE`fvH8>6Q(D->eMjJ|At)c&tA*~a|WL7-XI%f>H@+u|Y0bD!Y;fsI`_*okEMrf0+S zL0t8gOO#il9bEDKYya6eM~RacL{nK#HdQ8N<4Ir@rcpF7nRC`(C*Cz|Ui3Wa9J$xn z54>hx%n=Xm(R^LA_oL&2OM(oQ!+E;-+ke7_F1^w7PVCFF;%@cd$r(%bj4}&KL&Ku| zH6|U=8@bE>*p`lT2e}^p3TLNT`LD}a5PdypAmpKx{_07aJN>V*xdG|7fJaN(DM?QO zmaZHArt=G1g8yH|mj89=k`INvznHhmh44OHY?M?;k!yw|03Y7h{g85q+BDQk{OwumrcpbONScDuqO;mkAZpPtCX33d!qkcaDZ^b~?#m$<|e0@ydhyFS8gr<&x=M z=9O~5u;A%Pcqm+cZ!1kVJUua0gV*vN*PH3=eB~?YHChVYB=$(^r0uf%WwqtvO+P~` zEiLW3v~Knu_t}UbcMQ@GX3y(>ZRJv}#j?=`!@&eLi@7q@rCN?KSEk6`vnAIfj(GR} z7`mz}0EL(%wC)C1+{@ zTpjWCS&HS<8=KU6FctSlQ?@j2dIkpV7B}Zot>$&<;P?BK1Ye9OolXbYB_$-BQ0Z2x zr?pVwofJ-qI0)aqee3ynyPT}rY%yO`t~@lY?J0eomq#i7&=XD~vx~POObR1(wA4(- z8VvOm0SVv1+Ay_i$*@&Zy5*dVX&6CYySCP>#x@7<#zvC2_)<|G6sIAyVp3e^r5M41 z=WfqH=bnSHNQa1HUm(d4U_10edB{y9BqVmHisvhbd2d&Iky`G+{agJG*^ON}i4 zSQ`NsZ5P!UfdHd#@pv=c3MR)sn5#C^g|sr|C58Kbb7TG%1olF zt}bD~&~yydr9VP7)Yq4BHC6l(jqh^7_Gw$t({(;po3dK#E)IW)d}35yY|(4Nhzj;4r?uV5LbQb@=hI0Q?PyFE z_P~^VBZn+CEE3U>yX#@k7L#%EKmxa8fn8mu*#~$P1qH#k21yf*5nER`H%p$6_v>ca zh`~bEMgW(p`;q)eT?cc-l9rfBKi;A}OuG%f4{bffKJFh=KkLQR1Hp5DHV&9Q zS*vtQx@rGxXWYZXquJ%$W%Vnjkguwy=Ac<;6F1dx*{6&BS^ZYZI1XDwetxf}wE7Qc z`ulNWl~C2y)g69_nF(oWgfY%5-f+g1Qx9=?vvPr5-^$m|hfayl2z-H!XuVu=9rNqX ztgC#&!1h^f7{&I#7G|u9MCjMag3^MAc}IA)!3)%}+!aB`6eH;)M0kVYdRyLe z?cs!(95)e$@C3xXI;tOuKYsksay#i785yzN8Zyw=f5+q>cr8lcuIN_RSWzKw6H0|B z);(>`)(Y;U5f>NdW`G?G%%Hf9$1|x(0f9gc2Xl*nuX%fWb6+Pe-}yD@8yS7X(eiOr zJR)V#S?dmF!RD|x5nTJQ06;QC$;xr5kL!sHw1msfDF=lwew9zJ*&tV8wcNs)Y}w`oiRO7WD*EK$8zXUw80hF^7RKCxT<{POZRk;e%ixu= zrpeigjl-UGVQOns8V0w2@(&KaKTUny?;!*a0vq%5=g-QYW-;`dH$c9kASIQ%tgEYY zTyoy}N#GeZF`UZxX!HY%S9FaX^_TymF$?-3=#)R-a6DR~6KCq*&RhDRl@xT+M^idt zC?oS~m<6jV890ipyrer}?*&Lxy;1^O8ih;}A<{&F5{*sj-c&KF``Cf0j_p*DS}4!O zOlBx=ADgeQZ|@IYAYFJ~br8H46x=wUot?d0_VjddX&@bTi+eV;E`r7r??#_;ePHG3 z>dJavhF!74(0n%50i=hUz0%59d5(O?D9kP0u=HH%%+ZU7#m3*U<8%86MFj=SEat+Ou!9w7lu4VlkXj#zA4$_$&8B+zRCC~?#GIIvlpEm6T?sEx z$;C|lb%|;-JtX_0Hw{QFLj9#dCLPSJFgZ1jkUEDJ3w74$=;(XXK=sFdZ|Z$iVJQ z>G@c1yQQAY$sr!8RqDAJZ$v6>F;_*DDArxl)Wprmc+B2kxGI@ zy+av5hV`;%?%}-Db3>X1$feVrP)k|mka*bIy z51jQEC;?6g(77Eu&bK5sH)lH+2lLE)yFKHoIBcWFwwnW3O#1#!0eURhM~z3k7z&Wr z!b_cdT_IorQUj}|lkUkv6{DIN5uEd9O*>TYd9ch=I5q>Pfo5k z7(B0UmmimghlfXb(xzOFD2L@7Ipvl;Zt1$#$<@aB9!`+v7Rq#>@lp@wYZdNRzYzpB zTZZc9*3_^8m^MU9LzIkP!o$0sbYTh#3Jxc8#fFEk=9TKEXjELWxEL5@uj4CVhkY-dHTT$vRsq7q zNeclN;JIC0T>#%|1P}oV8oG;nYt|?=`>o@_oG|PYRYx127|U?!%p^6OQBa_wqC$Jz zRcY0g256gMagyh4ttYDMi9igk+WW*z(a;vVortVnY8s6H?$>##smmF{L7fQBoi!Ho z>NwcaA*#LBQME6n*T*U9e>RuVz*_|a?we;$0T}*wn0z5+g;ew39 zOwS+g%feRb!x_acv1c{v)>yC?9_E zJ+vn*dE8pekzO+JQAqp6C4f&)XPa}MOmCr8_gQB=N7}q?Zcbf`HuZmSY&j;Dr_6JA zeR>K80|a)u_~Yezq-+YWyLyq%J1~p#bixxo0RZ_8g5S){%+n!;n_;J)9RLVC0)pWb zIQ0fQs`$z;U!LvaV`5$c9QF>Nun{hEFo8zHDRjMDYB+-2gind~Q2Gn&N!+WU`^#kp zjPE$?GV&ePQOF#hS0K!Ew-kgM91i*tJOEN(fzU{E#`k#2=Zwf@)i=nK>SGo7hq3<$ z!Y53DV<@nbJm(V%p}aTSk9Wh5xI8Y3@@=2jO^Qlbliyi`qE)m^CJWH(WlyRvB3j&j zXX!U|0T!@uaFJi#x6{8p9Dn2c;^)`5*Xte5uwIMmzt*oKjd0@iIhBF|W6k~cqS|D9 zvmJ<2fJ8z;K@AvIHg!82w)?=e-Yy>X>@lc~t>EZQ7AOHQ%oKcgHZFU4w4BOEfPsvB zvS2&Rb9dZv)O?9=k;3B&G|{wk2VdcF3W+PlHMwX5Gk=B+o9H0>EW%ip1 zJk=;65+D%r;C5TxF?u8EN;f~k{;nof8S!`N^wR|24lO!WA8|X+E(UeSQm_(b_73RP z?hB8@BFC<3{jQ3NM8ZbF0EdU0!EfVRmfY4HWGY$?mmpLV8BpKRsus)g#P3qbXc?rz zjlmX`0Xi&3Bw2DfId!d=iUA8=bKK3?maXc;WXq{TvdjQIZ7JI{sUe0NlL;L`!ND>5 zHQ5cSwMo^rs%tB7syq!mSG+#|{=8R6W88yNUPH^dFwK0%2d}BS7wz8Af{MD3mbQ4C z%VNB91UkEcIGg9(!#p-^u{vQm(Xm})_KjxJ{?Dbq>qwb8&^Kc9;vGp}tKaAW(jn`aHuxdP zVcfV%oNdoWf<9GD@sVR*`5?gKFcT{Rn?k|-9j@peDUQU0`GI$k;&FcKU`e@;m7xei za;vZTStSpY$>+e0NX~-v_Ryc%%@-SPoM@mpP#+bq1JybDt>()R(@tq>LiTH8uGZn) zFS+{Y;_7$@Ij35dn7?2?k8J|CW7w{+R> zIA>;0?Qzr=BZwKTQ^ugkniG^u6W?%a&Dz_3ewdX+_=-S znTazP5^r*Z(8>*U;M7gZS_v)avWI%gKT+5qdOf;}-1%)}U1G_lP0$}(ibMB7IlxY^ z>#MvM;q8ATZRp{g03}!*fBAGy#WKsN!EKI+Q5X(3gJ^SU%{Ji&RuhpE|{fb6{nb8IGd;KykORoqB8T92y5gZ`U9R?wy> z>Xe)tD;>jUX|y9s44T7DJlA@ae|e`1_&$H~JT@Be{Dp&X=E7n=KK4&THBm(w0=6WN zyiPlksl%%zVty!yl!!DY2GoU&pP_G}KJjbDzkfTWge{C(L@CM|fxcudFUo2+(mB}b zfdgKxn=~phq+PI4m)|#LPrkHi{Ihsx=$qS6BQO^-1DQck?8>#77g+M_ZtezW`PnHl zsh}{$QpTw2T_{mMS+Ud>hWIa!$;s=+^Zr&zv z-t2e0D1Hdq=n8QdcV?)C|6Qh>V@uO#H!9`pmaRvOuhn#Wz9V6}xEC*95!e!sbs|LJ zSs@CF6a>j3&8MEnzj5)pc`!OkJ3V0so~sRG`6}SueIdO5vLS0mIG(Weg&-H}Txqg# zn3PxB)8j)_=F<$xXN?Pr7!|qlb!0oI)oI0RU-q(s?;a7=L>l?&2GS*5IOe3gv_MP? zG{1}Z#=~9(qOFfkIUwH)Iom(>WK0WIkO@BoY7Vk?V9$p6sxbfYQ}*PjY5u`~RsUu1 zL`%Lmrzjb)%$7V@@pPp6e^ZzLTNVCaE4v;sr9B>0ilsE+)VsI2QX(F}{|@D*elIZ6 zmYeE@-$l-jC9JvmJzf`_`CN}d7jxu(v%M4AJlE}GvULdqAzVyl4CP(f2B1{ zMiACrZ(S+J8v-Kkf)R5FlsqAH~R%zzF{fFPi`%nsrsDV0ZH5Eg_d5we+NSfLi!J>GTE-Bl>cm4}r{{hRj*yLR9 zd6KfnBn!04in{fr)poA@{b@~T@^5&gNS%$RC(cssCv{cRElH06qVJ=QsinYbR8!p4 zhZ=?@Hz!5VTtp-N0O`fbYwvI!t=`D08##*xp z)yXks>n#j`owUQ_E1oyHK%XN-gX$t0v+_!*@ir6se^RyV}&l5SvL+3!61}4A&gSNt}iFS zRHfl+b^ZCYx`kM-q3pWZycX%#znvd=1S%8QbJC!I)Wl+2lb&MhZnd&O^rO&5?Dk{k z7A;2Wi8SL8nS+W{U?KpZk275UT^8R;!=id`IkA6^664YFM}Y+DqN3=u<~B=ZBapU@ zO}li^FE>JLsVvzFtWf{-gU_)?^7-%|+$640lkZxe&p0VLER&9pTyx$1coh*#oXPwP z2VeFBxz?ST+2^KZ(zE>PPVP4zqMu~xOSN1pt!x4~!SZf)WV`cY1QP|cM7MR7m?-?~ zY^T?L1M~E}3$|pe)1zJ?Im)=o)=!=fGR(YT6ZntUlTD*I-zB8a;l?JN*4`lPl(U`D z0|o{Xz;fof5p zL$Xs(2JK5+7>$3Xj4Q_!k}1ro?gcnCKlISQkoSk|cpsb{OEsu0@Yd#MJsLaCWbKRJ z-LPO6#JqyDr~LJ;F5Q*>Z_|@g@qb3fOQFBeXP*~BqSCE3T)>p@Qj!M4@)tB7{-@de zf2*+`d$xRTWhU?YJDIKp!%pn3@I-}xgXMu{i1cOxKwrS*(m|df;XyY2?RKPpXV{>& z&g%*!BG0jgsmU4NshJy*KW#s1rnLQq^z=D5qE+RmRO@lGO9D_A=dPPH#GeFaM?WJ< zFOqBb>~tM;oU7}}-&U?fikqpWY-Y6l;iyick3iW}=}kdt_C_;vnI)nkGr%)(*x}9S zFg7urwP<^K=)%#$a_;T2>YBjH0<&c>TuwZ(b^S>5d@qgvD-KS((>CgdXW$;h3I+Cm zo``*UGdTDDXIWWQ#!;0tsvuI-ZUO0Swo_QW#sY(QET8*ZcF=Y-SYoXmUi@*=ifCA} zZ|REsO8x$)H`9H^DcW3+5pNPbLCn7vs~^zg%R4u8bV{{Kr6x>!JviW>e(D%T;#?#8 z3E-rZhS&d~W~!U#E(zWUiQ5=; zBeCp^=DBNS+sr-eyJl@t>dx^PUK7~~rQTM+Gdk?f;#-t*g?yUPxen0gP9#C?W`>w) z{~)vt<5nRKb-&CO#j@4U3*(D9qv?d6tru;=)USb#ya2{VpNIHvY0gITL+Q2MG0+GQ zc|;5g?O^Zq_hh`FNXc?h&vKLcQS*w zYquhq;`%{=e}bDR-(msmI40zY9m75{%JvfD zi7zmGD4`X!k(${mQ-}aPUhbHuY(X!b5H?n5N4Tit1eqL5iqC?ruMCg!abEo-JtgJX zdBmxZqK$n1n~DJ*Mj)-KSDnfRuYr1Q+}Kdq_5{Wu>2m{n%XkfLfCtctmS%0BeS|r> z0+^YW;JF(meF1W$t~UM?G;7J3u$&AF-q=q=q+pVf2a_|mCP_nTH|d9?P#wlnQuNF1 zOG0YHc7;wXrvjP_Tzz_L4AEP%e9rm~WfVMY zlm;fd>AJDmSA__0h*ZdhWK^cXyIq=B8E?2adona;8N}~f9aDaQwC&=g9$$m4jbFEL z9OROiUCh&OScNojn|uG@f%qdv$)tzwJ5zq_nsU*$;o#UpN~Pjni_p$^3{9z2y#uzZ zDFsdn*u&OcCZ#bId6J{OycG>M^2QixQ!cl!SyD@v^71uK`3bGPV&x=}nfE9g##kXY zfxeX8A+IVZRW2muANkH@-A4=LD}y%Hnt*du%eC9E+PbgyA#<&e%K6@nLT<>P41kU$ z#}woa#l}0eR0^CYAKV6hqkjPD&;N@4AmF63uG|G@?bOC{{<9-h_C;<50~DJUI{teU zvvqeobT{-m4pI;co!_0d9f(dmzUe5;dA{qL{Z+I<*MGNJA5E}D%PYf{@llU}jCNTq z8H$hB>$eKIMVx3gdrefz5Zxd zYeIyayJf{mRcZp6ua9*&sh|mMtPOBjVylRM@prkO;WT=sMoL)Hz_A0qHf1$5qqa=3 z0^w3ZTgjc9{vh@oY3N^%_}?lMQ}6L|z`>)gMSeZOVo!ide*X#@sLXgd7!yG^*zNTi zH8h+NvA3;N?(ywOfyU2O6$VL09ICm)WTSSgBT1OoyUR&!2ddBn0Of2R zsQN-c%%yK2P=1CXARsV#61G9KReC`xVg5?Q5XVlR_$Oh0F)0Xc{5Nv;kiSGg5TS6e zikkmO_S)9G|Nr6tdo078wzIQyx;cnrO7ZU9Q!{^z^J#-12BDw}=z-*gf$<89sdIUm zkAZ=KkI%C&ib`M5*48#V``4(sXTTnXL28!k!ng+q1?geERE?-c$(2pLI6qHjx6%?8 zh9NUEGpn^+Gj9#V3pzMl9j~^xw+jmk z*HV-m5eJ|fJ$rga9nO<`)bmtCoGImwmm|Q?_NoT}T_HR!hwm^^3yqEpT|Yw!C=$im zpPEe@K=%T)wni2A&YGC){_c))sK39_;Q$+^(r~bWr(6M=Iv)Ayt}B*L4yX@?MR>!n zZDwk!+HKBONosap?yAtNCEE_P>8LnN#z+HcsHwk;kiejlORYpl=`Y@19?6OuT0lcV z$)s?rX==K=DsvSDks5mIi#*-cs}b_a9=$jmHl*%!3=BqCFO6*{@;($r=T!@~rwRB{ zayT7-iZSw6jt=bwZEtVuboiA^Yilph%&008QdO$ba{r%i^|8hr%YEZ83~CMm5z(Mn z$i#$-i-5y&;hjVX0bh!)Z#yB@PfYoJ7d{pWsC%kaLtSDrUph@y~Y*oYM2;e zhX1l-d{a?TQM)hP?e+D>=H}+c#s@~b?UDU`^Qm3ER^-#p08}*dnKJK)@bGXnQDI@A zoA}{18d@jKbsQ~FDQ1IFDbYwDrHo@T=sO75W7wb|CkHex;f^~0#Q==+K>y>d=Y!h? zzT8VDW@cv^>y%%&#Vzg@vGIPkOfjBeH4_a~G8LXWSuwbNjSvW;KEynaFh zuDf#a^zF(?n^yt+FUAew#Lbwt`%5ka0fCQ%kk{b#OIZ8Q@PF9*|A&Y7!JYw1m;0M@ zv*|DpNY^BJa;{K?K^%)Z+dep-6q>r&R&M7eE>DPz`U6$5VD@*6LIfnF(t?5rL&#&M zD8y}`75UUp9Q4_QGXh$?ZNB;W`SHB&4XLTARge%2g0o)0TOuL}P;^jFNbJO>q@Bkp|RIbU%m>6KW064Iu^x%_ybM&NDn=cm0u0a)97BW9 zg8j8kO6cE^2n-)&*L{(A#bjk;W7u%amSMhI&hkCk>(S>Qdg|D zhxn3NS0FlY6Y|J_q=nHY1RhsJ!%2Le5A#;72MhJKKtpFJiKF8bBgg>Q0sWWxJAj_z<@4v1l$4*O z2gZ`Qohw8`@mpG2Xq{Jod&?Wydj9HG#o4$ujI#OHF{BAPIJ7zSc@r^-ZCErLC%{XybtCPzsNv zvnd{jjsAxZqd=_W*Gb0GFMB@n@I6V|n{a>aKmqmL-CfTI`~8{leG(43%2`?}F=^>+ z<-=i4yY0^#edtqY`1nJo-vJyhBd-zfIhX>GAC#Wl^SORvUm%dW!_Ts>Kugx1ep3YDzj?sJg6=2ZB zf6{b8MqORpgK(Ya?ozYs=g*%lE$JCPwH#latdU3VOynyZeA!#v_qj?J{PtZ$PhK9S zYq7yzPujfdD?BDPf?rY+u30nJQyaOjuP+3jN8$wNo6};1;&H`L18_W5qA8h3;C_bu zG|#!XxHl3&cPVsQK`P#Cy5xhDS>`)l-W2ma;K@`EK-WtR3n%!}rlP-yiIFjEs@F=4 z%(tKY`Y8vjZ2aTI)gL~7#6d@AwFU`!ke32xy-Qlg)OKr+NCMpSq(z@+IEkauZb#nm ze6H4N7+eJ2987GA2v$&3>}1AOPKu81Vk;~t=u9Vlr&iph3n(R!3;^|zP$DLSR#u#6 zDMS$7;}@UW%|>5j)x1q2|X(wfJVW5-Ql7#7ifGMNJs1>?K91jqS9J|qbsE`pjS3V z9$~YoAes<X@OL8WzKf8z9%5Ktn;XIb5i}yK@`$ zD32>5WiUjgYQdJ<-=^%STQh}+hvx!PN{jm~AdMWGM&iBV2Q!WXLI~v&jccI8s=)97 zC(o1|sTrflx%{jxv3(c{q7N3WRHxxrB*MUBj4THLB1ynCJM@`=hr9XTq z7qPtABg+mb%c9xz^z;C$6B851-RtH;Zzz9XgysY?4)(W2=o_G)SxN3(&iyo<0P#rj z>PkLLS?&CkEiU_Aq4;Lk%Y;EgK)LrM$7C%R4KZeE*0Qp1=#Tiy@vjN-;at9aBd7F1 zULH^hq%v-Gnk={6_eN5vK{~Vcj_);@fI0(oQ|@rx4H#5(v3TLblagq$jOJ@Bio~^O zhZzs+)IosIuZfC`?CVypR6Ma=Mf(AjYeIqMeYGn^;{e-r+z>nDvEeZw)%yqJaMaY) z0JR*@kKLasCyDO?aI(9z(;r5EXIr}%kl^W0TpTSAp8}czKz6!#5Ed^fE1OGD2uK18 zp=r9cQfKoOasgRsk#=i}c3LcEKXVdSNli{p4j`MDa0hfmx-AtIHUKJC!5_6g^3r{} z25;O2ryC6=0bs+h0pQmlQ;36F1>;sCgcI`>Ab|KqzkN14%-M2taw^#A4;C9$<`5u^ zss01`2}lmFDw6NJ#6hCOkPzx`?!saI{45jjHO&S)EH-mh8=HzMM2Ha|$`&vbL@Ct2 zX#EGaG$+LI=090Ev;q?5$?8w&{6D1YbNnmj9kkfk*vI1zq*OPsc&<#c%lR%V09+S+ zE|~Rh*WkPlnOU>lg!E6Z+ZbE^lYA}-v0DJWlN>H4rV&%TOfu(W$?BHT5^}ARXf47M zeAYqz+JSR?p^oWnNz6dNVwxX6_QOA^cs_ui1g_&Mfls=@tSnN1tN|{)0tn)8`8?dT zwD56&*Ygz=Ds{U80l@UQm^DK4Pv!MIUTGKbg>}E#$wfv+2FMhF=bbg683B}j!#Qgt zK)X8;*eWpv2q&yxq-4VNHR3WLN1P>hhwkj^DqoKvlccP4J~a$vx0n+;>5Hamz1gLC zX}Q#dg@?CT@_@?PmHwlngK7zgD&BL)DDO|P*6}*aZykr;^M?09|b92K|vTR zA6LS9RX}!`#T}wErY-pzU)k8$+??61|c z;jNwsS0h|C8*ZQ*byswB^ts^NYj}+SNQl9g9#ati95bI54U32^WUZ(eHEV9j?ihl@ z9s=IymFbSAQK4jZyZRjXB-%+ySt@zZxdvV)P$-(-qtdFkA?pJ6PEi)pl?N3^fVVXB z4a7*%iV@;JglCt>->)<+?GvCPdf=0F@X{r2@Xgw)8?Y9ImG?N03M zmA3NQZHHA2E-qNV1svTA=YK8Wo~YIT%#V+qW+?WcRtEpY1N)dE06wMFF%hAtto-T? zV_Pl}pe2cMOJWD^G7JIK9RZG(8jR7sysT}PN<>7Io}NBN419+V`44M+34~_XqS52S zJ#fA%(QG8A1A=n}c_ow{+=`q^x>tQJ=hkBkD+qXxp!@a%X|9l4qgR}n0cj#|z)_VX{2Xef^955H) zfdZ5`a!r0aDP@3Wn1CSl$whH~eZ&3S0Q%+O3qYAjBJ#a$kMF7Yu`&x-APC5G5(>Y@ zq!)6aM0W=V!gIwI3JE5O{EXyvMH9k;d$AX+(TP*$jZ=iixdzxy*qyW z;>?2Zeh31B1^V!9T63(1C5~P3!GhCsdEXW_tkz2ud?uJ+FY})iwxu4Gd1=ca-5xXH zWr#Bi2&9+%@GJPxH^A*}P$2{^C6X~nzu=2UdL%-vK-9_l7aDLIr}Dc0TIuDR5l16H zZ?ijAkcl;Br2rA-b^C?X6cQ=W5f3WOoFC^Fn;ekpS^(9$5{SzeR0Z`sPcKyU!B&;? z;Q&I=IiUV{_1h-w;@(BaE=0c>ju90KKfJn+mw;2zRp^E}2{ z_*#kxO?YqQdYFOtsn(w^$ISCkLTH8jLNLN&pmZh%O#M*)I1Qo>*#LS@6;RGr1FZyq zV5}uFHzjZu_&u>#z;s30eW6w`fFZ*`Y5CLB5KLf*W9TL#rFI89U-t2OE$~lMQ;^0G zO_%akw9Et<>8No@b_=WmT^HCVr`<*YXmp=_97+xS~$g z#FTnJwHX7c((TvS-u?tx^W638#t*jNXPFvmX}-b1tk9p}LN|c)d1d{Q2ezD@G3%35 z0*i-ek|{sSV(dvuExSu<1iboBYlb48UOwAI&d%-jQ2%$vR}CKiP5lFBqcSIiZ!@YdlWUXWdPV$Wj;g-M5Z9!012_a zy4j_M3Ia@oh>D7iYzwycgmKOY>^JBN-vC*)1U{6w_LU=abA&sNB&4&g>Q3}*sj-QkIHnl5#4N7I>FxU-s%-ka*Q>-jM8eY}PN)-uE zE5&1Y#2>%TS~yJ>U{N~jnjEOXOFHWin>^_z{16(z9(7Q_k0~Zs{rPd_bZT9n@ko71 zA{`3q=IbNCWaE1#2=dHRIW<(B4n50Um#J2$ntsQUl51Z zYZ-hwb!b_MGysLZ+~T#H7XUm^TA(#vq7p<&kZI$5S5k)g^U%sgHu6KP?7oo^zJE9d4Dg_>f%B_TX(x@0=Z#8+|S4J}!AQ zqDX@s@~um#f-p3-be$#HH;&X>2aNG6v}?sU|wADhoy_k;DYg3 zadh11r)yo=zYM8pmO`m6wE1jNR%$$qF_GgJ^z*WisS-^$yl2V|)?;Sygt@!SPU5!f zob2sa-c3A$Gd7hT>R~GqPh90y*qL%Y9h3Os#Y`M;5-drRz>U#C z{$#60NnNcY1fMLsb~gp0C*Wz^I7J`crW37Aah&=7trvdaDrtYFpZ|d=&R&bQwEa({ z8Ragvfp$esM$BFJB7sw_X!>0&d-8%5uD~-IRwE9ZGcW0=C?q{z->YH{|DC-SDP-b9}2?@Mp+A0{DQW?GbTw6d-AWe2!JKm98rt$C_)_!>WiTC^V?@k3c8tRjM5)syo z4)-872Bp%wt-mi;pC=#vB-%1-rUB=YN!k}gl|52<})wvr~5@f7A3MyGSY87#DRH~j(BJ+}TT0XwUZ|%+qFjXU$+!IDZ z5x=406Bajq2bpF$Q0^#>`;-*4@+I|>6H3Hy+1`((QmF4vSAAK^&(8q@Nx5y0TY1$zZpVb4jt%B)bZPQBl_>WB z@?mwt!C|u~9DXAz!(gcu9gR$tzOs#}!^ZS^Y31QgTVgaJ&cdHV9uG)5i~FQTB6PiU zMcfJ2ll2=6Zj2Rys@ZjOB_}(ZjWjFM#)nA%9CyaHG#fufFXPiHIWSE5&9^yn*dqH~`=`gv zzD_2CTrXZMBB0UZ<0GTOcf0!x0)YT%rIIU~iSR{2EAR;Rs< zaki|&^*EU4%E*j_1Ly|H+dV4e?BgQlYO&EO3b&2SHD*v@pX~rUT29?)B z@TcaNbA)aMn%3lrJ3g#@4`&!(1l}*YZmfMJnTLX@yOLB`UP6YrhZN)GGc);c;p7lO~Y_{iTlu%(_oGlu3eJd99~pw?kmg%v?j9YF*% z@jt$3j255e#v~O;=)xGruk8D$VG&YRW@ilqei2wYxIH03L5CFvf%0;4rfyc(Z~O6% z!aSpY1XEQcM237fRAFF_veC8??`b!7Tg>N|C?@8#hzR#$>t}dE!2Ste(zy`I`2}f( zd`%*EQ@nP-*c4}M?k`B(jp}siWL0j)PGjF^jiM6FYqF-!{!Z_TUY3I+qx6g1J;Ef` zfIg}|k}iEC&z^!VC%6HFIh6~HJ8__-V8PS@swIXg|D0tut7vQex5(Yn-pB->prR98 zM+(P{92OQbA;)oPJ_}AQ{u3TSp)2?O1IGF%o5YC=kF+U@x6Og7w7ehd;Li8UL?#yn zmg-LIo|(q)Rc+@fQ7wOE-tgdBBh5h~DcWEIK@zkR+*8#SNqE_&;h{3qLuUyeE zQ2jL-ljz$`*a3tKoD-AAlBHF(RU`fY7#v2a{R1lOilg{hDvnMRgB99v*|L9oee--N_8GL11gCRe90cwSmLHzYUl#io+O zk3yYZ;8~1{5r-&DGA(dR?DlmK7&-$*b?0@VOK` zM&)D~I-R|LZ$4!0`Oh?w$F*7RZP^;;47X!7N%Bi{JmYj1uhJ5_#gZoUAP1IVs3KJuD?dn(w0TAKXRC5mA1B1`-TulNpCd zVgT1DMc+flDnY+DpQG48FLYBTd1Pscz?#aVEMYM<3{A_bOdO5p zTPclqnIb3s`l@2wd-Q(AJB>Mrs#HaEEPvvlp5>j00~GTEpqTH%-+uBWRm0u&Yl^9< zlfR6I2^y7)p>!JO8qHfRandI<5zKD8BR+Y@m`6qO)1qS(@jczl7hO5<3UL33S(y~rY2G( zr=l_i9T+gI1Ng+}yj7!l3MwQ2wi3bQiX&*dY_DX1=3&;r;^Mm?U?~7Fi|pqRc0im` zVN-_{OclOb1$`5VnM~?kDCKGhpZMFio`86=K5cJ*Eft!rpQe*&A# z{e{qXw)`@ovWfz1Y>*pGve9gQ0pwb39J3IBMu}@p7c6%5QyhV_ zTzM><865KsbDu!mQ0p49x|?<}=ZYz4U#jdHGl1AXAH-l<7%K%L={+}XnsN9QiF&4f z*jMH)%bQqS#5$p#Xi4{*T=s$x_IQSU6m4t12AZZBA5K9qYIivhbKk$9J4#J^K>t3~ zQ%tdw*5nZ?w?0LomY>e*QK7t+AH*BIP7$8SUCkr0>Ta@0IBwBSP$r(pC$<{tG?T7Z z;=JebBZDxiZF}-l0sb9%c`c`!X$R=d$CRi$1a+QklpEm0gNoyN&z2|Sdi#tkO`(vv zta>g_+Kl!l7jiQ=LxYeEKHan_`&L}B8b5yJn(em+jqA#unva(vC+kj|G<*_LH7-qE z=;32tvQz1VXeivytOn@IfpDQ>&Tf|j4}aG(FPt$}+%&XbO86n2I3#uW zzK*z4cUjzL%{bHFe%^OfTKyVmtTsVU=rt2yLhj~~)?4uTKOZ(TltfVc@O9^9%}@*m zJcBRwJ!CYu+;<`^py`(1HTD1*o~LjpYhn3^5c&I)AnH|D?D0MLex%5qLFkT&{eTV) zbqofkHnnAe?u8TS53Iucn{&Z!NY=0h^szJODfpveYB#%9RLgb!*QHoc9D|T(?L&7{ zeDj8pN!?0IZD2Lw+iANw2`@e_ELs+MGG|Vx*x3)uWK_3d#fi+F4xelQTK=pe(u1kY zBeYop{J0(l@vDe_D+r_jI<{!DNiWfa>WB!(6e_ApzeZ*%X-^)%oL-Q0=NeVDsrBN% z2tZgas5!ALrjQyInP@Uj7dx9E5OS{!0K6(g04Zg z5UNV2MPZTog{{5)@4&w8B|??ZobqPpt!e24loYwYl1+~l(8vl4wEsNQcY>)39rmG| z39o+T@1;81ReUo8!M6gO5E*MWAEX&CFKsY$8A$@cg~MxVZT38~Ghg4XjL@0IO=;9g_L|l>6v{8E}rO zEFqTTTPH_rLu715ouFg#yFBPa1AFn2QP+4-)&4HyVu$kC*RPLGKZ*l*_m}X`_3h~@ z(3Oc12Eq+hRiNd_0#u31$)=i+!-p(A&~wV$b@(jRpN&YO`@lN*odX2yWO+3#EG7a{ z^=D4wf5q!-wC%cf{en4}UdQ9H%$2c}SnU7WhMjIf=_*|oqwm+n(3p*%R?N{F1_qq02HQ+fBx>K;6VH7UBz+_wfd>Hw}9Ps z!)rXdKsxQ`PBZq-Ixz{_if5wxCVSsFj>SLN$ZMV8T!ICx^0~JfmDM1AiUf5=EJtH? z#t*{dsied^aVnmS%o6IzS}jTuD*l$J7u-%@A^`M>e*rgjmS5^B4*vemCeCh}pyt_x z@5TAKQbc?_m{8?PzZkN-Lt=O08)2^tP87tHYdk0rgM!cuRcE}WgiaMa7Qj$2S=>XT z?Y{ECU|bE@FE6+LFLPDq;oO+S{$TX6d^`?!Brkc%xp4!=u*CubE_bY!NI~lM4n8_3P5)d1s#?ATxVRUA| zt{Bw--N&w5`$i4N32p$@yB?0&+P9jO*om)X_HTn^%8GQWHPUsIjoEdc*-i_ww5DG> z((!JD=Ft}o;N4=H9yxE?;!Ql4s~w72$`gP-O#iUxuXZ%tQD;2YfgCey$ z;iaezZReGU_cOZCb5y*DB^z|fm8^q|TliRIVN!(-N7E zQ#V1EK%M+S+LF4I1$|04O-XT$T?%kVi72aDGksKE1qoiA0#3wrwa2}<9j(E2L&;If zNBtbNG0}#pHhVIkxl9!1R$MKUNMDjffJoeNv5Yp)$p))_z2Ec=Jm*`Ocn+m+G^T{2 zqfh{9a=m&Nh6k1eDVi%Tgg%+y{OPF ztXzhKtdv*K_bF?dk!pY_D=aLG6x1Cv$0sMDp`kg5#UK7!pV{7hzc-(%hlWqUY4I2A zt^-e~Z*B7`o}r^sPNFNQXr;XQ`H|r{d14ze7{fPe5wJx9>s%FNNgWVh;o1T1GoG}L zhe;Gy>pfWG5|Rn7ODmy7c3~@VM}#}AVL>+!3|@#wQ#ECq<;`s#=p)BX%co*#YByhd zj(az;4KSBxMrwiSrXNU%7D=tHx_HVU@ymH{OO?`kN9?o6H?L(dsAra-wjkq{C%=W- zmkO$Duv)l1CQ!kPev;NGWys7`bSJT9jPjqzi!{i7 z2VhRu#e^Zz2ut=%?sC?FuV?vhg^od35c=Y(8hhlIf-VeNw^wHE$L=lb6|&T$IWqCU zYQ}TBG>rXEH|!nj*Ey1Dc6D9Qn$*45R;V*iFC7G4JN0p)^XW>yTN6_UJdQ?t7S!PJuy~>s;Mp*!UpvhvPd%G`tzO!N!=@~N9gHRr50)vVz+w$k@fk|h=QW<`1Po6JX5hRkh(ETm<+K#Z zv!$0AD&z3GWR|{7Uo;oSl+q7faF(JTu@G*Mgge(-Y8>w*ORT^h3xQekTdZ)5r6B(c zj>)Yw@o&`7F85N!OxbV!_dkeqRK)_8y9_Q@-Y~(JJ**JJ&@g zrkj=_3ZRx(g4bwVaoY>&qlsZvZO`710BRtTGNtKS;9Af=-HW=iJ7A))fF zqvDdndeP>quc;49Gt?NXM7{{QUo~u!`Lwt2u4-S{H8A~D<|+I0cXWXPUe8E5&sG{`TaFR4yFiCIg|C9$Wv3YBM~gQMKE zDi6ic5Gek90M40{S}jN9VKdKH=PPxkxi?C1Wo(T9G-vXL*(9}sQy7CUh5 zyKCte>)Z(jcUHky5tOw)3U1V>4{guf5&uYKFp(B3XcFLtaWMlO1UOQc_b*?Yrcm zb;F9`#JsOp!^LoBVqQCOu(NCH=u}l!YIa(1c6WDkb8{=J1O^6zEei8fJpB%KO#3Ii4Sdp>hI^XQ}W{{naFX{6SaugI4AgZZ^>oMZydTU((EK>YE z?*F?#Aka^w;`2DQ_VH;O_wMGUqYIoa<1in@z`{}{=jClEEggKv3W^yJ>eiE~izn_F z4>`HVqUtW*-f4Xrs;a=b%94YgzObbQaEWT_>JI#_yR*EN31dy_MNCXgR5X1{L8+jL z{NBPMzpgI6KV{sTT&F?~>jd_hM?j!o!A-><=oFb47_vyogghmY-{WNeh;WJFrVZ$e z2+!`8kdR0X`N9p6f-0!s7e5yzbulvX^Q1}KNJ}Hdqm-EW`LlfDLjBKe@nGa%-9EhM z2aqx?>q;%sHBdTH)6mdG#>Y?2&dLUY7WOIvp}8aR;0f_7kz3^?f$9E!47YmF*ZW1x zX1X(7CE<=_;pD_sCNsYU6v*4(q#TU5Uy)@_ZYAbrvjgYG{>#bR&0>#hnB6u+{nby_P;RYrry0YyV)m2Q(5H<>c7}1ZI^Yu9yiV@NhCBRR|oW)Gxa# zISq>Z53+M|fK{JVAsn8^=#X!3Z$EMh9cJHZQv(WwGAJe(YyoV5D+V@V&tb?nNtT*j z)2wR8a1lWW9!Dq#6(wbP^dd+&YeVUIZ>_AhfV2y=`co4V-B$Y(XJ>UG6sf7H+ny~r z`ez_<0dYR#a{>aolY%j76sWuOURPprvN89tQXayTZVNO^w&C}>xOt0;iV(W-adA`B zS~?EiG4&2BXlHI?#y|>{^+Jv9IR+!G2!*+XR3P{zDjFIcl8`Tc{do?Jjg7rEYinyg zot^s(WWB>9v(r5le{SQhYUBa8p#$vJ4!Ii4MZj)CXDT=w8n?H%0Zf@|`0zz+b8~Y_ zkH4a#0{BicO4cgZqsA1fs;Wv-s7uWO!p%8{;wdR9GtY;Ulampm1R#d`4UU;6iK9E{ zu!V{n*O1wpJjBPHLBzzyO6}bFfr{eAZ63n-AXmJ+yg{PUS64?v?JuDKd*#xw(4(?qb=>d)`SRa!z+6N}TN@1xO*6@Q z0=P}#kdd`DH}{iImg*VTvVey_FVEb`DK>@N?Ui?DSY%@2`Nk*>q?5iNIVGiEp)A_2 zsI+uq!*L7_gqoU2^lpH=DJY-|YV$k?XVu--c5pLe^!WG~K&!Dbl&&(t<(^A-f;MFNT2Ps_8FcxFBF8B6xWxVX4pE@hU{(NT3M zabQSD$P+RlO_C5AHnxhatgM29KoZJR45;czPADa0#N%+M=z-j3666J6 zB0wU2q&vf~fIv0?N3EG8fX!Q8SV*5ngpJ+7tl)Wl;bdY$Ib8tcX_9tvYhAy2Z6Oik zR5U%X=#@s-10z@0S8fvC9Is+2d89~VmVgV@^71lc=@ea!h;xKAs5dKMBDgaqh?SMc zXRG)?Ma|7E!LX}vE3*RFq;^lSm+hLStWkpT|-?(QyL)<-M? zIp?PFTu~NmeEhs|%dY%8FQNbUvj9D0V$FZV`3_9^Dn}QRQCl8+{RMm~jmAv>IgEtQ zo{@jP_XsHGGQY=opyK>~y1mOFarZ^hM5vBMLwpZj?EiaQ{g5zS0ZRFnl{IanY(xrV zOJab-T14#wAN08sNR@#u$Ko%AC^%SUKq~?DBf~(z|MR^4@I@7v^>qNUO)&8U24{-F zUjhH&fA?rO+4sfb&&)T+dtf|g1`fZw$UjF7gu(kNukI7>zh7`${QglTPacd&r3!k~ zR#ZgJrGQO#12FksJrV{jPQu+~_PPVBOH#mI0fCRHscCd{^oTB~FsvLpd_j;8e0k3g z=)CQ$6b#!0o=?GJ={mr5{rdF_SV8XW>}e{vs)`qsmQJ_k-# zYL*bTH0*9Ik#RI3x@zey6-kf3y25lemk|C>v!+J`Yv?;MsnHee3PeRc2}({)Jq61T zC!6)tVD4)u$KtTak(ZDYALu&0hp=#!^-lt(mQi>*y~K)M#LfGhs-=#rX1E2XRyW?U z8%v%~EP33t>Ij_&xHY69dEtjKJYqhQMeeX7=DAGW*ybs9G0Z-H`K3~r1>C}rzvLiL zX9xRMz(kT3US6wVr7rudL&0Y*o|I9hh^#)-{ZNX(&4~LsQ%6;9aSy{Gv*c6WLUV)a zV8W_l>r{Qt*fuT90UVgC;)D%jZ!V~hzhi=%R-Z0JT7ew$(4AlpHN_*kJS9B8k3`zh zANtUchIq16S&fL-j%B>ik8k|FpwYD3oVt}fT=}R$A$3^x_ORWYG&E8wl##$BxlLhj zJAGK+jqg0qYOYOY>xG@P{ITOnLNoq_MJcze@+E@*_QX)coV8-z>E=q802Rb#R|?+lti9~y)1M;j`bKRumn4y^0{r9!mkjtx-V+9G z|CQJ0&t@=&)I$doZFwNyytSrW^u*>>Ym5dR3Rbh;#>>UC2EGS{$_YShc^84xDRyWNB)Ql%i)96zHDkM3GK! zU}D&}z?(q0l2%5L_iAIUa5yD*!?Z-oo*Y<_aP}S)BT?-%<&F?A3T$0n=TL<3GB*y&8%e4zSu+=r|Gf|-!iFgZDwJj=TFuDjB$+iL=<}4 zEWK8dZBQ7CF68=hQSMZ8byCO~FJQ5dZ4>)oSUW&w;tR&s;ifiAt#b@&qGI)LdqoA9 zDW?vNYA(aL6~$Abu$IYH1E-Dk4#H%fYu(0LMR`1v%RdjS^MY@bKP5|h)h0h4^x%qj z#%#G%Ful)H=%lGye&nRPAn6nZZNgJ4gR?B{#Ita{W+#EzE-ppg^7?_+H(@hps>v{w zq%P<{gy4l*-y}GfJ$T1p?@r{cM$=>!_e|b@Fp!s#prXuHCeF@kf1NTyCO+mfP?O3h zeEvR0ymu)qH)CoLNFX-O2RJ;naGI#IWGPHGe(>t8%N;cK@0qG;Lbr423YN{k89b^m z?eIJ@+Hu{{nCZmD*Wx3UP|0Ff;KPHE18TQT*=nr7QLdK$?g%WS#>_rDf0;HuQj#Yr z`{TaNyv;;R^VlanjY#QaE*5?#9M9p*EY31{ltOKr!4MvutJg=11N2<4TP;l{I+qb^ zXz4}J)5zcfA2XS%`T_3o;!kFS=7Rc(`nnvR%2E$yA(idhV{W-~4SaUG6{%!9Yom~e zoU#dO@?xlVMZa6pE1B@2WbY`wpo^?xGzPc5SZZ>KUxla={={iqxLk#huKbDXN$#GZ zrS=|C>Q{S#N#3kDocU1yL-ru_rKf*VM3c1$)Fi@&{+4y9%A0n5xdGw*dnNNWZd|a& zB;x@uP37k{sTvaA%aau>w41!Sl0!3oYV})Q;||sXW2fLEYIYuhUEQ%(u~q&YinV`N ze*~R}C)H2Y^MHU;`_TC{e^@q0(n^}L(q+&E4c>`(^vcP1>5EY)a+g12nkw&wt>i#( zq|1Vj$0Gm3U`CSgtOBLP2%_4dNcFUlZTzo_E;1lt$hU*WGZH| zn0}A}DPdwAYn?TRIHIHXW;O>kBRlSEY2U*7m<@jQ)(F4&vC+ zE|r5`v#8r^dI^73M#fG$CX&ZP4xA`m&Qni+GAPh|S>^6eQH<&!*Y-c3bbh!O)T(eU zy~=*J!pSQiJsovE>zop6#@A$I(uRjMPq1y!cBN_`nX_!q$t5kL&~wyLG192>48tN~ z`6+T=#%)0y=W1>lpLbt^-({(dCUF+DPXSxS??&O>#{A>u0n}tCisj#spWnACA9$Ug z6;JZLf77*0IM==7uYRc~#F(aU!%<-TA@@s3-`Una9&leb8|}uOF_aLo8zx}%h?U=B*zD;)=QxYoZPUNzGh$6Hp<4UnUe;k--<)U=1MrU#cBpHPk5{Z{ z{M_^kshld5BMpPvglC0H8_v9U5{gvut$IMDh~K2{wY#Ru`@%!3Ah}`@5fl&rUPu^A z*Ne_^t>T_%e{FUo*R-2F{CTQOZROj-y}ZI0yHD{!&8v%z15B=5M^oM{KdMS|#%PG} zANT$p5k6EihOJf>yc6*!4u7ubrpRWcX7>va0K%htO>RTYsxIiL zQ5ji!BCe+fHF!*3%IR>>$a01K9DWgwcD5xcK^5{dwtFQY(Zag>1bZTE;uDydmaE{I z!~(H)(u${T@o@G!=ir1QH4HWJR#vdZg5E+gy|wOb%f5VoQsm3 z#LIghzf>a4ZS=50{e!dwN3}PmZEiTpoPY0Fb|A*0J}#IIZbda2(X5a_>NA6)n9HAkKGYTVaJk_2wj8`FWJR3@Dz`@{F!CM^_Hb91zev7EFx z?_2EM^av^2;K~Q5B+f24G8(m|^Om#qhp}(HD~ug?*2{n*4A0r?zDfc@okqf6cO>Cl z44ozj|NK<|Qh1T<$V@U0jFvfL=09cAEw^*8uYPHI#QZ|X&{5Q(zI^m$Km$u&Lm4O@sMNxu+yq}%7%7J`tq+ZdTyvNB_hX+^&Swa`jLj0I$GaKy zezb3Q?$uv~X3CxFXJq&cx9P+^j?7-*{Jp9_aj7xD$RZHZKM7iWG#NprUi^Qm*3CyQA@YeIYa?!v{TH_cC#bWJv5NaW=BNF+9x zKn34>kc-6RSsFM0iIcC+e!%EFS*_#;c?(<0OeRD+Tg;q5TCYI3q^z(1tpze0=h?xZhJO#n;?s|*7>-wJ5n^pF(N(s>BAX9rT%{Ho4CGy+H4Vm`dsO zE_vnR$V}}gsCu*3fP3@nuF}cUkP;ufuz#bZC*0RN{jet6$yUrXqZUKZq; z7E9LK4LBT02BKG}c4ZbvjEn0!-qsJ>ZW9!#9Wkjb=dZ~jVI!$bH=xcE@9K>{KwWuU zK#Zwe!Ah40NkYx75q6WNt=ho()Q%B6-dJx*eg?I3xV61bbJrIaT4_TZ3v6kB3*wAA zwIBG^v>=e1wxvO5-~&l}X=Tf)rAlbL(Zsv)__#Mp)Y7vIAtn(N%$Qo4RiH(ZAP;f> zlXsdSBA}x6nav$vXUwi^xu|as&2ou!L+A6Svb>heQ;eV8jOv!f+i{Nm3>IEuuLdVO zi0mO|^KPOC_oONJOgcHG+cO$`w^xPjX}DA&??<}>+A%K3z-x?N??x{mZaOZQ5X9&2 zdKKDshE>Eizqzz0=pGChZ#KNa5+(ic5EP;p{y+9X&?4Ku8=YpOh{= z1~0_86l(cl;(;O5MrA-tVQmX$Tkh5W0RB$2?{K0PLrucOmf((EaDc0baus0Hwdb<4?^2v?}lJYTf@Z9^VZx z*GZvOG%XoSPIWo$wlPmwcYYoliukAKv1LeYDWo2UHP4bDB=2tSV>||}#}kvYu|ffu z-~o@mcU`D?EdMjR2%79Un?fdBygm<4=B95<14dtRpCA(=>WxIE`6(afg&s1VbsDsv z`{$84-S}sVrbRffrOgsimf=Qbxu1$P<+BkDOn_(kJb7FZDl^qlr4~L@{Q+i1xYi%l zkSo_@aQIo)lJYE2yFzPZSSMHoy*BbGWNS z^TLFX*8%##MDMuE5UwmuW^WQq~g2>?p zJAF8F>foH2+|ENCl|$afXZBH4p%EWjr!#DK#$gP$Qnt^3MnwF@_CO@!7bY@26O=nZ zH%+o2JwcaUld)Dq;!q>;mbxZuckA24JJOW#9R|YpBQFSM+v5`5YLv{Yt1*jiqpA+n zWxL{TlO|_o>javNIFlGVjvAM7t?V}^h-$~M8yZP1EeJSjdKF`aUmzC=}8K#~9^B={30Cv^dQY0r}IyVA_jZj*R8#qoi z`5fDIrl0IHo-<0oXnd5LE@QLD=Q0NF0u&cwq0{fG9m5EW>`GfSN0eZX#e&Hmo}gRK z7{H*qvdZ1;_UWo|L5oOjOm#_TvNG?$!u4OV!Jod!Z)ct@+VNdr@ zFafpF=ECPZjP-@1OT&0`F+JVdS)& z8+n1l@mxgGB)NahZS77*vFgYv$)DxDed&(&>H1p7_NI&x&RduNsf%xA3f_z z$1TYmYGC^O4&pQ$(&FmGS?<-i1)ETYJ)0yg^CV&0*G5ne&0enFn^&L;HmSa&&dU126g^rC z<{zf>}qR5St-n8;xN7HMMKNGo82-t9HP5%&hMwL&_k}<^|n4)XC zWocEGww>w-R%~qB5AJywHZYjh)W+H99ivqEH^^xs4?lstA1JYf7ktZZ5H=f(o^H8y zk0majwq|l`0D$U7GN;NI?&7uV$zzA`YD=@u=RB;HNY|s$cm2L14HnCZB)F?Fn~le7 z{GjO3NKrhU5VyJe)WyJ@>VKFk`WAgf!g$+K!v4dicpRd!^#Nd=y_|h(fC$J*{trw! zT_F7}BOmTbdD!W48vK-OW++>DOIzCO+k0kB?Wy4i;#e0>RZEFYblepS@D8(t<-I3$ z;a0mX>E=%*Fwu||iy73ESJr>~rRgp&rZ8uE?ks(h)6k?>ko&s^04S>El`^=DsK}^= zmh7p;Lhl`G_CNuGYnm4X|GPe-7wA|6*mOx1h?WT0+A|%?ssZ#mlVG z*00$|*Ie;xxJygnl48_CH4cgW?$ljDC$2lr1E}qlO`veha6cE{qEj(p+Z-kKXAOPJmRm|Jw`;#pRsbB*Oka}kM?BH~h zSAB3jIm1aclLD=X6mtHOAQRW~PY< z?~MH#&FJ>FG`mTr6leKwGU11B<)wCOU2^tWNA0a6!ZbU%jdSP-egD4&4`tY#~UQVS6B5}aRBD7S$5}}I%t^KBPf17hPY&}&B<^cZVu5ys&q%% z!#*SOo3k?iMmcigDM2f(DYiuO^;og6;r1whg+gMgJlA$_nWiJu03_N8+?X?mq+F5P z!`|Hgit>d>raT!}7B1-|S*U4LOcZm)u2o4Ope}HYpTKdwRl~O@180K!Z4aXYhQ>#d zBYvOTOE4+0BsuKV@kC-0Cf4YAlH)AiT^oS=q0JjxJauGJYBy%FvX%{q)nhsSmCa<% zc@T2bOF)1hZS`)UBj^G7JGv{Flk2c7W_;hYiKPpA8RaHdqVl zhn23@bA51eF-6{-Gn$9*$U;`=87L|xf*1+1i(9bte^LDVRMOX|T$wpbS$&HtyNJJa zwAm^DrW%Ile7l2`lmWFi#2R<=Z@-7Lg?3R_Y-{?kwCt zi%tnUX;rXe)%t8MCtT7N`IR_f@SR~i?_m@OUBb4bmX3HMGx{x8xpsy}&DU?aufrw8 zS@ZM_DFt5cggIu;I?sj?XIE<#kRRdYzaL{EGVkWui3whPC17k4PD>s>=$DzuO(DNJ zZc(eJAT=M!$XNDz<4Z{qM=;ToZ}Fr_xQ#C^VdP_kb_V+WU4IsNt6wnroI80(p{vmT z^aZ`BEf6yROOLy%=DzGpUP0{OC62%s>3?XaAS6uIu6f-T=``VQ`0rfcXMtqIHa3Gj z!>4}4ZEsHZM-hP=9)kZ4k@yYx?he(qd|l7nu9WEo=@E23-ig!|tNEWVf4y+gX{IAO ztORf)3fB9Zx`;Np<`8xy4JCt)DpdnHDasow*|LSCc!W+yDA0`34$b00w zwmk|cC;w@yaZ*yg#X$PY1pM*Wru|Oy1ySpm%KW#mrQ>?qFdpdE{MW>-ew;U>k@4tXf#tyg72f!=yzb z+%DMrPp{3EdCTm^dh|Yjrj2vsz-BAUpUZGm@glBnsXJQE&?l^x)-`(@wrS?ySmRRS z%ZVQKr#bS799eoF(sepXkUlhuhm1CoM9iI})<94$! zJO89Cv`=&Ke(}$?)f4VBrlHd3q13SbW}p(+ z-W%)9X*@s)jTBeAF}&d^uyRW640vEV?xid)Rn;cgaFX>%6zv&-7FdG`!HX{r5?fR%ScMIFP25q4( zxIMd@05j#_cu3BK!WDDLa(JR1v}QRb?n#!5cJisoQu+vg!5Ju$5vQ&cZ$31(t(+<0 zHGHo;J4)^j=p2Y6NFv0H!eDUwDc5BD7y^f){ihhWOIdUB0%(d21sp`~S;U)UgpGVdY=KFcJoMhxu&hlZ- zZAy#1Yd95PElr5EE*2^q^Wrd?MaJe{#@(!i45mR!6eDQ>A}Y8iGefBB@-gf!MTI0` zAOn#Zgpdf+Y_vY&MLPYC9&;u?sf#Jf4M>M9dv|O5y5H;wObvjx`_a)+IHKiNr#l2( zUiMGfnU6!CzKKbXw#DQ=f>lcEuHIOyL8?|a%##&xD_<~QBz5691ut|BBqSw0dvosr z!4FfBb6$ICAC|zXPk_Njq0QteC0Wb5?^9oCw(T8zsFuZpj_YP5W*)_iZYTQlBm z{fmb0-n{^N4m!GmtPW=ff8-~dlIfo@Mgqu%FbOr|#w%csQMf67mk-|Y(-QqGdG;K& z+FYAK5NUu+^({)fZOPo|5!qxDAgN!ArL89q->h9EdPyilLdG7++zPfSzKYR0m&sMD=#jyugUwOZ|+;fx%L?(>>!9k!P0xAJ+9v+?bhtU|WiVa2+ zcEU@MUX!XgffWluCQjSzsU|3yi$X|K)T|jq8?Y1X5uNuJ=G>(xSDc0Cqcyue(tG_L zym}{6RH}%;v5P<=mRu-GR4B}gcaFPwwdMVP*iBV>LRtr;x6 zfdJiph9A9-hKvE^)8cj9_?MDeoyg)az1-;Hci6Ku_hufVI#OJF^-V@iG~lK}w5%-G zwT)aDEAB%SsN<@sQ-`l?C7Iehq~Na)lC|g?ELqz&4XB6uJbv*xn!kT9FCiC6A^;LE z{E^LIQD`m5Zw&=GjOodba$+i5wWWNI#eMgc}%}Y!#pZY_|4@xyb$Q?+{=%2)b*hWd;*aKoJpYB+^c9PMPvS(dd78 z-Cum_*Xw&xUyP-jn)M0+B0Lgwe}DfRoWT@cj#sZ}S9wuLaSp$NJ=w=$&1fYrLeAQt z#p1=su<*@PF9I%fKz+Bg?l2_x@nJwM-IK(?X}jIdk;waP&r?abv!_c1kJYAGH2u+&;`65!U_mBUB)b(fT4=6?kv#%bT#iFJwdaPB6UfhDA_YX zdL(csIl;lmH#h>$R$yo*D(YFPJk6@xeOJX^v7Jxgr@d&lmQT0Q$sq zJ|{~H3v*#nS49hzorwSa6c$ies;GPbF1i;N?!f!eZ0{bp6YQOo|NUSvFgi#FZ>R+0 zsz4}cG%tVu2^yWH#2gJ97Z=sPf*5dhZ5iX1;1#GO*w~|RIQ^;{imRgJPxZMx{WAPF z_k0KLBw$_`qh&13(fs!w!I`eN#sMqZmQhv3AtcmVUapum{MAkW0V&QByzp{t!||Bp z=6EAI0qNfRAixRGUmmr2yHx1yBEPWEh*5-JB4E|Oxlmdk?9|@Uu(KSIp9b0 z3-YU1zwPYGD!VAMWsl6r9$DFv?7cTpk-fLb zh_d%4NysMILWJzS`JH#K_xtmH9pB^l{o^oEU+)|Ch zuB6mdAsA~3RDe@n$}9-+U^6g_h}r8z{TC|8^#Pk50{Qj zO9ODH4abcy!U%uB&>;L1mseK-X!FF@c4Na}8~aMU90?H-opkE~2YEQ?H8M6mm4Xpt zYQ(HA_(BLFg7qYMdHJqwfTXGRpf$99`t%7#7k*(J<0TDU1gswb!!pv-Np|Uxqb&cy z=^#G!0j@SWF3uT{T9l+aR1*^u<>lpH7`LuMC(52vs9tkYS)XQx%N4O%zzf$vh8TfR zd3o>!;7`51y~dbh8qim$si(&x{bK28XA#$Dmx^j92n7R4*Jg)?C{+YOh5k99t<1~Y zmSM@r{!8s99flftUs#xuhzKOqiW5x;N#qJE5C^SeZM_Ejrf@el3Cr7mYHBJWfs_+R z82|i4PDaMu((?NJSQl`>;vlx@;cCI8%)58rXJz~NR` zS98VJOi++SyzXHjpHBaIP6Zgqs;#G|prq6cK*<@q1@^GWNI+|a zsFv=+pg}KdLP$?*cK*yRQTIPYT)!pdF#^(%|{6X{OU+&ORS#yj)7Xi-B$fu|X z8O~&dEK!EuLcme?(`&1h> z5F`Y+dtiSfvfC1JS8bS58QBi@m9`T7UsrNTfCBp1pb8d1@ z!Xr@t=mNggnD__}cyEC^cX4si7!&d06;PQyOF~>x+Vk}B^z@XLe%)$xbyrNx9=L^n z{LtjY@y4#wNso%!I#}1`MDs^TjKeDjT%A}4B3L$2(Vy15p&qmrJe}V01nZ;y?SI@P+oSiUQWMG7^k~q7bqCC z?kmg7nLfJ8%8~H#IB-?}xzmK)2x>3`5I{%(7hr=Sx{1x zE~=M+67+L#wimPRbVl9$XmMAs{S^YEYDu`}pC*I~`#AZ$xOk>nzYJ z$!Ry2*36~Ll&~5y24ezfbtE60fkA?1bYzCxdOlnHEy=4lZ^~)_&>w=#G&jZJcO;pL zAC=Mbo*jMv9(M!7pra|hP^Ty&JUsq#1!Xo8`N}My0o@mh>B`MblDNsk zulnsRU#l<&n-oVYX?lLJMO{ZD7mH$PXP5T{<}BxoSXAWZB6*KR-|O8sgM9=>&8M&5 zT;%S7p;&CsY1(=jYYg1Cz@VDf9 znn*k%A+gRLqFrTRh{{I4$x_ZACnF;>i}6J2w_a>aj6tLOyQ2Vca$pm`cdW!z?Y3#a zB#rGl%FAWBFt*TMD2Mr7whV51d_0L9XfK%p#)ypUCyC!mX~nS}#|lfci|efN{#eIq z;O&Q?waIvJOwK$?xFJb_IBJ=B?6p{5aB!FFZHG5UO#?3 z;Od&B!Qfs5Jw~r5lz$Ajz~EUob%nR~kFCM57ik84Q~JsLcTY6l%?=G+zXPKbEL{y{E=DTlYyhfbqI^`ZNJr57)1ks$5l1N{yZ|s36pCUma(?%h!vy6=U@lI}189p@l zK#v~WPnoZw`siI}YQXuPe;&{YjU;lVdF;^O!svYdeHX%pd*{cyW|l9me;(vF{oOfQ zJ{kEW^*e^plUg{yc)7*=B-o`fV7-OrA&F7tja|L=Z71T@9i}yM6*>ORlp0NS^@pkW z`1qjIC4TgY8=|GvDc;$@z?5=)m3>VC76qR`2r2AGoOc# zPi?@QJBBqBjD2u0vj4)1e;J0GTX3!LPL*SLfma6=%0egrlP2bbt1yvkf6a3 zIuko&IXynha*{t*S10xgi~En%f4~utaV7J9{`^h@?u_hcBTto%Vz`RbPA2lr=!iE8 zQ7<5mlA9q&UH6f~UmpcnD?WXJyY;Bi>##TpB_JL|0UBgDan2IpKGDD=jfmeZ%}7=m&JGc00hrTU%TE>J+ZiQnxCPaF1XYF zOK2P(5En-bOC|)LM2r@qBABEwmq$46&@5zUVS#Lbd-7xq%wfB5|1BQAzK&mM>)%~4 zY9{@_pu7w8 z;B}$%0d@9ppqYV=E;}dZVb7H-U|b#vokIT+mCwxF0V_tE+B*N|^#kz#8dr8bff!sl zT-5tWr8fH&?+05j777Y@cb>3ObTznb0&fm z;I=8t$r+b~Yp`^Y=O}$R1XgAjSJ(2H#a)dw@<$>@GyLP8Db1A}$e{9Jb^q)v?S4c9 z;fod!8~>kbs;XtZL2MsJEGHC)`u4%`_g?x~OJ-IFjwtA!_f7ix`cxXwoEW2nb=)^e zg8P~1G5hD+jsDCH9@Q%*FLyj__HNyLy}Nu{=n}`{DO*Q@PU7du1_u6-#gpcJt;qevh4;kydY#ysr-TXThgCIgKHm5r7f#X!}8oSA>zia2vXR z%N7KEK>1vnSk!>;#Urq;2Qquyr{Tcf=h)S|2kM-AJrWBG>)tgQ8atQLUDx)2t(UV> z?!_Zj)54R^_azv1uYdiOBlI+iGC{s6cJLj#*I~VJWQbK(t!H0RWT?sW=g^JzX3*|d zc3M(WXFYAPLDM(tJo~jV&WW7Gkrij8VJj`}j|-5_j=l~C_Z{uAsoZc)v;r5inE1}{ zJ6E;S`F7kUgG-x?Z|f>#aR$|r*gDJxkMsM!-n|6R4{sn6i#HvjK|!Xji5!pUQ8GCk zP#zr8qIL*>M`r3 zlIueH38p{99hTNZFrsrh2yVpOr3l;iv@Y;f8j5sp}E7 zk2u--=q>alb8%yGGQq@v=sDA8bYtR+Al}to_T|RV;TOj-IVXN%V-G`Us&9frBbv;6 z;#8Clt|9In0SISRID@DB zPlmTrB@%+u`={@EAIe??Zt9U7&I`{m7S-;$4#L@FXM%iMc(hlp?m7;oH~Lt-)Otr+ zNZ|Q@@A*=X<-GoCHUY;CytQR^FK2Ub!E;}Q;^xxLSzO4QT3E>H_>-T(yb@3w66>*x z;WDdo!-bFTPZd(Rn(FDqw6Qd7`JV>|2dkX=V;jhq zei=#_EbJ_HySTU*zt$~%W?gBQK#ig?6)J!DA;h9Ry=H_5H)|}Dd-g?Fy}7EMT3Bd5gbKo%NF8y zd3izC*BnrWqPMsk60*Vd&&hd-1y)7*4g83Vj12m=QK)4dblAz}n~9D=NF_+jB$TZW z(8%YWpxEWYC+h-g$svUncf>jbF5bNsV8V?|F)j z(c2`+JCNc5Z|QTnshQcmu^&H3Z60}!6dKDuYU*Ap;OB{$_g`#p{Mwt!w<6C7HtY`A zuq{z@Wd&adtKQt)kP!I=k!$6qiIA3Sv9<#{+jJh&dlI)9Hl3^On7QIwuDc=OGQ%Oe zF)0+(QtWK_ z@F&8*217+n4bpFoD@{F!E5Mld3-%AWID^S9m?8vRPa&!ZZ(!v|oCW?9u#VC!UO@!; z*2owZVY^b5teZf3D?2OeWnKpAEG|-{u*|tr(rfpK(6OOq6*_FMWg8uC{Z^_5>3u+e zhsZ#Vq!6WLX6~lR_%k{^-MiW5vUw~n6wddk{WOLxlnmyCL(?2)pm>ixSq+(@fhzSj zvCwF_*A<$R1H+6}L2xaYm@FL~ANL@Pw2-P}6mkyZknTI%Rzm%Ny~QK>Y3p~syWz~* zcS}F|1?VttU$&*qs1=^S=UV*yaBO<}`{<~diAk_3!j%L(s16R4SvqhaA4*A;)l{#s zL2j+GGVVeAIau$Zyz&;W!w42fNH;?W=kAfve%Qbwj*-6rt*MZ4(@upxz`?=6?|1LK zJS}(~6a*PEy4$x2fY>u30jeHL`8Y+&mX?3OU4`yMh;al31>GYdQv80!CPm>ru;s&i zGRr8OiXX&}+OO%Ttm!yJ6=qdldmA;MUvKuVsM)m=(gK&QW*I+ytZTJ`Fi6c$2<(V z-I-+T_Ch0;1TCs_a~ENR3is>!dcltpey`6ciuu(TXzo}=xqaksrF!Mt{HKbG!<($);6v$1>wi{%=2KBuS0_9wTfzPD;=(uK zJ?8(Je-5=JSb9({2}A90WmQ#l+d;rM#wRJH`p`F5)_(GYQQGYdq{k+-*(TqiuiF-_ zHfT(oQ-n*)fg*UMBUL~A+@k!uX+`pN=*-WZMK&$Fgs277M`=bzM7*b6=P`u9c63#H zKs6qiAO1;s&G4^AH_fDLEu`YLt76wl;7W{!1e%b%suZ4sgSUWWZ?jYg(JdnB78-~~ zArQOw8ME!RT*eV(I_?-hd*%_vkXE7$z9@5BGjHMTASw4#&I7U^%)Y~gY~Ek`PP1Br zCW7)Ff5@qeNXd;^)4gU%gC}2MS39qe?iW``mEg+VntoS6Aepk_28K~0M1P+iz0=27 zCw}0**~yEIi<_OEJFc{Rayp;epkbjyt*Q_^`qbj}>?JTQ02{!k^3EGgewQ<eCg#i=PQ3)8wjY!7k^t zoUNPg&r;7M^EMHLa!%>o%-%Kq|>N-M#%ll2ws|ICZgu zYJ5~$XQqAz)#pRL*s|wo$WLx95#uGFvR`2SR;~>wrfPs4{r+b!JFYsLUwktvJw4pb z7=;GnNJK_pST__4Kv-^>t}#Jm@Gb^-l<}!csn_qQcx-)9$&XKBYQ~3$C9&t`9)hQw zHw!;HIy&w}CnYWC<4k6|IXgp6YU`^eJXSn8vi zxuPtSC{HNNuZNSzs^xAY=akk;)B&S+MD4jo@Bzzw2E8?ExuGR%qJn?cRqcU?AySJ9Aoaq z_I4=?mv}iBNCZzfsck@s!@Ol9UkkU@uSF}3T%Ik7 z;u7tVgS@~j6JugTNj5OeK;g(WbZ+kH1Qm`Z9-`*f=JLTc_7CSfZa}B6prlhU0@=O6 zoX(FScN#m{M66T8?tA=veo9n=7=tl-%WM}mh^swN(14T|WN1TfB5GeL<%I?ZU(IGC zlEJKOYC4BPLM1ua%mop!#qHM(Ox)bc@3?+pM9ct@1cD~3uy75A6vFGcC8wqBO{n?$ zudZz)N+WYn#kkXqO%@*K;k z2B|0*23GeWfp>be4Nk--UdS{ZI7-}Vux&;5?pHDNgvAtGBP%lBT z0hy&IUgK?^J)?#RPf&J)$RGJ3qr;W8wXo1oU44BLE`K%fU0^sJIVq_t96cxDSe?(Q ztE6P$4UA70V`osRgsp_UbP3>=kXzgMTC*S=e5RBAf+Q5)XFr>L-W?q79rfYL`{0-V zt}RC65AaPh`D^YQ17Hdk!aY17AOMIgIdOOcAKVHSWeC1AG&~H3yXc@sHXcHBGam@i z#ZJb~fFuG*huc_O3{>@IPz-=XE@U~cO%URlzn7GhgdG)<&gSIhCB+hNEe3DulkL#V z%-g7_%;A+Uc(bTeK0D4Bnn;=ULDaLk2`b1fWW ztz*N;CQUA4nvQf04BisZL!M%Oejdc;=VL>|$U{TKCS+wkZE!$!jfyIq@4g)t!`=HL zA|l^?{hcf<-du;wu=8VsdlSqYLWM#+5{yCX5}|E{WvgwS(O(R*Dx2s~ye@EQ~Qr$79sNU_EU znhfZFzO;KxetGi-GTx9VTw?=ED7T`&we$D?o15Q~io^3ijpF4i<+X)I`zOLYrsjhh z6fxSe(o(U@Q5bg$SI0dLR0cRbPzgfNOm#s{>k9ibv>9}`CU#Ei6IGB|1%Fpq(be?; z=0vtLZlQSFGZc(it^{rG?Nx%f_aS{|tz&SWpoSX$*Nx5t4l@ZTxZJ=H@weMBf!TRG zySwd-2q84cfzL?h4MT3-#mz1BCSnbNjg4JV0l~u&qPZ@1#GD&uU@^tZfg_8Byjfm= zewam|Z4r=$-eFzME%%4nKif`N-LSAirO{vWcT?r-3xL*eKkO9tVZ0#_7rKP1|4%8ixtS~6wgLD1{mKy%|N+gVy z7-k4KVG>@T8~g&9hgcp?pcgJ1zvDtM6w$a4Ta57VHGaW#HeTN9mKH;J=?-%kaK^-R zJsVMrICn-mE!hZnVld0DX+TygJa^Om=E)BjcM8wZ%dDw61d<^BXK1c}Kal_x6u{cB zv#&a6$To-Bl#Jh&Ph4 zB@GJjP{l2P ziGX+L5ftsxmw=$(SN;i2jEyB=bCzxm+n*gdfTUsijdwxW3yO}DpfQw@ zdLqJp^+yq4Q{dpVme2$-V+E!7_wsJt zJTqsIH_Z7f#Gk5>@z1Ua1ZtzBP+4r0QdCrg@+9)RX!M^5aC65+MH%s?LU>pW1ECPq z?@LP9MMS704Nx0o92~Y`VX#tLq{A&7N9|7epJ<2|;1!_Oufb_X!(=&r%-MV3_x&x^ zp^O1)2Z91>7=HyL_%gN#p3nO9m{xR|7_T5{u<-D_QwjZ32eg=Zd0m~I)nOxmC;Vq#(l&8mTQ1wox%R|m>K z8_t+jDUJUcIXO8bnJ%dX9A8>9Y7dQ!Xp~VRbRQOJ4j)<~p$&*n`XCBh!1RBMjji~v zkbcsINMIA@Fghc%Y4ZWTv-cob2*oY9p&LNH=5Ll?PynC?r07P2eU*On$O#Q>PjzJ_ zJt?Y)7&14%;{mi{;B;>b-<`dOlr>VFqJ#^$zF-o-ZW!|-3`_v10%F8}wsLy3Qb7Qb z$|X{|aQt~vOx;m-^u?9$Rwh%*7$@%gg^Ck3KJQuL+$(eUB68rsCrP|Vx6Y|<$9 zkkkK@2YGt;WVj&k#v5fsG&GkBT|`wntfZ))keNrAk~6!N7x^nsNIS4qti^u$@&Sl( z5h!c_Q)d^K==}vV;gy!(Fd`1pfUrR`S=H5003r<%^`X3+?gFa@6%@lT)KV8%i+u)Q zntqGaVcFQ&kl>=sN_l#DtrP^eWr##vZv2hyK>$BKE%iZumS&@n4wI26&5JfbZEah+ z|MPtr5IVk|u;aTx8gHz$`}_?j8Ob!4b9$?nf@tCmAN=?yPyE2-*mQ*R6a(1gnXxfQ z5hOjU!IHP{OCoANLy!*7866)7!_s>s|2uD!t=i9Rg&F-g;3DC4e-KMlglXkD6BCo1 zoE*ryt~j#f&)aUz3n-VCh6ddp1lty&neO6UM1ZS&i|l%*uOO|j;tRCjOG}_&tO1gQ zhtR_Wk>`W3BH+|H_0k1?+hJYg!FywmL4_O+=9yBCSouTB`1ETr+kerFC**EF_sQM-fk_{;Q6rx#jI@X(9=pl5>`zj6XK zVh3F+6dwIqQfkzj6Wll5w@!WPCiN_e;EiLjeMYjFo1XI(C-1+v44W(A43m#d?FyCXdH3DqiF(A}yUUr#47Vs@3 zfVdF$Kr%PW#3f(<_D%fP;^PK8h6-}&$E!hI66wV^MJ|kHm)lzDNCHi&3E~N34+Yh2 zDk3?Rf7@IXYP0g$N73rs(P7pp8)K*_i)48AvEvyv0S#LP>slAn3L&GFU+ED$vXg;m+C4&5xl-vl2H zW)G>=Xiojw`Ck0%GA9>01}o`EVaf-34{q){i)@n+=$;fTR|w5;_!YYDEMyPv?q{#y zXM3=J{nOmDr(EFkCq^B*lYxEg4<;0*A$B7JdkNhN_(?7Jv>Y4-tlnJl6CBY`xJWew zsCP|7R`xdxA7igqE~_b7s^1ZzR`%e1J1VSt?%=7HOVUD#j1G2qTK((ApFR7vzd8yU zkqv=Hesm)&;ak5`;@j{JQS!**)CcEE41A0#DsP(6@+elAIaQB5=Uw_62P<)dq@Vs3 z%Y2H$;$mt5eidngmt&2IXHLt-QPObad}cr5Zj7t+LGqj6p{CFA@xztLH+9dOjxZ*` zD?|!(z8CPDJ@7dJI7TVVYkl#i-B{5sMNs|0JwD2-^rOdwufr16_A{CeACmlM<f2VP9IEk0o9A3Tn5AU?d-!yC+#=|df)Tjqb@bUZ1FoV^xob5 z3D}2w@Q|*IVxNRb+$)a7p)~m0?S^0e^&eY`pLd|kWBb+S0(kHWeME&#QMx(|J0{|3z$jY#l_#C6f04NIbW=Ioxgzvyp8Ne;RNHs9KN@YIfG3%->G-`u1tbL0XOtK1n{&<+n*(zg$T z%o1$a(@zA;nAkV#$5J|f>0YOJ+h^Y8&U?J6J)Ohcf7fEzxN3u$JSs5=-DAC*CW@Pv z_b;pqL5YS&p2UIn&G{t#V(XWMV5S?fkienL(2yI*m)!Pg8L zVPW1gZQ0`e{{HQqgmzwv`h=XiDV_`Wil6i!WVtbIFPB2Gm>3S@!q@Im%vhbe z(Pv%X3^=qKG<%d`^z!^!mEZfexXgcEb8!*F!-i%p5>wr-(xcEY&$Y9n_A8ln|E{PO z*Fi&NgpbsD+>hm6mQ|0MUPGj~J~JKt@KIHcy*T9wsc!6#ck!3?gQxvB(_6SFsXOa) z^t+#b<%VWqXf$A;2~(-Bv(uibYQ2yyFf_a{byt@X#QYIm>CZi%Ls!Fm65V*P$nY1D zcDW0M*MDmIXn^V_(!$Hnx~|JzrmSINC?Ox@+bBe=BdG9Zz$=d0#B8gpBhB7^3vVaF z{Cq`?|IGchNOa5e%H?VL3mQ4hQPGlHCu_?@IsK{zgCzef?z_2Y=OINNX53ywW#2Cn zy2F`X{JuZ=jnAiZ%h2+n&r;XmRS|Ye>IDdPbx498lU%YE#bS7=*2fE8MM`Q6iv?jD zmo>U{=P$g|`OA-XCK7*=XZ8z1ObL+~Alm`DB=;95)b-P0(qC|}%hctp0^_%rwQHV9 zl;^Eya+fh!w^ak?<0w>lWHotycL{6f67}*Y)z_KFn-`h4n@^kXkKxFZB^2#Ox@JSV z{oa6?gCo|DAOBo{HQ(&Z<6Pyp?Iikwm4!UmvCp-Y2r|o!FKd0bc24cqse~%;wO86Q z<{G!*b{+pF7Jd^}I7`=J*nd)Wew07*Dq`$C1I%@5BMyG?SktZX!S8jZs+B~NG$?6!60FQ@-J+rDJ`^Bnu}*tx1# z{C1!#ZntxeZ=b2jsLP+;4Z}*g|9Aji1GY4>++-r`B9C}iFUv~M42gy&SdFW=zM~dV zSIIKp+Z@H+`A4IuMXo>GEgJnf^^#co{*l8&#mn;EIgd%zek>Xd?8Uar~t{u%!g+vee^{mBc#eE#~4QZJj!IKv~%Q-nL+~`@VhTcnThu=iU>x#Gd zns2^~jhHI_&r#J1jRX9sF@dP|3ZA*qPL2Nk%*nyzLr>ck<&7ADLq`I;<*#a)m>|vSde#QZn5A^%1w97?W1QfiFKNd63$%FWIbSA zmMnZf@iK14qte^Nz-HILX4Q?{0>9eKf#x37iI3+JPs4FVG0lVtX4#+EKN(zt<2;#k zyKK`Gds%MDLxiFeOm987rB|R0ii7v@na||bp0qslGmk%dR)5()<8@RO{rt4~a-yNc z>+xYva@|tTn<*}*nI1h#4kL-c*01lW-f<=wrIk+ChPU43?z-{Jn$n__(+Dq^(ebJ* z{R;`%k2P|-6U4e2udb@F$*!Ji)A%L)Fc4Dz&~x$OGn-?FKW=bTn#Sn3_P~JOx6Mn@ znxL7;!qc(npCo9V>Ox1yv*{-3N@kBA4}Fib$D<9t&nOlc+k%makQxs7z>9^Ig}^8{ zwKl2wvd=R3bF;3byXMdIw=glbj>{UWx?IV_@x0kx!@d}uh3r~72l|gDaUa~@e`RI7 zX|)_*drn}&*5s^|V3{=_za#`hAlni5M+kgH@)^b<`+u1RXe7iQ$9WquP2FZe>z90A4}0e6LIptZOMFV0!a9nn3yrf0QVQD-2CDwA-^+_ zJCcvU=Rdvs=&;Z&x4OG2hcPAKgX^*kPL(8JpA|mGKvjWntr4@ zd-n-qO}C#uL0WUyFjV|88BW>6WGnjf)?yqsy=9rHeoK$0nKqQh)pUJb4U5nfjOhA6 zU8S6yrio?ev^9L!Y<;Yn+GjJuM9{pzR<2`(&CitL!Oa-BYo3`=h+%=Im*=(jN3jxjIYkzZbOKth~1tE z_nJK5tv=$Y8A%C5eJG&8PgTt&c3~WkZbu_=uxXoyI;e~Wv2!g zh$JlwOBg-|74R|pY|Wzl>oxs-T_&-GukZC8RzDBr2zrr%j(sYbw_Y8QO03!W8%t{{ zq|{u+J@?kqECs`QU51TO|K0U8`RI$W7Aq8nK84N7#Y1~VwGE5CR$8x#kxB1O8EYZi zY`@-*79j2~?uZd}cj)e~&dY4}+l+BZ2GaJ7*xuoU(nMlnh$friSe9Q85iL=)5 zeD~LhuP<#b1q%+H_rL6wkH8Wxe*KtT`zZQZ%SUZ}c1iMCQ5$Ifqa*hq$@xmufGtN< z;>4#o&IB_4z6RGX;?yH;^*ir6oNSx2^Ode~OuicS&8)ZGvz2`yEf+97gdH+$?54HJ zgL9L;+HetTcXzAMa>5lLoJ=TAmm=)EP zw8QJk=Oyb98C{w2XiY_MuFl?2u!lA2)zhBT^hHm@O~x%CjR-`O_n+~$aUZA`6ZJI| z8qYEm(iJ*(wU5W_a&3*IJbG7AZo$wRa&RYK{;WJQbkv~FcimH;fuFQ*`_QWmd+}M@ zu4zT@wnNW?Ps)Ia!`W_??|dL0#)!Q4rp~&e-S&vUtwC!o?K0iwIuZuXZSs@VpU)UAwCL@UZcBe z-f)>Jy2CA2G0BBX>8nm+sC#mWy(Yi-_(e{4tNFJ}T%C%^4DC>o)$?D}&+89!<@2d1 zi8`0-7e09v`)afXw_&v@z#pw^aXP(R)^x_c3X>{2vgG|Z^Y3gciEBjaohAw%6v?D) z>y;fcFQ>kU&I@jP=S32=I8cOyc=M+=Fss=R5U`+3{7XKeWd`PK8HyTl za3yD+{a|%HVf*$@V7F}k+I*n5@Z+4ze%(OY!4Ms?%yh}aeOe77=C3Wi>kWt9XOp)M z(9Nco7Fz|J)VuQe8MWo73T;ifhDKIKwVN_oZqb}IkM{;+(J?T6-QWFvS<7?9CIB7?ie2_K0E#$@e8h6?nXCGl2SfJX7| zR49jRJkTVA&e22a9FV$z-QD2KBoTJmw3szL;)T(pdLnw_v9bEh_brqkL~F>qW>bGY_$;Lv7SUVFM5DGp%X$oNm>;2A=+2$oUT!}>zd!PO_S5xDI^2ZIV~3<8tyEJh zJ-cf3BH4cD$6h}gfQaX`aaL4+eX>+g>{`I(q%{@&CD@3ZneXNCjTqG5XX2%6K*#41 z#xW01l$0#v%=C%3yGdI49ZVsZU=LZs=CBe``^=N>n$f&-drCiEUp=_b#bbM?Xn>q2 zs#GP~*GjYR=0z+m_Z>cb?4wtqnA6yZ^Es+^;cE@6^dhT$|_j*_$6{=n2elvguu1 zeA^!w3R0a@`ewy$);*ahV{dbcZSU!l%Bk`~w5q43?qm1Jbw01dX}#@J43*dl=ITo) zui(8It|sw67fVIr4!>fGRMFPQL|2iPaFHtK;uxocN`j+vI zG=qiQeaGE3AF>xr`PWR4WP(cNFk{tCTX=apoC_x=?(sS!?^UOGx&!P{?3Qu-!>Ton z#CqemJ1oH)OoQ`8<+SGGZ`BSsP)nRcN3mR-)1;ArU&>rSSNme z^!z6;$~Nu6ht>CsjjogbdZm5e&&4YY*Y4m~ z(gw@SUy9W9TRX{1c7fUvM{Qm+Y&v({SR$yQZ`%H*^4rq@C*s{t6T1TDaq_AuGTr(E z=0wapZBbK|E}`ej#a_yn=f4pGvE{-FgNBP93RtAFv{Cy772A*)1GrQDY^L}5?( z8L69P{NIl#KUgte*Becw)G)+kkn7ytC(!Q6lH@~SqdoJnCOoyp;3m@^ z+sXRvu#!DtH)WBKpj&413Iq1E6Mq=i7EG&+`!O7bq`Iyq9(Nsl&UNTq#ZTX6b;uTU&jxnA(6jXwRiMo!-xC|9f zudV5UiTd{DrzE5(xt5R16Kb`u7II*oEDMf(7CfXWX5Q?I|J6+~HQB1+dCQ=j$CAUn zUX>#(??Ja;Cy~-OIa_k>5rL=W_I-06Tpo9^U)mYh(GH+}h8RFH92o9lE^etR{X#Tp zW-XptW_AFg=||gO5RuG+C%f4=&>xum+O3~HhWkjdp%yfG%VlWZ2Tp=%2cG&|p~Z3-NJjJj7%RTFKY=@A(nTzh_sM(M=Y;=Z{a zigc!<5a;}+As&_M0?yntHnzRe=vHD$mRNrIssMJ?*YA~%j(UW2fg^BGi3?j@q;x4; za)~snDr+^X(1W7Q`8?|kvfI93yRiklrqFj1afXRmtVL?Iaw2x5Z)Z7m(p-MIcFyTX zX2hb`zrdT9rssMp6KlYJ(6dfjyx%6%`RmWZP1>ESo^>+>#@AkR{?_qVyA{j1Xk(Jn zlvCT$*_nLs?p2-QQ!15mzoen2R7)p&1opu5(Gr|Z{*>}orQ!aHZgq=sm_g%Jm7PtqhR% z&-!2u9^ro-^jpXx9F$wf8UOjfe*>id{oT;;Cjei@{(t^12Dlvx97{@qM+yo(J3IGv z{a@75fRnnV>~l*{9jw=ov&05gBc+kZ2cVzl4oL`5`eDQhg!^4L0ai?dctPrTR*wnx?8IXwa>;( zh%;Md?XL_3NltBjEH(1_l`~zslCx=#by~T6)VSd8h+r-wDxfSoB!9IrBxrs7U@AzU zqe9lruw8PhGlheR@uNK}i}HM?wpQWknX$sY;{T$w48jpv7#Oh)c`tYq=#0akH#IWy ze zzQnwhTq*5n^b*h&!Z38nFk?%?=s7Y_Y`rCx`hIPp&@57Qz;CZUIMcS6;VX+jJM{JadOW8bn z_n-1!n|d!lu4h+)o6KT1%-i?RZ%b9Bq1)Y(Q_Xs4N9frrNzYr-UHrHeZ|6h z$c6syHlsvpFO)tp#Rmc^J)!wJSpMkBNSl5j^swBOns0^!l39V?U-J(V6&%2Fr|fNR z@9a#RmXkwoU|JAgqh79FPW9^6Agd3Iy77LQj>*I|<;0t^09ZzZFN43+@1C362zv2< z#Cl!ZQ9T0Zv0c}E<6!q-;^&rBk}r#KUCG;Bu6F*D3rF{xsJM+oTgCg50>nS`E!Pfr zOxrivJt!K+v?Tem94NkF$;VeYkABBfzN1ScgIB=M`Gc;pN;*z&G>_SKriyc}{0-~} z?6@gaPvoOo@P<6A3KGeQL<&rt zPc(Y0l-rVbNaFvqLFqqRm3zeXzqsSGHEl7_eDs~KQI$p*+dE859&&kM4D=)t5*hus6QM! zPWUjG@8>u9ex7Mss4e<6(=(R({v}tUD?`R{mwv9pkdn##?!D7ffx~!*{Fyq&BU&?d zulwSkn^O{sE{wm;-1eNmh*{0@i(W1FYRjSZvk-1`B4jkz%!)xnW)uEvoFs1swOxY- zr%A2bipt7hZuFYHZ#v(qdlb8z3Ry<`(eso{tJYfu>{P(bH0AVy|G@*QGf)JQxU)I$ z--o2$S%>bsW{=&wQ!uZvR?(4=k-za#!3)&lk`jh0bC(J7y6)Y@?nFQk8Hbp!K=T?@ z11we|dgV@Hbc-7Q>drNO`bK&wcpyw+4F z&!+tkeT{YTWZHPK{L-k`tM0|Lz>G;}5pvg`0d=NM2K$8_*vSjy2NX@8?`c$|U-EC3 z3Qn0xE`E%iHg{^LxVvugRuxpg(ralkpBSS2Ol_Kabcamv*8c0~_yzAmw+FC%lnoj& z07~uMyH;ynWktmo{AeG(nZBe(2Ai~3GqbIf9Ag{}!_wZOQzehGPRW0q+}w{5OEUGa z<-j-pm#ahQ0I(`x0;lWfGN;BIO7(K)|9(f&tE8k~UrW4!R;PVvLsX^zB8D^{FA!3vxBrzN z?hiWC3F6`50T?lOY@GkU9vfMvXVV3=A^h_p^We*$S5W_7FVeeHxm+o4II=w{iWUvL z)`0(cbiZwaHddPgMJ5dXTu1tL4l#?zfQ|*YVVNp@9P-Wn>m;5NW&T`PhUAl}W}#*u z_GNqa{1Jxhf-6mvCuR}Ir3G^A@gOU#4VDYH~y_J%XJ&Zx? z)H5)s9)G#08Gr|8h5erl`xqgL=X(6yMuWiJq)~3K%|ws+-N`$_M|2B?))R>edR;-U z3=Ic87>;86-g^c(@fW43@l|-7&E?k?yW!49&YFm%8qCc8=sEb-m;2MSfx;x_^0aTD z`(gyYAlt_I{PJR)XB~FE@g2 zgZ0&PYPS9^-z*(o^ZV{ABe!;kV(*#0{BGo>)q8NvqYJ@xO7?)1=Q;NpP3dkV1MW;u zt84390sVC)TKo-HtQfRFF%eUqK7|`aN(}6_dXDM}`cOj%q=7z2YsNifLVjT2D#gh4 zhxY*9YieS$ReTr>4fkI~WF1KQ6WrjvT>p(A!ehSi zy+8F$fA?}r<;jP&ugP|f&X?XrqS;T$y)SpfF<-nq(a_vHtcq3Z)^yNc#B9B(TX|Mw ze>6EIq7qB8E+6Cah?M2h$!*z9puQV_xZhJt=Ikpo8sny&9)7yv{3X4}|9fFjGjoh;i+$Z_P}yu$o&>-Uk7 zSD`c7KgY&ooB)RgknU|@K!NFwt+H}**J}zf{-67Oel;_dH^^;^Z(NXk>G@uUt?6z? zv911l8vW9v#Flaktgbu7FlixhHZA`KgUIsdK`FOD1xLM=8{6*=TLo%9zBY++_;Q)J ziuPI~)ouEx>1tY5^M!+566qTaFYn~7MNh4u^>e$#KD0nincp1xFQ-Yrv!b^$$R&QU z2=w~-Vm6RAfhFr}*f*i4T5ypguR^aBpg%jMtI!ASfxu|t7tGRM`>Hn+ET|+&+Z_!l0BC*jTI89fj zcB^ppC#1r}D6J0A+^L~vNt8LY5Rnfvm<&<^UI$!g2>n1dd8pjw)YYYE&g$VRt4)l= z6ets$lcW*+Ug*o3rSFS}@rbz2{k;lQoZd;azm>n0V5HTwv1~Vq`{7Ty`T;cc(r1vA zpzVvI`Q4oOV%T=O5xx*;syQrt(EZIVwA+Fouh{~>@??T4U;qc7;;R)&qf9~ob9Ff?}}uW$V>OgW6$8l%-+>dyh8Zn zC{<`678Vlv_0G)D`4P;%c=0AZ8_{U~WnJ0b-3^~ExJH^mS|aIr&3E9r6S8Uk^IF^$ zZH6!gs;Q*~)rH?Lq{P&<=>J`8^ug*a$efRmaQo@Seb!po2rI9Bf8Y6Rw`jv2bu)Or z>wK|F@n+@NZ*^fW1J0s*N=1_PnRjJF3E4S|YV01FEM52Jk~;CN5#(B}l5w=}zFCi^ zLVk_g)_!OBXaYC5#XB@@CWHV&8#M7LwozbOahEUEjl2cFq=(rR$AxJOc zn>d_baxB2MgBVuHO7!oudG+emRM7|r%=tCa-eU#ks=#w#7Fb-gw7;*e?%vaKR9{~Y z4gdYJ@0?B!Htl;_oZFX3b)Idy_ZhZ{rcbiW^0?ea`R^}yx_en~a8_35^!s2!-T4Eq zU-F^% zgGWeC_n?;TEM_6sV>FE z!*j`*0nJ57&&%rsM$&?xKewR&ZfRrlY!;%(swL7*q*}~vV0_pj^|G-kJYapg?v+y{ z`(NP#QMzHe<@E~oNDiG&zSe`-Ig>eQ0D6B<-M)V}_0{u+FLAO~cVF4p(1!Y^{J^y= zFgwoa+6?!>mrnIP1cR2?{6(cq$6FW7JV+xzv-Mh$@}bNzNgX98Ut7Do7-~vD_L+cL zrpn%DL&La1_PyI>r>5um2O5kknDWnQ^+*egrKz6KJc_tRS)ROa{IlleL$zg;a`77D z4llkgcjeNf{%6_i`vho(cn{i?>N-^y<*L*|mygV$#PtVLQ<(I{#k##Yd`Eu4?_U-E zV`hoE)#c7{To?6m2c@f=^vApwzOUVT#Yo}IO>3!1O|)N4l*d)oea_nZPdmYS zJQ6KQ)Z|$(bnZu^qNT!=I3qYabQ79VHfE7wgLS0%436jZkeiW+z z0rFNK>Ms8BGa6_T)Z$ycyxPzC1PA?3#CF+;mttmmx{dvXy!^kr1cF~8$>3uBxn@im zNV1xP?0a}g?*Du9{sT0MD3^`^CSq%0VVEUf^1t;oYzws8=4NHl^Yh0?&@~eLYg_!& z(m;3x4}*`i>5XCzOs5>hDu6HfS7e8(;di~dc%J|x%sa2qH_yk-3f4M=ANp9St`d)b ze-=d0|DQ7U`07k;U?TTwls#uo)6YN67;o*GOjcej{}4lcuC$(c%B{bo=Fy&>9E#ac z5caL|vAUzMlC>~jCZb7$eq6+3X94UMg5oD|vXU&Uut+3$1;-Wlj?@iYDHC>Ir+M6) z=%#vm+cf9})qThJ59onlIBJ$pfU|g|RiYFe{emKt&IxbjMAlsZUEg5@)o%KW5w>5={ zzocQ5>dAHeKpJy5sL|ce58_MkVRVuo_MN!uG1O3P7O z+Gve-Yqe6_)kjYH%MSbmZ=>y|4>nzCRW%F)bJLhmbg3Ez=xj)MB@uxo_XA&x%_0#d2L%Wd?@=TW+oSJsxh3^>H z^z57Fw&Pn{bSH0nVNCnBE!S+@5@@8mHQ)#$3fWb{J2jMJbI&ceWY}ioKDI-_djEL1 z9S#8OBkre&EicC)=(d)uUu>QwzYzewY4eU>Sm1Ld^DjZCTg;C%<5z!_Q<28Hu|G>b zRGRP7=a`9GZU0o~*`ATi8Inuvsgqmi*lb(=iBo7Wa!7JX5_c%g#$_fz<@ha=wwg#2 zx%%F`x>S^*lKNhe%)UHLu6a9hqgT{qmP2$l*Ves}IRU)MflT`OvUKiwzGs6jy&Uh_ zZBjlttn1*=?D~(UvVA9L-ccneQx=gt*TOi>&ULr}ZUX2!W9E|&SE&b|O=J?3s!I2qBc=5zACWD6xlni9il?Cthv!+}{> zl-up1OxpL1g2vkwDZMhq66g$EQxMH{Y`ChuG18)tqCrc={2&@WziD|akLxnoln8Ij zx2m3T|MQyU!h#}4OXI);J88SrS<$1fW^VnspC&_UHf)1Jj~~YSyu23p%<1IoKzG{K zF=Ng62VxkHKfmkTdV_t-G?x|cX1>XePlw2f;T!D_{Q^8!s*=TLt19U6tiLR&c8hDX z)(V)LG;XPPh>Q^#U=$nv=bUrj;OkXIfC8m%$VUT6`?f#(%$;vOs_Z_zRWa+xEnamA zni9C^S?1#x(G~a`7K1W*dv=YtE8V3(NwKeKWzgB|#V*HCc_33z4r9%lJe6fBLg^;V z#Qn)@>tx*`ITBh!lr;O(UD#OtN`@QvCCoJ2icf9-v5g%#N*|P+a=HbF>;(BniCxjw zbu;imccCLo{C==1CC8zZfpd!Gk{5zzH1B-Zigi6q?B_GIBQ;w*dYQ^!(&iB&W+e4inren@;TzN^EB-PC?Xp4*!VK+RAqQP;_29#9UX|0|){NJFx zp*g;h?c(6IqPhztTtKgC`qA$E(sMMq z;|%LK4#GzHNY6(tC$B^qf2}a8M!6dR&R6Ix4-0%wVN+Bc5S-Uj=~yk1dzDPNZ~IoS zZJE57;K-ltC(ZAT3Uo5tG3v>uas{trM0O{}z#9=ei9Ia$42&;m;UJS}YYy zb?F@?tGoxx6!B#w?YW92U16b=C<;v>N!Vm%X|Gb1`!<9 zt6&MyQaXOq=MfUEgvfVO7isH55yjwmH(X~D$Gd{LB@~0QFuu-x!xrWne@LgsgiAGx?ZbW&nc{AYX}Gf z%aL9rfpo^f6oW&9qu`{olI_WIguk8B@mhV7=P2VS^80A@mo#NWb>zMg*Dp>YEK3TnpjN$NXe9_VEmTig16$_rlxN z&oHg@dwvO%kIpmAZIO3&e^c}H$mPPw_e)d$WuP>|qo>mE$5YMZK%ZqIvx&9LTq!z@ zni5NCHqt^L|6=gPuz07SAs5XZbG~e9sn`)AJ2`8y$mqnU%d@h}9YyL~&;vz{R_i4{Gy3=a2Sql>f55kFtvm?D#1ukMuVE&hs6z(>2@ax?BL0~@cD zlE_npbq#BAqY9rvv8>N{iZY#)GwiiF$v#^=s&e=CRSTjpvB-orAq*TuBu|5Kz8(6W zS&|x)6A@lRq{$5|dNB3_2%|g#`$NP_(ahg0E&FINw+I+m<>{ggYUM_2lPe!l)pof& z(Br^NevWO_N5_J)>-57(UzOv0+%Nr?A=31%Y?og;cuhJ|y<@#$sIxbzuH9}AntStYkbzWd|SPl+AVgrmlrD_aU{y?B(a%|UU&G?g(11BaAD&2#h=H*QC{P=AM zNq`QbdsW&WAiRJ86uvMt`oAvf|Al%(P#}c>&e*5(s)KkeW}()>jB)# zzodkVFX*Yg042~jF~x0E>o9~|SR=bc@xG%_))(V>In5L|kwITc>$)VD_ajfc8>0#Z zi{15qIsJEVyF6A*AK)5>A$X}Zsu(vHdqCKR3YQ=*BDgd0L*YlXTYIjuPksCIe;hg+ zv&m(Iw?39S!)Vot7&cHI>2e)pixI(=3M^~F^-rH53#1<_b0rb<#lFUE)hOK>fZJ7qh54Eb)*OAwMf zx@CJ*jI!@Zk&yy0NyIhX!P(~m2BXm13n_yUsVjcpGv4iS&TY0NSBt9IFHO+;XyG!q zmq2OZ<@$rkHu`W4c}5c z2;bZq#uALOnoF)uP`Z-umLtVEj?aDP8I}HkX;5{EOuTgQ(2gljL+s(&?C?$tEWW$$ zvORN=ZdE_ff62y7B2FD{MgPbN6lb3S_p8$iDoBqkYCB4ZOuUVtU|zK|3*wE|p5D(6FSH#!v+Rr6PUuowYFhZzZ;EP! zDYUX3i%R0-8hS5QRoD!ZHfhR(QHYm7EHrN4HOFQ6hTMv5c(bYV@NEGaY9l*8PFrme zpDNKWEB;h+1tkgPoJ(xZHv}j3pq*x;2yNm2jr*A#EOOO8ZrRvUd%FnS2E+Tjp3HSR z*WIg?N?scGROeK~b*7VFu-do&XIdW@zL@%8{9fZBuhG%+SVr+jeva!GOWotb26zA= zHz}{do%Jp1EtonZ=t^)(?U4{`Uaw6;O_&=a-@PmZvVOlT=x3Fd8@?@_*1I}B8Cpuo z>kT&voId!GGt~6k{THQbGPFo9D9W zGar%I_mWA`7^Ur;bh(5jzY>ef{nmRa?ra-p`%y-vM?%;=mA@$-&w*FTdH_!Ic*p8l zodZ4Y;KhJi!4$N`Yx9;UyjV#R%iT$1kH=?&;$o)Fu3mCeOCK4=aY)9P+rulvbfql( z^`?uIUyAaXG9zX!qTzY`6%v(RxnDQUS%WS$*ZbiR!qt%0VLcvHs(F|?J~G4a)b|TK)3kK{4wpP zW!bMWoUd!Mi;ULx0ea?&c)Yod%Eu7^3qC(hl?W9yxtE6kpQUPR89}As8*(sId^Dq72 z@e=hlLjq^asPsx zh30*Oel&yOcq?7XeTNgr$2n(n&lmGdt$vp!JZ_-}sFh_X{^_#oNS?_C_5SlXpX=*T zB(yWw>fU)vE+0*q|L~?y(#Xexu9wIEaWcs!-ZYGircdsE3Ma?bM1*WUxV=q2`?p7H zZEc5~!e=39wW@cvp}EvLV6}`cWI2S!S2oqTt8s2AakO>xvR#4We&FR$j>cm^3+;Y6 z#~yRet+c`?m3O5jk00T2beTKRv&o@Oxd4l5NYW7@x{H1_B_Ss#XS0kV#i@XZ-I+>p zl5h)leL3ggCxNw@gSoGY-ZL0-#hmAL_76)rmyY}Lq&7CZ>)bZjCOi(8$7tI#_PT7( z4y!$#=)&b(D-s+hQgoB*FA|lw_k^TmWYEO$Jc3RV4T6o?b;489^h?X#wYF0tbIVsf z=RwlR=(M>qSN}KPSkre4ho6zyghzgFE{O|DQyE8ZJL$iBq@pSSVJntz~ZSg|42Ufh`Za z>r|yO9lvF7l(IMPmCq^hS+zG-?)vFlCKHPAe%P39Yv!bt#JWG$Ua=US z$0~u3fqG4<5+ShCn+~B69pc-^8+0?(>F#M>`G#@%8dK1Z0BeHlq}RMPnF_!B6q@H6 zapy|uqZNCA?LiPLiRvFP`<8*?R<8n6Wbo@WrEeTxzKgIqf3S8DyZUjU%%k3!cJa%b zM|e%#ikg_><cP(zip$BV8}9e#*{*I%<7u?zbQx6&)(*hNsGL1*${!*~ zfJpvq_xW+>RV7sm0}eTEu%#Ai##1=p<;dB|x{*s)GA$x#|1KTOj4a^#6c9@;rmzm; zy4R2Y6V%JzCm|=ijK^Ex5ExiYv);0D;S%Dk2FTUb{pf_b1qI!Yb}Yd$690`bB|hu9 z+k_M)?UG#`{-~RPx!On24UmAK9bS)EPnlf5{|7eYu;)1e8Av}!H?|ppne*}EKz4}$ zbU?7tFavR4@5~RhTIH%gQXEgbqh4uysr$s#i{yG7*q+5J4-u?Ynib=MMaO~8tbLwv ztEQQ+`Ot8xWc3_H!wRTQrW|)9@xahqt(`P|bQC?sPW8r|Ps*O*QnQcWm<@llNyA?= zHA~r46EOUnYI-iHcW-R+%E8%XN)n!D4V@?4pPGjnKI<@Fz}zen6|z7^glGzr2|y=J z&uIBP`nyi^&e!lob(NgVf?SeR&J>%m9WoXRNwW?1+*;kcd1+@;hu>G-cz#elx6InG zZY4)l^M2x?zx%ncwDhgL-3ZWfNDrJH1P;fq4t%MsV&lx=;8jfa;J*4u^y&lQqzz-% zUGhSMQn@&ugEeJdcE%q)srgB@2i9BP!rLDe=PuR!-gRPXB^T&p#YJ@MUd2%@{7_v@ zap}?**%(7)be2;5toA(z>x!Kj-R|(vo#&yrD$L#ABba}_kbCe#<_DJ6Mw~%mvd_o0 zLeE|eo?qu1>|XoUVrQGqojvr-`Eu&ZUwxkP#hiLg|1Jm}R&lD%yM1tds95tcBnB|6 z$SU!rsp%IHos6;ZbW;-wEDQ>1dPs3+v5vF)GUsu8n2yshvM4GpVM~2Ue^qjo$ zu7&R0!iUnBcWJFrgNkxuspxr$8(!Gi{flNI3Dsqd`T^ePo_KqYM&q<4wKXGJU*b-0 znRHn^>1unMI}@M!Lf>1=XM0XsW@Lr)&ez5Smjl^foUHZ|7wyIBe$zU^VvaLkBM_7| zVQAjw5*GXPP zN0P}BBq8CDRHF0Y@I_eDTfa~L&bFIZkyV1({UajU8%22j?w19yP#U&J!4Xth9VPpQ z)HuaY37cxu^^tSj(esQlIO(Y8ogKuYUKH@m4HjYO-i|y?Sudi`>py=luc9LEvBQGZ3%WqLm#7J)2wnqe>h7)!%*?cL056%K@0rLo85HV^c1v2x z=RclAfJBv>!)#j&G`R4gO70P=rolA-!7N(93RO}U#(9!Jg>2_XcBB<=8WKr9;2U<#T;t~DuL zccMjsqO28I(gq9!fJDw3BY?)|mWYVgVm~8%BmwwHldWq32QXwHo8{ms7_jmRNSK=J zuH}mX2QiRp4Kbi?UbLGLx!)wi75hQ%g|HLcgR6yu%R?*yE65k&AJyf{GUyBNL(tmr zO9XAx&x&g8HE?+;Dk%X(6MZo$a*5=?CbUihCG*Au|B&@bhGoo+252+~Lq-Nq%uxO&Ee$vW%@EfCJ>&%<643S-#*m0g zF9BQK0hT2foK)EC)_jkorP1_TCHKOijRF>6iuf4~Ch)M~*Gmb$0cY?D?-EHfG>mX? zaFoJJi4p|Q!1%bRsHin^0L`%ybOAw6CRh*jY=qHBDr#!JR?dA4KkEt86sWgaq!TnfrkXz@EzM7I@GRH(09flBY6OMuA@p|%AZtj5UOTNH@fe0);bB|u*d zxI29|r_tfzV5CI8?G_IYtXC74ERZ4}6r( z`|{|R2Vn6 z>5$M9Gb~tITQ~C$(TD*_8Z=`8rNJ*0G)axz^z`(KidV2pFyKw3K|ZJB!u086fH=U& zh!$a6_f)~Hsi`%>_Ctm3mkITIVEdjyWo(NCRwp37qll12*cN9a9B~Mli@z6E!#KfA z*}Jw#(#w}$UF=uMdZG=tV;I?hkegT4k1nGFMk^ANl7`-iFvaBo-p0YP2A*)jdw&eH zJlb&QFflNISFzJ)qQJt_d5qP)&e z_YY{i(l2Nkm>5XkBqxvl2>1#OTc{r%sH@ZaT%uPq)CiUY24#ed9dO#XxZJL4efcuL zhcQZ2QW<;@2usZR-O;&5Od*475Zt)Sckh-wu_$N=C9Kp+WYc2Fm1uV^pd0If5S zA<+ftMH`z4jm_&z|IG7fz`zs?>9`0{6)Lw9{>UJwEV) zfN0nduP0SB@CMMvs*+bmzECyF(l9hJLBj}S)`|AUL|?dG<+A(}`k26~RiW$Tq`^N3 zg~mc+)!)z<*W?o@8}=#EWHjT(hRZwz>6ZhV>{M}I0%Z`YQ35hKdT&wpErwA>OmMP| z$eWmrz}>Tfk8wvug;2oK(z4upIN+Bra3#Dzrp(M>95KlU7HGt{4W;9_mgBo#P8O+X z-N%m~6QLc-6bx+Map~7`aJa=vvi|@yo$juWR^7RGIq{j=;;zT^oj_1{o@8KT+!VHX ziSwDiz95O0s9DZFc8ng_GM3IICHBY>=cm)$w^z`&U#4~y7)_y3D^vpob}fh=9j-2M z2?}04xlKOl_dXkYN303fxlxYDi7XtQ@*PSej9S^pmwO-Y75;eQ;#5D2Qp(-RmWQ9TkA&; zWjlzqxi23biG$G&kEhGu)7ACXoU!GHf|a67?469aCB=v#rR>+)#kFdfI19?EX^7D` zys@6~3eh-3E+j&35D}P@GvPEW^jKRB#51RpB)|5M;NmT1IV=#hja~RoT<~wb#Q*w6Z zr;z<*YCQu3@-*bJ584U_?pXvcA>{H>L3Xr9tcXBlpm@UuTRgi23MS$?P^X!0-1yeo zU<|$<|e#S>c~5hhu%2-H49OXn1&y=RSvf za&1M$ZEo(^5VhVMnvS-tIk490+(}E}XjBp+$8=55Hvvw5OA&E#>L4aGxUJ;#elH(S z@>m_EQY9RPKv~0I;7ee_Dm!dn6%LeNnV7z zf)gFiZ%jmRk#Przr^|j5my-Wyl;J8dG4hfVggsroe843P*CURXh)qxp0Z)baNyKRy zJo5>9y1WMInrdu=LLwp_tm=qEEXu>n8#GUVLP462)nriTu?y!0tf?r1Uo}4;2z6+N zAA{G^W=F%m3F{nEa+h&@{{?8H0BOB%%!4!{v`ti^^x2rZ3`B4q(lo`gm{=+@ysYxr zUHTI-QX&}{8ChcuiGn8*D>4c|m^T((^vjn)_r5*j4h#$g@_)+K59rt1rd5N$6@xA! zu-5ann=jl~|90@^Hzwv_sc(6Cc``&k5Mo2rX06Q?0O2jJ_}Re>BrdRfX~1RHQicXm zz^h|A?A>!ugwRM;UpGZl%ho*VVDOV8``mr}*w?T3&Q3k~ZUorI3@o1PEM7VQVrBC< zudl7AGmjGy1FmO~fe>Hm+1e`YGJD(+Kunr`+!V*G0?ea-e+A)~DN<5Ww2E|%vOHzo z6SX)l&v@ogQ(DX*OF~TXPN9^vfpWUeKhvKTTayJlpYsRN4(^5Z?)Z3ayT>uXF z7qyb<)zyi3k4ok4!whMBt)_+}5@}pJT7v5E_wUl+sBJ7Qfy?^;H$CdHe(4!IBYwYf z=$&BpsyYTaBRmRB<{|HltgIQ}m4{DGg!sIEU1q{QCjy;~){Sd1$-nDzP3}uyA~o~) zki`|w#=iwS9`wTcp>7jRN@8hi`&?U`jV*kIj3m3%?`P@ADs=0D_vN~=kb)Qbnk0Bp z@BXqE>tv0*f&%UFU1TBUHajaTRB;fSa7ziqcC(cJr8ns(HLW+VE_tm{@-|||(=m7x z2y^9g4qQ}wZwr82W9{fGZO!M|ul^oc7RUh*_Dp5Ey@Qd^Z@cpOUo6`BSp<=Ayn~ni zuOZO1gVMLgX#|fPJryFGuJ95lmmW8PnSt62;;Vw^C*uETJLZAN|HedP2Wn?uD&BK% zNzh+m>6ylfKt#zOKawYd9c*z2W=CT|eC65Jw89{7id?u0syy~IWx&WhO5b6@>hNZq zv7$R3<@r=cyB)VOj^5*Q7~R|;-oqATPlOP33&d4n0s&4$+NTE_Mj@Z=2silo_#{r_ zWNEM(6h8YK;M%W%2&7st3IqPu;NW1RKN$^{UNns*CINQr${2l~^5Caelt}14Qb9F* z&HoH=9tq?8Gr;LR-SIliTgbY7l~EAqajyUzEVvsV34E;C3~D5JAt^$0fYVA@zp`GA zA=kZ~HQ_bMEaLNugl}&}NDNZ8KJ&~mZ+t4Wp4flI$ikV@On~hUGIo1sdE3+Qia5ToEruW{j8B+$^WvpQEZvXQJRYq~EyWP-!j|X21 z{p6Mr2O6zE3gYomJ!}n%n(irY$EtI)&$%To=E1|W@zd=wVk*!Q>)drF#OGFuQOa`2 zc`0OU00v0Bw6uf}JC%J)6cx8J4^h@u(e9o z_CVwToFz7&3Rp`mXDc;yZWPIQD->pl5$ctwU47#KDJ-cNP?FkHVpbFRVEY~Qz~JM0 z%=*GYh#PHv3)!rXrY4z5Q+=jn^duYu_6!oc@csunmgKd$12EkHTF&q8X^8D$O;EVs zpmY_hLRK!7TOwk>lt30d`$8x#k(B*XcX1pM^*AD2!nhb`S)Jpdq8`J7|9L1JoZtk} zpy47QhzZzcg@h8TQXD>Bd^2t=+yi-Akq4>&Wot2@QL^=3w2IwdA&c5*0QU98^dvj* z-~98kBYHHyI^>B@L)NK@i8yYerY&YPA$xw}9<*Cq0h5rj1y}=IdJVun zYu;v}g0F!RxH|JdH4m=Nnl}i7Dd-lZJP8A3yY!v|`jD^w4YZxlXc$xx)-?hdz_zJc z>g4Zq^ab)kAxIqoOq#vriYAFdUhu;Ma#`I_){E15WKsYC41&R3EZa$b46#psG>yn7 zZ*+BZjI%<1BaZKz5S;8vm;*{Bv2E0>1FjPpL%ziPTh zEmkI=llw8i=s$D2KtlQt%+w4Ail(_G;asaX5as_JFGQv41Ts49_?HuwBHvct775u? z#wRC>2nZk$gKCIaqd@SNjFhxQO?n&Q$+6#STK(nGNauhE5ZkRTrp>JEgXwYb-m@71 zLR!K>rw%Y2HL7Hjed0QO-wPnl;yNNK=>ocSjfc#!Vd4nChPaklIeB4ijfpsM(p~^Q zaNDsV$Y-^z2e!kfYHLfUex#$rq5BER60$q1Cr@A)gC2jY=*J-FLjXfC9UWbFs%XK$ zV&&1VdfQqlw`oaRo6zaXkb!zqvob+3u~hA9YRP&m@X_=T)^BJ5Zj}gdWq>>n{9kgi zS8qqht;|($qX61XLI8AM7sro+fV_^l=EH{=CXl%bHPF)>OQA?ZoQOSCk<hZDCiDoE0EQz7tFkdJkFk%VcpC5;G&?Gp1g*;C@+30?bX?goA8J z$YHZVTmVK~1Hi4Cd1U<0Pmvpe{w^OMLJ<)iYl{&v%7`_DI^lbMIy=j7O{N?le0j`U zh(6NO-k3=zNo_!IHz}+eo8I54Fof120l0^;lTj$z(yN=L&{m zcaH#7o_wR%n{M(uax4^a#~iT>rGdy)W?3SJwx^)OU8RJDO@nX*G(j*#J2yL9(sz0X zaX-W`Qf3l&qY=rQs93R>SAS9$j6Ys4QYBE>m3c2A#4+&*H26U45s*zRlAE8?@?dTL zSz|_l$a{*4BA;r)U&b-pbO;$1YiS?F9~u( z2!LXUCDZ2O63{RBqZ(X^)F%SDC#0O1b+5?+XbfJ%&=sTyd|?*XU?-IFfEPfZ)uerV z>B5rU0T`yZfHGY|j6Fx!A)}B|^Wq`Wfwu1Vg@vFtG#gcTNPp!{^vJQZQNxN5?H7p@VG`Rt_6g8W}{WK^+S;@G6lG zGeNN9GhR@x1Q7#o6+lI2+5|L+SYF)O%`HvDz5hu?DU^z4`rqCI?KHs51A;KXtRYV@ zf=_|)`aUSWEA~TztG(mnK2uHTxdZSr32JnY@3f^ZLcz78iB{n*m>(;GCaO;|l6$FGR2lV!9qk^!6m;Y3WLZT41*4jGr?0~Zk zvQz-3zJOW4#}LJuEOr1Dn?K9ba()eKS{RHQc0ZVsHL~MIG^@Fhkw2i}_)zfea5o#c8#4HlTW}i55-R~zFS!>Cte&vNF0gz-E|4;WDR}_frMD*;JS9F) zpm|-BN%uos7_qmv2Pp*vos~#}ND|ACB2IR^ily;f3{e&xIm<^+nTPr`lUyHD{N4mFz-$V$Q3M@ zhPD%&&<3eQIz(J`4>F!oWK*YUf_V!%#^nq{`L7hBcMI4U& zbV&z?Z>X8zk05nJIJGU1m`f3I3Hy5yB^K!Z0KQ)F@TN6#DL=S45Ietq-3*rq4cmQE z#n!|GJU%ZB?xP8^K-r^6ujaS2&=86VA>#QH&#?m9pmD#VstU1>p&lbifKxM;8WW=i zq+(<=XDHiuVT7@>6A#P{S>_@Z*$V~2t)A{~*o>Zt&4_AZW5dqMng_Klc8QbB(o&Ma z1&IJ8-Q|tRw$9F#ik-(d< zzdixB?D^LlRrN6WByDbEu-p%%*+cx_P}C3V-gZ>RQD-b4#p)IulI6Uc~#TJTo)kpDT&f zvmei)Pz?KAqcmHI2@b*#XunR`aI)1gR^tZVTNJUM(fY(c=pf_UOyCpn?6uvILIpF8 zgfaD%6>HcfKx2VL2el5~%XsJ(ZN?WhE)_*(WvCrNCFalbfZ-{j-$B?@H)y;82EMt< zQ5jFKBl)LJ5dxt6-~Y$5P^#0P`2O8_p*I8G393_|(f6=WlaH_u1Iqc5QcxzfxN!x( z=n$tOlRBh#@;&y%u;Z++XI{N{SZLSK;6gaRD3Aj}u(zPI=y(4B%4%Y1Xixb2w{j4z zNl7(9E*Nqo0wPt)!E7m(fFS?pO~3#-3kwSY&6D=KF6MQ`4heCKnDewc{>|{|yZh(o zp9JC(OkN)+B_*ua&5R~g@qj)M5pbk@Z@$GJev86hp(!W*Jsq8~1X+xXDLFaWkfbY| zDGT1mqC5UGQ_e1GW4vSRyY3C$9fRsBqUL#02DOE2`6xIN5`A>NH0jl*`)gy4I6z!?58NtV>#>PfeOah?t$So;R9mh1r zHbrjPclGb~_sf(?my~e9MRR_HaM9Qnpfy&D+D!5dCCvAl#QZ-$hTdTE@p4ulNOpyA z`h683Qbi)g%JTDZuv=MN_!j$P&e0REqdTnVS%d!SJ|}Me2brV!I~E3KBIANal>(!h z!8M-!TS|wYe3dkYKRN8ix1J@_R#q)bk+a8g^W`3slmC1&?ev`G&a1OAej6i^U|N2} zgL4k8=9HDGEBjwTMZC}yN$(>Yr>$On&b;yZ70Gks)rg3hG{VZck1RJii-#r+t{%D; zc&Cy%)j7PjIXfLjGMEzQ#(c=V+sY!HIeEVNfYM~P%>RcDLI7- z6UbOgPhQTsc&l)~>o>0CWQ?Xhczb-$LErOn_)ZVzk6&BX z$~|+5d4xVIZ(Z}u!uUk>*Xvg*mLt`ysmUXIw>)wSt+xwGH+QKc_m@j6I?C$?$c9Bc zteP8+bJ%ar+lS+$Na3ig5L`sJmWp{-WZDYG2Ak4*@~Z~3 z_uj5OWQPUWYq93C!!lGI1{^1Q_X*bz7FYXX1g}L1T9>3$Z|mqH*;%`b|5Ofde_3sL z_w1yJMVWz2K0)Hrv(cE3ZgJI%y=~9W57gI%mj`1Pt$Wj+**LvC+^6;wt?y`ezWy-2 zL2uP=!9b_9`rXWoKci3e!AjZ$RaPD6*DjH=$~V($I_&{NhX%`fDC|AH$%P18Oi0x~ z4bGt=K^Y=O`lZax!vkFbvkf6e=!oxYMBJO#@*_OOSN-&>xyP3mye`KJI3t(cyzPH9 zpe-FMT9c1>9eiV0oBMgtFo>xqrGi8FoA6jg)J8{dd~Jun{$2#$i`ZHHX=!8sH);ti zvysMD3y(xUZ@;=k8dst2wb@8|dbqN?#Co)MhStK6`2J0EN_KRV!c86B(cjw7yM}~n zZx#ig#F9>w9@T|ZEZ5)Yn7O)sB=E?RNHskM0-kRHNT2x-gXxEy#t+rVR7IX+FC>>> zy&J1qVqGsXNK?1Igj?`&*h^jPOy6-IEHtdkm4D>HNKL-MWj$QqgQ*|n`(JCtvW#nf z(LIuTeI7f0Ueh5uc)i%?a=(e*NJsOI;^MF3*lKZ3_tnccm8=Qk?c68q9$t4L9{kKi zg4_J!n>4K(=}1-BgBGvv4du&TdnadGZ1=yIjx5ELZaZZ>iM<@>>*;NKw_l-f zW*5iib%QREIp^9N-*aQa6yDTBt;H+&_f{YFv7~94x}VKhzm=5mm!(Ok*%I+Nd3Y9n zMe`*(DN@QMGGvz{j+dK+A*dDmv7X9f?%oA9w!aLsJbJ3%e!zX_dsq7uN#}`m%!%#M zgs!glXi95YMpoNN*nlrlu8M?j%1zFw*mB3~o~WML-=wX1f+CHNXH*KPOCM3Lo!8ap z|3)n5Fr*IE*_=H!Vx~aRhI;A-qJ_-&m3Nm^OCirAhtZ=`d z$MsEb2FjCrFlO|y1#_SyB&Z|9lGZOJ-M7;ZH)ugUS6=sPJ(qp2?&+Ldu- z-yjsP-CAd<6q=CxrLCfw<|Ms2Hvbje%4vq{?l{(2D9@!^KAr<>JNRrG2%EnDm{7-f zkTot}OWdYm%YN4?y_2GaS@vo+Te^0EmV`p-5L1%(;1Q~{`)|!-ulqk3(2H}%MdBs? z`)mJQzFw6u**Y1jH@T)BgY4}EUIe_s5(bp zaU+LrDeIYKr^EZbo@cjJU(FpxmA%41MyK%i3ur?{MyJ6El98CuZs3tM?wg(_UrNLn z?0nHE7HLk1I_z|(9{23q7uKKQHer`S6Pjy{@@D4U27~TDflYXA$t(KzR#f*;R-(X3 z*`m_LlUOh+4(Ztv9zQ+(81M0L&@?H$fnrQb%zs?1;tn@p6;igERtLCFA0^W6_I zpJTrFla^OHWS#1^NFOhRwYq7Eu^oJ5E6%Sb*Rr-v8aVap>?{_u6;f-XI(_6mpU+5m zv?gI})9Kb&TIsf$p;3E!IxKPLoJ8q~!zWgv_51N=`#rrqA$)|z;%T>gw@zAz?gsiT zy*5m9!2&C07D7RY)u&wIK=xi9_G}+}r5An@XH{-v1IHzp`3DteG~QpJ9k{~f%$9EP z=M-Jx)W%{75rKm<6A6u!9p&$-hWpR1@cSEH+$(7?p#?8pZ)e4zi5dsZe)*sIPBpZOyPwd-YZL≺>VYWciW7%<`B`fs_ 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 literal 93194 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 AV^FJ2 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P6|#>T!X+0(!I0E}=Mj^jWr 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 diff --git a/architecture/search_system_containers_c4_diagram.puml b/architecture/search_system_containers_c4_diagram.puml index efad5157..07320624 100644 --- a/architecture/search_system_containers_c4_diagram.puml +++ b/architecture/search_system_containers_c4_diagram.puml @@ -24,7 +24,7 @@ Rel(user, mobile, "Opens up") Rel_R(mobile, searchService, "Gets search results for user queries from", "via Firebase AppCheck") Rel_R(searchService, bggApi, "Gets board games search results from") Rel_D(searchService, nosql, "Gets available board games information based on the search results from") -Rel_D(searchService, cacheQueue, "Sends not found board games to") +Rel_D(searchService, cacheQueue, "Sends not cached or expired board games to") Rel_U(cacheQueueWorker, cacheQueue, "Reads board games from") Rel_U(cacheQueueWorker, nosql, "Stores the board game details and pricing information in") Rel_R(cacheQueueWorker, bggApi, "Gets board games details information from") diff --git a/backend/BGC.SearchApi.UnitTests/Endpoints/SearchEndpointTests.cs b/backend/BGC.SearchApi.UnitTests/Endpoints/SearchEndpointTests.cs index c02b93e7..1f0b3c6b 100644 --- a/backend/BGC.SearchApi.UnitTests/Endpoints/SearchEndpointTests.cs +++ b/backend/BGC.SearchApi.UnitTests/Endpoints/SearchEndpointTests.cs @@ -9,13 +9,14 @@ using BGC.SearchApi.UnitTests.Helpers; using Microsoft.AspNetCore.Mvc; -using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace BGC.SearchApi.UnitTests.Endpoints { public class SearchEndpointTests { + private const string InvalidApiKey = "invalid-api-key"; + private readonly Mock _mockSearchService; public SearchEndpointTests() @@ -23,7 +24,6 @@ public SearchEndpointTests() _mockSearchService = new Mock(); } - private const string InvalidApiKey = "invalid-api-key"; [Fact] public async Task Search_NoApiKey_ThrowsUnauthorizedException() diff --git a/backend/BGC.SearchApi.UnitTests/Helpers/WebApiApp.cs b/backend/BGC.SearchApi.UnitTests/Helpers/WebApiApp.cs index 486778d9..718a6bdc 100644 --- a/backend/BGC.SearchApi.UnitTests/Helpers/WebApiApp.cs +++ b/backend/BGC.SearchApi.UnitTests/Helpers/WebApiApp.cs @@ -7,6 +7,8 @@ namespace BGC.SearchApi.UnitTests.Helpers public sealed class WebApiApp : WebApplicationFactory { public const string ApiKey = "apiKey"; + public const string CacheConnectionString= "connectionString"; + public const string CacheQueueName = "queueName"; public const string MongoDbConnectionString = "mongoDbConnectionString"; protected override IHost CreateHost(IHostBuilder builder) @@ -16,6 +18,8 @@ protected override IHost CreateHost(IHostBuilder builder) configBuilder.Sources.Clear(); configBuilder.AddInMemoryCollection(new Dictionary { + { "AppSettings:CacheSettings:ConnectionString", CacheConnectionString }, + { "AppSettings:CacheSettings:QueueName", CacheQueueName }, { "AppSettings:ApiKeyAuthenticationSettings:ApiKey", ApiKey }, { "AppSettings:MongoDbSettings:ConnectionString", MongoDbConnectionString }, }); diff --git a/backend/BGC.SearchApi.UnitTests/Services/SearchServiceTests.cs b/backend/BGC.SearchApi.UnitTests/Services/SearchServiceTests.cs index b57bb3a7..5238ea99 100644 --- a/backend/BGC.SearchApi.UnitTests/Services/SearchServiceTests.cs +++ b/backend/BGC.SearchApi.UnitTests/Services/SearchServiceTests.cs @@ -13,6 +13,7 @@ public class SearchServiceTests private readonly Mock> _mockLogger; private readonly Mock _mockBggService; private readonly Mock _mockBoardGamesRepository; + private readonly Mock _mockCacheService; private readonly SearchService searchService; @@ -21,8 +22,9 @@ public SearchServiceTests() _mockLogger = new Mock>(); _mockBggService = new Mock(); _mockBoardGamesRepository = new Mock(); + _mockCacheService = new Mock(); - searchService = new SearchService(_mockLogger.Object, _mockBggService.Object, _mockBoardGamesRepository.Object); + searchService = new SearchService(_mockLogger.Object, _mockBggService.Object, _mockBoardGamesRepository.Object, _mockCacheService.Object); } [Fact] @@ -55,10 +57,11 @@ public async Task Search_FindsBggGames_ReturnsGameResults() BoardGames = new List() { new BoardGameSearchResult("1238", "Scythe", 1987), - new BoardGameSearchResult("82374", "My Little Scythe", 2018) - } + new BoardGameSearchResult("82374", "My Little Scythe", 2018), + }, }; _mockBggService.Setup(service => service.Search(searchQuery, It.IsAny())).ReturnsAsync(bggSearchResposne); + _mockBoardGamesRepository.Setup(repository => repository.GetBoardGames(It.IsAny>(), It.IsAny())).ReturnsAsync(Array.Empty); var searchResults = await searchService.Search(searchQuery, CancellationToken.None); searchResults.Should().NotBeEmpty(); @@ -76,15 +79,15 @@ public async Task Search_EnrichesBoardGameDetails_ReturnsEnrichedGameDetailResul BoardGames = new List() { new BoardGameSearchResult("1238", "Scythe", 1987), - new BoardGameSearchResult("82374", "My Little Scythe", 2018) - } + new BoardGameSearchResult("82374", "My Little Scythe", 2018), + }, }; _mockBggService.Setup(service => service.Search(searchQuery, It.IsAny())).ReturnsAsync(bggSearchResposne); var enrichedBoardGameDetails = new BoardGame() { Id = "1238", - ImageUrl = "https://fancy.image.net/funny.jpg" + ImageUrl = "https://fancy.image.net/funny.jpg", }; _mockBoardGamesRepository.Setup(repository => repository.GetBoardGames(It.IsAny>(), It.IsAny())).ReturnsAsync(new[] { enrichedBoardGameDetails }); @@ -94,4 +97,32 @@ public async Task Search_EnrichesBoardGameDetails_ReturnsEnrichedGameDetailResul searchResults.Should().ContainEquivalentOf(new BoardGameSummaryDto("1238", "Scythe", 1987) { ImageUrl = enrichedBoardGameDetails.ImageUrl }); searchResults.Should().ContainEquivalentOf(new BoardGameSummaryDto("82374", "My Little Scythe", 2018)); } + + [Fact] + public async Task Search_NewBoardGames_CachesNewBoardGames() + { + var searchQuery = "Scythe"; + var cachedBoardGameId = "1238"; + var newBoardGameId = "82374"; + var bggSearchResposne = new BoardGameSearchResponse() + { + BoardGames = new List() + { + new BoardGameSearchResult(cachedBoardGameId, "Scythe", 1987), + new BoardGameSearchResult(newBoardGameId, "My Little Scythe", 2018), + }, + }; + var cachedBoardGames = new List() + { + new BoardGame() + { + Id = cachedBoardGameId, + }, + }; + _mockBggService.Setup(service => service.Search(searchQuery, It.IsAny())).ReturnsAsync(bggSearchResposne); + _mockBoardGamesRepository.Setup(repository => repository.GetBoardGames(It.IsAny>(), It.IsAny())).ReturnsAsync(cachedBoardGames); + + var searchResults = await searchService.Search(searchQuery, CancellationToken.None); + _mockCacheService.Verify(service => service.Add(It.Is>(boardGames => boardGames.Contains(newBoardGameId))), Times.Once); + } } \ No newline at end of file diff --git a/backend/BGC.SearchApi/Authentication/ApiKeyAuthenticationSettings.cs b/backend/BGC.SearchApi/Authentication/ApiKeyAuthenticationSettings.cs index 3d9fb4ca..084cfec0 100644 --- a/backend/BGC.SearchApi/Authentication/ApiKeyAuthenticationSettings.cs +++ b/backend/BGC.SearchApi/Authentication/ApiKeyAuthenticationSettings.cs @@ -13,6 +13,6 @@ public class ApiKeyAuthenticationSettings : AuthenticationSchemeOptions /// Gets api key. /// [Required] - public string ApiKey { get; init; } + public string ApiKey { get; init; } = null!; } } diff --git a/backend/BGC.SearchApi/BGC.SearchApi.csproj b/backend/BGC.SearchApi/BGC.SearchApi.csproj index 2792513e..e0537f64 100644 --- a/backend/BGC.SearchApi/BGC.SearchApi.csproj +++ b/backend/BGC.SearchApi/BGC.SearchApi.csproj @@ -8,6 +8,7 @@ + diff --git a/backend/BGC.SearchApi/Models/Dtos/BoardGameSummaryDto.cs b/backend/BGC.SearchApi/Models/Dtos/BoardGameSummaryDto.cs index ca85cc65..9e077c2e 100644 --- a/backend/BGC.SearchApi/Models/Dtos/BoardGameSummaryDto.cs +++ b/backend/BGC.SearchApi/Models/Dtos/BoardGameSummaryDto.cs @@ -2,6 +2,13 @@ public record BoardGameSummaryDto { + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// Model is based on the data returned from the BGG XML API. public BoardGameSummaryDto(string id, string name, int yearPublished) { Id = id; @@ -16,7 +23,7 @@ public BoardGameSummaryDto(string id, string name, int yearPublished) public int YearPublished { get; init; } /// - /// Type of the board game (e.g. BoardGame or BoardGameExpansion) + /// Type of the board game (e.g. BoardGame or BoardGameExpansion). /// public string Type { get; set; } = null!; diff --git a/backend/BGC.SearchApi/Models/Settings/AppSettings.cs b/backend/BGC.SearchApi/Models/Settings/AppSettings.cs index 89d7a8b6..e7c8637f 100644 --- a/backend/BGC.SearchApi/Models/Settings/AppSettings.cs +++ b/backend/BGC.SearchApi/Models/Settings/AppSettings.cs @@ -7,8 +7,14 @@ namespace BGC.SearchApi.Models.Settings [ExcludeFromCodeCoverage(Justification = "Settings model don't require testing")] public record AppSettings { + /// + /// Gets board games database. + /// public MongoDbSettings? MongoDb { get; init; } + /// + /// Gets auth settings. + /// public ApiKeyAuthenticationSettings? ApiKeyAuthenticationSettings { get; init; } } } diff --git a/backend/BGC.SearchApi/Models/Settings/CacheSettings.cs b/backend/BGC.SearchApi/Models/Settings/CacheSettings.cs new file mode 100644 index 00000000..ea05fc81 --- /dev/null +++ b/backend/BGC.SearchApi/Models/Settings/CacheSettings.cs @@ -0,0 +1,21 @@ +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace BGC.SearchApi.Models.Settings +{ + [ExcludeFromCodeCoverage(Justification = "Settings model don't require testing")] + public record CacheSettings + { + /// + /// Gets connection string for sending messages. + /// + [Required] + public string SendConnectionString { get; init; } = null!; + + /// + /// Gets queue name. + /// + [Required] + public string QueueName { get; init; } = null!; + } +} diff --git a/backend/BGC.SearchApi/Models/Settings/MongoDbSettings.cs b/backend/BGC.SearchApi/Models/Settings/MongoDbSettings.cs index 872ab434..1715b5e1 100644 --- a/backend/BGC.SearchApi/Models/Settings/MongoDbSettings.cs +++ b/backend/BGC.SearchApi/Models/Settings/MongoDbSettings.cs @@ -6,7 +6,10 @@ namespace BGC.SearchApi.Models.Settings [ExcludeFromCodeCoverage(Justification = "Settings model don't require testing")] public record MongoDbSettings { + /// + /// Gets connection string. + /// [Required] - public string? ConnectionString { get; init; } + public string ConnectionString { get; init; } = null!; } } diff --git a/backend/BGC.SearchApi/Program.cs b/backend/BGC.SearchApi/Program.cs index 2c188bcc..e83dd7ed 100644 --- a/backend/BGC.SearchApi/Program.cs +++ b/backend/BGC.SearchApi/Program.cs @@ -19,6 +19,10 @@ var builder = WebApplication.CreateBuilder(args); var appSettingsConfigurationSection = builder.Configuration.GetSection(nameof(AppSettings)); +builder.Services.AddOptions() + .Bind(appSettingsConfigurationSection.GetSection(nameof(CacheSettings))) + .ValidateDataAnnotations() + .ValidateOnStart(); builder.Services.AddOptions() .Bind(appSettingsConfigurationSection.GetSection(nameof(MongoDbSettings))) .ValidateDataAnnotations() @@ -50,6 +54,7 @@ return new MongoClient(mongoDbSettings!.Value.ConnectionString); }); +builder.Services.AddSingleton(); builder.Services.AddTransient(); builder.Services.AddTransient(); builder.Services.AddTransient(); @@ -101,5 +106,5 @@ await Results.Problem(statusCode: statusCodeContext.HttpContext.Response.StatusC /// /// Entry point for the API. /// -/// MK Having this is required because otherwise the integration tests using WebApplicationFactory won't work. +/// MK Declaring as a partial class is required because otherwise the integration tests using WebApplicationFactory won't work. public partial class Program { } \ No newline at end of file diff --git a/backend/BGC.SearchApi/Services/CacheService.cs b/backend/BGC.SearchApi/Services/CacheService.cs new file mode 100644 index 00000000..cc551f40 --- /dev/null +++ b/backend/BGC.SearchApi/Services/CacheService.cs @@ -0,0 +1,88 @@ +using System.Text.Json; +using System.Text.Json.Nodes; +using System.Text.Json.Serialization; + +using Azure.Messaging.ServiceBus; + +using BGC.SearchApi.Models.Settings; +using BGC.SearchApi.Services.Interfaces; + +using Microsoft.Extensions.Options; + +using MongoDB.Bson.IO; + +namespace BGC.SearchApi.Services +{ + /// + public class CacheService : ICacheService + { + private const string OperationTypePropertyName = "operationType"; + + private const string AppOperationName = "add"; + private const string UpdateOperationName = "update"; + + private readonly ServiceBusClient _client; + private readonly ServiceBusSender _sender; + private readonly ILogger _logger; + + /// + /// Initializes a new instance of the class. + /// + /// + /// + public CacheService(IOptions cacheSettings, ILogger logger) + { + var clientOptions = new ServiceBusClientOptions() + { + TransportType = ServiceBusTransportType.AmqpWebSockets, + }; + _client = new ServiceBusClient(cacheSettings.Value.SendConnectionString, clientOptions); + _sender = _client.CreateSender(cacheSettings.Value.QueueName); + _logger = logger; + } + + /// + public async Task Add(IEnumerable boardGameIds) + { + await SendMessagesToCacheQueue(boardGameIds, AppOperationName); + } + + /// + public async Task Update(IEnumerable boardGameIds) + { + await SendMessagesToCacheQueue(boardGameIds, UpdateOperationName); + } + + private async Task SendMessagesToCacheQueue(IEnumerable boardGameIds, string operationName) + { + if (!boardGameIds.Any()) + { + return; + } + + using ServiceBusMessageBatch messageBatch = await _sender.CreateMessageBatchAsync(); + + foreach (var boardGameId in boardGameIds) + { + var payload = new { boardGameId = boardGameId }; + var message = new ServiceBusMessage(JsonSerializer.Serialize(payload)); + message.ApplicationProperties[OperationTypePropertyName] = operationName; + if (!messageBatch.TryAddMessage(message)) + { + _logger.LogError($"Failed to add message to the batch for the board game {boardGameId}"); + continue; + } + } + + try + { + _logger.LogInformation($"Sending board games {string.Join(",", boardGameIds)} to the queue for caching..."); + await _sender.SendMessagesAsync(messageBatch); + } + catch (Exception ex) + { + _logger.LogError(ex, $"Failed to send message to the queue for caching."); + } + } + } +} diff --git a/backend/BGC.SearchApi/Services/Interfaces/ICacheService.cs b/backend/BGC.SearchApi/Services/Interfaces/ICacheService.cs new file mode 100644 index 00000000..6607fc6e --- /dev/null +++ b/backend/BGC.SearchApi/Services/Interfaces/ICacheService.cs @@ -0,0 +1,22 @@ +namespace BGC.SearchApi.Services.Interfaces +{ + /// + /// Cache service. + /// + public interface ICacheService + { + /// + /// Adds a board game to cache. + /// + /// + /// A representing the asynchronous operation. + Task Add(IEnumerable boardGameIds); + + /// + /// Updates already cached board game. + /// + /// + /// A representing the asynchronous operation. + Task Update(IEnumerable boardGameIds); + } +} diff --git a/backend/BGC.SearchApi/Services/Interfaces/ISearchService.cs b/backend/BGC.SearchApi/Services/Interfaces/ISearchService.cs index 4c17d200..ec850a33 100644 --- a/backend/BGC.SearchApi/Services/Interfaces/ISearchService.cs +++ b/backend/BGC.SearchApi/Services/Interfaces/ISearchService.cs @@ -2,7 +2,16 @@ namespace BGC.SearchApi.Services.Interface; +/// +/// Search service interface. +/// public interface ISearchService { + /// + /// Search board games with a . + /// + /// + /// + /// A collection of . Task> Search(string query, CancellationToken cancellationToken); } \ No newline at end of file diff --git a/backend/BGC.SearchApi/Services/SearchService.cs b/backend/BGC.SearchApi/Services/SearchService.cs index a352936a..d4fced04 100644 --- a/backend/BGC.SearchApi/Services/SearchService.cs +++ b/backend/BGC.SearchApi/Services/SearchService.cs @@ -1,5 +1,7 @@ +using System.Collections.Generic; using System.Net; +using BGC.SearchApi.Models.Domain; using BGC.SearchApi.Models.Dtos; using BGC.SearchApi.Models.Exceptions; using BGC.SearchApi.Repositories.Interfaces; @@ -8,19 +10,30 @@ namespace BGC.SearchApi.Services; +/// public class SearchService : ISearchService { private readonly ILogger _logger; private readonly IBggService _bggService; private readonly IBoardGamesRepository _boardGamesRepository; + private readonly ICacheService _cacheService; - public SearchService(ILogger logger, IBggService bggService, IBoardGamesRepository boardGamesRepository) + /// + /// Initializes a new instance of the class. + /// + /// + /// + /// + /// + public SearchService(ILogger logger, IBggService bggService, IBoardGamesRepository boardGamesRepository, ICacheService cacheService) { _logger = logger; _bggService = bggService; _boardGamesRepository = boardGamesRepository; + _cacheService = cacheService; } + /// public async Task> Search(string query, CancellationToken cancellationToken) { try @@ -31,12 +44,18 @@ public async Task> Search(string query, return Array.Empty(); } - // TODO If detailed info doesn't exists, queue a message to retrieve it + var boardGameSummaries = bggSearchResponse.BoardGames.Select(boardGame => new BoardGameSummaryDto(boardGame.Id, boardGame.Name, boardGame.YearPublished)).ToArray(); - var boardGames = bggSearchResponse.BoardGames.Select(boardGame => new BoardGameSummaryDto(boardGame.Id, boardGame.Name, boardGame.YearPublished)).ToArray(); - await EnrichBoardGameDetails(boardGames, cancellationToken); + var boardGamesDetails = await _boardGamesRepository.GetBoardGames(boardGameSummaries.Select(boardGame => boardGame.Id), cancellationToken); + var boardGamesDetailsDict = boardGamesDetails.ToDictionary(boardGame => boardGame.Id); + + EnrichBoardGameDetails(boardGameSummaries, boardGamesDetailsDict); - return boardGames; +#pragma warning disable CS4014 // Intentionally not awaiting this call, as it should be done in the background + CacheBoardGames(boardGameSummaries, boardGamesDetailsDict); +#pragma warning restore CS4014 // Intentionally not awaiting this call, as it should be done in the background + + return boardGameSummaries; } catch (Exception ex) { @@ -46,12 +65,10 @@ public async Task> Search(string query, } } - private async Task EnrichBoardGameDetails(IReadOnlyCollection boardGames, CancellationToken cancellationToken) + private void EnrichBoardGameDetails(IReadOnlyCollection boardGames, IDictionary boardGamesDetailsDict) { try { - var boardGamesDetails = await _boardGamesRepository.GetBoardGames(boardGames.Select(boardGame => boardGame.Id), cancellationToken); - var boardGamesDetailsDict = boardGamesDetails.ToDictionary(boardGame => boardGame.Id); foreach (var boardGame in boardGames) { if (!boardGamesDetailsDict.TryGetValue(boardGame.Id, out var boardGameDetails)) @@ -75,6 +92,13 @@ private async Task EnrichBoardGameDetails(IReadOnlyCollection boardGameSummaries, Dictionary boardGamesDetailsDict) + { + var newBoardGameIds = boardGameSummaries.Select(boardGame => boardGame.Id).Except(boardGamesDetailsDict.Values.Select(boardGame => boardGame.Id)); + await _cacheService.Add(newBoardGameIds); + // TODO Handle expired board game details } } \ No newline at end of file diff --git a/board_games_companion/ios/Podfile.lock b/board_games_companion/ios/Podfile.lock new file mode 100644 index 00000000..1f990f30 --- /dev/null +++ b/board_games_companion/ios/Podfile.lock @@ -0,0 +1,277 @@ +PODS: + - DKImagePickerController/Core (4.3.4): + - DKImagePickerController/ImageDataManager + - DKImagePickerController/Resource + - DKImagePickerController/ImageDataManager (4.3.4) + - DKImagePickerController/PhotoGallery (4.3.4): + - DKImagePickerController/Core + - DKPhotoGallery + - DKImagePickerController/Resource (4.3.4) + - DKPhotoGallery (0.0.17): + - DKPhotoGallery/Core (= 0.0.17) + - DKPhotoGallery/Model (= 0.0.17) + - DKPhotoGallery/Preview (= 0.0.17) + - DKPhotoGallery/Resource (= 0.0.17) + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Core (0.0.17): + - DKPhotoGallery/Model + - DKPhotoGallery/Preview + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Model (0.0.17): + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Preview (0.0.17): + - DKPhotoGallery/Model + - DKPhotoGallery/Resource + - SDWebImage + - SwiftyGif + - DKPhotoGallery/Resource (0.0.17): + - SDWebImage + - SwiftyGif + - file_picker (0.0.1): + - DKImagePickerController/PhotoGallery + - Flutter + - Firebase/Analytics (10.6.0): + - Firebase/Core + - Firebase/Core (10.6.0): + - Firebase/CoreOnly + - FirebaseAnalytics (~> 10.6.0) + - Firebase/CoreOnly (10.6.0): + - FirebaseCore (= 10.6.0) + - Firebase/Crashlytics (10.6.0): + - Firebase/CoreOnly + - FirebaseCrashlytics (~> 10.6.0) + - firebase_analytics (10.1.6): + - Firebase/Analytics (= 10.6.0) + - firebase_core + - Flutter + - firebase_core (2.8.0): + - Firebase/CoreOnly (= 10.6.0) + - Flutter + - firebase_crashlytics (3.0.17): + - Firebase/Crashlytics (= 10.6.0) + - firebase_core + - Flutter + - FirebaseAnalytics (10.6.0): + - FirebaseAnalytics/AdIdSupport (= 10.6.0) + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseAnalytics/AdIdSupport (10.6.0): + - FirebaseCore (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleAppMeasurement (= 10.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - FirebaseCore (10.6.0): + - FirebaseCoreInternal (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/Logger (~> 7.8) + - FirebaseCoreExtension (10.11.0): + - FirebaseCore (~> 10.0) + - FirebaseCoreInternal (10.11.0): + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - FirebaseCrashlytics (10.6.0): + - FirebaseCore (~> 10.5) + - FirebaseInstallations (~> 10.0) + - FirebaseSessions (~> 10.5) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/Environment (~> 7.8) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (~> 2.1) + - FirebaseInstallations (10.11.0): + - FirebaseCore (~> 10.0) + - GoogleUtilities/Environment (~> 7.8) + - GoogleUtilities/UserDefaults (~> 7.8) + - PromisesObjC (~> 2.1) + - FirebaseSessions (10.11.0): + - FirebaseCore (~> 10.5) + - FirebaseCoreExtension (~> 10.0) + - FirebaseInstallations (~> 10.0) + - GoogleDataTransport (~> 9.2) + - GoogleUtilities/Environment (~> 7.10) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesSwift (~> 2.1) + - Flutter (1.0.0) + - FMDB (2.7.5): + - FMDB/standard (= 2.7.5) + - FMDB/standard (2.7.5) + - GoogleAppMeasurement (10.6.0): + - GoogleAppMeasurement/AdIdSupport (= 10.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/AdIdSupport (10.6.0): + - GoogleAppMeasurement/WithoutAdIdSupport (= 10.6.0) + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleAppMeasurement/WithoutAdIdSupport (10.6.0): + - GoogleUtilities/AppDelegateSwizzler (~> 7.8) + - GoogleUtilities/MethodSwizzler (~> 7.8) + - GoogleUtilities/Network (~> 7.8) + - "GoogleUtilities/NSData+zlib (~> 7.8)" + - nanopb (< 2.30910.0, >= 2.30908.0) + - GoogleDataTransport (9.2.3): + - GoogleUtilities/Environment (~> 7.7) + - nanopb (< 2.30910.0, >= 2.30908.0) + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/AppDelegateSwizzler (7.11.1): + - GoogleUtilities/Environment + - GoogleUtilities/Logger + - GoogleUtilities/Network + - GoogleUtilities/Environment (7.11.1): + - PromisesObjC (< 3.0, >= 1.2) + - GoogleUtilities/Logger (7.11.1): + - GoogleUtilities/Environment + - GoogleUtilities/MethodSwizzler (7.11.1): + - GoogleUtilities/Logger + - GoogleUtilities/Network (7.11.1): + - GoogleUtilities/Logger + - "GoogleUtilities/NSData+zlib" + - GoogleUtilities/Reachability + - "GoogleUtilities/NSData+zlib (7.11.1)" + - GoogleUtilities/Reachability (7.11.1): + - GoogleUtilities/Logger + - GoogleUtilities/UserDefaults (7.11.1): + - GoogleUtilities/Logger + - image_picker_ios (0.0.1): + - Flutter + - in_app_review (0.2.0): + - Flutter + - nanopb (2.30909.0): + - nanopb/decode (= 2.30909.0) + - nanopb/encode (= 2.30909.0) + - nanopb/decode (2.30909.0) + - nanopb/encode (2.30909.0) + - package_info (0.0.1): + - Flutter + - path_provider_foundation (0.0.1): + - Flutter + - FlutterMacOS + - PromisesObjC (2.2.0) + - PromisesSwift (2.2.0): + - PromisesObjC (= 2.2.0) + - SDWebImage (5.16.0): + - SDWebImage/Core (= 5.16.0) + - SDWebImage/Core (5.16.0) + - share_plus (0.0.1): + - Flutter + - sqflite (0.0.2): + - Flutter + - FMDB (>= 2.7.5) + - SwiftyGif (5.4.4) + - url_launcher_ios (0.0.1): + - Flutter + +DEPENDENCIES: + - file_picker (from `.symlinks/plugins/file_picker/ios`) + - firebase_analytics (from `.symlinks/plugins/firebase_analytics/ios`) + - firebase_core (from `.symlinks/plugins/firebase_core/ios`) + - firebase_crashlytics (from `.symlinks/plugins/firebase_crashlytics/ios`) + - Flutter (from `Flutter`) + - image_picker_ios (from `.symlinks/plugins/image_picker_ios/ios`) + - in_app_review (from `.symlinks/plugins/in_app_review/ios`) + - package_info (from `.symlinks/plugins/package_info/ios`) + - path_provider_foundation (from `.symlinks/plugins/path_provider_foundation/ios`) + - share_plus (from `.symlinks/plugins/share_plus/ios`) + - sqflite (from `.symlinks/plugins/sqflite/ios`) + - url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`) + +SPEC REPOS: + trunk: + - DKImagePickerController + - DKPhotoGallery + - Firebase + - FirebaseAnalytics + - FirebaseCore + - FirebaseCoreExtension + - FirebaseCoreInternal + - FirebaseCrashlytics + - FirebaseInstallations + - FirebaseSessions + - FMDB + - GoogleAppMeasurement + - GoogleDataTransport + - GoogleUtilities + - nanopb + - PromisesObjC + - PromisesSwift + - SDWebImage + - SwiftyGif + +EXTERNAL SOURCES: + file_picker: + :path: ".symlinks/plugins/file_picker/ios" + firebase_analytics: + :path: ".symlinks/plugins/firebase_analytics/ios" + firebase_core: + :path: ".symlinks/plugins/firebase_core/ios" + firebase_crashlytics: + :path: ".symlinks/plugins/firebase_crashlytics/ios" + Flutter: + :path: Flutter + image_picker_ios: + :path: ".symlinks/plugins/image_picker_ios/ios" + in_app_review: + :path: ".symlinks/plugins/in_app_review/ios" + package_info: + :path: ".symlinks/plugins/package_info/ios" + path_provider_foundation: + :path: ".symlinks/plugins/path_provider_foundation/ios" + share_plus: + :path: ".symlinks/plugins/share_plus/ios" + sqflite: + :path: ".symlinks/plugins/sqflite/ios" + url_launcher_ios: + :path: ".symlinks/plugins/url_launcher_ios/ios" + +SPEC CHECKSUMS: + DKImagePickerController: b512c28220a2b8ac7419f21c491fc8534b7601ac + DKPhotoGallery: fdfad5125a9fdda9cc57df834d49df790dbb4179 + file_picker: ce3938a0df3cc1ef404671531facef740d03f920 + Firebase: f13680471b021937f2230ea8503c7809d8c29806 + firebase_analytics: 97d12c9683531ba3f923a798a95362e7590f0757 + firebase_core: 58542d7399889ebdbb034baa72d081e54c5c814d + firebase_crashlytics: 5f6296621a0e8ed7d15a7499c8131fbdcf176e3b + FirebaseAnalytics: 9f382605c5ee412b039212f054bf7a403d9850c1 + FirebaseCore: fa80ad16a62d52f67274b5b88304c3a318bbf9a4 + FirebaseCoreExtension: cacdad57fdb60e0b86dcbcac058ec78237946759 + FirebaseCoreInternal: 9e46c82a14a3b3a25be4e1e151ce6d21536b89c0 + FirebaseCrashlytics: ede07e7f433a0a2270112baf2d156b111cfb422d + FirebaseInstallations: 2a2c6859354cbec0a228a863d4daf6de7c74ced4 + FirebaseSessions: a62ba5c45284adb7714f4126cfbdb32b17c260bd + Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a + GoogleAppMeasurement: 686b48c3c895f3c55c70719041913d5d150b74f6 + GoogleDataTransport: f0308f5905a745f94fb91fea9c6cbaf3831cb1bd + GoogleUtilities: 9aa0ad5a7bc171f8bae016300bfcfa3fb8425749 + image_picker_ios: 4a8aadfbb6dc30ad5141a2ce3832af9214a705b5 + in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d + nanopb: b552cce312b6c8484180ef47159bc0f65a1f0431 + package_info: 873975fc26034f0b863a300ad47e7f1ac6c7ec62 + path_provider_foundation: c68054786f1b4f3343858c1e1d0caaded73f0be9 + PromisesObjC: 09985d6d70fbe7878040aa746d78236e6946d2ef + PromisesSwift: cf9eb58666a43bbe007302226e510b16c1e10959 + SDWebImage: 2aea163b50bfcb569a2726b6a754c54a4506fcf6 + share_plus: 056a1e8ac890df3e33cb503afffaf1e9b4fbae68 + sqflite: 6d358c025f5b867b29ed92fc697fd34924e11904 + SwiftyGif: 93a1cc87bf3a51916001cf8f3d63835fb64c819f + url_launcher_ios: 08a3dfac5fb39e8759aeb0abbd5d9480f30fc8b4 + +PODFILE CHECKSUM: 84b7f0ad7428cb894ad73bf70c77827d7438b18a + +COCOAPODS: 1.12.1 diff --git a/board_games_companion/ios/Runner.xcodeproj/project.pbxproj b/board_games_companion/ios/Runner.xcodeproj/project.pbxproj index 49117883..e620e90f 100644 --- a/board_games_companion/ios/Runner.xcodeproj/project.pbxproj +++ b/board_games_companion/ios/Runner.xcodeproj/project.pbxproj @@ -153,6 +153,7 @@ 3B06AD1E1E4923F5004D2608 /* Thin Binary */, D02AFCB5254E4BFD00C36357 /* ShellScript */, 173C006E3010407C6C42EADC /* [CP] Embed Pods Frameworks */, + D0EAC3432A713F62008D8C1C /* ShellScript */, ); buildRules = ( ); @@ -349,6 +350,25 @@ shellPath = "${PODS_ROOT}/FirebaseCrashlytics/run"; shellScript = "# Type a script or drag a script file from your workspace to insert its path.\n"; }; + D0EAC3432A713F62008D8C1C /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME}", + "$(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH)", + ); + outputFileListPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase --validate -ai 1:718227562022:ios:56c660a2206709a39390e7\n$PODS_ROOT/FirebaseCrashlytics/upload-symbols --build-phase -ai 1:718227562022:ios:56c660a2206709a39390e7\n"; + }; /* End PBXShellScriptBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ diff --git a/board_games_companion/lib/common/app_text.dart b/board_games_companion/lib/common/app_text.dart index aff77bf1..654ae13b 100644 --- a/board_games_companion/lib/common/app_text.dart +++ b/board_games_companion/lib/common/app_text.dart @@ -100,14 +100,18 @@ class AppText { static const playthroughsHistoryPageNoGamesTitle = "You haven't logged any games yet"; static const playthroughsHistoryPageNoGamesSubtitle = 'This page will fill up with the history of plays, once you start logging games.'; + static const playthroughsHistoryPageGameNumberSubtitle = 'game'; + static const playthroughsHistoryPageDaysAgo = 'days ago'; + static const playthroughsHistoryPageToday = 'today'; + static const playthroughsHistoryPageYesterday = 'yesterday'; static const playthroughsGameSettingsGameClassificationScore = 'Score based game'; static const playthroughsGameSettingsGameClssificationNoScore = 'No score based game'; static const playthroughsGameSettingsGameClassificationSectionTitle = 'Classification'; static const playthroughsGameSettingsGameFamilySectionTitle = 'Family'; static const playthroughsGameSettingsScoreDetailsSectionTitle = 'Details'; - static const playthroughsGameSettingsGameFamilyHighestScore = 'Highest score'; - static const playthroughsGameSettingsGameFamilyLowestScore = 'Lowest score'; + static const playthroughsGameSettingsGameFamilyHighestScore = 'Highest score wins'; + static const playthroughsGameSettingsGameFamilyLowestScore = 'Lowest score wins'; static const playthroughsGameSettingsGameFamilyCoop = 'Cooperative'; static const searchBoardGamesPageSearchInstructions = diff --git a/board_games_companion/lib/extensions/int_extensions.dart b/board_games_companion/lib/extensions/int_extensions.dart index d2b39110..ce2ad9e7 100644 --- a/board_games_companion/lib/extensions/int_extensions.dart +++ b/board_games_companion/lib/extensions/int_extensions.dart @@ -4,7 +4,7 @@ import '../common/app_text.dart'; import '../common/constants.dart'; extension IntExtensions on int? { - String toOrdinalAbbreviations() { + String toOrdinalAbbreviation() { if (this == null) { return ''; } diff --git a/board_games_companion/lib/injectable.config.dart b/board_games_companion/lib/injectable.config.dart index e0640929..63b70563 100644 --- a/board_games_companion/lib/injectable.config.dart +++ b/board_games_companion/lib/injectable.config.dart @@ -6,56 +6,56 @@ // ignore_for_file: no_leading_underscores_for_library_prefixes import 'package:board_games_companion/pages/board_game_details/board_game_details_view_model.dart' - as _i45; + as _i46; import 'package:board_games_companion/pages/collections/collection_search_result_view_model.dart' - as _i32; -import 'package:board_games_companion/pages/collections/collections_view_model.dart' as _i33; -import 'package:board_games_companion/pages/create_board_game/create_board_game_view_model.dart' +import 'package:board_games_companion/pages/collections/collections_view_model.dart' as _i34; +import 'package:board_games_companion/pages/create_board_game/create_board_game_view_model.dart' + as _i35; import 'package:board_games_companion/pages/edit_playthrough/edit_playthrough_view_model.dart' - as _i46; + as _i47; import 'package:board_games_companion/pages/edit_playthrough/playthrough_note_view_model.dart' as _i12; -import 'package:board_games_companion/pages/home/home_view_model.dart' as _i47; +import 'package:board_games_companion/pages/home/home_view_model.dart' as _i48; import 'package:board_games_companion/pages/hot_board_games/hot_board_games_view_model.dart' - as _i36; + as _i37; import 'package:board_games_companion/pages/player/player_view_model.dart' - as _i27; + as _i28; import 'package:board_games_companion/pages/players/players_view_model.dart' as _i11; import 'package:board_games_companion/pages/plays/plays_view_model.dart' - as _i37; -import 'package:board_games_companion/pages/playthroughs/playthrough_migration_view_model.dart' as _i38; +import 'package:board_games_companion/pages/playthroughs/playthrough_migration_view_model.dart' + as _i39; import 'package:board_games_companion/pages/playthroughs/playthrough_players_selection_view_model.dart' as _i13; import 'package:board_games_companion/pages/playthroughs/playthrough_statistics_view_model.dart' - as _i39; -import 'package:board_games_companion/pages/playthroughs/playthroughs_game_settings_view_model.dart' as _i40; -import 'package:board_games_companion/pages/playthroughs/playthroughs_history_view_model.dart' +import 'package:board_games_companion/pages/playthroughs/playthroughs_game_settings_view_model.dart' as _i41; -import 'package:board_games_companion/pages/playthroughs/playthroughs_log_game_view_model.dart' +import 'package:board_games_companion/pages/playthroughs/playthroughs_history_view_model.dart' as _i42; -import 'package:board_games_companion/pages/playthroughs/playthroughs_view_model.dart' +import 'package:board_games_companion/pages/playthroughs/playthroughs_log_game_view_model.dart' as _i43; -import 'package:board_games_companion/pages/settings/settings_view_model.dart' +import 'package:board_games_companion/pages/playthroughs/playthroughs_view_model.dart' as _i44; +import 'package:board_games_companion/pages/settings/settings_view_model.dart' + as _i45; import 'package:board_games_companion/services/analytics_service.dart' as _i22; import 'package:board_games_companion/services/board_games_filters_service.dart' - as _i4; + as _i23; import 'package:board_games_companion/services/board_games_geek_service.dart' - as _i24; -import 'package:board_games_companion/services/board_games_search_service.dart' as _i25; -import 'package:board_games_companion/services/board_games_service.dart' +import 'package:board_games_companion/services/board_games_search_service.dart' as _i26; -import 'package:board_games_companion/services/environment_service.dart' as _i6; -import 'package:board_games_companion/services/file_service.dart' as _i7; +import 'package:board_games_companion/services/board_games_service.dart' + as _i27; +import 'package:board_games_companion/services/environment_service.dart' as _i5; +import 'package:board_games_companion/services/file_service.dart' as _i6; import 'package:board_games_companion/services/player_service.dart' as _i9; import 'package:board_games_companion/services/playthroughs_service.dart' - as _i28; + as _i29; import 'package:board_games_companion/services/preferences_service.dart' as _i14; import 'package:board_games_companion/services/rate_and_review_service.dart' @@ -65,24 +65,25 @@ import 'package:board_games_companion/services/search_service.dart' as _i18; import 'package:board_games_companion/services/user_service.dart' as _i20; import 'package:board_games_companion/stores/app_store.dart' as _i3; import 'package:board_games_companion/stores/board_games_filters_store.dart' - as _i23; -import 'package:board_games_companion/stores/board_games_store.dart' as _i31; + as _i24; +import 'package:board_games_companion/stores/board_games_store.dart' as _i32; import 'package:board_games_companion/stores/game_playthroughs_details_store.dart' - as _i35; + as _i36; import 'package:board_games_companion/stores/players_store.dart' as _i10; -import 'package:board_games_companion/stores/playthroughs_store.dart' as _i29; +import 'package:board_games_companion/stores/playthroughs_store.dart' as _i30; import 'package:board_games_companion/stores/scores_store.dart' as _i17; import 'package:board_games_companion/stores/search_store.dart' as _i19; import 'package:board_games_companion/stores/user_store.dart' as _i21; import 'package:board_games_companion/utilities/analytics_route_observer.dart' - as _i30; + as _i31; import 'package:board_games_companion/utilities/custom_http_client_adapter.dart' - as _i5; -import 'package:firebase_analytics/firebase_analytics.dart' as _i8; + as _i4; +import 'package:firebase_analytics/firebase_analytics.dart' as _i7; import 'package:get_it/get_it.dart' as _i1; +import 'package:hive/hive.dart' as _i8; import 'package:injectable/injectable.dart' as _i2; -import 'services/injectable_register_module.dart' as _i48; +import 'services/injectable_register_module.dart' as _i49; // ignore_for_file: unnecessary_lambdas // ignore_for_file: lines_longer_than_80_chars @@ -99,14 +100,17 @@ _i1.GetIt $initGetIt( ); final registerModule = _$RegisterModule(); gh.singleton<_i3.AppStore>(_i3.AppStore()); - gh.singleton<_i4.BoardGamesFiltersService>(_i4.BoardGamesFiltersService()); - gh.factory<_i5.CustomHttpClientAdapter>(() => _i5.CustomHttpClientAdapter()); - gh.singleton<_i6.EnvironmentService>(_i6.EnvironmentService()); - gh.singleton<_i7.FileService>(_i7.FileService()); - gh.singleton<_i8.FirebaseAnalytics>(registerModule.firebaseAnalytics); - gh.singleton<_i8.FirebaseAnalyticsObserver>( + gh.factory<_i4.CustomHttpClientAdapter>(() => _i4.CustomHttpClientAdapter()); + gh.singleton<_i5.EnvironmentService>(_i5.EnvironmentService()); + gh.singleton<_i6.FileService>(_i6.FileService()); + gh.singleton<_i7.FirebaseAnalytics>(registerModule.firebaseAnalytics); + gh.singleton<_i7.FirebaseAnalyticsObserver>( registerModule.firebaseAnalyticsObserver); - gh.singleton<_i9.PlayerService>(_i9.PlayerService(gh<_i7.FileService>())); + gh.factory<_i8.HiveInterface>(() => registerModule.hive); + gh.singleton<_i9.PlayerService>(_i9.PlayerService( + gh<_i8.HiveInterface>(), + gh<_i6.FileService>(), + )); gh.singleton<_i10.PlayersStore>(_i10.PlayersStore(gh<_i9.PlayerService>())); gh.factory<_i11.PlayersViewModel>( () => _i11.PlayersViewModel(gh<_i10.PlayersStore>())); @@ -114,140 +118,147 @@ _i1.GetIt $initGetIt( () => _i12.PlaythroughNoteViewModel()); gh.factory<_i13.PlaythroughPlayersSelectionViewModel>( () => _i13.PlaythroughPlayersSelectionViewModel(gh<_i10.PlayersStore>())); - gh.singleton<_i14.PreferencesService>(_i14.PreferencesService()); + gh.singleton<_i14.PreferencesService>( + _i14.PreferencesService(gh<_i8.HiveInterface>())); gh.singleton<_i15.RateAndReviewService>( _i15.RateAndReviewService(gh<_i14.PreferencesService>())); - gh.singleton<_i16.ScoreService>(_i16.ScoreService()); + gh.singleton<_i16.ScoreService>(_i16.ScoreService(gh<_i8.HiveInterface>())); gh.singleton<_i17.ScoresStore>(_i17.ScoresStore(gh<_i16.ScoreService>())); - gh.singleton<_i18.SearchService>(_i18.SearchService()); + gh.singleton<_i18.SearchService>(_i18.SearchService(gh<_i8.HiveInterface>())); gh.singleton<_i19.SearchStore>(_i19.SearchStore(gh<_i18.SearchService>())); - gh.singleton<_i20.UserService>(_i20.UserService()); + gh.singleton<_i20.UserService>(_i20.UserService(gh<_i8.HiveInterface>())); gh.singleton<_i21.UserStore>(_i21.UserStore(gh<_i20.UserService>())); gh.singleton<_i22.AnalyticsService>(_i22.AnalyticsService( - gh<_i8.FirebaseAnalytics>(), + gh<_i7.FirebaseAnalytics>(), gh<_i15.RateAndReviewService>(), )); - gh.singleton<_i23.BoardGamesFiltersStore>(_i23.BoardGamesFiltersStore( - gh<_i4.BoardGamesFiltersService>(), + gh.singleton<_i23.BoardGamesFiltersService>( + _i23.BoardGamesFiltersService(gh<_i8.HiveInterface>())); + gh.singleton<_i24.BoardGamesFiltersStore>(_i24.BoardGamesFiltersStore( + gh<_i23.BoardGamesFiltersService>(), gh<_i22.AnalyticsService>(), )); - gh.singleton<_i24.BoardGamesGeekService>( - _i24.BoardGamesGeekService(gh<_i5.CustomHttpClientAdapter>())); - gh.singleton<_i25.BoardGamesSearchService>( - _i25.BoardGamesSearchService(gh<_i6.EnvironmentService>())); - gh.singleton<_i26.BoardGamesService>( - _i26.BoardGamesService(gh<_i24.BoardGamesGeekService>())); - gh.factory<_i27.PlayerViewModel>( - () => _i27.PlayerViewModel(gh<_i10.PlayersStore>())); - gh.singleton<_i28.PlaythroughService>( - _i28.PlaythroughService(gh<_i16.ScoreService>())); - gh.singleton<_i29.PlaythroughsStore>(_i29.PlaythroughsStore( - gh<_i28.PlaythroughService>(), + gh.singleton<_i25.BoardGamesGeekService>( + _i25.BoardGamesGeekService(gh<_i4.CustomHttpClientAdapter>())); + gh.singleton<_i26.BoardGamesSearchService>( + _i26.BoardGamesSearchService(gh<_i5.EnvironmentService>())); + gh.singleton<_i27.BoardGamesService>(_i27.BoardGamesService( + gh<_i8.HiveInterface>(), + gh<_i25.BoardGamesGeekService>(), + )); + gh.factory<_i28.PlayerViewModel>( + () => _i28.PlayerViewModel(gh<_i10.PlayersStore>())); + gh.singleton<_i29.PlaythroughService>(_i29.PlaythroughService( + gh<_i8.HiveInterface>(), + gh<_i16.ScoreService>(), + )); + gh.singleton<_i30.PlaythroughsStore>(_i30.PlaythroughsStore( + gh<_i29.PlaythroughService>(), gh<_i17.ScoresStore>(), )); - gh.factory<_i30.AnalyticsRouteObserver>( - () => _i30.AnalyticsRouteObserver(gh<_i22.AnalyticsService>())); - gh.singleton<_i31.BoardGamesStore>(_i31.BoardGamesStore( - gh<_i26.BoardGamesService>(), - gh<_i28.PlaythroughService>(), + gh.factory<_i31.AnalyticsRouteObserver>( + () => _i31.AnalyticsRouteObserver(gh<_i22.AnalyticsService>())); + gh.singleton<_i32.BoardGamesStore>(_i32.BoardGamesStore( + gh<_i27.BoardGamesService>(), + gh<_i29.PlaythroughService>(), )); - gh.factory<_i32.CollectionSearchResultViewModel>( - () => _i32.CollectionSearchResultViewModel(gh<_i31.BoardGamesStore>())); - gh.factory<_i33.CollectionsViewModel>(() => _i33.CollectionsViewModel( + gh.factory<_i33.CollectionSearchResultViewModel>( + () => _i33.CollectionSearchResultViewModel(gh<_i32.BoardGamesStore>())); + gh.factory<_i34.CollectionsViewModel>(() => _i34.CollectionsViewModel( gh<_i21.UserStore>(), - gh<_i31.BoardGamesStore>(), - gh<_i23.BoardGamesFiltersStore>(), + gh<_i32.BoardGamesStore>(), + gh<_i24.BoardGamesFiltersStore>(), gh<_i17.ScoresStore>(), - gh<_i29.PlaythroughsStore>(), + gh<_i30.PlaythroughsStore>(), gh<_i10.PlayersStore>(), )); - gh.factory<_i34.CreateBoardGameViewModel>(() => _i34.CreateBoardGameViewModel( - gh<_i31.BoardGamesStore>(), - gh<_i7.FileService>(), + gh.factory<_i35.CreateBoardGameViewModel>(() => _i35.CreateBoardGameViewModel( + gh<_i32.BoardGamesStore>(), + gh<_i6.FileService>(), )); - gh.singleton<_i35.GamePlaythroughsDetailsStore>( - _i35.GamePlaythroughsDetailsStore( - gh<_i29.PlaythroughsStore>(), + gh.singleton<_i36.GamePlaythroughsDetailsStore>( + _i36.GamePlaythroughsDetailsStore( + gh<_i30.PlaythroughsStore>(), gh<_i17.ScoresStore>(), gh<_i10.PlayersStore>(), - gh<_i31.BoardGamesStore>(), + gh<_i32.BoardGamesStore>(), )); - gh.singleton<_i36.HotBoardGamesViewModel>(_i36.HotBoardGamesViewModel( - gh<_i31.BoardGamesStore>(), - gh<_i24.BoardGamesGeekService>(), + gh.singleton<_i37.HotBoardGamesViewModel>(_i37.HotBoardGamesViewModel( + gh<_i32.BoardGamesStore>(), + gh<_i25.BoardGamesGeekService>(), gh<_i22.AnalyticsService>(), )); - gh.factory<_i37.PlaysViewModel>(() => _i37.PlaysViewModel( - gh<_i29.PlaythroughsStore>(), - gh<_i31.BoardGamesStore>(), + gh.factory<_i38.PlaysViewModel>(() => _i38.PlaysViewModel( + gh<_i30.PlaythroughsStore>(), + gh<_i32.BoardGamesStore>(), gh<_i10.PlayersStore>(), gh<_i17.ScoresStore>(), gh<_i22.AnalyticsService>(), )); - gh.factory<_i38.PlaythroughMigrationViewModel>(() => - _i38.PlaythroughMigrationViewModel( - gh<_i35.GamePlaythroughsDetailsStore>())); - gh.singleton<_i39.PlaythroughStatisticsViewModel>( - _i39.PlaythroughStatisticsViewModel( + gh.factory<_i39.PlaythroughMigrationViewModel>(() => + _i39.PlaythroughMigrationViewModel( + gh<_i36.GamePlaythroughsDetailsStore>())); + gh.singleton<_i40.PlaythroughStatisticsViewModel>( + _i40.PlaythroughStatisticsViewModel( gh<_i9.PlayerService>(), gh<_i17.ScoresStore>(), - gh<_i35.GamePlaythroughsDetailsStore>(), + gh<_i36.GamePlaythroughsDetailsStore>(), )); - gh.factory<_i40.PlaythroughsGameSettingsViewModel>( - () => _i40.PlaythroughsGameSettingsViewModel( - gh<_i31.BoardGamesStore>(), - gh<_i35.GamePlaythroughsDetailsStore>(), + gh.factory<_i41.PlaythroughsGameSettingsViewModel>( + () => _i41.PlaythroughsGameSettingsViewModel( + gh<_i32.BoardGamesStore>(), + gh<_i36.GamePlaythroughsDetailsStore>(), )); - gh.factory<_i41.PlaythroughsHistoryViewModel>(() => - _i41.PlaythroughsHistoryViewModel( - gh<_i35.GamePlaythroughsDetailsStore>())); - gh.factory<_i42.PlaythroughsLogGameViewModel>( - () => _i42.PlaythroughsLogGameViewModel( + gh.factory<_i42.PlaythroughsHistoryViewModel>(() => + _i42.PlaythroughsHistoryViewModel( + gh<_i36.GamePlaythroughsDetailsStore>())); + gh.factory<_i43.PlaythroughsLogGameViewModel>( + () => _i43.PlaythroughsLogGameViewModel( gh<_i10.PlayersStore>(), - gh<_i35.GamePlaythroughsDetailsStore>(), + gh<_i36.GamePlaythroughsDetailsStore>(), gh<_i22.AnalyticsService>(), )); - gh.factory<_i43.PlaythroughsViewModel>(() => _i43.PlaythroughsViewModel( - gh<_i35.GamePlaythroughsDetailsStore>(), + gh.factory<_i44.PlaythroughsViewModel>(() => _i44.PlaythroughsViewModel( + gh<_i36.GamePlaythroughsDetailsStore>(), gh<_i10.PlayersStore>(), gh<_i22.AnalyticsService>(), - gh<_i26.BoardGamesService>(), + gh<_i27.BoardGamesService>(), gh<_i21.UserStore>(), )); - gh.singleton<_i44.SettingsViewModel>(_i44.SettingsViewModel( - gh<_i7.FileService>(), - gh<_i26.BoardGamesService>(), - gh<_i4.BoardGamesFiltersService>(), + gh.singleton<_i45.SettingsViewModel>(_i45.SettingsViewModel( + gh<_i6.FileService>(), + gh<_i27.BoardGamesService>(), + gh<_i23.BoardGamesFiltersService>(), gh<_i9.PlayerService>(), gh<_i20.UserService>(), - gh<_i28.PlaythroughService>(), + gh<_i29.PlaythroughService>(), gh<_i16.ScoreService>(), gh<_i14.PreferencesService>(), gh<_i3.AppStore>(), gh<_i21.UserStore>(), - gh<_i31.BoardGamesStore>(), + gh<_i32.BoardGamesStore>(), )); - gh.factory<_i45.BoardGameDetailsViewModel>( - () => _i45.BoardGameDetailsViewModel( - gh<_i31.BoardGamesStore>(), + gh.factory<_i46.BoardGameDetailsViewModel>( + () => _i46.BoardGameDetailsViewModel( + gh<_i32.BoardGamesStore>(), gh<_i22.AnalyticsService>(), )); - gh.factory<_i46.EditPlaythoughViewModel>(() => - _i46.EditPlaythoughViewModel(gh<_i35.GamePlaythroughsDetailsStore>())); - gh.factory<_i47.HomeViewModel>(() => _i47.HomeViewModel( + gh.factory<_i47.EditPlaythoughViewModel>(() => + _i47.EditPlaythoughViewModel(gh<_i36.GamePlaythroughsDetailsStore>())); + gh.factory<_i48.HomeViewModel>(() => _i48.HomeViewModel( gh<_i22.AnalyticsService>(), gh<_i15.RateAndReviewService>(), gh<_i11.PlayersViewModel>(), - gh<_i23.BoardGamesFiltersStore>(), - gh<_i33.CollectionsViewModel>(), - gh<_i36.HotBoardGamesViewModel>(), - gh<_i37.PlaysViewModel>(), + gh<_i24.BoardGamesFiltersStore>(), + gh<_i34.CollectionsViewModel>(), + gh<_i37.HotBoardGamesViewModel>(), + gh<_i38.PlaysViewModel>(), gh<_i3.AppStore>(), gh<_i19.SearchStore>(), - gh<_i31.BoardGamesStore>(), - gh<_i25.BoardGamesSearchService>(), + gh<_i32.BoardGamesStore>(), + gh<_i26.BoardGamesSearchService>(), )); return getIt; } -class _$RegisterModule extends _i48.RegisterModule {} +class _$RegisterModule extends _i49.RegisterModule {} diff --git a/board_games_companion/lib/main.dart b/board_games_companion/lib/main.dart index 9d1803c9..c9c5ab82 100644 --- a/board_games_companion/lib/main.dart +++ b/board_games_companion/lib/main.dart @@ -36,7 +36,9 @@ import 'models/sort_by.dart'; import 'services/preferences_service.dart'; Future main() async { - Fimber.plantTree(DebugTree()); + Fimber.plantTree(DebugTree( + useColors: true, + )); runZonedGuarded(() async { WidgetsFlutterBinding.ensureInitialized(); diff --git a/board_games_companion/lib/models/playthroughs/playthrough_details.dart b/board_games_companion/lib/models/playthroughs/playthrough_details.dart index 51003889..13cfc2ce 100644 --- a/board_games_companion/lib/models/playthroughs/playthrough_details.dart +++ b/board_games_companion/lib/models/playthroughs/playthrough_details.dart @@ -22,7 +22,7 @@ class PlaythroughDetails with _$PlaythroughDetails { const PlaythroughDetails._(); - int? get daysSinceStart => DateTime.now().toUtc().difference(playthrough.startDate).inDays; + int get daysSinceStart => DateTime.now().toUtc().difference(playthrough.startDate).inDays; Duration get duration { final nowUtc = DateTime.now().toUtc(); diff --git a/board_games_companion/lib/pages/playthroughs/playthroughs_history_page.dart b/board_games_companion/lib/pages/playthroughs/playthroughs_history_page.dart index c040cce1..efff3c10 100644 --- a/board_games_companion/lib/pages/playthroughs/playthroughs_history_page.dart +++ b/board_games_companion/lib/pages/playthroughs/playthroughs_history_page.dart @@ -348,13 +348,18 @@ class _PlaythroughGameStats extends StatelessWidget { mainAxisAlignment: MainAxisAlignment.spaceBetween, children: [ CalendarCard(playthroughDetails.startDate), + if (playthroughDetails.daysSinceStart == 0) + const Text(AppText.playthroughsHistoryPageToday), + if (playthroughDetails.daysSinceStart == 1) + const Text(AppText.playthroughsHistoryPageYesterday), + if (playthroughDetails.daysSinceStart > 1) + _PlaythroughItemDetail( + playthroughDetails.daysSinceStart.toString(), + AppText.playthroughsHistoryPageDaysAgo, + ), _PlaythroughItemDetail( - playthroughDetails.daysSinceStart?.toString(), - 'day(s) ago', - ), - _PlaythroughItemDetail( - '$playthroughNumber${playthroughNumber.toOrdinalAbbreviations()}', - 'game', + '$playthroughNumber${playthroughNumber.toOrdinalAbbreviation()}', + AppText.playthroughsHistoryPageGameNumberSubtitle, ), _PlaythroughDuration(playthroughDetails: playthroughDetails), ], diff --git a/board_games_companion/lib/pages/playthroughs/playthroughs_page.dart b/board_games_companion/lib/pages/playthroughs/playthroughs_page.dart index 6cb154d6..06d3f40c 100644 --- a/board_games_companion/lib/pages/playthroughs/playthroughs_page.dart +++ b/board_games_companion/lib/pages/playthroughs/playthroughs_page.dart @@ -200,9 +200,11 @@ class PlaythroughsPageState extends BasePageState } catch (e, stack) { FirebaseCrashlytics.instance.recordError(e, stack); } finally { - setState(() { - _showImportGamesLoadingIndicator = false; - }); + if (mounted) { + setState(() { + _showImportGamesLoadingIndicator = false; + }); + } } } diff --git a/board_games_companion/lib/services/analytics_service.dart b/board_games_companion/lib/services/analytics_service.dart index b133851e..04dd5fcf 100644 --- a/board_games_companion/lib/services/analytics_service.dart +++ b/board_games_companion/lib/services/analytics_service.dart @@ -1,3 +1,4 @@ +import 'package:fimber/fimber.dart'; import 'package:firebase_analytics/firebase_analytics.dart'; import 'package:injectable/injectable.dart'; @@ -14,6 +15,7 @@ class AnalyticsService { required String name, Map? parameters, }) async { + Fimber.i('Captured an $name event with $parameters'); await _firebaseAnalytics.logEvent(name: name, parameters: parameters); await _rateAndReviewService.increaseNumberOfSignificantActions(); } diff --git a/board_games_companion/lib/services/board_games_filters_service.dart b/board_games_companion/lib/services/board_games_filters_service.dart index 6147079d..c8e9e667 100644 --- a/board_games_companion/lib/services/board_games_filters_service.dart +++ b/board_games_companion/lib/services/board_games_filters_service.dart @@ -6,6 +6,8 @@ import 'hive_base_service.dart'; @singleton class BoardGamesFiltersService extends BaseHiveService { + BoardGamesFiltersService(super._hive); + static const String _collectionFiltersPreferenceKey = 'collectionFilters'; Future retrieveCollectionFiltersPreferences() async { diff --git a/board_games_companion/lib/services/board_games_service.dart b/board_games_companion/lib/services/board_games_service.dart index de40842e..fc9a5e62 100644 --- a/board_games_companion/lib/services/board_games_service.dart +++ b/board_games_companion/lib/services/board_games_service.dart @@ -10,7 +10,7 @@ import 'hive_base_service.dart'; @singleton class BoardGamesService extends BaseHiveService { - BoardGamesService(this._boardGameGeekService); + BoardGamesService(super.hive, this._boardGameGeekService); final BoardGamesGeekService _boardGameGeekService; diff --git a/board_games_companion/lib/services/hive_base_service.dart b/board_games_companion/lib/services/hive_base_service.dart index 93dbb6f5..4caddf72 100644 --- a/board_games_companion/lib/services/hive_base_service.dart +++ b/board_games_companion/lib/services/hive_base_service.dart @@ -6,6 +6,10 @@ import 'package:uuid/uuid.dart'; import '../common/hive_boxes.dart'; abstract class BaseHiveService { + BaseHiveService(this._hive); + + final HiveInterface _hive; + @protected final uuid = const Uuid(); @@ -13,14 +17,14 @@ abstract class BaseHiveService { String get _boxName => HiveBoxes.boxesNamesMap[TService] ?? ''; - bool get _isBoxOpen => Hive.isBoxOpen(_boxName); + bool get _isBoxOpen => _hive.isBoxOpen(_boxName); void closeBox() { if (_boxName.isNullOrBlank || !_isBoxOpen) { return; } - Hive.box(_boxName).close(); + _hive.box(_boxName).close(); } Future ensureBoxOpen() async { @@ -29,7 +33,7 @@ abstract class BaseHiveService { } if (!_isBoxOpen) { - storageBox = await Hive.openBox(_boxName); + storageBox = await _hive.openBox(_boxName); } return storageBox != null; diff --git a/board_games_companion/lib/services/injectable_register_module.dart b/board_games_companion/lib/services/injectable_register_module.dart index fcce7ee9..0e11c959 100644 --- a/board_games_companion/lib/services/injectable_register_module.dart +++ b/board_games_companion/lib/services/injectable_register_module.dart @@ -1,4 +1,5 @@ import 'package:firebase_analytics/firebase_analytics.dart'; +import 'package:hive/hive.dart'; import 'package:injectable/injectable.dart'; @module @@ -6,6 +7,9 @@ abstract class RegisterModule { @singleton FirebaseAnalytics get firebaseAnalytics => FirebaseAnalytics.instance; + @injectable + HiveInterface get hive => Hive; + @singleton FirebaseAnalyticsObserver get firebaseAnalyticsObserver => FirebaseAnalyticsObserver(analytics: firebaseAnalytics); diff --git a/board_games_companion/lib/services/player_service.dart b/board_games_companion/lib/services/player_service.dart index 9fabe70a..f02a197c 100644 --- a/board_games_companion/lib/services/player_service.dart +++ b/board_games_companion/lib/services/player_service.dart @@ -11,7 +11,7 @@ import 'hive_base_service.dart'; @singleton class PlayerService extends BaseHiveService { - PlayerService(this.fileService); + PlayerService(super.hive, this.fileService); final FileService fileService; diff --git a/board_games_companion/lib/services/playthroughs_service.dart b/board_games_companion/lib/services/playthroughs_service.dart index 7d5d418b..60b5c999 100644 --- a/board_games_companion/lib/services/playthroughs_service.dart +++ b/board_games_companion/lib/services/playthroughs_service.dart @@ -1,3 +1,4 @@ +import 'package:fimber/fimber.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:injectable/injectable.dart'; @@ -11,7 +12,7 @@ import 'score_service.dart'; @singleton class PlaythroughService extends BaseHiveService { - PlaythroughService(this.scoreService); + PlaythroughService(super.hive, this.scoreService); final ScoreService scoreService; @@ -57,6 +58,7 @@ class PlaythroughService extends BaseHiveService? notes, }) async { + Fimber.d('Creating a Playthrough...'); if ((boardGameId.isEmpty) || (playerIds.isEmpty)) { return null; } @@ -85,9 +87,10 @@ class PlaythroughService extends BaseHiveService { + PreferencesService(super.hive); + static const String _firstTimeAppLaunchDateKey = 'firstTimeLaunchDate'; static const String _appLaunchDateKey = 'applaunchDate'; static const String _remindMeLaterDateKey = 'remindMeLater'; diff --git a/board_games_companion/lib/services/score_service.dart b/board_games_companion/lib/services/score_service.dart index 1ec4cbbc..50e6899f 100644 --- a/board_games_companion/lib/services/score_service.dart +++ b/board_games_companion/lib/services/score_service.dart @@ -1,4 +1,5 @@ import 'package:basics/basics.dart'; +import 'package:fimber/fimber.dart'; import 'package:injectable/injectable.dart'; import '../models/hive/score.dart'; @@ -6,10 +7,14 @@ import 'hive_base_service.dart'; @singleton class ScoreService extends BaseHiveService { + ScoreService(super.hive); + Future addOrUpdateScore(Score score) async { + Fimber.d('Saving a score $score'); if ((score.playthroughId?.isEmpty ?? true) || (score.playerId.isEmpty) || (score.boardGameId.isEmpty)) { + Fimber.e('Score is missing required properties to be saved.'); return false; } diff --git a/board_games_companion/lib/services/search_service.dart b/board_games_companion/lib/services/search_service.dart index 7321e3a4..62f4c634 100644 --- a/board_games_companion/lib/services/search_service.dart +++ b/board_games_companion/lib/services/search_service.dart @@ -6,6 +6,8 @@ import 'hive_base_service.dart'; @singleton class SearchService extends BaseHiveService { + SearchService(super.hive); + Future addOrUpdateScore(SearchHistoryEntry searchHistoryEntry) async { if (!await ensureBoxOpen()) { return false; diff --git a/board_games_companion/lib/services/user_service.dart b/board_games_companion/lib/services/user_service.dart index 7203241c..d4015c7e 100644 --- a/board_games_companion/lib/services/user_service.dart +++ b/board_games_companion/lib/services/user_service.dart @@ -5,6 +5,8 @@ import 'hive_base_service.dart'; @singleton class UserService extends BaseHiveService { + UserService(super.hive); + Future retrieveUser() async { if (!await ensureBoxOpen()) { return null; diff --git a/board_games_companion/lib/stores/game_playthroughs_details_store.dart b/board_games_companion/lib/stores/game_playthroughs_details_store.dart index 7420d1e6..4e1817c3 100644 --- a/board_games_companion/lib/stores/game_playthroughs_details_store.dart +++ b/board_games_companion/lib/stores/game_playthroughs_details_store.dart @@ -1,6 +1,7 @@ // ignore_for_file: library_private_types_in_public_api import 'package:collection/collection.dart'; +import 'package:fimber/fimber.dart'; import 'package:firebase_crashlytics/firebase_crashlytics.dart'; import 'package:injectable/injectable.dart'; import 'package:mobx/mobx.dart'; @@ -122,6 +123,7 @@ abstract class _GamePlaythroughsDetailsStore with Store { return null; } + Fimber.i('Mapping Playthrough to PlaythroughDetails'); final newPlaythroughDetails = createPlaythroughDetails(newPlaythrough); playthroughsDetails.add(newPlaythroughDetails); return newPlaythroughDetails; diff --git a/board_games_companion/lib/stores/scores_store.dart b/board_games_companion/lib/stores/scores_store.dart index a9ed636d..1ab4e7ad 100644 --- a/board_games_companion/lib/stores/scores_store.dart +++ b/board_games_companion/lib/stores/scores_store.dart @@ -1,5 +1,6 @@ // ignore_for_file: library_private_types_in_public_api +import 'package:fimber/fimber.dart'; import 'package:injectable/injectable.dart'; import 'package:mobx/mobx.dart'; @@ -24,9 +25,12 @@ abstract class _ScoresStore with Store { } Future refreshScores(String playthroughId) async { + Fimber.d('Refreshing $playthroughId scores'); final playthroughScores = await _scoreService.retrieveScoresForPlaythrough(playthroughId); + // Using for loops because the score gets updated while the loop executes // ignore: prefer_foreach for (final score in playthroughScores) { + Fimber.d('Updating $score'); _addOrUpdateScore(score); } } diff --git a/board_games_companion/lib/utilities/analytics_route_observer.dart b/board_games_companion/lib/utilities/analytics_route_observer.dart index 744ae751..5dd622e1 100644 --- a/board_games_companion/lib/utilities/analytics_route_observer.dart +++ b/board_games_companion/lib/utilities/analytics_route_observer.dart @@ -52,9 +52,9 @@ class AnalyticsRouteObserver extends RouteObserver> { Fimber.d( 'Pushed a route $routeName. Current page is ${route.toScreenName()} with backing class ${route.toScreenClassName()}', ); - Fimber.d( - 'Pushed route arguments ${route.settings.arguments}', - ); + if (route.settings.arguments != null) { + Fimber.d('Pushed route arguments ${route.settings.arguments}'); + } switch (routeName) { case BoardGamesDetailsPage.pageRoute: diff --git a/board_games_companion/pubspec.lock b/board_games_companion/pubspec.lock index 7684fa15..798dd084 100644 --- a/board_games_companion/pubspec.lock +++ b/board_games_companion/pubspec.lock @@ -241,6 +241,14 @@ packages: url: "https://pub.dev" source: hosted version: "3.2.0" + coverage: + dependency: transitive + description: + name: coverage + sha256: "2fb815080e44a09b85e0f2ca8a820b15053982b2e714b59267719e8a9ff17097" + url: "https://pub.dev" + source: hosted + version: "1.6.3" cross_file: dependency: transitive description: @@ -888,6 +896,22 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.1" + mocktail: + dependency: "direct main" + description: + name: mocktail + sha256: "80a996cd9a69284b3dc521ce185ffe9150cde69767c2d3a0720147d93c0cef53" + url: "https://pub.dev" + source: hosted + version: "0.3.0" + node_preamble: + dependency: transitive + description: + name: node_preamble + sha256: "6e7eac89047ab8a8d26cf16127b5ed26de65209847630400f9aefd7cd5c730db" + url: "https://pub.dev" + source: hosted + version: "2.0.2" numberpicker: dependency: "direct main" description: @@ -1152,6 +1176,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.4.0" + shelf_packages_handler: + dependency: transitive + description: + name: shelf_packages_handler + sha256: "89f967eca29607c933ba9571d838be31d67f53f6e4ee15147d5dc2934fee1b1e" + url: "https://pub.dev" + source: hosted + version: "3.0.2" + shelf_static: + dependency: transitive + description: + name: shelf_static + sha256: a41d3f53c4adf0f57480578c1d61d90342cd617de7fc8077b1304643c2d85c1e + url: "https://pub.dev" + source: hosted + version: "1.1.2" shelf_web_socket: dependency: transitive description: @@ -1197,6 +1237,22 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.3" + source_map_stack_trace: + dependency: transitive + description: + name: source_map_stack_trace + sha256: "84cf769ad83aa6bb61e0aa5a18e53aea683395f196a6f39c4c881fb90ed4f7ae" + url: "https://pub.dev" + source: hosted + version: "2.1.1" + source_maps: + dependency: transitive + description: + name: source_maps + sha256: "708b3f6b97248e5781f493b765c3337db11c5d2c81c3094f10904bfa8004c703" + url: "https://pub.dev" + source: hosted + version: "0.10.12" source_span: dependency: transitive description: @@ -1277,6 +1333,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.2.1" + test: + dependency: transitive + description: + name: test + sha256: a5fcd2d25eeadbb6589e80198a47d6a464ba3e2049da473943b8af9797900c2d + url: "https://pub.dev" + source: hosted + version: "1.22.0" test_api: dependency: transitive description: @@ -1285,6 +1349,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.16" + test_core: + dependency: transitive + description: + name: test_core + sha256: "0ef9755ec6d746951ba0aabe62f874b707690b5ede0fecc818b138fcc9b14888" + url: "https://pub.dev" + source: hosted + version: "0.4.20" timing: dependency: transitive description: @@ -1389,6 +1461,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + vm_service: + dependency: transitive + description: + name: vm_service + sha256: e7fb6c2282f7631712b69c19d1bff82f3767eea33a2321c14fa59ad67ea391c7 + url: "https://pub.dev" + source: hosted + version: "9.4.0" watcher: dependency: transitive description: @@ -1405,6 +1485,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.3.0" + webkit_inspection_protocol: + dependency: transitive + description: + name: webkit_inspection_protocol + sha256: "67d3a8b6c79e1987d19d848b0892e582dbb0c66c57cc1fef58a177dd2aa2823d" + url: "https://pub.dev" + source: hosted + version: "1.2.0" win32: dependency: transitive description: diff --git a/board_games_companion/pubspec.yaml b/board_games_companion/pubspec.yaml index ef4fcf00..67a1de9d 100644 --- a/board_games_companion/pubspec.yaml +++ b/board_games_companion/pubspec.yaml @@ -55,6 +55,7 @@ dependencies: image_picker: ^0.8.4+2 logger: ^1.1.0 mobx: ^2.0.7+4 + mocktail: ^0.3.0 numberpicker: ^2.1.1 path: ^1.8.0 path_provider: ^2.0.5 diff --git a/board_games_companion/test/mocks/hive_interface_mock.dart b/board_games_companion/test/mocks/hive_interface_mock.dart new file mode 100644 index 00000000..880beafd --- /dev/null +++ b/board_games_companion/test/mocks/hive_interface_mock.dart @@ -0,0 +1,4 @@ +import 'package:hive/hive.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockHiveInterface extends Mock implements HiveInterface {} diff --git a/board_games_companion/test/mocks/playthrough_hive_box_mock.dart b/board_games_companion/test/mocks/playthrough_hive_box_mock.dart new file mode 100644 index 00000000..0e8f1d39 --- /dev/null +++ b/board_games_companion/test/mocks/playthrough_hive_box_mock.dart @@ -0,0 +1,5 @@ +import 'package:board_games_companion/models/hive/playthrough.dart'; +import 'package:hive/hive.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockPlaythroughHiveBox extends Mock implements Box {} diff --git a/board_games_companion/test/mocks/score_hive_box_mock.dart b/board_games_companion/test/mocks/score_hive_box_mock.dart new file mode 100644 index 00000000..52465dfa --- /dev/null +++ b/board_games_companion/test/mocks/score_hive_box_mock.dart @@ -0,0 +1,5 @@ +import 'package:board_games_companion/models/hive/score.dart'; +import 'package:hive/hive.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockScoreHiveBox extends Mock implements Box {} diff --git a/board_games_companion/test/mocks/score_service_mock.dart b/board_games_companion/test/mocks/score_service_mock.dart new file mode 100644 index 00000000..38aaa1f1 --- /dev/null +++ b/board_games_companion/test/mocks/score_service_mock.dart @@ -0,0 +1,4 @@ +import 'package:board_games_companion/services/score_service.dart'; +import 'package:mocktail/mocktail.dart'; + +class MockScoreService extends Mock implements ScoreService {} diff --git a/board_games_companion/test/services/playthrough_service_test.dart b/board_games_companion/test/services/playthrough_service_test.dart new file mode 100644 index 00000000..c9da0560 --- /dev/null +++ b/board_games_companion/test/services/playthrough_service_test.dart @@ -0,0 +1,159 @@ +import 'package:board_games_companion/common/enums/playthrough_status.dart'; +import 'package:board_games_companion/models/hive/player.dart'; +import 'package:board_games_companion/models/hive/playthrough.dart'; +import 'package:board_games_companion/models/hive/score.dart'; +import 'package:board_games_companion/models/player_score.dart'; +import 'package:board_games_companion/services/playthroughs_service.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; + +import '../mocks/hive_interface_mock.dart'; +import '../mocks/playthrough_hive_box_mock.dart'; +import '../mocks/score_service_mock.dart'; + +void main() { + late MockHiveInterface mockHiveInterface; + late MockPlaythroughHiveBox mockPlaythroughHiveBox; + late MockScoreService mockScoreService; + + late PlaythroughService playthroughService; + + final samplePlaythrough = Playthrough( + id: '123', + boardGameId: '987', + playerIds: [], + scoreIds: [], + startDate: DateTime.now(), + ); + + const sampleScore = Score( + boardGameId: '', + id: '', + playerId: '', + ); + + setUp(() { + mockScoreService = MockScoreService(); + when(() => mockScoreService.addOrUpdateScore(any())).thenAnswer((_) => Future.value(true)); + mockPlaythroughHiveBox = MockPlaythroughHiveBox(); + when(() => mockPlaythroughHiveBox.put(any(), any())).thenAnswer((_) => Future.value()); + mockHiveInterface = MockHiveInterface(); + when(() => mockHiveInterface.isBoxOpen(any())).thenAnswer((_) => false); + when(() => mockHiveInterface.openBox(any())) + .thenAnswer((_) async => mockPlaythroughHiveBox); + + playthroughService = PlaythroughService(mockHiveInterface, mockScoreService); + }); + + setUpAll(() { + // MK Required fallback of a dummy objects when mocktail needs to return a model of such type + registerFallbackValue(samplePlaythrough); + registerFallbackValue(sampleScore); + }); + + tearDown(() { + reset(mockPlaythroughHiveBox); + reset(mockHiveInterface); + reset(mockScoreService); + }); + + group('Create playthrough ', () { + test( + 'GIVEN playthrough service ' + 'WHEN creating a playthrough ' + 'AND board game id is empty ' + 'THEN the playthrough does not get created ', () async { + const boardGameId = ''; + final createdPlaythrough = await playthroughService.createPlaythrough( + boardGameId, + [], + {}, + DateTime.now(), + null, + ); + + expect(createdPlaythrough, isNull); + verifyNever(() => mockPlaythroughHiveBox.put(any(), any())); + }); + + test( + 'GIVEN playthrough service ' + 'WHEN creating a playthrough ' + 'AND duration is not provided ' + 'THEN the playthrough should be in Started status ', () async { + const boardGameId = '123'; + const playerIds = ['434']; + const Duration? duration = null; + final createdPlaythrough = await playthroughService.createPlaythrough( + boardGameId, + playerIds, + {}, + DateTime.now(), + duration, + ); + + expect(createdPlaythrough!.status, PlaythroughStatus.Started); + }); + + test( + 'GIVEN playthrough service ' + 'WHEN creating a playthrough ' + 'AND duration is provided ' + 'THEN the playthrough should be in Finished status ', () async { + const boardGameId = '123'; + const playerIds = ['434']; + const duration = Duration(seconds: 100); + final createdPlaythrough = await playthroughService.createPlaythrough( + boardGameId, + playerIds, + {}, + DateTime.now(), + duration, + ); + + expect(createdPlaythrough!.status, PlaythroughStatus.Finished); + }); + + test( + 'GIVEN playthrough service ' + 'WHEN creating a playthrough ' + 'AND player scores are provided ' + 'THEN the playthrough should be saved with the player scores ', () async { + const boardGameId = '123'; + const playerIds = ['434', '564']; + final playerScores = { + playerIds[0]: PlayerScore( + player: Player(id: playerIds[0]), + score: Score( + id: '12938', + boardGameId: boardGameId, + playerId: playerIds[0], + ), + ), + playerIds[1]: PlayerScore( + player: Player(id: playerIds[1]), + score: Score( + id: '98223', + boardGameId: boardGameId, + playerId: playerIds[1], + ), + ), + }; + const duration = Duration(seconds: 100); + final createdPlaythrough = await playthroughService.createPlaythrough( + boardGameId, + playerIds, + playerScores, + DateTime.now(), + duration, + ); + + verify(() => mockScoreService.addOrUpdateScore(any())).called(playerIds.length); + expect(createdPlaythrough!.playerIds, playerIds); + expect( + createdPlaythrough.scoreIds, + playerScores.values.map((playerScore) => playerScore.score.id), + ); + }); + }); +} diff --git a/board_games_companion/test/services/score_service_test.dart b/board_games_companion/test/services/score_service_test.dart new file mode 100644 index 00000000..44f79b06 --- /dev/null +++ b/board_games_companion/test/services/score_service_test.dart @@ -0,0 +1,77 @@ +import 'package:board_games_companion/models/hive/score.dart'; +import 'package:board_games_companion/services/score_service.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:mocktail/mocktail.dart'; + +import '../mocks/hive_interface_mock.dart'; +import '../mocks/score_hive_box_mock.dart'; + +void main() { + late MockHiveInterface mockHiveInterface; + late MockScoreHiveBox mockScoreHiveBox; + + late ScoreService scoreService; + + const sampleScore = Score( + boardGameId: '', + id: '', + playerId: '', + ); + + setUp(() { + mockScoreHiveBox = MockScoreHiveBox(); + when(() => mockScoreHiveBox.put(any(), any())).thenAnswer((_) => Future.value()); + mockHiveInterface = MockHiveInterface(); + when(() => mockHiveInterface.isBoxOpen(any())).thenAnswer((_) => false); + when(() => mockHiveInterface.openBox(any())).thenAnswer((_) async => mockScoreHiveBox); + + scoreService = ScoreService(mockHiveInterface); + }); + + setUpAll(() { + // MK Required fallback of a dummy score when mocktail needs to return a model of such type + registerFallbackValue(sampleScore); + }); + + tearDown(() { + reset(mockHiveInterface); + reset(mockScoreHiveBox); + }); + + group('Saving score ', () { + void verifyScore(Score score, bool expectedResult) { + test( + 'GIVEN a score $score ' + 'WHEN saving it ' + 'THEN saving should ${expectedResult ? "succeed" : "fail"} ', () async { + final createResult = await scoreService.addOrUpdateScore(score); + expect(createResult, expectedResult); + }); + } + + verifyScore(sampleScore, false); + verifyScore(sampleScore.copyWith(id: '123'), false); + verifyScore(sampleScore.copyWith(id: '123', boardGameId: '321'), false); + verifyScore(sampleScore.copyWith(id: '123', boardGameId: '321', playerId: '834'), false); + verifyScore( + sampleScore.copyWith(id: '123', boardGameId: '321', playerId: '834', playthroughId: '123'), + true, + ); + + test( + 'GIVEN a score ' + 'WHEN saving it ' + 'THEN the score should be put in the hive box ', () async { + final validScore = sampleScore.copyWith( + id: '123', + boardGameId: '321', + playerId: '834', + playthroughId: '123', + ); + + await scoreService.addOrUpdateScore(validScore); + + verify(() => mockScoreHiveBox.put(validScore.id, validScore)).called(1); + }); + }); +} diff --git a/board_games_companion/test/widget_test.dart b/board_games_companion/test/widget_test.dart deleted file mode 100644 index 570e0e47..00000000 --- a/board_games_companion/test/widget_test.dart +++ /dev/null @@ -1,8 +0,0 @@ -// This is a basic Flutter widget test. -// -// To perform an interaction with a widget in your test, use the WidgetTester -// utility that Flutter provides. For example, you can send tap and scroll -// gestures. You can also use WidgetTester to find child widgets in the widget -// tree, read text, and verify that the values of widget properties are correct. - -void main() {} diff --git a/cloud_infrastructure/terraform/dev/main.tf b/cloud_infrastructure/terraform/dev/main.tf index d47b68af..3356562e 100644 --- a/cloud_infrastructure/terraform/dev/main.tf +++ b/cloud_infrastructure/terraform/dev/main.tf @@ -38,7 +38,8 @@ variable "resources" { sku = string }) queue = object({ - name = string + name = string + send_policy_name = string }) }) cache_function = object({ @@ -48,6 +49,10 @@ variable "resources" { name = string }) }) + key_vault = object({ + name = string + sku = string + }) }) nullable = false } @@ -69,11 +74,17 @@ provider "azurerm" { features {} } +data "azurerm_client_config" "current" {} + resource "azurerm_resource_group" "rg" { name = var.resource_group.name location = var.resource_group.location } +### +### Storage +### + resource "azurerm_storage_account" "sa" { name = var.resources.storage_account.name resource_group_name = azurerm_resource_group.rg.name @@ -82,6 +93,10 @@ resource "azurerm_storage_account" "sa" { account_replication_type = "LRS" } +### +### Logs +### + resource "azurerm_log_analytics_workspace" "log" { name = var.resources.analytics_workspace.name resource_group_name = azurerm_resource_group.rg.name @@ -90,13 +105,6 @@ resource "azurerm_log_analytics_workspace" "log" { retention_in_days = var.resources.analytics_workspace.retention_in_days } -resource "azurerm_container_app_environment" "cae" { - name = var.resources.container_app_environemnt.name - resource_group_name = azurerm_resource_group.rg.name - location = var.resources.container_app_environemnt.location - log_analytics_workspace_id = azurerm_log_analytics_workspace.log.id -} - resource "azurerm_application_insights" "search_service_appi" { name = var.resources.application_insights.search_service.name resource_group_name = azurerm_resource_group.rg.name @@ -105,6 +113,17 @@ resource "azurerm_application_insights" "search_service_appi" { application_type = "web" } +### +### Container Apps +### + +resource "azurerm_container_app_environment" "cae" { + name = var.resources.container_app_environemnt.name + resource_group_name = azurerm_resource_group.rg.name + location = var.resources.container_app_environemnt.location + log_analytics_workspace_id = azurerm_log_analytics_workspace.log.id +} + resource "azurerm_container_app" "search_service_ca" { name = var.resources.container_apps.search_service.name container_app_environment_id = azurerm_container_app_environment.cae.id @@ -120,6 +139,10 @@ resource "azurerm_container_app" "search_service_ca" { } } + identity { + type = "SystemAssigned" + } + ingress { external_enabled = true target_port = 80 @@ -145,7 +168,9 @@ resource "azurerm_container_app" "search_service_ca" { } } - +### +### Service Bus +### resource "azurerm_servicebus_namespace" "sbns" { name = var.resources.cache_service_bus.namespace.name resource_group_name = azurerm_resource_group.rg.name @@ -158,6 +183,17 @@ resource "azurerm_servicebus_queue" "sbq" { namespace_id = azurerm_servicebus_namespace.sbns.id } +resource "azurerm_servicebus_queue_authorization_rule" "sbq_send_policy" { + name = var.resources.cache_service_bus.queue.send_policy_name + queue_id = azurerm_servicebus_queue.sbq.id + + listen = false + send = true + manage = false +} + +### Functions + resource "azurerm_service_plan" "asp" { name = var.resources.cache_function.service_plan.name resource_group_name = azurerm_resource_group.rg.name @@ -166,6 +202,7 @@ resource "azurerm_service_plan" "asp" { sku_name = "Y1" } + resource "azurerm_linux_function_app" "func" { name = var.resources.cache_function.name resource_group_name = azurerm_resource_group.rg.name @@ -183,3 +220,65 @@ resource "azurerm_linux_function_app" "func" { } } +### +### Key Vault +### + +resource "azurerm_key_vault" "kv" { + name = var.resources.key_vault.name + location = azurerm_resource_group.rg.location + resource_group_name = azurerm_resource_group.rg.name + tenant_id = data.azurerm_client_config.current.tenant_id + soft_delete_retention_days = 7 + purge_protection_enabled = false + + sku_name = var.resources.key_vault.sku + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = data.azurerm_client_config.current.object_id + + key_permissions = [ + "Create", + "Get", + ] + + secret_permissions = [ + "Get", + "List", + "Delete", + "Recover", + "Backup", + "Restore", + "Set", + ] + } + + access_policy { + tenant_id = data.azurerm_client_config.current.tenant_id + object_id = azurerm_container_app.search_service_ca.identity.0.principal_id + + secret_permissions = [ + "Get", + ] + } +} + +resource "azurerm_key_vault_secret" "kv_queue_send_connection_string" { + name = "AppSettings--CacheSettings--SendConnectionString" + value = azurerm_servicebus_queue_authorization_rule.sbq_send_policy.primary_connection_string + key_vault_id = azurerm_key_vault.kv.id +} + +resource "azurerm_key_vault_secret" "kv_queue_send_name" { + name = "AppSettings--CacheSettings--QueueName" + value = var.resources.cache_service_bus.queue.send_policy_name + key_vault_id = azurerm_key_vault.kv.id +} + +resource "azurerm_key_vault_secret" "kv_application_insights_connection_string" { + name = "ApplicationInsights--ConnectionString" + value = azurerm_application_insights.search_service_appi.connection_string + key_vault_id = azurerm_key_vault.kv.id +} + diff --git a/cloud_infrastructure/terraform/dev/terraform.tfvars.json b/cloud_infrastructure/terraform/dev/terraform.tfvars.json index 6dc0f428..0cc63893 100644 --- a/cloud_infrastructure/terraform/dev/terraform.tfvars.json +++ b/cloud_infrastructure/terraform/dev/terraform.tfvars.json @@ -36,7 +36,8 @@ "sku": "Basic" }, "queue": { - "name": "bgc-cache-service-bus-dev-sbq" + "name": "bgc-cache-service-bus-dev-sbq", + "send_policy_name": "bgc-cache-service-bus-dev-send-policy" } }, "cache_function": { @@ -45,6 +46,10 @@ "service_plan": { "name": "bgc-search-queue-function-dev-asp" } + }, + "key_vault": { + "name": "bgc-dev-kv", + "sku": "standard" } } } \ No newline at end of file diff --git a/cloud_infrastructure/terraform/prod/main.tf b/cloud_infrastructure/terraform/prod/main.tf index b66903cf..d653527e 100644 --- a/cloud_infrastructure/terraform/prod/main.tf +++ b/cloud_infrastructure/terraform/prod/main.tf @@ -160,6 +160,15 @@ resource "azurerm_servicebus_queue" "sbq" { namespace_id = azurerm_servicebus_namespace.sbns.id } +resource "azurerm_servicebus_queue_authorization_rule" "sbqsendpolicy" { + name = var.resources.cache_service_bus.queue.send_policy_name + queue_id = azurerm_servicebus_queue.sbq.id + + listen = false + send = true + manage = false +} + resource "azurerm_service_plan" "asp" { name = var.resources.cache_function.service_plan.name resource_group_name = azurerm_resource_group.rg.name diff --git a/cloud_infrastructure/terraform/prod/terraform.tfvars.json b/cloud_infrastructure/terraform/prod/terraform.tfvars.json index 4b555969..70c43fab 100644 --- a/cloud_infrastructure/terraform/prod/terraform.tfvars.json +++ b/cloud_infrastructure/terraform/prod/terraform.tfvars.json @@ -36,7 +36,8 @@ "sku": "Basic" }, "queue": { - "name": "bgc-cache-service-bus-prod-sbq" + "name": "bgc-cache-service-bus-prod-sbq", + "send_policy_name": "bgc-cache-service-bus-prod-send-policy" } }, "cache_function": { diff --git a/pipelines/mobile_app/build-pipeline.yml b/pipelines/mobile_app/build-pipeline.yml index 28a7272d..fbd89390 100644 --- a/pipelines/mobile_app/build-pipeline.yml +++ b/pipelines/mobile_app/build-pipeline.yml @@ -15,9 +15,63 @@ variables: value: board_games_companion - group: BGC-GLOBAL +parameters: + - name: runTests + displayName: Run tests + type: boolean + default: true + - name: buildIOS + displayName: Build iOS + type: boolean + default: true + - name: buildAndroid + displayName: Build Android + type: boolean + default: true + jobs: - - job: Build - timeoutInMinutes: 20 + - job: Test + timeoutInMinutes: 10 + condition: eq('${{ parameters.runTests }}', 'true') + pool: + vmImage: "macOS-latest" + + steps: + - task: FlutterInstall@0 + displayName: "Install Flutter" + inputs: + mode: "auto" + channel: "stable" + version: "custom" + customVersion: $(flutter.version) + + - task: FlutterTest@0 + displayName: "Run tests" + inputs: + projectDirectory: "$(Build.SourcesDirectory)/$(appDirectoryName)" + generateCodeCoverageReport: true + + - task: reportgenerator@5 + displayName: "Generate coverage report" + inputs: + reports: "$(Build.SourcesDirectory)/$(appDirectoryName)/coverage/lcov.info" + targetdir: "$(Build.SourcesDirectory)/$(appDirectoryName)/coverage/" + sourcedirs: "$(Build.SourcesDirectory)/$(appDirectoryName)" + reporttypes: "HtmlInline_AzurePipelines;Cobertura" + # Exclude all generated files from the code coverage + filefilters: "-lib/**/*.g.dart" + tag: "$(app.version).$(Build.BuildID)" + + - task: PublishCodeCoverageResults@2 + displayName: "Publish code coverage results" + inputs: + summaryFileLocation: "$(Build.SourcesDirectory)/$(appDirectoryName)/coverage/Cobertura.xml" + pathToSources: "$(Build.SourcesDirectory)/$(appDirectoryName)" + + - job: BuildDroid + dependsOn: Test + condition: eq('${{ parameters.buildAndroid }}', 'true') + timeoutInMinutes: 10 pool: vmImage: "macOS-latest" @@ -46,6 +100,22 @@ jobs: buildNumber: "$(Build.BuildID)" buildName: "$(app.version).$(Build.BuildID)" + - job: BuildIOS + dependsOn: Test + condition: eq('${{ parameters.buildIOS }}', 'true') + timeoutInMinutes: 10 + pool: + vmImage: "macOS-latest" + + steps: + - task: FlutterInstall@0 + displayName: "Install Flutter" + inputs: + mode: "auto" + channel: "stable" + version: "custom" + customVersion: $(flutter.version) + - task: FlutterBuild@0 displayName: "Build iOS" inputs: