From ab4499a305806689f8c1246721c9deb5e2fed699 Mon Sep 17 00:00:00 2001 From: Yevhen Odynets Date: Thu, 3 Jul 2025 23:46:08 +0300 Subject: [PATCH] Adapter --- code/adapter.php | 62 ++++++++++++++++++ composer.json | 44 +++++++------ public/assets/img/diagrams/adapter.png | Bin 0 -> 33042 bytes public/index.php | 20 +++--- .../AbstractFactoryInterface.php | 2 +- .../DeliveryServiceInterface.php | 2 +- .../AbstractFactory/JustinDeliveryService.php | 2 +- .../AbstractFactory/JustinPackage.php | 2 +- .../AbstractFactory/MeestDeliveryService.php | 2 +- .../AbstractFactory/MeestPackage.php | 2 +- .../NovapostDeliveryService.php | 2 +- .../AbstractFactory/NovapostPackage.php | 2 +- .../AbstractFactory/PackageInterface.php | 2 +- .../UkrpostDeliveryService.php | 2 +- .../AbstractFactory/UkrpostPackage.php | 2 +- .../Creational/FactoryMethod/CashPayment.php | 2 +- .../Creational/FactoryMethod/IngPayment.php | 2 +- .../FactoryMethod/IngPaymentFactory.php | 2 +- .../Creational/FactoryMethod/OtpPayment.php | 2 +- .../FactoryMethod/OtpPaymentFactory.php | 2 +- .../FactoryMethod/PaymentInterface.php | 2 +- .../FactoryMethod/PrivatPayment.php | 2 +- .../FactoryMethod/RaiffeisenPayment.php | 2 +- .../RaiffeisenPaymentFactory.php | 2 +- src/Pattern/Creational/Singleton/Loggable.php | 2 +- src/Pattern/Creational/Singleton/Single.php | 3 +- .../Creational/Singleton/Singleton.php | 2 - src/Pattern/Structural/Adapter/JsonReport.php | 46 +++++++++++++ .../Adapter/JsonToPHPArrayReportAdapter.php | 30 +++++++++ .../Structural/Adapter/PHPArrayReport.php | 36 ++++++++++ .../PHPArrayReportInterfaceAdapter.php | 17 +++++ .../Structural/Adapter/SerializedReport.php | 46 +++++++++++++ .../SerializedToPHPArrayReportAdapter.php | 23 +++++++ src/Pattern/Structural/Adapter/XMLReport.php | 37 +++++++++++ .../Adapter/XMLToPHPArrayReportAdapter.php | 32 +++++++++ src/Pattern/Structural/Adapter/YamlReport.php | 28 ++++++++ .../Adapter/YamlToPHPArrayReportAdapter.php | 23 +++++++ src/helpers.php | 2 +- src/router.php | 16 +++++ 39 files changed, 453 insertions(+), 56 deletions(-) create mode 100644 code/adapter.php create mode 100644 public/assets/img/diagrams/adapter.png create mode 100644 src/Pattern/Structural/Adapter/JsonReport.php create mode 100644 src/Pattern/Structural/Adapter/JsonToPHPArrayReportAdapter.php create mode 100644 src/Pattern/Structural/Adapter/PHPArrayReport.php create mode 100644 src/Pattern/Structural/Adapter/PHPArrayReportInterfaceAdapter.php create mode 100644 src/Pattern/Structural/Adapter/SerializedReport.php create mode 100644 src/Pattern/Structural/Adapter/SerializedToPHPArrayReportAdapter.php create mode 100644 src/Pattern/Structural/Adapter/XMLReport.php create mode 100644 src/Pattern/Structural/Adapter/XMLToPHPArrayReportAdapter.php create mode 100644 src/Pattern/Structural/Adapter/YamlReport.php create mode 100644 src/Pattern/Structural/Adapter/YamlToPHPArrayReportAdapter.php create mode 100644 src/router.php diff --git a/code/adapter.php b/code/adapter.php new file mode 100644 index 0000000..b7a04f4 --- /dev/null +++ b/code/adapter.php @@ -0,0 +1,62 @@ +getData()); +} + +?>Adapter DEsign Pattern Diagramx^6ZgAR;An2qG=?7D8xI zsS2t-Qggx(4H?%>|f)@MKOdB69sbIx@g{<^O_>zSv(_TyiJAiS+3ROP zAP}{Z;$uw^=nN4AI&S{Uap28_Te%eo^b(}>SQhfacyV+o`o^H|)%gR#P-XU;zxW82 z*!g$_ick*qDF#I7!bB7LiKa-hbAoev zgVTib^X3vp|6=Iw7$kFEM>8ak7(B(kMe_2lpqH#AIZwB3w7GV+t@j~#O!ri`=X$d{ zmlqE!tjNQU0Ffwv8*L`snD37unZXR_W8a^>6u9WWKc#v6zn6d}{tr;dOFvHrP|lrZ z6%feulp^6csEZGZA#E{0Yn(2CUfc|SLwIop1j+{?3_+kh!V(H!_hR+=agfA2`6lO@ zlOT}JO9(FrM7j+-2V&DigFwZJ6wA)i1LN;Rww?mL>}LgjlEDC^WkM)J^VyF`$pKJM zrVKR|RyyJeeEft$1(c@*{PfZf`1s{T%Fw4^3f+w`;NuvIfFEt50J>==z{hEiDS*<6 z{@*1+R#L0){8uf74n|48xrUI=6jhbIhz-nK7{LqFW%h$Q;t(0mv_;HfyVEW+b(<4m zc>m0bjHI5k*2p#SV`=_B>VZcK9Xvn_t#PSKthVQ}CT#E!YC$saA7{?4MqrZgS!pxq zoDmzQm-5-|6JPjZt1js?-7TpgwY!Q`&tM}d?BO>WUA6RY6(!g4`+9pufVyaZl<12l zI#`YI!S+~3GpEVds+~Rt1t}-T&Soa^i?oc(JvP>aMWeZq-jtZ_b0Eo^KNu$ACd_*Z z*G(_=)w5x1#~_>OK{+b1^1GXYdqjnG?LF}XDzx& z+6X+*6tfXNG{ci!y=KRI&&}4BexL}4_TBdIU#a&`iS=e4#kgA(7>3x}+Ui36gl2Pq zH|UzIIQJiw(WHE&44gNgg(t4rMB+(%cT?QPlAeg@=zC1kIo0mr;Xqs3s7g;XCu~H9 z3l;kV2rcp<#5q)Irxb(d#EerI+o)0n$`wUm0o#!FNScT2eA`l0{`Ko+vuMzyQzU2Ut@ z*H+o1IPxl(y?J7tlbUHbCV-G%f)Ti9*yKq^VBXP8s8jJ+oM zOHNbFrMGTwICtK{NGtt=zMB`eKrgcXK8g5+uQAzhG>ofcB)GJvcdF zEy&h}tXG;o54+P-p+Ja(i&<#UHT;sD#jVXA*&wr2fXBTuHW1I_vX?)TeJDa2aTRxqeo|w(6)V*7o6V(2ZDTv+#To z+|p3qU?Cn&O8dOUu#B&Bn{;Ly74R{4@1y$z*?GOmFcPpxT04q}_j`ArS!jotg0))k zF3Nf|z?*M^j@(w#@9D*Ol5D=cMjzDfTFKJljps@X!3^#uF@jWe@3ep8%A`TOO*d>W z8Q?W!GMsqm(Qkx52nT1*rI**pB=U^fDX3NZ}K@Sg0B(6?7x?MTfKF2U7 zau*w-h0Zji_Soqr^#sP>To4Jw^84vtQWtX+&V%Lk++uv;y{UVJ{XRZj1m*7lInk=r zp8lmO&*w{`hh}Ynmq5;sD+@mYM^^-I(=1>nZ$xO*mGlcZaEXrE>qtvJ+5Ku3icO_i zKPjn55D{S)RUNrh`WTGvj2fK_b^bl$7Hs4x4`*`U)`Ew_*f3|~UBwc~k|iAJLh0@T zzb@;+9~16xv*X`;c1=&L2MW)j5^09~&hz_wKZC;zA%$O!0`#E<4`se3}I3J!-#1ubWincShC&}cW^CAP4df1fmWd@G~h6qF5mA^QGZ z8+a?V5c^KwpXKt8(-5Nj>~?W zmwSV`gQRuP5q5Ldyg#63#)`R6w=Z>N>WAA!%rfEejkSd_y>&x^{ zRKJ+u`^BPDpc=hAzq;&mR9|-_Ti$}Fa8^9aj_i+4%&E?Drg9VicY|8&y(Bze%TLt5 zBQ-3ngCKHQkH)tV6`GaxLc8HchRWUH63UhOr78KLI}7odR*Ul{e30K%zX}mbqEcM3 z_jL6O?&S#Ph9#z+=5}-x$>L(SP7C*xD5&EaN7Bb|29XaX|1i%TOSE7(iIjK zI7}BxkyA3~LRAUVwT#$98ApS%1lxs|SnIf>UPByYOwZHu&E}k*Vwb`{3v@^MPu;|A zLTqsei{tjc`BSl7AVrtYPDTE_enq$X?j>ZG0c#~6b3Xg?JPRDep=u=G&ns=Mq&ddw z)aT4Cs%@n^PG6t=K2#JNuJn6CR9nl2rfMi}NTG;k@1yeiHxMK7B_kK?Hax{Z-Y2YU46RHkf8vY%ljJlJ0A{ z)-wpbg^jqU`MJy=>VrrGE*hHZx4K_cvoemAc6U@4rZ?a+%XIE#%&G=+X9wS5cJm2T zKRZg=Su7A2Ey7p&R3zW!JY$|~({K5UGY>=bNf#)3WhP9X-THQ(#XyHKkKY4VdxX1b zFZz%D;;qnp+Uv#ZURu}LITyuBg)%(lT@~#sI0fos5To^53kAbZ`d!aN&6@Q~jmCeU z3@a~8oOqRK;djg7WGK61t@Eo9>AH57Y7ZRodW}V&l*{+oyqDvMuzUYQ*2xBB1usY~ z9acB}4;6(OlVH&%2A!=53|2t)BfUnSw^!dxg{sMMnBu zOOZC)#U!sh5y&acfXL>v=jS5r<2wn8^5Hq=>HNu}b$i=}N#$brPa_8S!_|O$xLP__ zT>%^Tp9c9)Q%D+qF>?SEGK9|qjlnca1(xQ$Q5NP&%1A%`9-~ZgRaBNZA2am!D~Q&c ztcGXN5|K~Z!`TWL1RY}2w`5p)FDJCvRHq8oxw+Lw8J_Vl6>b)haCj7Sx48a!VO|9} zcn-Bx-rM3_u<~p$k}*oiJZYlrH>G-}3KM95P;P35vz3=vRMj&bp`oix#$7?L^!ulM z!k`g+1aq5>o9A7Z%|~G;xAiVw6?+91zpU@N)^bJphthH4sK&zVjNjzkZ!^fwRT_%8 zoZ4Ez)4yk}A&(#{UzTWf9WX%ygu4%+ zp2zy(LGiHBE;n*BdX{lO#QOIQ1KzAh0!U$76T2P=dTui}@>-Ec6{paYuioo?ziW8<1-?h!`JkKE~m8xhv=$r#q zArW%3|I!Cep6-mqq`Nk~@y|ljZ?!*x$Ir!G1t9rH1-cPt{qw-9te`AgzhtLF0-3MLQoQ zd@7OksHUKlR9x?DLiq)poW#Fdsx^R<+d zYUp@N?84xdvE|g|FJ<8V2d^Z06&qd72=Q^27ejas&x$PFnoc*Dx2zE`%686n6#Lwc z{X-MY)8yD|Vbe41GfAahx-XMiAyxfRJuP%k@LrjC~5|_q|rI@s8=r zpuGuD5rn|o!T5NBQ!fDDyUZT~WpX*2S{j~xd83J@o8kyU!$VRR-ylTV7KD6^ZO6P{ zS8L(FrGFpizuDC;Hl5zZbemV%(!7bg*PaWo zIpG&kJ~~({qyKpY*x>+z;&SY^Ny_@WFSfRws626Ty+*L@F*N`fEI_IsV|9U|WjV9YbK&~n zi01GkSX|c9gUu-L8P*|PO8Z4FQM(9wKn<~)4%B+-s%@7!v+7#?dCM#3fJEGFC=FQ_ z&_s1nBVgOll{^evV>8A$XCofDb4gqUja)9&Q7@|uooQIu@1M?A0Ep@QWA=27dKA#O3z)yr?v58E76{zSO44%)0TiQEGc6p_bz33j8DvFrQeC`5 ztCWTq_Z&m^&bCw7XGB)yZMtBzUWRiLQ!xYLUB?YecKIxBf$o0y%+gRc?@E!Z6JZ=z zr3?i+E?>(k<%-xXOaZFs_d~Q}&e_SJvC&(Z8!ja{hmMC914YZN`Y`3*^%SK{YC?N; zzj30bZkq&*p*u(xIS}`u62X<+T3|mFF!`3LzCT+7D~@;*T+-oDg(7!km5C-^f48Zb z=FLGYv>ug3Qpb1xJi+AF_8a=rH9)gLLP5MV1J;X**%pu-hx96ffh40$kube%qkK<@ zll|4&7A0l@OY&*>ZEuhGc%T8KcG!)GWc<2u@|pG&P4tqF_D;QindP$A6%o>M0YhBp z0Hn~pWf-U~&#LcGOGR%D^lw&~KkL6q_8@gEJgXZYBeDHa4$1&9TbIq*8d*oGgaz79oV@#qk<$JA ztEHKs%q6HYrrlIw40h&O+Tc0l)Z zz1*Fkwxvj{HPFS5?3tgrsL}PFtuo-p3Q-f?*1l3SwIx+ub~5D7Y}ZAc><nT z^RBMeduFEr+6a!>u}oAZA#e`yarqGIYmK@R9DNzp+^ z;)st63kB;keJp6bRa44Lzt8MrZkP|NC^u6ZAjHevcNAHkx~=|And*o#w|)MeTRQjKiXO_y`1u5X>OB`kvc}#kGL^CAisyKLOf-XT5D3EM06_Ncv-xw{3w(h7mqupJs40 z?Y<*@ymX-W4(Q1v%4eXeqglvMAK75`s9y~d=B?Yu9kH*WY^MDQ44dTrRzUztbAxNA zfw!i-N2GIZQS1O3J(_u1&=FHtmG2Vq`I4soNyc!mBLTqOhOOrb;KO_L-$i?|Tig3j z;^R!{%gvN_WBU%Z`GM`uJ(B0WU}im!Y${L>UT z-P9r6up%Z_6nG1AIa0>IDf1@_yqH_y5d9~a9*+(?2m1^YECWF0CHlxtX-(MWl(Byj z_vijE?e;UPaobLZe-h1HPW~TB{9j`xJZxDC^-mnm)UCDs)9ODd^C!$SshCKk|4HUQ z!`awx`MYEMgv=d-qu}(P?DjLOb0*&I|MU@F-$xNFfKqkX1`84hT>Z(MUXe*PaJeo?{7Wz6a?Ph^F9(QCS^CNnb&Ut4c{T|O%F7U z$4MEDou_b0J@V8|sr7aWtkp1{Io~xZc@zldQ%J4f_@<40w$b0G@tsM|_Re^4nRML# z#_kD%JwWE;o1<8AuY5K0LmUvZdg_#amSRszki^8nr(^1=iC?TR1Nnn?-2>?AGjk+8e8_4|Y_qbNX$C zAIogF=-m)avGqOaqxmhqAk3&i9qjFV=4K0Zx1~1dmf=b!(q!0VwJ{Yi%#yOb3wrq~ zyOa5W9duGf!GvTgsWM^di6ce8n7n@yCcc^xbb+Ax za_-1zPc`@s7QfsL*q^6bU@&>0PckI1N3iXeiPpJJ_N@-4`n<6BM^h}{^?k`%8zFzK zGmDE_AB2nT53C+Ea;TGb0FRZb^K@JuTa^;o?GB*DY_z8cIi{XJY!g*a*`0{w7=&N- zpezM4fCF4<;@DpH-S|SXtw88T%9;>x8qiYNDn=H|6sgkT5D!7mzo>KQp7q>6}s05(EZTq zJHGM-F5!C6pIr*_{gyD^>?`fJ6KP}4cllooXzBlY%rYR)xljRUo~@^nLRxjE)?EL1 zphW1g^_D`03A2uZLG3^4HCHQ-8e-`hY zzARG6m?wgO@cJzMvG)qlngp3JJ~^$x%ie!B(|KYuyN~wLUt;(DIfDcv5)d0bh}@kL zZd)?O%#`$Hu38tmbig`G(H{^UX7CRVar89w{*t+K2t?L*Yy4%Hjhe%0Dsem}^VJ*- zE>22-rh1L1ScOGUh5K+7LjK~SfzcoTnrTip+h4OO+gceuoGg;`oO(WsXtg;b9jM1M zAB?>?2>61P@j*f~JygnLuDaf2*O%BnuJx@y+a{Oo;F8)83ZcN^NPvs^d;#HJ_yv_zyf;ui#LF> zosZcR%dyz*uhXmhY#{ zK(j^a{^ym>+2bJ9Fkn2hCfarR+q$~Bw5b11h&l{)>|@Pq1yHd$6L<@=_sL72N$O_h z36S8k+GA~iuQHC1cj^|GFL)iEc}WujjEe!NJ)>;}fdnmp5i!6BtW>MOQ8MPj%5?0b zrWc?Vi907iZ7~2hEr1&*`3{y8vCIuU@zV1`1jsbR^T}yYyzm0GDUdVHy@@D2nMO;| zsRL8YF_2}u*NJ!_aeS~2gf7WlQ5yRL9%hR(GI5jqM6H2?L|bsC6xkNEPJhRU*m;6JSh=u>-Tg%19}_1RL0Sp+4g zQ4Im4JqJiT8NI&^L}WuRvMRu$EfUZs_e9q@Tk9@q-%Z88xR%|7sfaRpuZ;`k)^2P@ z1B=}~g^3HG{MXH?!!&!MCw)PtI{Bh6_1?8+GT3%XrOG4App1M_&`Yt4fCjV|Jt^)X zfAR;9ivy7KEyl}n<-@uzY4*lTUWyeTGyoC~ z{6*;Db&&5(z;^S$ZXbK8S2hO9Qsatq_{AEu@d}uJ-Xk2RZ$= zrG5nr;`VwU^f6x#3Odr(A3~r#82}^ww}>Y|WtO$aR8t_lqrdk2C$|4*5C+1~Z`V7I za`x{y{M$GWR0ws{`88`bGID4v$dn((a>K2)_B1FAabx_qC&c@pG<<7`k8zbMp>DN_ zf&P^?tOG>we05ff4WuH|6~Rh8QGBw2^x~m3=D!4o_W2$`iCFr=}ksn z=M3jp4zBlCd4Bybl=Oeg^x5ON)Ked97Hrq;FEEp4X~{e4WWw^n;kML4qgnIYIPPN~ zZ=CtBwSUbvSK`GA0#0f|`H^W4ry>qX@XJ`};VjD6mP#i0pLQu@Mc@JyL}{Qko{O0t zsh*oU`aS*`WU$HI!4qCb25V4t?~}hV6YyBlu=L@$2c9fW{x()*NhXa2W8wjm z&c6PqNv?>)fTqv_ht&4ANZpoyDtU{nYtRF>4lLK-O_3R-fKhP@;SABats0~46Mh-FrF2j2btN?JlMKFnPF))+L7L%&TOL64xvTTtx=zP!G=r&nxZ*Q6W2@c_CvH{?F@7zD( zs8<7Q_B`T9-JhUc*KR>?AI=ZK4?iHoJhtF3ygNU2`W~#F14^gJLs4J;(HNZ;fVV2% zc#Nehkm4f(&J-({9^O(hU>+0mI)JPuRh1vi7m?(v=7Pyn9stH&<^Ji&=VF0v_n|Nb zlYLAnta%7Z+72ih-EVjmC%v^YC-e7iK(;vNGJSmYpPUYw!naGI^Tfk7>3lyekKIkt z(gOU!79S*A0q}+OTmM0Ez)8Zf7wfooGKYc7joLjvCS{R4mFTP}9W{JZt>~x{Mop@pcUJ1ktAQZtPkjQg`L>h;Y z5maHJ`dkII>Z!8(xW$udCqG`&0HTx?zb2ZBHs!@(3i%zuiFxD&s_JYA-`q&qrgGII z|7*t|^ie|4XDvdJ|Hg-nkqVRjW{Og`KMn9%;`>NzWIys`M4>K6y(55|hV|NZ#UtpX zksC;nl!#3B$v45k$IA53o)!;K_NH9%jpLRaj<-QsucLrS9TwRtx!K5U2|rw&(>*kH zBk?;Zc|(?oA~lSVw24Xc^Fz4Xrbs!;(|IMyldr)uDXI^{obdwViZz z{A(#e;pz(n@1#h;z$$dxDgzy3l_{evTD6pwR&;-5(3(nH+XNBHkPS<~O-nJesJ%(~o@5*HyF z>GKeSBJEoQYNlr7CIpyUc3YG-L13S?mt^Bq{p7fOpT5QAbuk>XwJI{M_TyNJJ#+gp zC2pQkhZ!(WGb1**rME{5Oh`z4%c1xS!Wcv=30Lb?p&Cev(T$};;dh+;S)HWEq5=;;jh2X? zT};FWSqF`ciqp-mL+-^6)0Hf89^vm4VytvAL`d%reDrm0%5AUbrFAxldO0;b!-4@{*Cwwn!;ITm8r;u_HGxczdZYu&8AZrbkM}KEK92 zr``W&{3tPN_Fq@Pr1)GgpMX8jz*NN-l%+S)h#8a}; zJyDG$9FX|fw(o91ui4aVWGUm|$d$_%wgmz8CA`fM!|$xJFXZU~X%vsvEPhkZa3o?t zJHSt$BL(L$R@~w-M%MJ6qyWW;OK5}=x1)>Aj{-&`7q+lD8 zFz*Q$OiUq1N9}eT{HZs(>f26V2p`;k*+1)Y$3dI_u>Zu;L>A_7wuz43?-0PNeX;TG z5P2=+1ii{K*dv}OGMad#)j*C7b8ov-&R56L`MF?MC3)ej49EPu$qE;zaEacD>??i7 zf!bZpO^cKzh$Xvq!=So=cKM)V`A~K*Wkdn9TU58ZWOCop{Jue*>u!Pc!K8FMhOi&F zPkujw5TGT4MLSx~4%Le7RIGeb5D^~D(B8H8-XBOwfwh+cyZ0J&hb`#B#~TUANGq;A z*66WpK}HRiy46YWfNmL(8|#-=!lPSLVq@RC!1}lqON?v}a3pD!#JYWYXuSrl`Ngh>0b5!4Gky`2kl{0Lp)}6RW_8Z#g5$*{0Ax zE=-gh5U67P)D&ZGkIkiyvw$5mM}?qodrI@+J2P%0lljFdsntGWZ8r|H(doZUZmBC$ z!8Chs9n9ppO^ax=2hQcWe|=L^5VSqLS>k`k@C9@dGT;p1a50%EPhK&buDacAH2@r# zZW%G31G~dJTpzdZHbsc)nY90&#%#Si;U~}Kp|2k_9DhfPmDs7@20)G@%;HBK5}OUO zy5ODGNDZ^ypOq7T)4+U4(3W4fq13AMiB#_e;TZ<$F>~L3k%=hKu5G4=Cs7)`y;_Z>-+b6Wa^KD~lHR zPh$KQBg5wh;-iQnBmPGxGA{|f=V-?!#-sCdd|j0Q1;i|K716C1W)Rs;7!HPBu0aPL z>o5?vKH*C{xa=^ihf4;cyt)p9cT#+d8(pY!@dMcyxad1p2|3)_G7)#$jf^HAqK;tz4wK}zV$y00ze zJw6Y^>~5+{NNxQg)`$>@<`eLHQrQ@)GWKypvqsbwI>z1@!oSkAweWJD@se3-wXn71 zcypVZT)Mi>v;FXN^$%Z~T)+%j^uFv&8gjN)e1=Tt116M4(e4&2TQ-w<6ABtxRh>Iw zQ5Y0LXj6OSS+5T>P!h!o5IF)$_#eQ;yKDF}hb-*}M;YrxRdT(<`1P>S1Mk1vMK5qk zbRgoalXQZs#9+BB4!)88djFh#!b9>&QT+nFH*Ge^+%42n3wSq1s#J*d_<4Q@r;S*) z#f0q@@D=u`0q$@Bz%eE%!^d!?{Bm?u2ph7(+pS@n`ce4^A8e|5&#GbXX>6(zpYjYg z)d1y>xPhI?97Nzg@c9WFs4jZ$DZ3$@rc=n`qcOaCxk0-+5oB-7X$7@&tXyK3yepnfUzf5F~-2ki0fz+D8rJ z97_r;c`)Ig^L9SPOj`$zTpxRy`^hgOWO*QC^ABdh!OJ01{kQjGR3%cel(YIFAJmgB zz!>^7-!n*e!Nt9Es^7OV_S8hr%O!mCPU1YD)XK(P2NXBu`A*WwtzeW0_422cylUB~ zgmw{6rRDsOkYu{;dhc_<@pQ{r8WXUSf7iG8Gc~*UdAG96Csqv|9uWYGfW;BUmz@0H z1M3#EUy_N3ZA1KM%lYPokBlgn+1Dc?mReHu;dhbJ`Bzac&L75};)ipy*3ZV@S7j|Y za;iI+2gtZ;3o~c?-}}rz)FOt{rsG-grB;73c)BIDl;NfEz+_92FyKAi5AVD}$LxO) zIIlU0t0qIM<`7tNaTRB2Ms@oZoGHg=k-rfR7#3KNXW`hXgznor|aLq*y6j56iM00ZxcOGB}Jy$HR(bf%?+PVcSl)0n0x zOl@&zt6?m+`(Rq&?g(^gFZ2C;U+ll#8L;uU$ZGZQ;E%P-ZM&SEwm}n`5Gj!9UAC8J zg;aL2T$-xTDs!L~igm)EtX)u7@JzEPne8TuBSp+c*N(Y*lwa#a+TW?On3(Ogd~D(F zHm9&1tl(1|>^+A`f*v>lepK=3Hec(vMJ|Oi8~vAp!Ou9V3rm3zZ$0T(pP`G337;Cj zQ;S?T7)QE{_E{!9tDg_@U3ZQ9+kkJAU*FDSo9z5rvSe3z3J7DBCW~a5y9`8h*Q-!#{w)M?Z7m9iWiXIw@h7#Ugm4DBEd-I6Pc#y|Q52=v@X`Q`oR^zppf7 zuHRuT2cGHA0LR~{s~z4&e^h2+Z@EGk{~+?M!cMgi{4Vjga#08^E)k*x)&J7F+ZhliaDkY?XDL!CaUs*~5FZEgBjYGE3w+%(&^Bb)0c zD%Wt*gSP1^Y5JwUU7zeU6DmSI%&ZGQQI;_a}568U}`!q0Qc&g?fn z*Ord;!+sUR13B2R7I(*c6t|>E&XXOvsH3|Oo~FMvph5W2#;2u-(%)VLOI@`_o+!<5 zg*N%HXk5(^ce9~?0BenYGtXM6gpT!CNPAd)#(&CC_x9e@WB5D*d82cc-U7E@j?gue zhm_{2EaP#9KJU|?7g>fE8ONQG@7@~VG>mDfvyrruH!OYJ6;YAzgqfpypw!T5n+u1C z6bwy&D(1s8Ha;`)^$w|I9y0*KNS01xTTdjNhB?wa{h9#|@8^wfK7IN3NwLH9$4#Y% zT18E7a?Ew(LifQuH=Mp)bn?HUa%FFwlb;(*o70~-M{&CWl)WeX6&M`45N-1$KHnwE zy3Jb7EJYW4k3VO{l(v7p^_0$a@OWB?g*xxOH6HH@yfLvvHt^evx0pMT?6q;*f4ZFnBl0cUn+d?=4}yX8}S?_xVHdBL92(<(c`eHifOq%&NQ$ zH#31(D>v4i&Ni|swrPCskCII?lQOE^5Wl`zM9(EOwgO%^EfuV%$zHYzlugkv>f2b) z*9?Ztbg7yK(tm{rov;1#a>twT>gua1BHFPrS#??anK@oi9TU!LZ?~whar4~h*bfhe zgxBBPPucRY?eY3d@B6v`Vz(9QV;Z#`*V#8SJ7E`RKjw12&Bo@#bhFi|% z?fU+x5X;4^!E=|dXFqq6hCce1e)2)FO(;w5T#b9@E#c}!(@U2{CGUIr2LEAjwO5yA z|CaODle~Jji4kVI5B;6i@Yi@y5B(ns2rfiki@y;CSjLTFnYGtXBm)tyYHm#}Z<2dM zCpx*OyAU$*iuy%DcfA3{g~MO{*` zZaWYe%27MZ(O<6Ig2Wg^4*)eLT_NT2%(p1EMp*+fg>EY=j!$7du2+!yZ*yAKuj??l zO~#!Z?mA3ob@J_Zm2(D*hhWS@(wOb_CjGRE-_jkB}@bRF!4%bvy)emhZY6NmR>1vZL+Q>X=Nx@YRojOs#_wl&97DHMi zEjxe9916d!Ou40_5mi}dQ*|4il>#8)UuiP0f$IMtN%nyRs`Sd80krq{RWaJvn-Oh8L8lPxgRg-Vrmo-HAILPoiTWEQ2JP(E#XhZf@ z*uZ7#1(DKP`=4^c1O~=)DP7!_C@_p|_vV{x(1hWn+O0;_rTYoNRg*6Iy^jS1R8=f~krX;ls(efL9$jbc*3AJm@d*R%Wl-AD1+G?<^SbEd_ zCq}5pHaFy!cw0NNG_vm%JkzQ&2X-R7Qd+_GlnSr$sKV>dY-(m2x=%uq;~hqKnoJ~O zYIMe`jDQ-?{jiptFyOi8vYltpJ4!Ql*e}foTb~`P50)2Kgui;=w(u~YB%68S1j=>ClIemGF;-f?_BZoo z3md-YKEZvd`a2oQiCieVM>UiZsMK7`Lc^)O#KlVPe8%vQbLHFo49n&MJW&3%d*~>c zBURI!v1c$9{>N=N3JtMMtQXd2TF%&*2LkxG*v(;mAGx9g6Vi4V3esoUXZ7jI%F+qf zaCxI~$;Ln8jXg(ZB3<#|jgv9agT#qT59EV zuqU}t=aG>du)NxB7s{n2swTBSjrF#cv%rNJw#l}y;nDWrY}hCK!bJM64{?kKhzKKX z-Xxm6Nq;gDdYtj%pVz1KX_EdlFwXsWBXY3{8~dJ zd!PA+xH4o*0(@6JGveCrLWF~a)A&qh-9G*_HWE(agWq>7*%)&To^$9eIJ)kQUm3ii zjG1#;=xARM<%Ls&318aMvF71QXT5Vq{n?=|_9-n%5~ccCRfl=8HdG=hDwVXhMJ-;d zMfSQ5lZJIOEj{O4{~GA%ApPmi zb#$lUcQdwGd}aOJuiPSh|5Y_7V`e7v0WhzMcAz+RXA2j%(^^+pWdVh!H=c^q=r4^!MRy^PcB{6Se+3rT?N*i z$o;lc4_J$>vp*XKfhlX8-Xnjdxih0#%UvwklPoUg$honKS75eA<~K1Y`=m;jtozx7 z+qO;256-9=0;WXDirlNXb{@ehW-I~8 zTyur^(dOngCR9|*my_;Kleum8rI$Z?kMs^uF6QkrP%h@R>8zGH_7opY{g&~cd5J)D zMDhd}QrZ6KMA6(>{@amx?)p|uG_BC46!Kr)8Stjdza2DuxKrF21?=&PEJ5P2#Yzn%r@OYZPyyAimrnQGkhe@5zUu&(!O$tS zNd6VBAw>`-R=`?n39NJ98v30xyIsc(-NN1a~!kLjRg+R6$4gt8wE?S_MzC z4=YsV-As|yYq~ZI9Npsi_C1bV`L0++e#R(7f!_Y}=qzA)(G5@Lum3A4NqCmQcb9%` z{8F9A@omexkwvwlu^sd{kD=I;?~Ze{BJ?J%umH7lzqwcV1>Z!j*HQ^B`{kt9Hso4x zl15*7XRb_pq^~giyTbrYrb!(5%T{HrPu^kE4ck6pZ3nMfR)HKjB2TG4`xCKJZEzxc zGP@@ZXv2@w|j`uanbc_SOE&eRr~vPM1YzBuKg;J zW#2}sp8djhb4mVt%ooRBugK2vYsG?nWsK?cnhjX zd*VfR`E^03cgnx}Y6GfjZ|Q_oa|8c*$M0fo{V+S&hlSPYXC0jyUJ_m^ z<9gy^ZqokSSKt_i-b;wXd>_4kJc(&2+ho_fAJ$y?!+(p>r}LT`$?LVyNNT!tMVs(U zU%UGF$WWgIE)2MeS+fv&Ep3=`74s7=#_h#7;3lS`>6gncn&9W`pW5zyUfNq7c+Hug zW8L}|N`4xgceHH@)MV^|uXJlM$CI32dAn@CqoM8?9!B-l? z8Cy*^#4^J4J47O7d7PnI*1Kf<80nzZel++v*|z8A>(Q@Hc7ucEcATX=Bc-kd%)a40 zH%sUqIWh`|aRr^bqc)u5ya+z!dJA&uqRi|=FPS`}^W`$byvC7okw)h>sGfX#FUOD; zHjPB0B3wNAf?a4lr_Wmz22GKCWUf{{T3b2qxg)u;?QP`{Ihx0-VwE7{JKnZ0H+kE= z)?(c+uW&UPPfo74H-Ee-#xqT#nI`#YrR-Ig(`>@zb#J=h3)@9pM}mUY@`v$hb&(&? zQpM#6-h%8ZZC%wc3wKNFyEgNQ?4g^fLZNSzM4rH@A|&OUr?*!j!5=$ntjrWPtun77Y>7AX`(e25Zh=WWV z>0k_60;7&?4^o)7O?hc--cb5+yq$NmZguH`?bth6^^5hjoK|HGj0Ok>r5ZxOoVmN% z;0P+UwzY>_Qz7p~(&J?P++E{~qukde&x>F&zZ>yP8OF5syiTZS{3v>x?i{SW`h(l+ z4*1A}Ad|hZWc*y5RwrFZPU&@dTF=wcg-vhrbmR{w>aBn%APw&~7Nh2it zkhkFSYpQz!)gmJ;_6*DqN^B}BK9u&@q(n#mLJv0L=ZW<*0q;H&>;B^QUH#umvN`$J zY?-{D|2bJi&C^V2Ip@c2n<8D8Zx39PTQG^aJ!xof{W!=T^{?FvabRbWq~^fc?J};- zAr;r^)bp)^z(Ljp_M$1n$X)M<2l!c+O0I%yEf*z|QOwL$-ov)a$ahW}Tq-P3?B0?aT2v+M^Tl$*V8k@!^1$=(mnKT^&ZnaZ19`pGf|hXoj>}3o zg>b3hydHLueLLsJ?czAU{PYqqZr4q|dyn3t!hHzMCBko~Ps@03&MNV1jfpjQm{>H7 z{_155Nt}DX*GP56UVsDHHV_KlsA(Z;$0h4!A&750F^ckwiJsE$Y;H}aLt;BDl5S{B zlN@&A^6xDdJr~d-+wF|j9LhI;%xhOUZsdUyn23 zv-#5COSTf$5NGzGtSZ5R!AuV;5iun~3OTub;M%Tmgybv8xoh;9rLJ7~sn_~^kMjjX z2QYWakk}6Gl8|R~%wB*cK5!CZ)fVe~51SS}GY!>@cf&fbn1nGaRK+?^I>*`IOCw7W z#haTOG_$bervs3P&(xi~Uq(J?uQ%B;@$%!6oJDMdu(P`Qmi|h4`j@xgTl+!rXg_4@ zS+~at${m-jgF4b~mKW!~xn$pMK7-3&50McWLA`k#E?sFP=Dq7acxDLy%@nj~@5ttt z)P7|`G~PwSW<7f)hqa>b$Yz|7!o%5K0lMtv_UQsq+xL?qaOT_BQDU9Pthq;JZO01A zsP|4EDDP3+Wk0V?>dUcW)Th=-v6=L~p0ZAP1;}JfMPT4OcvN!doX|LVB%eQ2#91TM zVkY-%L-7}}PWJz=z3+@_YHR;guMHat3J3x!N|7d@fJA~7q$tvRZ&E`Q2qdVeNEd0+ zM8$w~5d#KD=pccBfRs=Y5krSa2?0WqISJnT-ubUPGaqKw%$l|C`H&UDZco|2r|fd* zItJ-fNzi1;$W*7v!l(%8tDD4>=)O8m(ILk>ZfV6v{d4Oc;WgF)ZD~&F9W+{D%1uCe zVRqp^gE~>-$Q8?q?jueF;;`r?58ux6U^Sv+E(3aRw91d>M(co++{R^|?H(M9`%8vJ z=>vu;UOj{SVlKrmd9-Uv2h)3-Ji;-${K=V`6>Sb(i~=W-+KDokzj`plbRR()KQnbX z>iP5S(ci+$o|FdvjLA>3n4_=a7ebh(s(zWYdf7NMoT{J;y9B@BDnr^$awfI(S(6qr zHe$5V{H-UTdonPu@7tVP5U` zwJjq*t(pyVi5$t%elBj0-&I;dA&RX(dpv(++*_QYLIPx!hP<-vn?dhQ$zIa^d)JZ? zlM1%0aGDc@MX0jt%U$YBb?BI}Jg67Iw`Ob8~7JkLA6LRhu@ScU0tX59Ljq)A{ziL^4I|A*eQQ;86Mzz z$a*?v@b(0~V=*&W@7y%1D8NIi4{7ovDV8CHcnuR8H?pX1FQ6K z6BP}3V(Y8l{p8pD+0Vq|Xa9v5(Vzi~&@ac$Bq|4K?T7PfDSDKjK6Ye*o7NkvUH4^1 z;Va*&IR!(Odvz_PQkR5D@uX-{!3^kn0b*qFIb+8S@&oI(7$;=oORJgfRZDTpdqKkZ z$T30^+HCEHsjQK)_~cGSqV0xv^Eneop?x`q>XFB&!NfvZy|N1(yH0p%XQH&VO1+aU0dxG7?k0UAZuqvC?y8w&7W>e zT2xonLVS;U&b<9}|NHr;xBZMd-etS)ScbPgcNacW&oqe$3DAi7@hj){#Jd!{xdHhV zFCIP9bIiNyC3W_!U|B{74R==Vm4d7mg3|MnYJvQ-l`R1}xvU;9`u2KA*nHIPjdDjq z+F%i-3-M!rNV@n2*!5eLjAbg+`qyBh(E4qh z(o3*q8TQ!XAh!*FylSyI$eXV*7v;t>V3H)`xNOEoS|Hq9?TM5XHn!cW!B{cR=1OV6 z!C9FIx#|o1q{p`1cHf;)rN)v3%8WEelKmM>GO+K6s=D5YGda2^pv2z&P{t6Cuy2bww)jLCMIeu`IR;?nVYMtnZB)U?>k+Au zM3MY`!dIQ{-Q}{ghqAbNVoKZikvoV7)*mrx!ChIzsqi`;dF2zsPCzJQY!eJne^H~GA^ zvv9v0Kxj{wBOzi@o?IUHSJ&!7A*QWc+)VOK%f-j|POipgkUlbt=_KFrrLWf;-~WLx z_$?J5IobyaKoEfCo`CW3E`u}V|6*T*180W(O!UX*h!Y6Q+&JWsu7dY~U3mDk6 zi#+*{^V`{s*v6N@7UPcLGFHrT?JO`bme}^#?qCah+xgRM7VWBVV3~%;TEM{A>In2h zT}}f|HQe|=z<^FgZ4?Ae=|B7Z{W*~p1|hZ|hs# z_kVxa9FyF0oT5 zp^jXtCr?6w3fmkm{Lo)m?6px_?$jMGvLDd*vRvS**x?cG?F81%x&*Mu%j%%hYh26Cv~kmscB0d0?iS zy@ZmulB80}>bXE!0gmBaLMQ*B1$ASrY8h>HU4W@a+Nb+Fbzl%>rH%4IX(J){TX@4k zm0z#_iR4`U1wUCU6=q2Jf$?=tuncA?M>+Ooc@oH&xYJZI;0E~O$8x{LnJlIsIj0sA zu#ClLWqAk4f4Nb#)lfc1emrs**vmj^P!~aqkGRMRjGvf0Ai#5)BJ59fKrK+c51i zl`I1!1oF)#GY-aos>sTUhFDg^$2;j3Ar~8(mONe8|2VyH?I03Jl_c zyjy9(J(1*-0{)4C&R?~`wLQOsyMR{?UVt7u1>BDWewcBqDCjvLq{K)eir>xk69JTw zCEEKkdP4`HMwd*e=@}Fm=p+qC^2|Waw#~WRTmee|7N#Cn6}~acy9yp#+)S>GQFuyg zcW@E9MCmLWAZKk(=-#oSXUJmcF1j`wIT5d_fpZrhl5XRcVuV926@`RKOU;f@Cu*MK zt3IV1;51qmh;IylojvzD!sl~iVvtDl$DOnFyU=0dOU-YLdSKiNn~UAueh}NzI8Kq5+^6UpYBV$7pA}9z zSvDvVqI_j~-_)~r#9LXmR-cnXw4Xbp1Lki{ng(`Sp`i2kgUy!`2LMru@`$+`NRy(D zxvJXV)LHp*0WsCRsqC?_Uu{Ck!O-nsRBj<51_%CBQR^&WvT}=?4WAt@UqjQP{(xBm3v8-Ehc8QtUNtOMa4-a{Gkn_N>tzb zhQUBlnSLoQn^|GB4ujN3u=d^U&h1FjsfL`A_X(<&lC2kbe)CqP-uwbqj~e%@)oJ6b zDZ)VEw!|Gp!F+wMQ^s@Cypr~BHF6_w#zQd+Rgo!PcSrNeiIt!=3qC6)k0Q(y$Y>2( zxLW9zMCD=C)fG^s+;0^)lH?m$yG-Q;Z~g@EORDoce5P#Fgh-n-JG4ksgV5o%zUw3V zO$w!c`auZs11Y%9`^-*agoc$~RwU@OS%v>D{~J9JN7qM4|J5P5dJzAye4)RM4#^tb zO6)PYZjs)Vw;CG*6Db7yW!lORb}_Gvd{tP;P@?inkbB|)d8Fm{^m%HHg{?kW=3T{P zK_<1s`11B<2hE4O&2vwJV+Q)$4Qe;`h!HlX@TE-6ngWjsw>OvX2F)3Xlj00FVt<}7 zolJA$=r`gj0@N+{s8~jvt%OO@)E0N9Z^l1Sb1pO0%!)`_=9bBAhGe=!6lAWaR1-gQ!~I1FQi`AjfUCny(Iw3CNiK)-a zE&X*|xd$KihE-qGu8C~@FacAk70!wBC}Q08fVRR(>fH`+IN7%CisKYwB#}7_GUEF6 zW>ThAqCtU3uO$^E5;rw#&iP4X6c5RA9u*2XwoJyj7w(;SX>{liBgmp=qzeC{aG$;{ zD3!{DTRbO3DLCzq?fB@Nf5FV%_(HeyK!M5;l)vlk_!6kETl;+v@_ao;;MRxLsn8&& z>eB9>&_#T+-VxbKuL>8}M(~Xscihgx-}BI4qSA8s;siNhC*sFf^$>JYrG<(3Vae4) z-M*{+@oe=n%+c8NY}AI7V6RC8g1u5l_!svQ)r^PBu@zbP{{aaj#QTb5E)p2QU`l*AZ{P(h^`>)p&R_RS zRnWEi4E<_5YCe9rvR9at0N^}A8J{FhQdA45^d2URFkgDiqASX}!DLfFq6__T!?%m} zZhRea!kHf7R+Yc42)*#sELiDcn9j(9oBrATjTlNwQJ>Q{xANj7-934U@>NQ4 zEGiG#la_nzqxOE`87rL>99XP7A;%-Pu4DmuSJ*#gpgP3@n{`b4t);1g0-xA-E>BV8 z0L@7|T2`jLT`Ns#6>|rbkAj#$QbkQC!xTzAsrcP!6{2zkjhMve0?8159VvUa?4=d@ zm=zJfJ2t-dU1CjSw-J3%Bv?8t-PPXbV~RLQM%ui|W&oAnjj6qQ;YCKEdrinG;}gzB z&mx7=a`{!YmZ3BC@7)D6AASepf-PMS4ADJ>LIET39zN&erAe&Ni`(^9T0fUD6eEjJDD{%B; z87^)$Xr7_i<`!kDN3|Q@nrUt;?=PrDR4Kh5B4_2Ufn#krIy4wpkITam{gB6E8z-UP z{t0SAfy^?XkUy2e^h;D|^f2Z(hw8Vi)VYkj|RVYe_rXXljA=zfGGRqy~qZRR+ z#?V0c7}j|exCOXmz`-i3t_=jgq7&q2konJro(^v%fv*75#;B+04=x z4?s2>jmkIIn%spA-LsXcb~P2&uQvMBlo$Ioy5Mx(A4X2)M*B$*8yrgCtS9@^Bnt4U ze3g!P`B|O-Oi@}g;266F>c&kk5$Hy#vR}(tT1k<|}1F20oEy zcS@o`Hd5Aje`pnwxelqlSMgO(uR8UFRdZBCp=O?Qx?5()@gOTibZ+ufVo!Lkz;sju z&Zs!rRL^YMn*%VP`Regnswe$gtPvC*FIZWR$^>U=(s0!?q2%O4seeWYEBaopR8Uyh zSfeg$Mc~KLu{@z+7zG_BGq3<>PG(D6a}F#>X9I_io^Ud%M4VtmM?74+zh>{TtZeh`emR~bju|VuQa&9!;;v6xki1K)#DfAR{GK) zY@-85TH^%Ey4S_O}nK^k9Yp%p&s0i7k)J-)FlF^O_nL( zOKEL5dozed?`IbQ-U|u(bEE5cOq=yZq^Qy|5#HV1K$vx>*hv8KjzMf=yaj*HG}=*HFKURb|X5$;`n(M8G+3)@<<&{xK3U8TQMjPqB1!m8eRMRfA0whHW-i zGB@X_3?$SCcv%tyl}L;VloBXX6z4o56wu29cInqa2*UYg(0GAvn^kl*Rb$9&qy|PA zO5QM#6_6!Wz-??^Q`_3Q&gX^PJxuO0KUgYman)}lJt4~a3o;5B$%n#A+A^=%2yUo-NNzSndINDcjKOl*?CY<7t*ZALZt2LF6Q zgszX)7Rx_nyZc77l{->y1G_E+l42uTK_`}zEJYkHc5y5i>88q<2!vghSJ;&@=)pjx z2ooXn)4dA^99#e>MRqi~lM@rO?R2OWv-7;skW*il7a(6Nm&;*^Xg9apUK6$Sw>eMH z0|PUEs;Pp;G(n^HQE9#n-}AJ2!>SgyiF;%{taMYE4c06xCHMO<#^3o4bt95PQ zQij^4015=NwwkR9n~n$W>hS%Huh&<+*nSQE%LgA6RMU7QH115O9F{{SIc>-6P|+gP z#kxqcaj?%BYUF9%cLy^|5ED~te7WE`FkISU@ZMAGL*Qhz6F}GKM@qAdl|Ud`Xg1Y0 z8352e<+QLwo)Cw**o@^`!e~w2(jK>Nw9mloLpWmOT9NWsSvHC$#t1DJc#8O6n5~Ya ziTh;l&aN*e<3B%8sm;pygCZ~%X?^T%>qGdYqUdipjRS<241pQK7~|})SMEPyum3&% z>7xUo#FDR|6|^-GD;%7oSLnr+2z16lqcyLc2?u z`Vo#K%CwTSQ?WV^13dfFGu#UTV`%*V*ZVv?E#z|BRmAe{z*>a!UDI7| z4MVFh)Te(DEbU#NNb8yl`+(o{(-!2d?C-m_p`u99{-DK1cuS}s(rtA1VeD#v7Rvr+ zw-TG(+|fcf5F+4nuGq@N?qVf#2Gd0fv02y4RP8Xs3Kkx4z#HOigJP_mIdU@wh^8s#>0-yjInQ>eA*#+K9{a+kL)nX# z=P-MS7_I-<%2USTV%MeI<)=u7nAm#O<78+?KY`~sNB`+{v5k#DOoAcjQ16}mpdPl*~n~~^A3m@-WVYOlZ3HH+08vOvn9?mvbH=Gk_uriWYN{?j#DeX zXnzm|i+xg`oaE@IGi(l(_ZTq?51RY+Q}Bf0?^>6oGNhXz=Y0enmTe5aU_P?41l(fo zPM2%C>5_sWKKV5w=6|@lY+tL7S-q&u5~$>s7ZN2@XmZeEg1!P9syXN)?Z25aym`2r zZ^6V%hgxtNdX()FdOwaW0=8wq+#IRsup-|llki{B4y8nThk;F;K@<)FEH@U7d>$$s zft6<;<>(1BQlIP3q9fKftP2Xy^76oWese z*vx-9FFG`5j=X#6Rc&>@)1pB;`pz9_YxtwD^uo!Z5Q{d=4?MUguO#&Cl~dj86PIet z2WoQ|juZJ};WPctEK82qxcKA51Qc=)VSA+!Z$+E18+YT5!?q`Wck1y|y#0|f3 zdMvdwD!lB11wW{Q5YK7*snm=GlGa>G`)ow~naA#8NK5g(xj{-35T3ox^#=2$_cwbbErA=!3T zUmTG#fmE;?&qCdJ2I!h>_FMujOnOy7^0izf5f2Wb;_?;vweK%JISQ#&skk9@SKt`6s0-tGimAXX1 z=N;xziv-cunsKv>1N}%9iwf^w$+eV)O6Ra=l}^--qk}!Tf^fw+Wm@`_n~}*=xo+p# z0u@SHd6TEHvC1XnQdI|rSh~2|MOfw18h>3sp}&d%mr4MY6tRN%zCizh>MrntACNqC zIzEr}aJ06#{71QNY-QN-AnAqcL-l%xpr%4U%+IY$0@1||A765+6%V9tWe_yr(qw!n z;1lFslB97FKRe3<5Po_*B@(CoinY0b_NfZTy=TZCaH;YStEO;mtvT@fu&Dhj^?g0l zs3^tP2z3=@_F3#eUqKsA4oDrIx%0yNC_58(2Ks!{rjNLyUq;ZNB|7d2O853_}p^)av$*XMT;)|Y6^0kwXyT-z=L}kqey=SbjJaOvk zmQ^?pq$1BN|BtKhM_BS@<~(QF(0>}%6MdNjoqD%eAkQVHsl1P^`&_EG*h?(iTCPd( z?w%As!^(<9CZ0L*gdGD%3Y}rE18j46le9nF?@P3L99ft%{XjV@tF!^8aZ4;gN3PO34VsE+Y$ zA@nv4BU3Dl(q{r3gaTe?8$8jGra+3fS!>`G0xH@tNH#J|D+YB;HC}bql=34d9&C=W zrkgUxm$R9nsF2Y+z{2~+BpA3IzjdaTqK0K+mavi}y;sngd<~)CcbjD3J@vD>LeQx< zt-@h7n-C=H9)IAe)9cm8N=N-bO}+y8O?2cNUe+B%3 z)4XxjP#Q6^QTh|i++1c2dL5gn3l3&%u5*js$y5m_fG*DA%Z=tM7>hsK5@l9tGAr5Bh>UX*dk(i;7+SzjY;aRzi6kqYo-bE%#3d%w&!4J}jPZK~QI ztYrJuDlm+niMoo>AM4{EmgN2(Qe4tm#0W)|u{MsY^7tk4``0ocE&h8a)`xTd3-i3r YG%Iby(TXZztjd}<@7yT4X8Y*B0cEHdX8-^I literal 0 HcmV?d00001 diff --git a/public/index.php b/public/index.php index 89e9768..df1f2e9 100644 --- a/public/index.php +++ b/public/index.php @@ -9,9 +9,9 @@ require '../src/helpers.php'; content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> Патерни - - - + + +
- +
diff --git a/src/Pattern/Creational/AbstractFactory/AbstractFactoryInterface.php b/src/Pattern/Creational/AbstractFactory/AbstractFactoryInterface.php index 940fe77..b433fd0 100644 --- a/src/Pattern/Creational/AbstractFactory/AbstractFactoryInterface.php +++ b/src/Pattern/Creational/AbstractFactory/AbstractFactoryInterface.php @@ -22,4 +22,4 @@ interface AbstractFactoryInterface * @return PackageInterface */ public function createPackage(): PackageInterface; -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/DeliveryServiceInterface.php b/src/Pattern/Creational/AbstractFactory/DeliveryServiceInterface.php index be3249a..d0dc2fd 100644 --- a/src/Pattern/Creational/AbstractFactory/DeliveryServiceInterface.php +++ b/src/Pattern/Creational/AbstractFactory/DeliveryServiceInterface.php @@ -14,4 +14,4 @@ namespace Pattern\Creational\AbstractFactory; interface DeliveryServiceInterface { public function sendPackage(PackageInterface $package): void; -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/JustinDeliveryService.php b/src/Pattern/Creational/AbstractFactory/JustinDeliveryService.php index b54caa3..bc310be 100644 --- a/src/Pattern/Creational/AbstractFactory/JustinDeliveryService.php +++ b/src/Pattern/Creational/AbstractFactory/JustinDeliveryService.php @@ -18,4 +18,4 @@ class JustinDeliveryService implements DeliveryServiceInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Sending package via Justin..."); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/JustinPackage.php b/src/Pattern/Creational/AbstractFactory/JustinPackage.php index 45b07fb..35558bd 100644 --- a/src/Pattern/Creational/AbstractFactory/JustinPackage.php +++ b/src/Pattern/Creational/AbstractFactory/JustinPackage.php @@ -18,4 +18,4 @@ class JustinPackage implements PackageInterface /** @noinspection ForgottenDebugOutputInspection */ dump('Checking package from Justin...'); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/MeestDeliveryService.php b/src/Pattern/Creational/AbstractFactory/MeestDeliveryService.php index 7b54303..84aec4e 100644 --- a/src/Pattern/Creational/AbstractFactory/MeestDeliveryService.php +++ b/src/Pattern/Creational/AbstractFactory/MeestDeliveryService.php @@ -19,4 +19,4 @@ class MeestDeliveryService implements DeliveryServiceInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Sending package via Meest..."); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/MeestPackage.php b/src/Pattern/Creational/AbstractFactory/MeestPackage.php index f300805..8870e31 100644 --- a/src/Pattern/Creational/AbstractFactory/MeestPackage.php +++ b/src/Pattern/Creational/AbstractFactory/MeestPackage.php @@ -18,4 +18,4 @@ class MeestPackage implements PackageInterface /** @noinspection ForgottenDebugOutputInspection */ dump('Checking package from Meest...'); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/NovapostDeliveryService.php b/src/Pattern/Creational/AbstractFactory/NovapostDeliveryService.php index a765030..5ae9659 100644 --- a/src/Pattern/Creational/AbstractFactory/NovapostDeliveryService.php +++ b/src/Pattern/Creational/AbstractFactory/NovapostDeliveryService.php @@ -18,4 +18,4 @@ class NovapostDeliveryService implements DeliveryServiceInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Sending package via Novapost..."); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/NovapostPackage.php b/src/Pattern/Creational/AbstractFactory/NovapostPackage.php index 3c7d493..f8cd6c1 100644 --- a/src/Pattern/Creational/AbstractFactory/NovapostPackage.php +++ b/src/Pattern/Creational/AbstractFactory/NovapostPackage.php @@ -18,4 +18,4 @@ class NovapostPackage implements PackageInterface /** @noinspection ForgottenDebugOutputInspection */ dump('Checking package from Novapost...'); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/PackageInterface.php b/src/Pattern/Creational/AbstractFactory/PackageInterface.php index 7ee70ab..e1332bd 100644 --- a/src/Pattern/Creational/AbstractFactory/PackageInterface.php +++ b/src/Pattern/Creational/AbstractFactory/PackageInterface.php @@ -14,4 +14,4 @@ namespace Pattern\Creational\AbstractFactory; interface PackageInterface { public function getConsist(): void; -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/UkrpostDeliveryService.php b/src/Pattern/Creational/AbstractFactory/UkrpostDeliveryService.php index 16f1380..e09ce3f 100644 --- a/src/Pattern/Creational/AbstractFactory/UkrpostDeliveryService.php +++ b/src/Pattern/Creational/AbstractFactory/UkrpostDeliveryService.php @@ -18,4 +18,4 @@ class UkrpostDeliveryService implements DeliveryServiceInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Sending package via Ukrpost..."); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/AbstractFactory/UkrpostPackage.php b/src/Pattern/Creational/AbstractFactory/UkrpostPackage.php index 02185c2..ac8778e 100644 --- a/src/Pattern/Creational/AbstractFactory/UkrpostPackage.php +++ b/src/Pattern/Creational/AbstractFactory/UkrpostPackage.php @@ -18,4 +18,4 @@ class UkrpostPackage implements PackageInterface /** @noinspection ForgottenDebugOutputInspection */ dump('Checking package from Ukrpost...'); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/CashPayment.php b/src/Pattern/Creational/FactoryMethod/CashPayment.php index e9a51ad..5d0a32e 100644 --- a/src/Pattern/Creational/FactoryMethod/CashPayment.php +++ b/src/Pattern/Creational/FactoryMethod/CashPayment.php @@ -18,4 +18,4 @@ class CashPayment implements PaymentInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Cash payment success, amount: {$order->getSum()} ₴"); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/IngPayment.php b/src/Pattern/Creational/FactoryMethod/IngPayment.php index b2f5328..0afd72f 100644 --- a/src/Pattern/Creational/FactoryMethod/IngPayment.php +++ b/src/Pattern/Creational/FactoryMethod/IngPayment.php @@ -18,4 +18,4 @@ class IngPayment implements PaymentInterface /** @noinspection ForgottenDebugOutputInspection */ dump("ING Bank payment success, amount: {$order->getSum()} ₴"); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/IngPaymentFactory.php b/src/Pattern/Creational/FactoryMethod/IngPaymentFactory.php index 9f2d332..bbc47b2 100644 --- a/src/Pattern/Creational/FactoryMethod/IngPaymentFactory.php +++ b/src/Pattern/Creational/FactoryMethod/IngPaymentFactory.php @@ -17,4 +17,4 @@ class IngPaymentFactory implements PaymentFactoryInterface { return new IngPayment(); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/OtpPayment.php b/src/Pattern/Creational/FactoryMethod/OtpPayment.php index bef3a22..02adfe9 100644 --- a/src/Pattern/Creational/FactoryMethod/OtpPayment.php +++ b/src/Pattern/Creational/FactoryMethod/OtpPayment.php @@ -18,4 +18,4 @@ class OtpPayment implements PaymentInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Otp Bank payment success, amount: {$order->getSum()} ₴"); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/OtpPaymentFactory.php b/src/Pattern/Creational/FactoryMethod/OtpPaymentFactory.php index 9234f06..4f4c8b0 100644 --- a/src/Pattern/Creational/FactoryMethod/OtpPaymentFactory.php +++ b/src/Pattern/Creational/FactoryMethod/OtpPaymentFactory.php @@ -17,4 +17,4 @@ class OtpPaymentFactory implements PaymentFactoryInterface { return new OtpPayment(); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/PaymentInterface.php b/src/Pattern/Creational/FactoryMethod/PaymentInterface.php index 7785539..7b4acc8 100644 --- a/src/Pattern/Creational/FactoryMethod/PaymentInterface.php +++ b/src/Pattern/Creational/FactoryMethod/PaymentInterface.php @@ -14,4 +14,4 @@ namespace Pattern\Creational\FactoryMethod; interface PaymentInterface { public function pay(Order $order): void; -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/PrivatPayment.php b/src/Pattern/Creational/FactoryMethod/PrivatPayment.php index b50e63b..0e9ad89 100644 --- a/src/Pattern/Creational/FactoryMethod/PrivatPayment.php +++ b/src/Pattern/Creational/FactoryMethod/PrivatPayment.php @@ -18,4 +18,4 @@ class PrivatPayment implements PaymentInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Privatbank payment success, amount: {$order->getSum()} ₴"); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/RaiffeisenPayment.php b/src/Pattern/Creational/FactoryMethod/RaiffeisenPayment.php index cc37dfa..b00a5db 100644 --- a/src/Pattern/Creational/FactoryMethod/RaiffeisenPayment.php +++ b/src/Pattern/Creational/FactoryMethod/RaiffeisenPayment.php @@ -18,4 +18,4 @@ class RaiffeisenPayment implements PaymentInterface /** @noinspection ForgottenDebugOutputInspection */ dump("Raiffeisen Bank payment success, amount: {$order->getSum()} ₴"); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/FactoryMethod/RaiffeisenPaymentFactory.php b/src/Pattern/Creational/FactoryMethod/RaiffeisenPaymentFactory.php index a09b46e..ce053b2 100644 --- a/src/Pattern/Creational/FactoryMethod/RaiffeisenPaymentFactory.php +++ b/src/Pattern/Creational/FactoryMethod/RaiffeisenPaymentFactory.php @@ -17,4 +17,4 @@ class RaiffeisenPaymentFactory implements PaymentFactoryInterface { return new RaiffeisenPayment(); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/Singleton/Loggable.php b/src/Pattern/Creational/Singleton/Loggable.php index 46ad7d0..cb713ce 100644 --- a/src/Pattern/Creational/Singleton/Loggable.php +++ b/src/Pattern/Creational/Singleton/Loggable.php @@ -14,4 +14,4 @@ namespace Pattern\Creational\Singleton; interface Loggable { public static function getInstance(): static; -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/Singleton/Single.php b/src/Pattern/Creational/Singleton/Single.php index 70b51c7..41cb5a5 100644 --- a/src/Pattern/Creational/Singleton/Single.php +++ b/src/Pattern/Creational/Singleton/Single.php @@ -9,6 +9,7 @@ //phpcs:ignore declare(strict_types = 1); + namespace Pattern\Creational\Singleton; class Single extends Singleton implements SingleInterface @@ -18,4 +19,4 @@ class Single extends Singleton implements SingleInterface /** @noinspection ForgottenDebugOutputInspection */ dump(__METHOD__); } -} \ No newline at end of file +} diff --git a/src/Pattern/Creational/Singleton/Singleton.php b/src/Pattern/Creational/Singleton/Singleton.php index 3ac148e..6ac6bb6 100644 --- a/src/Pattern/Creational/Singleton/Singleton.php +++ b/src/Pattern/Creational/Singleton/Singleton.php @@ -101,5 +101,3 @@ class Singleton return $this; } } - - diff --git a/src/Pattern/Structural/Adapter/JsonReport.php b/src/Pattern/Structural/Adapter/JsonReport.php new file mode 100644 index 0000000..91ffc96 --- /dev/null +++ b/src/Pattern/Structural/Adapter/JsonReport.php @@ -0,0 +1,46 @@ + 'Mikrotik RB4011iGS+RM', + 'price' => 9094, + 'count' => 27, + ], + [ + 'name' => 'Cisco ISR4331-VSEC/K9', + 'price' => 167955, + 'count' => 8, + ], + [ + 'name' => 'TP-Link ER605 (TL-R605)', + 'price' => 2499, + 'count' => 895, + ], + [ + 'name' => 'D-Link DSL-2500U/BRU/D', + 'price' => 420, + 'count' => 112, + ], + ], JSON_THROW_ON_ERROR | JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + } +} diff --git a/src/Pattern/Structural/Adapter/JsonToPHPArrayReportAdapter.php b/src/Pattern/Structural/Adapter/JsonToPHPArrayReportAdapter.php new file mode 100644 index 0000000..3ad755a --- /dev/null +++ b/src/Pattern/Structural/Adapter/JsonToPHPArrayReportAdapter.php @@ -0,0 +1,30 @@ +report->buildJson(); + + return json_decode($data, true, 512, JSON_THROW_ON_ERROR); + } +} diff --git a/src/Pattern/Structural/Adapter/PHPArrayReport.php b/src/Pattern/Structural/Adapter/PHPArrayReport.php new file mode 100644 index 0000000..aac4312 --- /dev/null +++ b/src/Pattern/Structural/Adapter/PHPArrayReport.php @@ -0,0 +1,36 @@ + 'USB HDD Transcend StoreJet25M3 2 TB Iron Gray (TS2TSJ25M3S)', + 'price' => 4589, + 'count' => 536, + ], + [ + 'name' => 'HDD Seagate IronWolf 4 TB (ST4000VN006)', + 'price' => 5069, + 'count' => 346, + ], + [ + 'name' => 'HDD WD Purple 4 TB (WD43PURZ)', + 'price' => 4109, + 'count' => 142, + ], + ]; + } +} diff --git a/src/Pattern/Structural/Adapter/PHPArrayReportInterfaceAdapter.php b/src/Pattern/Structural/Adapter/PHPArrayReportInterfaceAdapter.php new file mode 100644 index 0000000..60561f7 --- /dev/null +++ b/src/Pattern/Structural/Adapter/PHPArrayReportInterfaceAdapter.php @@ -0,0 +1,17 @@ + 'Makita 4329', + 'price' => 3479, + 'count' => 395, + ], + [ + 'name' => 'Bosch PST 650 (06033A0721)', + 'price' => 2103, + 'count' => 983, + ], + [ + 'name' => 'Dnipro-M JS-65LX (98609000)', + 'price' => 1920, + 'count' => 674, + ], + [ + 'name' => 'RZTK AJ 650 (252143876)', + 'price' => 699, + 'count' => 1265, + ], + [ + 'name' => 'AEG STEP 70 (4935412900)', + 'price' => 3950, + 'count' => 765, + ], + ]); + } +} diff --git a/src/Pattern/Structural/Adapter/SerializedToPHPArrayReportAdapter.php b/src/Pattern/Structural/Adapter/SerializedToPHPArrayReportAdapter.php new file mode 100644 index 0000000..8738f5b --- /dev/null +++ b/src/Pattern/Structural/Adapter/SerializedToPHPArrayReportAdapter.php @@ -0,0 +1,23 @@ +report->getData(), ["allowed_classes" => false]); + } +} diff --git a/src/Pattern/Structural/Adapter/XMLReport.php b/src/Pattern/Structural/Adapter/XMLReport.php new file mode 100644 index 0000000..4d8209a --- /dev/null +++ b/src/Pattern/Structural/Adapter/XMLReport.php @@ -0,0 +1,37 @@ + + + + Ibanez RG421EX + 21278 + 129 + + + Fender Debut Stratocaster HSS Dakota Red + 8400 + 289 + + + Harley Benton ST-20 BK Standard Series + 5190 + 389 + + '; + } +} diff --git a/src/Pattern/Structural/Adapter/XMLToPHPArrayReportAdapter.php b/src/Pattern/Structural/Adapter/XMLToPHPArrayReportAdapter.php new file mode 100644 index 0000000..7e58e67 --- /dev/null +++ b/src/Pattern/Structural/Adapter/XMLToPHPArrayReportAdapter.php @@ -0,0 +1,32 @@ +report->buildXML(); + $xml = simplexml_load_string($xmlData); + $json = json_encode($xml, JSON_THROW_ON_ERROR); + + return json_decode($json, true, 512, JSON_THROW_ON_ERROR); + } +} diff --git a/src/Pattern/Structural/Adapter/YamlReport.php b/src/Pattern/Structural/Adapter/YamlReport.php new file mode 100644 index 0000000..3dd7704 --- /dev/null +++ b/src/Pattern/Structural/Adapter/YamlReport.php @@ -0,0 +1,28 @@ + 'Apple iPhone 16 Pro Max 256GB Natural Titanium (MYWY3)', + 'price' => 62799, + 'count' => 2127, + ] + ], YAML_UTF8_ENCODING); + } +} diff --git a/src/Pattern/Structural/Adapter/YamlToPHPArrayReportAdapter.php b/src/Pattern/Structural/Adapter/YamlToPHPArrayReportAdapter.php new file mode 100644 index 0000000..2a2433a --- /dev/null +++ b/src/Pattern/Structural/Adapter/YamlToPHPArrayReportAdapter.php @@ -0,0 +1,23 @@ +report->emitYaml()); + } +} diff --git a/src/helpers.php b/src/helpers.php index 4c6d737..556836c 100644 --- a/src/helpers.php +++ b/src/helpers.php @@ -41,4 +41,4 @@ function trace(): string function getFloatRange(): float { return (float)random_int(1000, 999999) / 100; -} \ No newline at end of file +} diff --git a/src/router.php b/src/router.php new file mode 100644 index 0000000..ce9a53b --- /dev/null +++ b/src/router.php @@ -0,0 +1,16 @@ +