From 0248b7b07ca9a2e2356f064d263dfd255f005961 Mon Sep 17 00:00:00 2001 From: jeffcheasey88 Date: Wed, 13 Sep 2023 23:48:14 +0200 Subject: [PATCH] New Json lib --- PeerAtCodeFramework.jar | Bin 487641 -> 515598 bytes .../backend/bonus/extract/RouteExtracter.java | 51 +++++++++--------- src/dev/peerat/backend/model/Group.java | 12 ++--- src/dev/peerat/backend/model/Player.java | 32 +++++------ src/dev/peerat/backend/model/Puzzle.java | 12 ++--- .../peerat/backend/routes/BadgeDetails.java | 16 +++--- .../peerat/backend/routes/ChapterElement.java | 33 ++++++------ .../peerat/backend/routes/ChapterList.java | 17 +++--- .../peerat/backend/routes/Leaderboard.java | 35 ++++++------ .../peerat/backend/routes/PlayerDetails.java | 33 ++++++------ .../peerat/backend/routes/PuzzleElement.java | 23 ++++---- .../peerat/backend/routes/PuzzleResponse.java | 19 ++++--- src/dev/peerat/backend/routes/Swagger.java | 2 +- .../backend/routes/admins/DynamicLogs.java | 17 +++--- .../backend/routes/groups/GroupList.java | 7 ++- .../backend/routes/users/ChangePassword.java | 5 +- .../backend/routes/users/ForgotPassword.java | 11 ++-- .../peerat/backend/routes/users/Login.java | 7 ++- .../routes/users/MailConfirmation.java | 29 +++++----- .../backend/routes/users/ProfileSettings.java | 13 +++-- .../peerat/backend/routes/users/Register.java | 13 +++-- .../peerat/backend/utils/FormResponse.java | 14 ++--- test/dev/peerat/backend/WebClient.java | 31 ++++++----- .../dev/peerat/backend/routes/ScoreTests.java | 12 ++--- .../peerat/backend/routes/TmpRoutesTests.java | 10 ++-- .../backend/userstories/RegisterTests.java | 3 +- 26 files changed, 221 insertions(+), 236 deletions(-) diff --git a/PeerAtCodeFramework.jar b/PeerAtCodeFramework.jar index 58246afc89a3ca5dfa3ceb3698077663cbe251f4..5e3f33f51e9c1b332288b64c119627a0b5471a73 100644 GIT binary patch delta 69108 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%0D~)bK_G6SF6BJD~{g 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

r@62I;`eJ-Bw)|%7bUT)90{m}N%L@=4i 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 Qy<8o<2tQ^*3YF@A0UHS~(*OVf delta 40639 zcmb6A1yodR*8mJNGr-W@jdX)ZcS}o$G}7J82oloGP*MVtN)I62(kUX{B~nT#>Nhjq z_w&Bb`>%hk?_(|3oU^Ze?XGj3V{#|`@)j-56LkhaI z3cr44=g)`0!$Lv9KtX|Hqz$ox5INnvZu;^{~w4u`|D( z{+W6AOF!Ic{;F^|otwk!yWG`&m&8qB$W&Lr{;xmXcf!xjZ)4+$AZYo+i5b7!taCc{ zWZaK4hO2Ud`Zt_RE(T(x?Q=K_usGSiWpv1tswn*Kp2cKx`c00IhI@r zUFUJH?WZEGA+7BI&{KW1q16G~W?XniwNXh%dv%FCYofsthB&e-<&KKb2nAgpcUXIB<+IBW7o(C)2ZtI!Ws%NqCKwTvn ziX@eO+v<6Vg%WMVZu{cQb2skvRO`J%RV~T&QhDqmm(^N`n!F(8KB4G;@u0xrj280U}4vQDXzc7%eG*sYWkbdgmyE znwY2cnTu9Qu_hrfG_oUR!#T3)Qf2v+#vDq#xVN6s#HVS-{S+Bl0s7}_6l~R3pdAyLRRKq4Wj3b{tcx7?VYo-%rkHW8mV23(hj zV=5OPXk~8#4ms)cJ;x(0KJv#isFu!QUGK6M78=1_w%*U9Lmd;d158vu=lZO^Nw-8W zj2azBF$+l*;$1u}y`;fzJiziKqmI3zAr9#&2Wu0wt`+UMW@v>>Ev^Pq>=MiI5LtC6 zr&81jDK+w@Gfiq!=ne8-zP2w+6ZU|{SKYlO$DN1Hf5+dcjTdZxv+O_TN%UrPtn!Pl z)@7RTQN!8_OQj^+6g~0E=_=Vp#o%=iuJ$Mqkp#qCM}08RG)HUHtLU+EPSTv6`pm1B zN>>St8Dky$5ySnz$Wj8Via$j2u|LmG3f3Be?qiF`4zxZKeeh$BT!SNr%ML7fa09}-HxB(RIHb9Yy5v4kcpA6>K&vYebqokmZ&O3odOQ*|@d%*2=D z8-zk3Osw`X_r%PDMHt${OffQV^Dzg$1>D?xr%P8Cv5-r;{TUJCbf4O+o-s7eIS;^^ z%J{X}U)`#0AUU=D%BY;lIqo^uVYiy=^^Se zdDT3_eUG;avCn3Pq)P_)qP=@Mj<`BrM)Kar7;MZi$acQjg5AeuH1u!pXg(tRx%0r}-G zVx8Eu0)E&xEE)x1wsd!pbV4_8Car&-)A&R1e)9IqB&;=k^1;+xT@#T^_yzSe5?(OP z?Gx`X*ZxNR(u2vFG7zi~f6g_}I1}R^=l^EHAT1S-M0T#7>5E7iqq$<8q7n&^^quBl z8g6$wY9wz#sM!D+_lRMC3lo5DJXci$vm{-7oZC%BxA$1MYL zv7m{08PPM`LeSzw)k0ohD7ikbS0ukdAhls|reVzx&Gfyz)1prRJm{~7Wjhd2<2f(- zZSFh1l4&xH7VKhbTCMHXmZ z#0Cqpr*4*~#+5i`@7`RBxleeR7J8W`tDIM!erw1VcPpLOK9F#0FPR@H*9-3?5uM~g zFVPIYc2kO%Bjh_8l9b9#`D&%3t!-UeTsx&}o;KjFawRTjg;i8#7WSj>i>BSzBna0* zOpWU&Upc?4uXK1B&$;pVf=#r-#1v0kOENwGGzBWNUT{mRV3<5P()kvI`L#%r@Yj<0 zFEcADo++4GNNDXHAKv8F-B!o=?Im}&#o4E(?M>p=RU z)f8LDa!ods$E`{of;`@^H469DIQk|GwcBTumcM1Tavjr>N|nYwQ7$#8G{^Us#~Tg# zU5%v26|G0bb(vubaDCa$nRc1r>xoRHS>t-x@drmxiKd5_h6~)z#vX2uM}BwWViV5j%3ax_MNOdYeO)whnZmt?A+?sP`psEam~DbM=}5*;cpx2xYlVpu}6i|PBY z{J$9b*We#iP7*KdsXBWX+WzLyax1vX>7SPr8~NkFLim2JYFV+Za*Y0h?XE-Og^XSu zkx7xf2>4g?L;0w*KQ?+ft$(eVe?@=}U^IPVL zIv8U>!`rzDK3{zzL_ztVsSGh+^$Fu(AqTA)*)?3`MZJ~`2zha-LjeG(^>An4>Iox% zmGvZ$ziu{ikR&ZRtpQma8WAU8NoqX3=L@U`a(4#a$5O=@oTT5oRdHP(H#s(OoNY%9 zMu5*NtF>g0NuN@Md}$Dp$$#g80;L$CAYfIus1dP$(-rI;JaqQ4tNLSpwT_*wiys^R z{99{sCgw!-u8-Ao-W=6!neU5^855~kR+7~amHsm4?H8Rr~} z@fU>JoGIi1i25q&(M1Vpeqoi-T_31)ajpRoR{JQ{>bn7-QDp#st@d|DeTKqggp$$V zLkoO{k}>1M2LFMkVxiJyko)2yK!t&fO)9XhUZ}sPxbt3ouO+Z!mYKg**d(RcuiP?u+5$|lz>eIyY^Avo^F_9z)* znV|-qtf}Yj2&sMb{UbQ6Y4e^ENe5}3=V|~l7(W02LZHLFMi1TO0pLQd$pKez0L+jA zQ25s<-XL1&I(!MnKm~C9tF#(`6AHg0f{oDtu#i}NJOIvCIzS9^9l<-J=MEdnAPB&O zHZlMX5fUZU1Cczip*fCVD%d6?zzY)rrxgVKg~P(Q0P+X|FgUdlq~L&tf3_gFLA#v5 zIIuZ>02gv?^PUrm?+hk_NeBY^5blTl76m9FE;8UtFb`?K7bG!rIRNb64KP_n02&hI zKMHTUfC-^ds(=*)1#2~cEF$=z>b9t~uwD}YHNw{aS_d2YoC0nK5-Y$N(gg^w;RjeF zAK?Cd&_m+#CIHBwMQ&gWn1=&^3Ber7_z6G{{T%|phIKmuC_o61*JltN?AjIZ2Z?}) zedrSh01h<89gGX(^#qWDksIM&g=#y%UE>h|_=%7P9*{^%P+kwX_LYGEAtX6O+`!-* zR}jO4Z*1Bv7tVzyJafo_1EqC1e=NegfdY!Y2L(1|s7ap|SyBTA1%N zz!?!9e|__N0U(4F7?F6;;{Y%*)L{wGh9C!bCndr@2xq{aZUZp?<|LdDEcOr}hcq2h zT(KZ9Me7wH0ZC^Io=Y&eSjI?6kRBHU1BqcmcYs}_hHz`s!^FYBON6svyg0xI$eLOW z_xP7!Fg7fd63F*A*FV8IO;G`9ktqb1h7pFx4E!5v|D+!#6se^JD=-hK5`s3g_B%Xl zxwwIk|8)c%v<3kx=LJq6DjXD1L|~~RKx#zc{%eMDB_JV!0&HCkIEV-?WWC1^u=}sT zhs_!S<&acon}Jr)-f%D_EXf2ogA~{DDUc6A0ba535daw6qISrD+-iXPw8snxhVfVf zgOFB4CYuQf%oMxY&n{zystOTx>Oj36UvI8w(Fe6By7G5iIb|Ll1qv2c(9k z#)9!+zdC?{NFx8mg%0{B7G5DoJO2uXEJd%RKon4mmtb_5aW^mxxd(0z1sHGdUvt3Q z?Eer(g$?xq6_Cb;#~wWtE&>KjU<9~=^eepAF+%Gffe2tSW597@gz9io`AC{bqrQoU z8x?00n1}=+-Dt@JVusR2!KFIb0>&WVFnAmy%>{$g<3h%H@)6JynZ$^UfZ<*MjgV3O zKLq&R0db*+TR;-n=ntSLk~-Xsj8L9+cyU517k&?nLCOuM#R#291k*reQs7Ff0zu^e z<|$NC5JU{i!~x+U(+^&@=n)_q*akjm2tgESi=vlcG$`IXIAJ7#Q$mmuLN?eVN)U3u zfx>lWgmx!@DG{!~fPG;F>HjBeVQ_t$k)#m)1<6l^57dc-Aj&oZ0_{u%W5MJEK%Ws{ z7`*-c)d-mhXU#xPC_Li8u=Piv76e^HRQ=tzk_IM*eU<=~BFVu60tR=k5z;mF!SIS& zBnLwKuR}*fYo&!+YJ+fKnzA54#J0cr4acNM*Z|h62)ags;lB7w06Lukri0xogN*+J zhj}~(A$t_eQynyev>m*u(8Az^{SZj7k551uNHGw_11Sb9Ne@Je^ap&)1L%}7=q-Xd zywLu$UTpGrFH#;ToB=x2GaKIaRGxw~ki`=|0w6^PL%Xu!Q8jG``a9$x=)qJRK;}sC z;AP|=f}@V0Ur5p5O_`R!&D!?AiW3wuM?nvvU_#gfH&6(&@*ohQon9bhp+hJH<;n$9 zKmp#Mb%avzT5W*zE4=I=mpEYIK_Gr4Te!Ko5&9tYeYXz6g<*t%W{^}rLqI}^C3q;y zA%5YzC15GfK}pDvhTlm-P2)lD5lip@gx8Zg5G6DvA501jtwzUyx+H++5o>TuA=en8 zkVFu&pT;MGIFZZ|O$2IL2V#VMO9Gux!m(lS@feC+gU2Rv8v``|72KLbRiF^0QQ!#D zu;+CkOJu&mBTbPIz7HN+e+7V941oBMQ4SZd3dv4<0VIS_9|rGYgh=PYZA}NQM=1Ml z6|{w52TNZEVf|}#I%ww>2-(Eowq%5T*#e;=mk_lThQ9~WL*60Qpi3q2`LE~@l#P@b z*#@~v;qAix7}SiA>#w)MO5xtpy$6LN1%q$wM!Ey;HZBAX(n4mh!3?mUSg6mDdcljK z2vSsJ=Y_8k!S)GJ4UizXVsubAh#2Nhf*OqkA(DpB(bw1Wze5FH`DmfCGLhEy$pO^TLOwR>9kfs0}J1(t~gk ze+M3Tc>S}{q8iK&!*)XT`8RU@flpO~Sz&XosL0tDUMgu}n?9&gNWK0?(5xD`pgMl2 zyoe-*ML0q3(`!; z)I_ei<)ii^9Sx5uAW|)%3RD(^CCn=R21Q&2subdWv;tKT!2s_KssT~}yL!|~#6npM zI(*doh=$7K;NjumYG>>5%#PRD$HSe+$H~pp_3udYpK%zz>o2zS{~zrCyYt_t0Qe*F z|N2veHhe@QgZ#gs;pySV>*?*`Y3J?hWancL-+(p1K!Os`2O)T9R2?A?$`#MVdzDAe z|HFo7m`$7KbYrPy)prEf=&@`?B=Lz6Ly%KrgLW$Q;CY&hIklvrD66dnTdz;w z{ehpBfH4TR>)a#Z>OkTD{^#@rc@FTul$84aq-3C*>yV+2#|i^M_{O{QpZ1O&&Uu{U zx&|$}HPsm(-RJ14G|h-`$cD8#EPDn%QAjX9ZPjw4bC#A){+ay#MVYR*lHjZEgiSsU zJFUBbYG+oZ;25nL)kro-PC2QX@Sf!Ym(!n7 zJ;xj$;AwcUoJXQTa-_%Ptw2dQPEb~MbUFYHc|>tUAhCQM&P#Alw5qi_<@Acf(CLMl zqQ9T7x+#$p$6el$BZt8=4Yp4QpBIz1kD5L%iVeRq<)V?p@r;(zfr$3SIFoy2>*&mX z#tU;)R5nPNe$;`|b$%wt`#px8YR%+FY^6-(;R4MV`?AUT{fevbOJDy~eKfj)-T)D( z(G9+lK#pv1jg*Q6cHnj%^+(=Np1nq(NT(29LD0bEH}H5lJJG~ts-Xn6Ik5ufs80G% z>-O%o5%q}mTXti0|&1y&;GHjjwE02B(2Yrl~_)5Y*y z*d^2`SgI2})BZ3{*%PlJ55RU=d@017;lMy}Jq{6~Z+!H1hh>reGqn$WK*Zs=X)e#B ze0}+ikQu#!z+~s;%0vsydgu6GD?5HTDxRtHXFJsNx-F#--aLThyB}^sm#gq6ofk1G z9JttsXU4)r{+JFMu=0C$aBIl?p{e!A zu)mjRtFL;K^4b1usQ4on58hHCjFYaK0FQbBwQ1D1>YmX&mJF$D>=WF~TXK+9*Nz9A zWDjFRMyVnlQ|mc8m$Iu$y0$w%Y><6=j$=f1-I3~YsJ?FwDFSUSKdykP5Rj4# z2nFROE((euB0>MHU;kZ&FyYDS;qAbOs9DI4_b(b0-mJ*U5zzlt1OKgLh#7|*^1l{U zeeK*doP2!$z9D{P_|!+wfaJHOf@HEI4+lkKxoEIx;w4LVRhCm~ zsLX~~a5WXMb8B)Hg){Qi6SJ}G-M<#2zcYDAmOw>S*XIrSFu@u#VG|b<8aq*7qUP+W z5Nk=qX=_2XnzxxS^heE#5SlkPqRYchr8T1EC2nh@vO)fa zqeri%sB(ek*ve^F*vb3j(N4BA&p;l=Rkq~smKul&(;42{Qn$J|T4Wivy8gov(2N6{@9U( zV>l*JMB{>{T5m0_M>9p9C~y?+jY9iDcB;)HU1dQ*mDkV@tG(dOkIB_Uudrv?=I)wBrs+_F?#E!G9OSWyVr?+wgfoHb2 zbXZaBL#)B(v)u8T7^S&SObK7Jb+k}{+XS>y=g^BOU znK1h{4CKuH)}Fdyx-!k3MoKzIa9p}8t@C`i z`|9_F@M$}_$LJ#>dFtMAUl}gWqQJKK))0%9kYA8bY~=K*3DiLsdZ>@?;~9Rv8;)D{ zq$0)pE)sW@nC{?~(Xg?V@&_LY# z>Y+tKRo?xDfoPM^S~0%g+nA)ym0OFzpA8Y))|~vRXmpHD8}cBb3wxRY)=o`2F|7*f zvLtaiCblEqXs-fYG`;xhiDpj0x-pIMhwY~jHp~r$LpIDK4Aru&O7U*hS#bta>31cMrI5A;vz+E4f6Tnf(@=d2YaKiuAltcl$ z%2QE)QQp)z)KoA+G>iVZSk~lR8nYw)y7)_W302Z;|3s=-g=-FDG^OsO=M$j;>t&piSEhw% zjx&BAE4;gawMOezMm+9MTH1UXhmMlhCi;b)_9E+E9AP~*`qXh*{#M*Le$}-B=W)40 z|3mGDStawzx(+n+D#n+4L`gCp%C^BFYTB~N8dcZwZom(Q+Sl5BNo|@QQxci|=3_tUs)7;{11wJ;r%s8w?3$4o zn#{Tx7jB4q|E3gAGCMQ*-d+!>i+uV>|Llj6{`FEaXEJ9dpvvZTsMy;Pthm~4MxCDW zoy%7{>h>BF;b+K~fFX|HlRR`36kGiN9%G^KhYxa8M2Ca+jDg4?eg;pCh>hSajpE@m z3IYI!{?nBQ!l{p&>m1vI0Ni~9iu{0!IaLZPW9t~9+{$0XVF%>r)qF2cO~Yzk{Jz)K z$PD~OJqob*mLsBToE8g#gcNo4bRF!zOX>Lqu%bAj>frwzDS*3^lO zi^>NlfB@T!@ZKk->H4lj9roNwCi?4-jjn>` zpFiY&ZA{~OGN0>xiQ~dAI&D|J?Pj7Bam6vRrr}CXE1}cu5Anygw{dr33>)!FvK*#3 zDR&8~Sl|wNYv+OWO+{~I7@JAwvR3|q9cfp?rmI+7?O=!P!>oPshXz4S9^4ey_BM<# zw|yye11w+L7B)}=-Wz?vg$EDUWA@bOFLJ)>vdx4|NU0`mi4j#zc8=x0r@P~-4rHGp zb;~UJDmIePp${=y*lZXCk=Vw@i$$!9kFU)Q#}wHGG?zS0IMC;v%PvUI7dbO&1f3dG z#Fj&ov2P>ymdoYkhSHPmBkkRi{tDzBVu>gmraZc(j3E)D z-C%sTgRZ>$HH1SM^@rA}q*KksmWyuq_-7frqhrE9lL6!4(*`L$@6X_Un$_D zN{=`k?tO-g1n>^(<%A?Z*n=)Gw_&}VRPbP2zfDcZw6=%$C*#?AU#YXB{DB_P#zgyCN=3(T4Uy_8nFtXV_TC zVZ_Pr*`6@9F9bY4RUjkcg+%(}4#`Rp%j^^Kwsdt63R!C2rcrivs%KgXw`2l?UeWVK zz3gwd$=+JWyfHCTp<*)LB~KsH?5Uv7xnb`DQz)d7&PZV0zLy)`Zc6+a-btV{pD3=O zM%>KRY`*udXck1q+8)E~pr9eGJ8p8-V%zDo+S9})n-!G#ezU@K;pKhkc+#EmzJJ1M zjD*5FNY=$hNnN+nNoejy+pf{HAx5{C1(9SoJ`XSEHLgL-%69rz>zCiNG8fW&1gCvl z(`{uY(?pQ{@0f2La`lKfO* zL*H3JdN$KbCpvwV(Ft)ii)sfO6@L{BcKU|BtQ2Ab8F_{~>3CN^wb$Zg0?|KyVH;$l zQ%(1ngXzVyaGj2DL$C0{a4&mzIjw4GGXT>Il>SG5%4!#OiG-EWmC;$z39O!3KeMv8 z0yIzIJh1xQ~fD2!TVM;QClBpM^~zK+gnOGHGM_< z#0%}UcN?U7(^N{|%*YEQV&FQ=)4phsXl>@sMnb`v$81K-TK-J!ZN=VLW(}oN@KZb| zj`7h&9<=Pp+Q@>)X_8&E2d!x$-@m;~gH6`@i3KUke#3n9&7Nmvmd8O+n>-PIJU6c$ z?h>MCci85XJB1k`>wEK3wq8WS8spJ*ezt(|Xd)%#PW^{*Ui$v;FQV3dkv?abFQ%HE zuwB1S@4q1u^#7>#$(|J|OcXYt@It{>aJX%L^7ZU*%3sNa?4tJK0>uX%drA?Bg&8;c z&hS#4pUgOoFA+4KM|4;zZLylStf-c^Z{B7);C<;+Fiqyb<7A@TEmF7ADu=&hB>%;? zF7PP>Tt*2zxIEDF0!UDlZnEGE^sug}WMgRj4~rTIK=t$S|NqWJ56zTnGo zj(=@QS)2CBNBvSq#Y3tPjbgW?eP3(uIlo4sIH!c$j9ybnn~-Tn|Jb~L>> z>4dmz|VXd$H^j{=tST zYR!;VxNN!{=x<(D`M%#_iPbf@OBu*DVf5XKKQD81(j^Nx*6fZ?6+n9vow4THo zwGn;$v_*Bf^JMas$(?xOrg?a1D?{(us<11#COsW*O5#?vwofa3A{JpxH+@6Wa^XpfM_Am#X(mcjODkK30T%Gsv;JJ0;8KEefJ` z5Qz2R1%oNqoQAuKjO8fbj008|8B6Qmr!xN5`7wj{O2k(%ZKMiccWK~H7w?8aCm*Bk zWJtQm_pX?mZB4F9ze}a7#ykA849Zb{P|1GpmF2AO9!n3cw27l?)|_WsCi)^o^F{Sd2#BPa^fX)(ct5ipW#?W$TJWsjdJm}Or|RG~#l?5I0(IX}Z~E!*CGZO*wvs_1HW zYxV2gfr*PR<-6ynQMBtd?zMcMuum49vETisCcnsq4)#XBPmlQM`RW^{Ga+@&i{MRS zeOmmRpjefltj^lSn%IabW3&B+xg)=~lal@StHRq`oNQ0WwOWIyWhApy&pm1TMDQOVS1mmiIN_{q9FH|_$4+>=WVshT<<-f`) zx(QtWiUP!u{3dxDWnEWJxWc}wqCEb9G11|Drln{`JZ*li#RNVo#4kz7sf?2oKWscr z{KUA{juj(gx@+^Uao-em64bAM6jh$Zscy`2^^o|BM-qQ<{zD69Zprco!iImcJo<~~ zSO`oVBWdKRllPL#D>{UwR$wz>0EB8jjc4?4;VlaB(b@k`NB!StP-=SGT87rHes=%- zHw7a%Pcu8x@byXivwiyvS7FusaMw9jx3%3?^E-kl`EuN5Tvy_#* zb*)sORb^s1Vn@m{;$k%~vh#GH;c$>f%%(LQi~azkjZnTiX1^7%p`oRTpAI>*Z&HQ0 zM@)QaKN|@ux+%CS@cBBK>%;dOrB^Mns*OYn3x|~M+vC}qVr{t|EP4%6Xt5Em`we`A z6-6gu-WB8sKqp0YHqs*p;uZoco=$oc3TQTkXf_Bo7Y*%m{8a3X3poAU6XuE?>u z*V`zY5AIUyC2usurg?(v!UcKi8L~CLE5Y7m#5sPZp-7~jbrETS`5j&)HmDUt0-tD? zS9LNIt-L*3cy0eM_(jPLMU{c(l)RbtH>H*Lt<-B|i(#$7YQ0uyk|{eXHSX)n(pdSw`4mlg@iug%Oo^nodrmG3n9qV4a>y(*XV9c^uxZ~k!= zgHd@Wph|D(nFCnQddQ;?yp4jv4N014Wq_!^S+MUNeR82ixpd^ehs&#GUn>vwIY0#( zHl8=y@j`{##f}B%)_xRUYzd4PotM2wb#^$do&0wFIlI;qAYRn^&FIVKJA>_X9PI!Z z2cG*}oRf-Ytcz~7f_9wQ2YT-1sMwnsZ5mb=u@z5Hiuw(J2E3HaPfmv$qabu?BOjYk zh;jqX`gQ=JxJ)?r8Zx^-mOzJt4i#<|uO{llfq_76^z%#-70*mnf$|34!i72~hXQAk z$^ui1lySHDiEFE>Rf zSF66~A-rk5JU zN0D%FaC4MmX`!EU7iMH6Mukd0KU38+4?FTyV-gjFvE8v`)SaT;^Gaz4f2z_cHrmO) zr_J#Cutb?K&+D?URA%tC#=b*nmW#U9TI5rHrFF&1H(@|eRsr|$@ke1m3wvnHC z+CEF0$GOz=25kLUjXtU5;p3LU-5@iq9c=cxZ3=2K2)U6jY#&uFg6ufjf=u1YY-}vl zYl+NM*d)a?rkU+ahz0pYX2w1`{3*PP`g(Amr+-fr2kte~8cLu024YJt6i6t5?;b;+FnLYz1sVk%dj@!XQ6p^ty z`-z;fgq|qMRch1>$zne{uTsJGEqVxGE8*rm2DgK zh!=jykFMrR6pMbjg1)d@4!YiV=M3wcu_yU~sE}U9&S;ej;kqB>+S*>?5!yTG@6p-n zF-6EcJJJf=E0p}R6NDDBNzWgOeUDzK9dH$*HruFCvc~V`-VG+$V4@E|0qolS;Y?-d=oM^T^ZSrojJIy#vt)$cnKlBpSJPaLc zqiS!o@xEwiC@|USw`77{B4${;Z|6%|QO!sTd8&6-_!dJJ_o)$o2tmJX(Qkz$lZ#T5 z1gKGcjtl>8Qg5^4#Ri)OO9g4qmH z$96&SvS>q5$mj(# ziDSgOeY0*5+6f_nMvr)H?OE{nrb+7is(NWQJe*d?4@qXIM8gdBI{0lP@ZJhR_X zAoJ4bQ`{5^shcVNhOct8dnUoZR8TM2g14DPET`2|uf6 zU>p72<0bQZ;PM9_-N5^MnqTxXiW@sdAH@m?fITF1oxJhq5?ezXiUO>+p+@ZeT=$vP z>;on`EMso0Mj5X+Z0XLrazlHjG**?hx|;W-8od)jhhC})r{}Zml!}kE(TF8t3sW4a z-~2&L2ahnG!oHr&gHcdI|2e?>_x;s>zvd!`4-fx&%?0&L1W_Q~`@=sv`)4@nNCdG! zrjWA{+NKCq((o|7i_T*wCm(}6pEM_f`b^UW8Mefgh{P+!E}2te4BAIa z7Z~P&vah7Roy2U4NTI`D)qyc0*YRJ~!WBFFKa&ys6Tg4dBCG^GfcT|qY7OucM30mY zYGRc?8Jh;Aj#Wsba7D$VFh-KZp-E(zroCQBX03>hCpN8CQHIivu`VB02B0f!q@u9@cNv^prHmh zy%1U5Q}*YLv;f`)B?L$1rm8?aO*P}?Xo>I#CCZbSH0kNsvhIjig1a9xfCtY#uFZ{18On^iqBE?)-s#`#g@;P;83p9t5}ep<8YLf^0e zoru(ji5lCLp_iF@-hvQTba81fpoITt1}WhGnJ*Dv%%UORi$Vz-;YT**CYYi6i;I7X zLL44ud_ZAj>?@Z2G!R8mL&9I|7R8_=Oq?CrEXr(4fuSm%%b?z3$kRqzYe_0+%27l> zuBgjE2(oUHH>p(zJnhqM_%xJdg`}p8m>Hk;Q{h8M=(Gn#8VvJ_)UE{aAD%}&Ix)L#2h-I;kN%K;WRqH5VdzTY zT^QTsATPXTK${-jG$9vmKQ90ued69ZF#q%*k}gBe{6XUdb{foJzx9LXd+r7Gc?KW8 z$0;ml1V2i#lT;~QzT*9&CQp{9cP{L4F;S`eGzKHSrfOq;t2A^y4P9@y5;x zk9mtBoMn>H2~XWeG4J(U=Yz?2w6wZPFh+J&wNoN(2cgeHs0r?Gvc?uZoa?J!+sWrp=$3m=O;pvSolCMep5j2PD$xb z@R>4k2ibICfu-5RQwZAuIoV`)Loc@|hB;16ZX$*sQ30F>YjT>Ld{bLwX{oBx51D(W zvWf3Tnb~0ZA!|rmMczvKUDUUWt9$HU?Lu2tL0@mJhVEsLZms+RnX$R>xv`=!x`vHn z#=H*67I_da7mtahPxaXq1VG9;M|Qb!omxQ&V7r$_Hg0_O%l zRE%><8ASBn+dOqsHVkzEUtzKusJv%cwBf!n%G@I}i~`vy=LnKi;zb25W)s&=@L=7l z2Wi$mk-L`nhJ3+N=f#d-I`A1icl zlmVyP(J$@&hz(CAVaj)pla0Vntj*Rx|14J@fImf|u0x0`F~%*SG?}o^_IB%bcCt$j1slz&$pavwR$eN-gqMxowP-qr zj)0PUmQT+U(gm6Kv8WVr zoQD>g;smMix`4Jl60lFaug=FMG9W$d^(1aA-QXp)xgIY~Nw_#Nd@uIov z5{(d{RLXyTG~{9DhgA`LA+a37WgjGff6t54F$!5ZR1)hRhlyJh5XgF9f^0RDh>I{l zykqkZ4$7W$xfqgU&~@HMpvbUXuP4H~Zl$zBF2J2TL*{KO3G_C(VwhWV|ToCv2nN-ohkT( zkRbfWO>@!sUAK>G?~P?cBYiCHHS?|>-f;Z>IwbS#Huuq=K{3Pi-z~e?IJxm-ZDc~#_H2{WL-U+W-sXFlBkzoe2%r>k%mCyG-S7%~?cxwEW%kU4)+7 zw$?UXAS+Il%3KA-hZmdM9u0~(%0{<|yBaPq9+Tj5SNaWM(dANo&v$lRr9(U8 z`-19kRhD=Jh};wVx8tlXih)_37AzYtH0F~Q&OYm&S&xYBu~Vl#WO@&%A`TM^eX`cN zD@K(jtso{ygL~MWf5Y5(lAiW)3{sa7c+FbKvwz|HI*eUi-I`0jQkbUefoSluXc@UO z?zrkRC!dDYQ|F}9)@$ysWG)xA{@ksdmUg!!E)Bc9jk~P74~G?hJ4 zGwwkh-N=1Dd2Lpux%c7i&O$D^K~a{{bVl{1}d-2$K&PKD~i4sBn; zyj~S;5!vc2l$1?K!qRqIS%#zza1a-(vdM<-o0qdcKIA^T(sP=YvV)YOry3-%K6N6i z@el~A@Be06dv;6U3H8G;o_jC=<~Z%u;;+AY>OrzWIh~tC8#L8QzP4?yL%y-u zhW+uh+f(q2+$8|EwWVH=EOXp-zg@Jb8IxBmcOu6Bd>}Goz>*D5=ZGdW*t3oD#ZYHs zro!pX?Z#;vdB7%MH4YNnmIsNn+c>^M9kK5-QOI8P&~desn7U7to)n*Ft3u$du zKY|{;ST9}L0gmsy>xO4r%|9q0Pl~o_zoSh#lK)JX5%VR#S8~{VCr*6kLN7hje*45S zA;lLU{c*=ri+sx?7=k`^LKIqkuzmJJ_+DWnV)`5YdAmgn_7Ca%r|-6itfkV{)l5aw z)X!MntZQTbuv2>k2tyNZI^*5btBT5~+pxXSdQGQ(TR`+_duYGR%+-ju=%a2MWe{!m zw2#)Xe@(8s6|)#w(fYKtR(iS~5aLt4S(wFH=D<>}^&_=P^but4Zh!TIluC_a=`QxP z){}YTys{FFqOAEa-52L9lD*#_Gc`J}JNFV4CR8a`5~o)R>Q-V0>v`*co^JLMI#Cx9 zfy&UF5|!qu5Y_&CMlY+&T9IVSpvw&-%roic^63`Jv z>Y$kQH0(ipQ;HV^M1E;@usXn-srypKbO+QH*%GFSVnzwD(rf|DWB|U|pmb5n(xcBn z0pEVUL&?7Sz>(2$)*=-S`l)@p*8PRCgU+ZW(C~Kw{&sMBW9e=OllNNM4SM9ulT=tMUr8SN=3RBaKZC%mE zKN_=hc_%N^SUu$u)b-w+PF3`bzHdn;@?B4ob};_7ife4_o?6N7%f8MB-9|CP!FH%2 zd&mBrHXDBoE#i3d3{AyX6S#X0ucVe3)=0FZ-`i|^zbAuUbluR&=5-7EYm!~kq(wSc zn?H%G74Wx_fecQg#dJnCxLZ-}x6CT|Z=RsOr*QcY6QDwB(sjpCf1svGHtyN1C8Y46 z-7}}3%CB~cxl!0mg1;cJy?d&xMs%F%S&+di^NQM+@_}b6 z!!8VVLC$obeIe95FPzjmEFS8hPnbP0{p)%a=E|A!E<1bJ+3_?eW~f>@t~&pi+i)Be z7Tv?tqj%OOAujqj)GGf)z)El9lTAO8db--OVSbpPSakH#h~Y4c*>Q z>4?+}B*a2o#5)5I7hSbX*Nmz%vlk!apC!HA^sd^mxL+A3o#X$qJ(C{8TJY!_NjLvD z;CC{$+~%p7qIoX`?aD3rMT{(uL%-_JGxeXX4we0SXI_Y_R$d=l$KWmL;l8REi1~Q9 zg4?CwA@l=vgf3Y#QlWB_fKxPwibftS_DNsg!v9m*cfe!Wg%2B#=PtACy+`(r%1D~B zXBkl{dnKEmq)CyHlN~~4*&{O~nxd2~MN~+GXng0sZ?D(W`~CmF@ALb4xUX}qbDitV z`#jeLpGfLwX&E!o5(iiBb!>Qvkh%9otrnk)0j`XP#-ivLOtK>6Wz>SpLl0*M9dF!QiCycQdZx8@1~DbW*cU)a%lDM@!AoSd<+T z5~huh@Dx##%`&&v=c+gx++$kxosoO{NZ#R-YVW!=&GjDMx;%4iX8FBgUB;=sOr&Qb zUj>V^1xoi=K8ydlLDPV#M|^3$$KdA=n+rU@ zCQKVXy_Np8h(BdQse^se&*eAe1V|PyY|0zXWBy9{?)e4tEUhe! zB~?;;^>)AK9TrZ%5~s69EG3sN>#0_@72CcW?EIFT|M(l7tly$Lo z8c_Fh9Dn6<^=eoD>)e#OyDw+ByQpvPt)D;Nwm(Q`hsNoh%v?1WW&A{h= z<}wZ6$zkQm^bn`xf0h;&v?#fx+x^5;FZT9S5KXP<}vgvP4)a~+pdq#%~cjIP3a$0tN1h%m3#cfi{m!qJC8?ATjmE_ z-+glWi+(kiWmm4Bv3i9;w!;VctsceCOk`cnGrJ_-9ozq5&OKp^B&a_VIQ->=%MQ`t z8(Tue9%}(5#O%D;k@6n3~GfmsF$4n0mEie>|^mN9oCNhlJac zVp%p+^YOY}Va`xrklJ|Oz_rP{Sv6-g1YAvIMA+Jy1?0wMr{4uy z($Y)qtxnHR)JwdUnEgs8jfvs>Ykh0K=eKX`B$Gn&`4gSg)hb>qX1MK6_FRxuXnnI` zcZh5NVf^mC*3i~K&r^qQw)63IE>db8J@DI}o#5wb}V97rq-oav@aq{$uNYyHBqR z|M)_LfNY6d_x!r>TQPl;faCenK3#2Jj)g2Q|CrdRcAa!5@OTFN)efSonK&+Ykv81n zyBgutOdjp}$zwWvpD1lz&sQ%$wi8j2VD#w>?>=7ij6djBWoBcIaZ}~&Wwtj0Y$rU5 zu6`Ilx47rr;0?`L!wqF0X=`=X-M%_1FS6rh2W=43Y{=QShJ1EL4~U;k#Mh1OX=Ukg z3#k3=Q+w!FIO&;$#5(X}<1f+C#R9cUfqHLgv>vwKbkz5G-EpxkH>BzhXZI`m*D<7> zA{;4vJ5oOjmrNdUx==q!bfy*eEq(PqaZvG1g!r+1V~6;eMfPjP_o+363#s@l>c&+= z4Kkj3J!@Wg#pBv4UCqGU*lIAy>`^1DuD!&Bo)}gtZFs{v2ftg9^Y66m@vjN?4ad`C9ZWMeJ3I_4_H# z?Niz=_^9pZy*TSDY*ssqZHA1e*^B#yA7s_stg-PJ0xzv?Y>KV#x)gdGJT)0QqCn62 zVKyUj)_101R&J6s95VB(F`Oe>V_tpZmA6L(e%&+jojRudEzgSe_R@P**`T34Ubn)O zcg-bcNWJ$kXvkj7fzhdg`;3NC-`GnJe|hfpGeKw8?e2(m+fM7B+uD&+OParQ%mk#g z=6eLD9NQ(5f0>(+p7%OMYKKh8Pd~I*{h}uSYiNJQvWr4kCLigK?q{R0FF9|d+nZSb zSpMAOv$v4QTeIOm)28x?Kr=SbW(tuIY}7|{YbJH@cEM@cz!1zm}W);oKSelm4+?UL#$co_LG z=k!fMV~d6xMMqvnPUVz$NmV>j$kBT^|6I)CMf-~!{o_fOpBY5zO|U<;QM_Gq)NqPE z_wsyYCPU`E`^HE84qFt}3Y7&j$EzLM&vWg8L!7K!zFc9^)ul@(>q${;*{QU2QXJX4 zb_=JOw@93OK^G}qaNT{MT+wwiliHdiyQa?2T%+TKm+7q@$(G0^6_=Eoxeebdc-@l| z#paj`9>;O%ZR9SxZX@=Z|6$#{tu&j}LsNbGTfR^9pNKE_ysQ%BEnrf6xYtmPp?gQ( z&b*PAmTYwG_sVQNJl>5NkQn?j?+1pfqz>1)UfZni;g-VVdWfSWgTo^>e4t;?Iwhqw zma{DXeb$!Tu&$+w%4@r)(<+?4Ox!=em-AAcs?gK}iA&CoAC}hbmWwvHEd#s{a6c7N z*WWK|HhbIPmCrHepSGMXv@eRKOQKYF=7?DRRv7ZM+E;Pt{PZC?5zC4a(rpGcs|&6? zt#zMFl6td@eIq8u&!taz?{{<5XYRHrgx}|SpZ4e5E;$>^&H8ozeY>YihSt)XJC&44c2^F0@s(qsnX)Q{>?i5-Vazd-bJ+sk-8<<^Haw zAYU`Lhso9ljeL~Ocqc4&o2V%=Y#=!``2fdmzp;zHN~OAQPN>)E1-rNvHk(rio4?5v zH7ga}B*qyRn$CY^^LgF=J@Z%8MEa#-<e(m3i#nUOaeVk0*B#VklQmvdu zxeim2z-MjK2FGNNtpg0@hokJ+%WW*8!U_(gc2OGo22@2&-5+{wnf8W1%hWVseGTE@ z;QqSNVag>rkM-W9I;Cdn_msJx(mpLo2ivTYz^Soo>OyvB3V>)((3>{Pvfla4z%EtlK8s~reR-)5g~^Y(S$ z>)$_Lbhv8%+3vJV2lgs$w{eLg+*(Q(W&s`X!gR61EZ=k9f8@L>napZV`)qTPpvR3M z%DUv4b;jmq1}7~~Z|*+6Wzue>oN|dVjpfE}>!%4r?dQg9)%)N1MY>V-X8pSFoDN6` zF>nJDqj7m+YO$Cul}5rBnzBc|yHlt&^zB~XVzb_NwpZ&l-BdyZrM2#fmWe+kqioyX z`*eysOz%prduDWUFzuw#=_kFH`nsP}oMUxkQ;od1bV7NE`376^uZ=?-qhlJv%_6l5 z+xebbmSyGs`n_EHf^tttkpAh8`5KB0y#-QG?Ox^aBqB+-C&)EUynB36RPXCdLDZDq zh!K_#$xbxL|SY7)zkK4P$K7 zuTxRWfm;Xcf)i`<>Zimy@~g!z(HmZ)*gttXJ)gf{$sp=(=cTxwcUt}hWxwYa7q$*i zlfF{d={)VN<<6f}`ew&@kYk9m)9vB|QQ^${_3X8-B4ZQvcYKE?j--fBTx#C@a&lKz zY5lj%14G>TF)3aSKfjgURbiq^tyb)f*IgvE=4~F3rr`T<@LSOtS^|)JWTdrdzKZW_vmq$~Btu;oV#C z6I37kVW)38r1vLzL+8;uUe~gY=r*2 z_5IEzRaCsJYD2mn%^uMaPgBTKy7cx%ov#+*K+-7=|8J#dAAj`Ex~{~q#9l2_n;_Bj zLh5aY4*xMTvB&Wl8ehIyG0NW1GQXB^J8^+7em+XHNnNsO=k&u*;!|1`mlGwr_KV4@ z33XYujoj7`ej3Nr{?IMHYbfq^6zI!P@D!kxcxOf0ck0`|Qx7bn{oTet^@)A^aBa^` zqD$??!`VIq1nn!d>)m|^tJ*wdJZ;APbq75!+n8*5RaL`g$C4t}bmmW>J9bKOfm~EvKA&Ea1Gd;fV&p2tybYJb!gzl3`HwTrLfb+u-faH^OZBMv$xB%*F^i$8x!VQN3kO>@?I-hYkyumAp7LIyy}1`vwpTvvp|Hnt#_m4pxDboorwnqx*2%o! zVb=B1`&lp6L$b;GkoM=`$&Ge8R`;DOH(A=$MKGCk`EY1jKNuR_(VV~Cs(V2(H8k=* zPsf|Wbb-M=zi(7tFpZe%d2h17PfM^1*(4iyy6(lt?3s`Uj3oAtnO_l>Ukg2w-c>c< z!e#F7Noet$ZqHXaz5LAh$v*eXU(-0%GD@y3M~$`k`7r6_AjLVl$9h>mX7exKn*4nD z=TaPEavG8FOG<>VO6uzQLu5zHKg$Wk?Q?N3eDEN&*Urc75 zfbf~1+>kN$zHWU|-}mec*res7fo+E~f<$X;uhwfsng*))O)4flc61Sp$u6D$WZkxF z&b{DrlC0JDbFT`+k3Q5Ix!91rVZ^DLH#6mJ7JCjz>m5>kP7?CBs@BmeI;TW^NHT0{ zBt%mpB-u~;F+0n%o7VfE?N|P`oF8y!;=u8k1D!`ZlwT)Lv5=mA?M{1fe`)jFB9o+1 z&x~r>*7v2&J8HjM-9bchI`(`#$B}$%WdD|UU(cKwP9>+D%T7ZXzAOyg{UMS8dL^%Q zJo|n*-?B)ot1z5-L07ySZ}>#GE8)lEt1o17G_)di&+#Tdc&8FIX}aZUo|x?}p^{wj zLwk#Db*<)4)SZ8N^AjnQedxYWU4+||R!Mf6tFj|iQKMLiV=*5y_+N~tk4{fSwa4#&@D%7>J|wPKXL01~3GUVbXAS$a#aVjum;9^LfqW-+$R5r*q(`#M{_9v=Ie>;B#5=ofjGv02d1^jyxC#Q%EzLb;3D z;DRwzEiY*Othrt-u?^$|L_c`*Y+EPC$ypYiXUigcD%Mwag{X-XYwDPfW=|G#@#^tN^AqPL&1{q$P6g-pu zet+q#UfPx;Ud#h~ib8398a1ZoLuLHlYKDcA_I2N;V%{RQQ7KOPdSI!>#vr-)No0Od z@@d36hc_JWg7%~{<%}Gfr;l^0AZe7pJGjZHcuB^rS}bt)Y>r~owrKsHBE854aDOJp zCn{p5;iPLvY^ZEmSV;a}sdv0LKC60e@nZ4!=bg&Eve4tgVpiGPWw`6}n0&17H1BUw z=Y8^Sn5 zg`eYs3*w_~JpIhme6sy$rFfV0maoJFzBh9^u56h4Ig!GG_WpBHhQpy@M6WK>6}cy*^O9+c(cIy7uALkwFhT zhnaS9V2HGa_Xt9nlI z3({Uqp?uxA>E2+=?Wbfl_iA4=R~+VN?K;NWR5q(9(AII?!J<2U(N(JQ_;a&GCB7r) zrd&c_1Q*dwas8xPe_*n^d_L`6=E*{X#@kQgy!vGducZTf`T39z*SHav{kv-Bi~Q!{ z^^tWwjC+$}y>4`xj_>+0apvc%p3Ly0PJsg7NPPz^k6qc%UtL&sf4pGOKtxGzq36+% zio5pXeuM1qJs*e6uX@frtMkm4ju{Z~Yq+L*Xy5YNQcc?1MyK5)W!c=D#Ld_!ZKMWV zsx05<(hPlK%`EObx$At^g{(Z`p6_(!AI%TTZxj6Jk+;75ljl7x|A52M9(2AfjSkv# ztO`sYNlc6sNdMG59sl#*3VP>H>$Ze?b8-^sn#V@hd5a!c7frP%!m+t@RDI6;&VzOL zrNuWHn(3SCo9bKYo9J7lmR!%>WT|hJu<7_FJvL>wa@KOTW0A_NzO3&eYa?lQ7~?5Np7|eY#Vo(4>^~Gtb1A&LYq=qv1_AQh1BLvo252OZkFz69WhDGUXTs*Y1S{b%w#BeH*E#Mv>$$CS!E?wc z!|0V!gHh7sQQ1-dIm@}t-pHcvoc|o-oZ+0@oaY_tdZeD?=f*&RKhzSk2>Z5*rL=#VNbNDw5PGBwns)NMhGKRBP8MoC29R{+E9+4s*C)KJab`l)uXe` zOwA(^Bns_{ko+I(lC;kVL}Z-KI76b+rv5|!o93tVqT1Z-=w$HWn>`%SKQ1`_p1Lm2 z_vM=7?|0Wp+a|P~!`5khWaaaDWWp)lamVqpqYS(VJMMqEL-A0@B5(W~&L&4wJ{E8N zWXHNG(&!*xMaxMA>W`G)3Cb-pcdL^R`BxaCL%)R>QfvV9A`}x63%3@(&spAqS2M);nZs} zraeyv3rx{G@R;qvb})aFT84DqT;b*!A+}JUxs##dOePzBv4b;>t~950%QM>ZmI^p% z6#10tD#%_x(5Z3u5x)d=rNb>6U0F`o7GpZCQS;zl#b-lgaVZZ1S5<$96@| z$QEPz^G6g|BQiPZ+Z{F$by1LfxORZyX4VM%moaBgo{`_$Tl?ZJDia#2Y1|H{7bC904$TyQt{~UEL-)7r8@~@cAigNBf6aGJcJcv0c#@e!dBS}9q?KUyaL2&*5|HpB0b-Gj! zCNt_?3Qngt5U6z&{`#=+H)ddMkvXY!l~Dewb2|&YO3TW}qa?$ea$af+1(Goh{4}O9 zo2)Mhpg-BNo#VeBJ3msXZXou&J$i#a_jTuXF8YL)m5)c_dC!k`Z0Dh`Xu&>GKh$eI zRWwGZ{S^N5;hV2%%kZ|v-B0NmQvSGey8!*ymhA#0?DLVTVU8Og^*IIOb=Ze*_Ln8` zj_o4!D)-iYTy}2rqz&fJ{;g`c`=G@Y>G8`2+yVDf3x-s@wXeJ`sbJ{ zy-{VG?4OG`Z+M&|sOtX*(R9yyu9N?b`FGsX9DTp<6ccpij5Qn3gj;+(fETa z*S)W#Av~loa~mTT9oFBuvd8k-ymeTOi_~oEoEz*vo4Q85xF#$}lvkvaIUqBTYgd0C zxgvkR4PmkWNiDABl6Bqr4b$A7{E2Dm9YGs&1U{?>7RmG{9U@&EAtVo%@eLYzB0ngYv5EC$4*ro$^V!sjczXU*r9VV zc6F)z7NG|m>;!-J?L7K}HR)b^luM_|&m%?m?i|gcNA9fv1`fj*xClcw|y-n=dVHhxA!N42n2c0jpDa!glFE6LR<%Lg3 z!Oic|MguwP?^-9+81AmOX;0pMPs(c2^h;$~N&y>(l$Zp(%&wZ3oLoP9&1;*SvfH7c zM}_P|Tf+Ub<*yDnacwLxSnqDDs$8SK?SuIi0Ul|2%e*v_t%-PaU%;?P>-hWDTJ_*k zt!O)i14AQfhkxlE5Q)}!@^Fkwbte11Y4TaqM}d0>i$wETVnj2kLN8r*6Se+%ajS2{ z<=kGSr7)nx)iG7l$(Uildg7ApaM%4(j%7md?-A+YMD24M*YTL9+_KA8pSirfskAP< zFr@Bz?Z`b)`I}^=UNuiy`8l%v*(Lv?Nsrm9)to#R)rj5_O?H%n2KADs)mRn?bL?++ zQh13Cvo{Z13LwlG1}B&|s1+2b>*U1q8e|Q$%}bsX*VYkj71*d38M98}Zcd-kY=ial zr=@fz(L9S!2D;m1Qx5J;k;JZtU}%mTlxv{$@FqwEw_@XU_Z=R+fYv*{sw><;_(w zWiR60zxi2idAxL7|8*}-RpmXlfY&j|$9s_4ywk^zCiG$R9PS{5>g~of@|XmuzUaT0HHT;(V6jo5(n3I@7RIN&<4ZG#X$>)js$2bN z?(3ooMb*;8@uCU~yrkKR{(I#L>Wv!_>P&qI!u7L zgs}}0A_ij3h=KtG(*x^f7&lfzoOmBo2}Z21FCg3)cP9c{V-@Vd-aeWQ5Vx^m2vfMeWE@l3sbSckT}1##*E-=D~##i zZ%o7^>7rZ!4*sAw4Ln7w+=o%npU&egEa469lJs1+kHz7Hc4%bp-slXFk(fKhF^1BiRj z_{P2`#q{a6Ulj6R#4hP$o53 ziKCd7FxoGB^_@84Da<7ll892U7){?H2tt#HE$9QxO2J-jkxVpMl~WDnFkxZlA)+v_ z>q0oH*WDs2VjLkz6xinz-=egr5r9nru@w~xOE@teXn(1O{U!V#0zvTOA&h8Ff1CIe zBCh%((0c>}EOXrQ)D}ujR*9aBKm0B zLm*;?SYZEz{PRzb87x9^gv}9S>>oe#6-b*ovLAymTObA))e#FskHH4!uvyIs1Zpji z-GY$b>XFr!pYbYS&r70H}f&XK`Unr2(6avM7wiQB;W)=d5RtOKJ zJfJ*)@PmsGC;)+Ek%R@wWH_UkBGShD|1~K}ur_ZGTtTk+$wdhy0F5<*eJN7F8sTLh zH^;v(iE^Q(Se*_{U>OyS1@N*)&=BLG`y_mpvjDfO5k5gQ_U~owcPRoe{Luw?Ge&xi z3Q@AYqHJ zp?F%h5Vp-D{!Xm~noI}dhe_6vYpJw=_xI>T{%)o-LGgCiCBUF9E_oW|AayCe>$x1* zY=?6-u!FGvNXS(VO(uj*`FBxR`DF-`jlWyS4FnJ2^l~tR5Y^^5sFgY>wnOMK=?+&W zjTzw=2z6lHCCTc&=^D6m2vJ*)S|?+4J-Z?Jj8^3ez!Xrm#}&}GhfKASum%CqIL%4*=x5xgpx?_^d2X-5Rj8U^$mA^DTa`21cu zaN2dnu0;XvVS3P}Xr3-!GL^ln$@X`or0oFoq~d&jN3vhxN{VdLG>6$sfPQ(&!dPcMzt1^bL|7g$Ph3&hKQq7 zLB}8!+c4;srR0vM{lyGAVOk=zpc^evcmsU&D8&HGtV9Id$MKR)$6<-LgWmV9T#OFqa#?xEQ$HJF^s z+_(`cLknxXnM|3cjVS(3Oy%##9#-T*b@}NiD5S`+R9JDYFd-B_s+qhi6s63K1Nq%x zy?tD9ouko`U;(@YCW*q^4`WZi-;}`wDnWoEwvw@r6JF(nEvgLNAd~%KI1uKPTEnE# zVz{sc5^KP=ARiY)rEvUVH$(u{@ej%*Q5pwE=}~e5BX```cJ8p`)mFR&x&|W{I7rC` zYG5&@=ym7(oTo(CwHg1G!K|}N#DKOpnt=%)ySMHInjX04*?J(n)J}UTfnXG+D4M5= zRS50wadx{ozQXGB!SC1$lU2V{j}pv;QAC4@{mrHjE=#O z5=^!4(3S91HUVLodjN)eeKof|Ap?g>RwIjV>!D_~3;Ip@w4ghR~hv z7*vY!uNm>GDQpyOA0TuB;Q-0rIG=%92sFTef->X;tJldflaN>T5=J2bw)m{H=vuSM zu6>|*grUm+ugsOnC^$}_I;#G!6y)yhj8W`GP2hF{R;c*|p!7wygMnB|dW_A#D>hjx zu8y2Lrp$0?g>Ai?Ot4ibN@k9^=ti$Av+S^i24D-Bl40@1;LO!aV0y0A0l->9sHOvU znJ`F0-fha`aFf%YM1)Zd70{JPPXZ1^6Nmw~lPlBSY0gF8EXV|bOoYgU7GGb*r~kWQ zvFRy28O)xZSNjLI6op1n9ql zY4{8RaRD}HkxwfnFn9x}oFcy!2dpdTmZpWPzj!!l%8;2Zr4w`q;x%Uof@1#k0O=sy zGWO{6y_X;?2-$`8%hMZt^4s8g_&c;dxyNtmrvx$xl^`e#Mwl_&=DopRYT$6s1_yI; zmp6Wo;mTpX6~iSsYb5u18511FhW3^Y`NB7AF-L41gQCkx+yg>xU=#=01!-E1!Y;8uG#UjX2mChA3gx zRxdpK#RFDj4n|KQ?|m#XRJbb!gdt*RU9jHrS`E~P;k{)b4AzaP4s|S}+6MTnsF?mU zVsyz(BUR9-AD~g4$PBe_EAT#r_+gr^Er3Q?^OK+fd``m*N!%pdg*TC)+qGjr9&p!& zN(Nk6DM>*~UTWg#Pe}OIWeNpq?!bYvhp8mNEtrrDlj+u?vFAOsjs^7mZEGY_Pz>!w z@%N!Mu0IXwI~%c#|B)zh$sP=kZwIT6#YB6f>;zG*$zcu1-CPysxVO=NhrC@A0}cg+vuNlYtcFnAuRSRvPWxq0i3;eETqlb<%1UJ0ovrgGrDiEDbrSk8Fpyc86rp=%` z0`7YRuC5A~1(MMESQXw1YO&ma!tJ47D3J-j7fY4+84ebWcc@svrkoZ0i*79H9xyn+GRmEYRVF5)-en9r&*QE;hXPHn1I7!8I@+*%FTm&N6i^(6NTJEx zu)bP^0*lgceTOgLdseQCu(gdds6dP+wK$q_jv3qX{O*(qRt1V@U=0N`QHnh%+t(18 zsy=I#EdhvK!uNg}mtcwZEmQ#x&`p9HD~Nsx1?m=}stN&^Sr6ZsVf<>YNF3DGf;1d;)Q>GRIG|{-h`J$o1ujeqR6oAS9Hi7}T zI(@uoa^)-N9B7QUxg+6!f2Kk8ymg;Q`eYV~U{v;xbSQGQaO*Ztv z>Q=!ugCH62fqlRj;LAX4uKsBN(g8kKHvq^*(hv*)1UqF$%e8w=squhmUcSdvT;+pZ z(0q9Ro+zR_JaZat`bH>(1y+Xq%!|?t@FyW+fG-xGYErI43GC*e_Byf))+;dyK6+TA zI6Kg4Vjl9&2Aod9jeY|yXR!s1NqDuNJc7?mhk;2l!t=lGU&t4iyDQ*fYO3IyuA<3N~~Q3zwYmJfML`g!1} zpRQ0N;CBk{VDzbwNz>Yr1F87H9Ez5F@LZ)~{(A*5h9aIa4kcCmEXQrVTyq0ReS`%ERd}Ko-`H2Wt0!Xu`UG~RD+C& zJ$?<5cRCacO%{#*wY`a#z@(9k*yN0s%%UZ2g?P#RE^7F-7&0dUCK(XHs}e^@gb!F3 zkw0zstOa^iGjwJ0ZPCBXEwM|_HQIL*vN`c> zg$>N7$p+GH;+~IoaB8VVYS48Px8@XzdjJB~<*W?)9B)0_q+v6T!C&&jP2(TbK!%f` zzB($Vw|G^=b$jEr_zA&7Ct6x-Gaisln5Z!oxlSE zZ>^YLur#XuG8BFS?o`QlB6rt3xY&V#U8QqV(pkU9FteJcboLnyundCXTs z@dD1b%J4LAI~i`J0fwuC@x`p$9Trdc0deY}dgLpsMRWMN6Vb(_-}~mZixqChf?*p7 zl5sS*Bmf0JsOf5Z^<9?IIs#4R2~9@su~iOed*NH#yIUP2cfzJJg+rqV8An%F0+@}5 z&I|LAGJ)wD_`VID>@sp*9#(})7QkP)w_5Y_2b2~-FZdWmU|4P5%p%ylBv0HwJgyKJ z!DtcQ@H4Okgcl;LFz4w;AYY6_HH#ts=}=%(jHqFDiLC6~atHRg?{J++KCm1Q2W7>G z3fkoFAr+771p(w%Gdqo9e$RXX&)FoavTAN`} zlT5~s6&dRPk1}B1Q*uk-O`8n}{|2r73jrO?7`oOXV3n6feRXY4EArP|i(~|k(h(ty zU~SSG@`JSD^ffAAnXuIUHpAL9GUUX2vey#Bv^VTP1FnTIk!uqc2$C6(`{r6In1MzF zBUqaTK#YvwSN>W8nC3tbY)?Vfkx)~tjSft%-0y-lR4eWMR|Wxclars^!wu+~AO72`_}(!6{A$ z9?l7pDQvP#076d*@LkJ&IBykHudH?s`!yT3LYDln3CO3ppMQX0Ili(oD2G;~g&E2r z13_@P9G^#$QRq4%4G`!ih=9Qr=rjstW~Kq_EAS@RRsjK_+%&+t0#UES z9GtPqmrdd#G(d9(E}NcK;4+3#;vaG}V8aqY8odAK{o#g)*HL}2dN$A?t-6zPe~&N zxT;pnH*hB-dJLNGJ=|uJ_w*Tcu&WB$hE47^59ouPpmYRclDme~4sfFikw;y%y9!oy zboYujglc?|%~=hhTl6s~H!y2oneM*VsC9J0x(q=3ksBb?6f>3pxVgfi2ITKlO8Pp;}Z%oslQ&p_BjtvcSXpY$n63+S%WBIW{RVC zQ%!~~C@1+hR%|>CxOHfautg}0D)bg8twq>@OfABSStZ}S`ObA+3W_3^zZs+!0EgO@ z6OQMXi|q7aE$vk(D4;%Te$LIH3^$>*LEpbpbI}pewTBSksYB4b^WfK02(`eW0-(MQ zp#$D^xL=*BgGH%pim;c&gD6y%8DoPHFagQC_-UceU0AdLiyZDE94PZ36d=Gt1lRAb zth|3N6_(dR{Wd_~A)kf6K{Wai8Ub+o9xi@kJtSUYC4!BkG#tRXWyPELBKS_dgKu+6 z;p&3CGxl6h2BtI<#GdZp(3cECDe$Iu8aklsw1OY2Ihkw$$F)RALw?lC8oG+lx$0pJ_n`C^5?(TU4-v*XZrr1X za(u8Ibm5RjzV3i;mtYmJ>!8l9kTg01Crxfe#4%FJ>5q91&?{=-cu6k*`Z*jGUIG?H zn~J*)(i=zNKzIWfd!gZt0?%K^f$**`)2aoV(2`SWt0mYiU@lCieox~O2dHiltTXvS zQYZt*-|tFf!LCuEf}PtTr`}Awjz|mo;hq%}x~8{Nz$-^5Qf6mWZpn@P3{cD~L*A{fmhZo>4#-mNaPZ*2qJ58<$^ zIt*@fA*$GrbB)_{_#)J(9R89wvi1lOC>9cVfMNLKpWg6Nra-&>&d2!CrB2%o9@-xI;-aw5FJ`UvNOo?KIlPZNRQ zZG@H8*Zug)5_Qcgw+Nk;>{d`fXC-k1IPiF7nKJaUSZ6mhmi~XbXZk+`Nskc`)MSm1 zAsdZPxFnPfD+sB9t;O^N*904$9)AMcp5T{8?a<-s*C!D21n){2=(GF`Xn2B1veH0# T6cnc@Pf;EYr=U18i$4AzcUWTR diff --git a/src/dev/peerat/backend/bonus/extract/RouteExtracter.java b/src/dev/peerat/backend/bonus/extract/RouteExtracter.java index 9caf3d0..75fbb3b 100644 --- a/src/dev/peerat/backend/bonus/extract/RouteExtracter.java +++ b/src/dev/peerat/backend/bonus/extract/RouteExtracter.java @@ -8,15 +8,14 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - import dev.peerat.backend.model.PeerAtUser; import dev.peerat.framework.RequestType; import dev.peerat.framework.Response; import dev.peerat.framework.Route; import dev.peerat.framework.RouteMapper; import dev.peerat.framework.Router; +import dev.peerat.framework.utils.json.JsonArray; +import dev.peerat.framework.utils.json.JsonMap; public class RouteExtracter { @@ -59,15 +58,15 @@ public class RouteExtracter { } } - public JSONObject swagger(String host) throws Exception{ - JSONObject result = new JSONObject(); - result.put("swagger","2.0"); - JSONObject info = new JSONObject(); - info.put("title", "Peer-at-code backend api routes"); - info.put("description", "Using Peer-at Code Framework"); - result.put("info", info); - result.put("host", host); - result.put("basePath","/"); + public JsonMap swagger(String host) throws Exception{ + JsonMap result = new JsonMap(); + result.set("swagger","2.0"); + JsonMap info = new JsonMap(); + info.set("title", "Peer-at-code backend api routes"); + info.set("description", "Using Peer-at Code Framework"); + result.set("info", info); + result.set("host", host); + result.set("basePath","/"); List routes = new ArrayList<>(); RouteMapper[] mappers = getField(Router.class, router, "mappers"); @@ -85,18 +84,18 @@ public class RouteExtracter { name = name.substring(name.lastIndexOf('.')+1, name.length()); packages.add(name); } - JSONArray tags = new JSONArray(); + JsonArray tags = new JsonArray(); for(String tag : packages){ - JSONObject current = new JSONObject(); - current.put("name", tag); + JsonMap current = new JsonMap(); + current.set("name", tag); tags.add(current); } - result.put("tags", tags); - JSONArray schemes = new JSONArray(); + result.set("tags", tags); + JsonArray schemes = new JsonArray(); schemes.add("https"); - result.put("schemes", schemes); + result.set("schemes", schemes); - JSONObject paths = new JSONObject(); + JsonMap paths = new JsonMap(); for(Response response : routes){ Method method = response.getClass().getDeclaredMethod("exec", @@ -105,21 +104,21 @@ public class RouteExtracter { RouteDoc[] docs = method.getDeclaredAnnotationsByType(RouteDoc.class); if(docs.length < 1) continue; RouteDoc base = docs[0]; - JSONObject current = new JSONObject(); - JSONObject data = new JSONObject(); - JSONArray tag = new JSONArray(); + JsonMap current = new JsonMap(); + JsonMap data = new JsonMap(); + JsonArray tag = new JsonArray(); String pack = response.getClass().getPackage().getName(); pack = pack.substring(pack.lastIndexOf('.')+1, pack.length()); tag.add(pack); - data.put("tags", tag); + data.set("tags", tag); - current.put(route.type().toString().toLowerCase(), data); + current.set(route.type().toString().toLowerCase(), data); - paths.put(base.path(), current); + paths.set(base.path(), current); } - result.put("paths", paths); + result.set("paths", paths); return result; } diff --git a/src/dev/peerat/backend/model/Group.java b/src/dev/peerat/backend/model/Group.java index be6bc43..14c44c8 100644 --- a/src/dev/peerat/backend/model/Group.java +++ b/src/dev/peerat/backend/model/Group.java @@ -4,11 +4,11 @@ import java.util.ArrayList; import java.util.List; import java.util.Objects; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; +import org.jose4j.json.internal.json_simple.JSONArray; +import org.jose4j.json.internal.json_simple.JSONObject; import be.jeffcheasey88.peeratcode.mapping.SeaBottle; -import be.jeffcheasey88.peeratcode.mapping.Treasure; +import dev.peerat.framework.utils.json.JsonMap; public class Group implements Comparable { private String name; @@ -21,11 +21,11 @@ public class Group implements Comparable { return "Group[name="+name+", chapter="+linkToChapter+"]"; } - public Group(JSONObject json){ + public Group(JsonMap json){ this.name = (String) json.get("name"); - if (json.containsKey("chapter")) + if (json.has("chapter")) this.linkToChapter = ((Number) json.get("chapter")).intValue(); -// if (json.containsKey("puzzle")) +// if (json.has("puzzle")) // this.linkToPuzzle = ((Number) json.get("puzzle")).intValue(); } diff --git a/src/dev/peerat/backend/model/Player.java b/src/dev/peerat/backend/model/Player.java index a532052..1be92f0 100644 --- a/src/dev/peerat/backend/model/Player.java +++ b/src/dev/peerat/backend/model/Player.java @@ -5,8 +5,8 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; +import dev.peerat.framework.utils.json.JsonArray; +import dev.peerat.framework.utils.json.JsonMap; public class Player implements Comparable { private String pseudo; @@ -70,9 +70,9 @@ public class Player implements Comparable { return groups; } - public JSONArray getJsonGroups() { + public JsonArray getJsonGroups() { if (groups != null) { - JSONArray groupsJSON = new JSONArray(); + JsonArray groupsJSON = new JsonArray(); for (Group group : groups) { groupsJSON.add(group.toJson()); } @@ -121,13 +121,13 @@ public class Player implements Comparable { return completions.size(); } - public JSONArray getJsonCompletions() { - JSONArray completionsJSON = new JSONArray(); + public JsonArray getJsonCompletions() { + JsonArray completionsJSON = new JsonArray(); for (Completion completion : completions) { - JSONObject completionJSON = new JSONObject(); - completionJSON.put("puzzleName", completion.getPuzzleName()); - completionJSON.put("tries", completion.getTries()); - completionJSON.put("score", completion.getScore()); + JsonMap completionJSON = new JsonMap(); + completionJSON.set("puzzleName", completion.getPuzzleName()); + completionJSON.set("tries", completion.getTries()); + completionJSON.set("score", completion.getScore()); completionsJSON.add(completionJSON); } return completionsJSON; @@ -145,17 +145,17 @@ public class Player implements Comparable { return badges; } - public JSONArray getJsonBadges() { + public JsonArray getJsonBadges() { if (badges == null) return null; - JSONArray badgesJSON = new JSONArray(); + JsonArray badgesJSON = new JsonArray(); for (Badge badge : badges) { - JSONObject badgeJSON = new JSONObject(); - badgeJSON.put("name", badge.getName()); + JsonMap badgeJSON = new JsonMap(); + badgeJSON.set("name", badge.getName()); byte[] logo = badge.getLogo(); if (logo != null) - badgeJSON.put("logo", Base64.getEncoder().encodeToString(logo)); - badgeJSON.put("level", badge.getLevel()); + badgeJSON.set("logo", Base64.getEncoder().encodeToString(logo)); + badgeJSON.set("level", badge.getLevel()); badgesJSON.add(badgeJSON); } return badgesJSON; diff --git a/src/dev/peerat/backend/model/Puzzle.java b/src/dev/peerat/backend/model/Puzzle.java index 7c45ade..b783493 100644 --- a/src/dev/peerat/backend/model/Puzzle.java +++ b/src/dev/peerat/backend/model/Puzzle.java @@ -6,8 +6,8 @@ import java.util.Arrays; import java.util.HashSet; import java.util.Set; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; +import dev.peerat.framework.utils.json.JsonArray; +import dev.peerat.framework.utils.json.JsonMap; public class Puzzle { @@ -63,13 +63,13 @@ public class Puzzle { * * @return DEATH */ - public JSONArray getJsonTags() { + public JsonArray getJsonTags() { if (tags == null) return null; - JSONArray tagsJSON = new JSONArray(); + JsonArray tagsJSON = new JsonArray(); for (String tag : tags) { - JSONObject tagJSON = new JSONObject(); - tagJSON.put("name", tag); + JsonMap tagJSON = new JsonMap(); + tagJSON.set("name", tag); tagsJSON.add(tagJSON); } return tagsJSON; diff --git a/src/dev/peerat/backend/routes/BadgeDetails.java b/src/dev/peerat/backend/routes/BadgeDetails.java index 0ba5e3a..cdb4389 100644 --- a/src/dev/peerat/backend/routes/BadgeDetails.java +++ b/src/dev/peerat/backend/routes/BadgeDetails.java @@ -3,8 +3,6 @@ package dev.peerat.backend.routes; import java.util.Base64; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Badge; import dev.peerat.backend.repository.DatabaseRepository; @@ -13,6 +11,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class BadgeDetails implements Response { @@ -30,15 +29,14 @@ public class BadgeDetails implements Response { if (matcher.groupCount() > 0) { int badgeId = Integer.parseInt(matcher.group(1)); Badge badge = databaseRepo.getBadge(badgeId); - JSONObject badgeJSON = new JSONObject(); - if (badge != null) { - badgeJSON.put("name", badge.getName()); - if (badge.getLogo() != null) - badgeJSON.put("logo", Base64.getEncoder().encodeToString(badge.getLogo())); - badgeJSON.put("level", badge.getLevel()); + JsonMap badgeJSON = new JsonMap(); + if(badge != null){ + badgeJSON.set("name", badge.getName()); + if(badge.getLogo() != null) badgeJSON.set("logo", Base64.getEncoder().encodeToString(badge.getLogo())); + badgeJSON.set("level", badge.getLevel()); } context.response(200); - writer.write(badgeJSON.toJSONString().replace("\\", "")); + writer.write(badgeJSON.toString().replace("\\", "")); } else { context.response(400); } diff --git a/src/dev/peerat/backend/routes/ChapterElement.java b/src/dev/peerat/backend/routes/ChapterElement.java index 7af604f..65327bc 100644 --- a/src/dev/peerat/backend/routes/ChapterElement.java +++ b/src/dev/peerat/backend/routes/ChapterElement.java @@ -2,9 +2,6 @@ package dev.peerat.backend.routes; import java.util.regex.Matcher; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Chapter; import dev.peerat.backend.model.PeerAtUser; @@ -15,6 +12,8 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonArray; +import dev.peerat.framework.utils.json.JsonMap; public class ChapterElement implements Response { @@ -31,29 +30,29 @@ public class ChapterElement implements Response { public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception{ Chapter chapter = databaseRepo.getChapter(Integer.parseInt(matcher.group(1))); if (chapter != null){ - JSONObject chapterJSON = new JSONObject(); - chapterJSON.put("id", chapter.getId()); - chapterJSON.put("name", chapter.getName()); + JsonMap chapterJSON = new JsonMap(); + chapterJSON.set("id", chapter.getId()); + chapterJSON.set("name", chapter.getName()); boolean show = chapter.isInCurrentTime(); - chapterJSON.put("show", show); + chapterJSON.set("show", show); PeerAtUser user = context.getUser(); if(show){ - JSONArray puzzles = new JSONArray(); + JsonArray puzzles = new JsonArray(); for (Puzzle puzzle : chapter.getPuzzles()){ - JSONObject puzzleJSON = new JSONObject(); - puzzleJSON.put("id", puzzle.getId()); - puzzleJSON.put("name", puzzle.getName()); - puzzleJSON.put("scoreMax", puzzle.getScoreMax()); - if (puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags()); + JsonMap puzzleJSON = new JsonMap(); + puzzleJSON.set("id", puzzle.getId()); + puzzleJSON.set("name", puzzle.getName()); + puzzleJSON.set("scoreMax", puzzle.getScoreMax()); + if (puzzle.getTags() != null) puzzleJSON.set("tags", puzzle.getJsonTags()); int score = this.databaseRepo.getScore(user.getId(), puzzle.getId()); - if(score >= 0) puzzleJSON.put("score", score); - puzzleJSON.put("show", puzzle.isInCurrentTime()); + if(score >= 0) puzzleJSON.set("score", score); + puzzleJSON.set("show", puzzle.isInCurrentTime()); puzzles.add(puzzleJSON); } - chapterJSON.put("puzzles", puzzles); + chapterJSON.set("puzzles", puzzles); } context.response(200); - writer.write(chapterJSON.toJSONString()); + writer.write(chapterJSON.toString()); } else { context.response(400); } diff --git a/src/dev/peerat/backend/routes/ChapterList.java b/src/dev/peerat/backend/routes/ChapterList.java index 19b6a16..ac30c0d 100644 --- a/src/dev/peerat/backend/routes/ChapterList.java +++ b/src/dev/peerat/backend/routes/ChapterList.java @@ -3,9 +3,6 @@ package dev.peerat.backend.routes; import java.util.List; import java.util.regex.Matcher; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Chapter; import dev.peerat.backend.repository.DatabaseRepository; @@ -14,6 +11,8 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonArray; +import dev.peerat.framework.utils.json.JsonMap; public class ChapterList implements Response { @@ -30,16 +29,16 @@ public class ChapterList implements Response { public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception { List allChapters = databaseRepo.getAllChapters(); if (allChapters != null) { - JSONArray chaptersJSON = new JSONArray(); + JsonArray chaptersJSON = new JsonArray(); for (Chapter chapter : allChapters) { - JSONObject chapterJSON = new JSONObject(); - chapterJSON.put("id", chapter.getId()); - chapterJSON.put("name", chapter.getName()); - chapterJSON.put("show", chapter.isInCurrentTime()); + JsonMap chapterJSON = new JsonMap(); + chapterJSON.set("id", chapter.getId()); + chapterJSON.set("name", chapter.getName()); + chapterJSON.set("show", chapter.isInCurrentTime()); chaptersJSON.add(chapterJSON); } context.response(200); - writer.write(chaptersJSON.toJSONString()); + writer.write(chaptersJSON.toString()); } else { context.response(400); } diff --git a/src/dev/peerat/backend/routes/Leaderboard.java b/src/dev/peerat/backend/routes/Leaderboard.java index 0667705..5aef25f 100644 --- a/src/dev/peerat/backend/routes/Leaderboard.java +++ b/src/dev/peerat/backend/routes/Leaderboard.java @@ -4,9 +4,6 @@ import java.io.IOException; import java.util.SortedSet; import java.util.regex.Matcher; -import org.json.simple.JSONArray; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Chapter; import dev.peerat.backend.model.Group; @@ -17,6 +14,8 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonArray; +import dev.peerat.framework.utils.json.JsonMap; public class Leaderboard implements Response { @@ -42,12 +41,12 @@ public class Leaderboard implements Response { Chapter chInfo = databaseRepo.getChapter(chapterId); SortedSet allGroupsForChapter = databaseRepo.getAllGroupForChapterLeaderboard(chapterId); - JSONObject leaderboardJSON = new JSONObject(); + JsonMap leaderboardJSON = new JsonMap(); if (chInfo.getStartDate() != null) - leaderboardJSON.put("start_date", chInfo.getStartDate().toString()); + leaderboardJSON.set("start_date", chInfo.getStartDate().toString()); if (chInfo.getEndDate() != null) - leaderboardJSON.put("end_date", chInfo.getEndDate().toString()); - JSONArray groupsJSON = new JSONArray(); + leaderboardJSON.set("end_date", chInfo.getEndDate().toString()); + JsonArray groupsJSON = new JsonArray(); if (allGroupsForChapter != null) { int rank = 1; int sameRankCount = 1; @@ -65,28 +64,28 @@ public class Leaderboard implements Response { previousGroup = g; } } - leaderboardJSON.put("groups", groupsJSON); - writer.write(leaderboardJSON.toJSONString().replace("\\", "")); + leaderboardJSON.set("groups", groupsJSON); + writer.write(leaderboardJSON.toString().replace("\\", "")); } public final void playersLeaderboard(HttpWriter writer) throws IOException { SortedSet allPlayers = databaseRepo.getAllPlayerForLeaderboard(); - JSONArray playersJSON = new JSONArray(); + JsonArray playersJSON = new JsonArray(); if (allPlayers != null) { for (Player player : allPlayers) { - JSONObject playerJSON = new JSONObject(); - playerJSON.put("pseudo", player.getPseudo()); + JsonMap playerJSON = new JsonMap(); + playerJSON.set("pseudo", player.getPseudo()); if (player.getGroups() != null) - playerJSON.put("groups", player.getJsonGroups()); + playerJSON.set("groups", player.getJsonGroups()); // if (player.getAvatar() != null) // playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar())); - playerJSON.put("rank", player.getRank()); - playerJSON.put("score", player.getTotalScore()); - playerJSON.put("completions", player.getTotalCompletion()); - playerJSON.put("tries", player.getTotalTries()); + playerJSON.set("rank", player.getRank()); + playerJSON.set("score", player.getTotalScore()); + playerJSON.set("completions", player.getTotalCompletion()); + playerJSON.set("tries", player.getTotalTries()); playersJSON.add(playerJSON); } } - writer.write(playersJSON.toJSONString().replace("\\", "")); + writer.write(playersJSON.toString().replace("\\", "")); } } diff --git a/src/dev/peerat/backend/routes/PlayerDetails.java b/src/dev/peerat/backend/routes/PlayerDetails.java index adeb616..340426d 100644 --- a/src/dev/peerat/backend/routes/PlayerDetails.java +++ b/src/dev/peerat/backend/routes/PlayerDetails.java @@ -3,8 +3,6 @@ package dev.peerat.backend.routes; import java.util.Base64; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.model.Player; @@ -14,6 +12,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class PlayerDetails implements Response { @@ -35,26 +34,26 @@ public class PlayerDetails implements Response { PeerAtUser user = context.getUser(); player = databaseRepo.getPlayerDetails(user.getId()); } - JSONObject playerJSON = new JSONObject(); + JsonMap playerJSON = new JsonMap(); if (player != null) { - playerJSON.put("pseudo", player.getPseudo()); - playerJSON.put("email", player.getEmail()); - playerJSON.put("firstname", player.getFirstname()); - playerJSON.put("lastname", player.getLastname()); - playerJSON.put("description", player.getDescription()); + playerJSON.set("pseudo", player.getPseudo()); + playerJSON.set("email", player.getEmail()); + playerJSON.set("firstname", player.getFirstname()); + playerJSON.set("lastname", player.getLastname()); + playerJSON.set("description", player.getDescription()); if (player.getGroups() != null) - playerJSON.put("groups", player.getJsonGroups()); - playerJSON.put("rank", player.getRank()); - playerJSON.put("score", player.getTotalScore()); - playerJSON.put("completions", player.getTotalCompletion()); - playerJSON.put("completionsList", player.getJsonCompletions()); - playerJSON.put("tries", player.getTotalTries()); + playerJSON.set("groups", player.getJsonGroups()); + playerJSON.set("rank", player.getRank()); + playerJSON.set("score", player.getTotalScore()); + playerJSON.set("completions", player.getTotalCompletion()); + playerJSON.set("completionsList", player.getJsonCompletions()); + playerJSON.set("tries", player.getTotalTries()); if (player.getBadges() != null) - playerJSON.put("badges", player.getJsonBadges()); + playerJSON.set("badges", player.getJsonBadges()); if (player.getAvatar() != null) - playerJSON.put("avatar", Base64.getEncoder().encodeToString(player.getAvatar())); + playerJSON.set("avatar", Base64.getEncoder().encodeToString(player.getAvatar())); context.response(200); - writer.write(playerJSON.toJSONString().replace("\\", "")); + writer.write(playerJSON.toString().replace("\\", "")); } else { context.response(400); } diff --git a/src/dev/peerat/backend/routes/PuzzleElement.java b/src/dev/peerat/backend/routes/PuzzleElement.java index d9c6497..9787146 100644 --- a/src/dev/peerat/backend/routes/PuzzleElement.java +++ b/src/dev/peerat/backend/routes/PuzzleElement.java @@ -3,8 +3,6 @@ package dev.peerat.backend.routes; import java.time.LocalDateTime; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Chapter; import dev.peerat.backend.model.Completion; @@ -16,6 +14,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class PuzzleElement implements Response { @@ -49,20 +48,20 @@ public class PuzzleElement implements Response { PeerAtUser user = context.getUser(); - JSONObject puzzleJSON = new JSONObject(); - puzzleJSON.put("id", puzzle.getId()); - puzzleJSON.put("name", puzzle.getName()); - puzzleJSON.put("content", puzzle.getContent()); - puzzleJSON.put("scoreMax", puzzle.getScoreMax()); - if(puzzle.getTags() != null) puzzleJSON.put("tags", puzzle.getJsonTags()); + JsonMap puzzleJSON = new JsonMap(); + puzzleJSON.set("id", puzzle.getId()); + puzzleJSON.set("name", puzzle.getName()); + puzzleJSON.set("content", puzzle.getContent()); + puzzleJSON.set("scoreMax", puzzle.getScoreMax()); + if(puzzle.getTags() != null) puzzleJSON.set("tags", puzzle.getJsonTags()); Completion completion = this.databaseRepo.getCompletionGroup(user.getId(), puzzle.getId()); if(completion != null && completion.getScore() >= 0){ - puzzleJSON.put("score", completion.getScore()); - puzzleJSON.put("tries", completion.getTries()); + puzzleJSON.set("score", completion.getScore()); + puzzleJSON.set("tries", completion.getTries()); } - if(puzzle.getDepend() > 0) puzzleJSON.put("depend", puzzle.getDepend()); + if(puzzle.getDepend() > 0) puzzleJSON.set("depend", puzzle.getDepend()); context.response(200, "Content-Type: application/json"); - writer.write(puzzleJSON.toJSONString()); + writer.write(puzzleJSON.toString()); } else { context.response(400); diff --git a/src/dev/peerat/backend/routes/PuzzleResponse.java b/src/dev/peerat/backend/routes/PuzzleResponse.java index 60963e5..fe510b5 100644 --- a/src/dev/peerat/backend/routes/PuzzleResponse.java +++ b/src/dev/peerat/backend/routes/PuzzleResponse.java @@ -11,8 +11,6 @@ import java.util.Arrays; import java.util.List; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Chapter; import dev.peerat.backend.model.Completion; @@ -27,6 +25,7 @@ import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Locker; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class PuzzleResponse implements Response { private final DatabaseRepository databaseRepo; @@ -56,7 +55,7 @@ public class PuzzleResponse implements Response { PeerAtUser user = context.getUser(); //saveSourceCode(received, databaseRepo.getPlayer(user.getId())); - JSONObject responseJSON = new JSONObject(); + JsonMap responseJSON = new JsonMap(); if(this.databaseRepo.getScore(user.getId(), received.getPuzzleId()) > 0){ context.response(403); return; @@ -74,9 +73,9 @@ public class PuzzleResponse implements Response { if(LocalDateTime.now().isAfter(chapter.getEndDate().toLocalDateTime())){ if(Arrays.equals(currentPuzzle.getSoluce(), received.getResponse())){ context.response(200, "Content-Type: application/json"); - JSONObject theoSaisPasJusteRecevoir200 = new JSONObject(); - theoSaisPasJusteRecevoir200.put("success", true); - writer.write(theoSaisPasJusteRecevoir200.toJSONString()); + JsonMap theoSaisPasJusteRecevoir200 = new JsonMap(); + theoSaisPasJusteRecevoir200.set("success", true); + writer.write(theoSaisPasJusteRecevoir200.toString()); return; } context.response(423); @@ -98,14 +97,14 @@ public class PuzzleResponse implements Response { } if(completion.getScore() > 0){ context.response(200, "Content-Type: application/json"); - responseJSON.put("score", completion.getScore()); - responseJSON.put("tries", completion.getTries()); + responseJSON.set("score", completion.getScore()); + responseJSON.set("tries", completion.getTries()); }else{ context.response(406, "Content-Type: application/json"); - responseJSON.put("tries", completion.getTries()); + responseJSON.set("tries", completion.getTries()); } - writer.write(responseJSON.toJSONString()); + writer.write(responseJSON.toString()); writer.flush(); leaderboard.setValue(completion); diff --git a/src/dev/peerat/backend/routes/Swagger.java b/src/dev/peerat/backend/routes/Swagger.java index f7f1b7a..24a90e2 100644 --- a/src/dev/peerat/backend/routes/Swagger.java +++ b/src/dev/peerat/backend/routes/Swagger.java @@ -15,7 +15,7 @@ public class Swagger implements Response{ public Swagger(RouteExtracter extracter, String host){ try{ - this.json = extracter.swagger(host).toJSONString(); + this.json = extracter.swagger(host).toString(); }catch(Exception e){ e.printStackTrace(); json = "{}"; diff --git a/src/dev/peerat/backend/routes/admins/DynamicLogs.java b/src/dev/peerat/backend/routes/admins/DynamicLogs.java index 00f0bd8..2e7f0ff 100644 --- a/src/dev/peerat/backend/routes/admins/DynamicLogs.java +++ b/src/dev/peerat/backend/routes/admins/DynamicLogs.java @@ -2,7 +2,7 @@ package dev.peerat.backend.routes.admins; import java.util.regex.Matcher; -import org.json.simple.JSONObject; +import org.jose4j.json.internal.json_simple.JSONObject; import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.PeerAtUser; @@ -14,6 +14,7 @@ import dev.peerat.framework.Locker; import dev.peerat.framework.Locker.Key; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class DynamicLogs implements Response{ @@ -39,14 +40,14 @@ public class DynamicLogs implements Response{ while(!reader.isClosed()){ locker.lock(key); Context instance = locker.getValue(key); - JSONObject json = new JSONObject(); - json.put("logged", instance.isLogged()); - if(instance.isLogged()) json.put("pseudo", repo.getPlayer(instance.getUser().getId()).getPseudo()); - json.put("path", instance.getPath()); - json.put("type", instance.getType()); - json.put("code", instance.getResponseCode()); + JsonMap json = new JsonMap(); + json.set("logged", instance.isLogged()); + if(instance.isLogged()) json.set("pseudo", repo.getPlayer(instance.getUser().getId()).getPseudo()); + json.set("path", instance.getPath()); + json.set("type", instance.getType()); + json.set("code", instance.getResponseCode()); - writer.write(json.toJSONString()); + writer.write(json.toString()); writer.flush(); } }catch(Exception e){ diff --git a/src/dev/peerat/backend/routes/groups/GroupList.java b/src/dev/peerat/backend/routes/groups/GroupList.java index b4199df..dc0f626 100644 --- a/src/dev/peerat/backend/routes/groups/GroupList.java +++ b/src/dev/peerat/backend/routes/groups/GroupList.java @@ -2,8 +2,6 @@ package dev.peerat.backend.routes.groups; import java.util.regex.Matcher; -import org.json.simple.JSONArray; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.Group; import dev.peerat.backend.repository.DatabaseRepository; @@ -12,6 +10,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonArray; public class GroupList implements Response { @@ -26,9 +25,9 @@ public class GroupList implements Response { @Route(path = "^\\/groups$", needLogin = true) public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception { context.response(200); - JSONArray result = new JSONArray(); + JsonArray result = new JsonArray(); for(Group group : this.repo.getAllGroups()) result.add(group.toJson()); - writer.write(result.toJSONString()); + writer.write(result.toString()); } } diff --git a/src/dev/peerat/backend/routes/users/ChangePassword.java b/src/dev/peerat/backend/routes/users/ChangePassword.java index ab4bff6..5d0eebe 100644 --- a/src/dev/peerat/backend/routes/users/ChangePassword.java +++ b/src/dev/peerat/backend/routes/users/ChangePassword.java @@ -2,8 +2,6 @@ package dev.peerat.backend.routes.users; import java.util.regex.Matcher; -import org.jose4j.json.internal.json_simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.repository.DatabaseRepository; @@ -13,6 +11,7 @@ import dev.peerat.framework.HttpWriter; import dev.peerat.framework.RequestType; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class ChangePassword implements Response{ @@ -27,7 +26,7 @@ public class ChangePassword implements Response{ @Route(path = "^/user/cpw$", type = RequestType.POST, needLogin = true) public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception { - String password = (String) reader.readJson().get("password"); + String password = reader.readJson().get("password"); repo.updatePassword(context.getUser().getId(), password); context.response(200); diff --git a/src/dev/peerat/backend/routes/users/ForgotPassword.java b/src/dev/peerat/backend/routes/users/ForgotPassword.java index e42f7db..0f8f661 100644 --- a/src/dev/peerat/backend/routes/users/ForgotPassword.java +++ b/src/dev/peerat/backend/routes/users/ForgotPassword.java @@ -5,8 +5,6 @@ import java.util.Map; import java.util.Random; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.utils.FormResponse; @@ -16,6 +14,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Route; import dev.peerat.framework.Router; +import dev.peerat.framework.utils.json.JsonMap; public class ForgotPassword extends FormResponse{ @@ -38,13 +37,13 @@ public class ForgotPassword extends FormResponse{ return; } - JSONObject json = json(reader); + JsonMap json = json(reader); if(!areValids("email")){ context.response(400); return; } - String email = (String) json.get("email"); + String email = json.get("email"); int player = repo.getPlayerId(email); if(player < 0){ @@ -59,8 +58,8 @@ public class ForgotPassword extends FormResponse{ return; } - int code = ((Long)json.get("code")).intValue(); - String password = (String)json.get("password"); + int code = json.get("code").intValue(); + String password = json.get("password"); if(code == checkCode.intValue()){ codes.remove(email); diff --git a/src/dev/peerat/backend/routes/users/Login.java b/src/dev/peerat/backend/routes/users/Login.java index 9cb11b8..9610202 100644 --- a/src/dev/peerat/backend/routes/users/Login.java +++ b/src/dev/peerat/backend/routes/users/Login.java @@ -4,8 +4,6 @@ import static dev.peerat.framework.RequestType.POST; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.repository.DatabaseRepository; @@ -15,6 +13,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Route; import dev.peerat.framework.Router; +import dev.peerat.framework.utils.json.JsonMap; public class Login extends FormResponse{ @@ -36,13 +35,13 @@ public class Login extends FormResponse{ context.response(403); return; } - JSONObject json = json(reader); + JsonMap json = json(reader); if(!areValids("pseudo", "passwd")){ context.response(400); return; } int id; - if((id = databaseRepo.login((String)json.get("pseudo"), (String)json.get("passwd"))) >= 0){ + if((id = databaseRepo.login(json.get("pseudo"), json.get("passwd"))) >= 0){ context.response(200, "Access-Control-Expose-Headers: Authorization", "Authorization: Bearer " + this.router.createAuthUser(new PeerAtUser(id))); diff --git a/src/dev/peerat/backend/routes/users/MailConfirmation.java b/src/dev/peerat/backend/routes/users/MailConfirmation.java index d04f762..0997d75 100644 --- a/src/dev/peerat/backend/routes/users/MailConfirmation.java +++ b/src/dev/peerat/backend/routes/users/MailConfirmation.java @@ -14,14 +14,14 @@ import java.security.KeyPairGenerator; import java.security.NoSuchAlgorithmException; import java.security.interfaces.RSAPublicKey; import java.util.Base64; -import java.util.Map; import java.util.Base64.Encoder; +import java.util.Map; import java.util.regex.Matcher; import javax.net.ssl.HttpsURLConnection; -import org.json.simple.JSONAware; -import org.json.simple.JSONObject; +import org.jose4j.json.internal.json_simple.JSONAware; +import org.jose4j.json.internal.json_simple.JSONObject; import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.PeerAtUser; @@ -32,6 +32,7 @@ import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Route; import dev.peerat.framework.Router; +import dev.peerat.framework.utils.json.JsonMap; public class MailConfirmation extends FormResponse { @@ -73,17 +74,17 @@ public class MailConfirmation extends FormResponse { context.response(403); return; } - JSONObject json = json(reader); + JsonMap json = json(reader); if((!areValids("email","pseudo","firstname","lastname","passwd")) || (!hasFields("code"))){ context.response(400); return; } - String email = (String) json.get("email"); - int code = ((Long)json.get("code")).intValue(); - String pseudo = (String) json.get("pseudo"); - String firstname = (String) json.get("firstname"); - String lastname = (String) json.get("lastname"); - String password = (String) json.get("passwd"); + String email = json.get("email"); + int code = json.get("code").intValue(); + String pseudo = json.get("pseudo"); + String firstname = json.get("firstname"); + String lastname = json.get("lastname"); + String password = json.get("passwd"); Integer checkCode = playersWaiting.get(email); if(checkCode == null){ @@ -101,10 +102,10 @@ public class MailConfirmation extends FormResponse { "Authorization: Bearer " + this.router.createAuthUser(new PeerAtUser(id))); }else{ context.response(400); - JSONObject error = new JSONObject(); - error.put("username_valid", pseudo); - error.put("email_valid", email); - writer.write(error.toJSONString()); + JsonMap error = new JsonMap(); + error.set("username_valid", pseudo); + error.set("email_valid", email); + writer.write(error.toString()); } }else{ context.response(400); diff --git a/src/dev/peerat/backend/routes/users/ProfileSettings.java b/src/dev/peerat/backend/routes/users/ProfileSettings.java index 8293824..703d9f3 100644 --- a/src/dev/peerat/backend/routes/users/ProfileSettings.java +++ b/src/dev/peerat/backend/routes/users/ProfileSettings.java @@ -2,8 +2,6 @@ package dev.peerat.backend.routes.users; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.model.PeerAtUser; import dev.peerat.backend.model.Player; @@ -14,6 +12,7 @@ import dev.peerat.framework.HttpWriter; import dev.peerat.framework.RequestType; import dev.peerat.framework.Response; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class ProfileSettings implements Response{ @@ -28,12 +27,12 @@ public class ProfileSettings implements Response{ @Route(path = "^/user/settings$", type = RequestType.POST, needLogin = true) public void exec(Matcher matcher, Context context, HttpReader reader, HttpWriter writer) throws Exception { - JSONObject json = reader.readJson(); + JsonMap json = reader.readJson(); - String pseudo = (String) json.get("pseudo"); - String email = (String) json.get("email"); - String firstname = (String) json.get("firstname"); - String lastname = (String) json.get("lastname"); + String pseudo = json.get("pseudo"); + String email = json.get("email"); + String firstname = json.get("firstname"); + String lastname = json.get("lastname"); Player player = repo.getPlayer(context.getUser().getId()); if(!player.getPseudo().equals(pseudo)){ diff --git a/src/dev/peerat/backend/routes/users/Register.java b/src/dev/peerat/backend/routes/users/Register.java index fc42765..b4e40f7 100644 --- a/src/dev/peerat/backend/routes/users/Register.java +++ b/src/dev/peerat/backend/routes/users/Register.java @@ -6,8 +6,6 @@ import java.util.Map; import java.util.Random; import java.util.regex.Matcher; -import org.json.simple.JSONObject; - import dev.peerat.backend.bonus.extract.RouteDoc; import dev.peerat.backend.repository.DatabaseRepository; import dev.peerat.backend.utils.FormResponse; @@ -16,6 +14,7 @@ import dev.peerat.framework.Context; import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; import dev.peerat.framework.Route; +import dev.peerat.framework.utils.json.JsonMap; public class Register extends FormResponse { @@ -39,13 +38,13 @@ public class Register extends FormResponse { context.response(403); return; } - JSONObject json = json(reader); + JsonMap json = json(reader); if(!areValids("email")){ context.response(400); return; } - String email = (String) json.get("email"); + String email = json.get("email"); boolean emailAvailable = databaseRepo.checkEmailAvailability(email); if(emailAvailable){ @@ -55,9 +54,9 @@ public class Register extends FormResponse { context.response(200); }else{ context.response(400); - JSONObject error = new JSONObject(); - error.put("email_valid", emailAvailable); - writer.write(error.toJSONString()); + JsonMap error = new JsonMap(); + error.set("email_valid", emailAvailable); + writer.write(error.toString()); } } diff --git a/src/dev/peerat/backend/utils/FormResponse.java b/src/dev/peerat/backend/utils/FormResponse.java index e91c9ea..aca7d23 100644 --- a/src/dev/peerat/backend/utils/FormResponse.java +++ b/src/dev/peerat/backend/utils/FormResponse.java @@ -4,14 +4,14 @@ import java.util.HashMap; import java.util.Map; import java.util.regex.Pattern; -import org.json.simple.JSONAware; - import dev.peerat.framework.HttpReader; import dev.peerat.framework.Response; +import dev.peerat.framework.utils.json.Json; +import dev.peerat.framework.utils.json.JsonMap; public abstract class FormResponse implements Response{ - private JSONAware json; + private Json json; private Map checker; public FormResponse(){ @@ -22,20 +22,20 @@ public abstract class FormResponse implements Response{ this.checker.put(key, regex); } - public T json(HttpReader reader) throws Exception{ + public T json(HttpReader reader) throws Exception{ return (T) (this.json = reader.readJson()); } public boolean hasFields(String... fields){ - Map map = (Map)json; + JsonMap map = (JsonMap)json; for(String field : fields){ - if(!map.containsKey(field)) return false; + if(!map.has(field)) return false; } return true; } public boolean areValids(String... fields){ - Map map = (Map)json; + JsonMap map = (JsonMap)json; for(String field : fields){ String value = (String) map.get(field); if(value == null) return false; diff --git a/test/dev/peerat/backend/WebClient.java b/test/dev/peerat/backend/WebClient.java index 392cfaa..ea855e8 100644 --- a/test/dev/peerat/backend/WebClient.java +++ b/test/dev/peerat/backend/WebClient.java @@ -9,10 +9,9 @@ import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; -import org.json.simple.JSONObject; - import dev.peerat.framework.HttpReader; import dev.peerat.framework.HttpWriter; +import dev.peerat.framework.utils.json.JsonMap; public class WebClient { @@ -49,10 +48,10 @@ public class WebClient { } public void auth(String user, String password) throws Exception{ - JSONObject login = new JSONObject(); - login.put("pseudo", user); - login.put("passwd", password); - route("/login", "POST", login.toJSONString()); + JsonMap login = new JsonMap(); + login.set("pseudo", user); + login.set("passwd", password); + route("/login", "POST", login.toString()); System.out.println("["+host+"] /login "+login); for(String line : this.headers){ @@ -67,17 +66,17 @@ public class WebClient { } public void register(String user, String password, String email, String firstname, String lastname, String description) throws Exception{ - JSONObject register = new JSONObject(); - register.put("pseudo", user); - register.put("passwd", password); - register.put("email", email); - register.put("firstname", firstname); - register.put("lastname", lastname); - register.put("description", description); - register.put("sgroup", ""); - register.put("avatar", ""); + JsonMap register = new JsonMap(); + register.set("pseudo", user); + register.set("passwd", password); + register.set("email", email); + register.set("firstname", firstname); + register.set("lastname", lastname); + register.set("description", description); + register.set("sgroup", ""); + register.set("avatar", ""); - route("/register", "POST", register.toJSONString()); + route("/register", "POST", register.toString()); System.out.println("["+host+"] /register "+register); for(String line : this.headers){ Matcher matcher = AUTORIZATION.matcher(line); diff --git a/test/dev/peerat/backend/routes/ScoreTests.java b/test/dev/peerat/backend/routes/ScoreTests.java index cbffc0a..d8d41a3 100644 --- a/test/dev/peerat/backend/routes/ScoreTests.java +++ b/test/dev/peerat/backend/routes/ScoreTests.java @@ -2,7 +2,6 @@ package dev.peerat.backend.routes; import static org.junit.jupiter.api.Assertions.fail; -import org.json.simple.JSONObject; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -11,6 +10,7 @@ import org.junit.jupiter.api.TestInstance.Lifecycle; import dev.peerat.backend.Main; import dev.peerat.backend.WebClient; +import dev.peerat.framework.utils.json.JsonMap; @TestInstance(Lifecycle.PER_CLASS) public class ScoreTests { @@ -42,14 +42,14 @@ public class ScoreTests { @Test void testOnDeployed(){ try{ - JSONObject group = new JSONObject(); - group.put("name", "GroupTest"); - group.put("chapter", 2); + JsonMap group = new JsonMap(); + group.set("name", "GroupTest"); + group.set("chapter", 2); client.register("Test1", "Test2", "Test3@Test7.be", "Test4", "Test5", "Test6"); client.assertResponseCode(200); - client.route("/groupCreate", "POST", group.toJSONString()); + client.route("/groupCreate", "POST", group.toString()); client.assertResponseCode(200); client.sendHeaders.add("content-type: ah;boundary=----WebKitFormBoundaryNUjiLBAMuX2dhxU7"); @@ -60,7 +60,7 @@ public class ScoreTests { client.disconnect(); client.auth("JeffCheasey88", "TheoPueDesPieds"); - client.route("/groupJoin", "POST", group.toJSONString()); + client.route("/groupJoin", "POST", group.toString()); client.assertResponseCode(200); client.sendHeaders.add("content-type: ah;boundary=----WebKitFormBoundaryNUjiLBAMuX2dhxU7"); diff --git a/test/dev/peerat/backend/routes/TmpRoutesTests.java b/test/dev/peerat/backend/routes/TmpRoutesTests.java index b5617a0..8392da0 100644 --- a/test/dev/peerat/backend/routes/TmpRoutesTests.java +++ b/test/dev/peerat/backend/routes/TmpRoutesTests.java @@ -2,7 +2,6 @@ package dev.peerat.backend.routes; import static org.junit.jupiter.api.Assertions.fail; -import org.json.simple.JSONObject; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; import org.junit.jupiter.api.Test; @@ -11,6 +10,7 @@ import org.junit.jupiter.api.TestInstance.Lifecycle; import dev.peerat.backend.Main; import dev.peerat.backend.WebClient; +import dev.peerat.framework.utils.json.JsonMap; @TestInstance(Lifecycle.PER_CLASS) public class TmpRoutesTests { @@ -42,12 +42,12 @@ public class TmpRoutesTests { @Test void testOnDeployed(){ try { - JSONObject group = new JSONObject(); - group.put("name", "MyTest"); - group.put("chapter", 1); + JsonMap group = new JsonMap(); + group.set("name", "MyTest"); + group.set("chapter", 1); client.auth("JeffCheasey88", "TheoPueDesPieds"); - client.route("/groupCreate", "POST", group.toJSONString()); + client.route("/groupCreate", "POST", group.toString()); client.assertResponseCode(200); }catch(Exception e){ diff --git a/test/dev/peerat/backend/userstories/RegisterTests.java b/test/dev/peerat/backend/userstories/RegisterTests.java index 2e69e92..2fe0f46 100644 --- a/test/dev/peerat/backend/userstories/RegisterTests.java +++ b/test/dev/peerat/backend/userstories/RegisterTests.java @@ -1,6 +1,5 @@ package dev.peerat.backend.userstories; -import org.json.simple.JSONObject; import org.junit.jupiter.api.AfterEach; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -76,7 +75,7 @@ public class RegisterTests extends BaseUserStoriesTest{ @Test public void lostField() throws Exception{ - client.route("/register", "POST", new JSONObject().toJSONString()); + client.route("/register", "POST", "{}"); client.assertResponseCode(400); }