From bed24e8f28def0c5ad54d7f08844072ddbec5cbf Mon Sep 17 00:00:00 2001 From: "Damith C. Rajapakse" Date: Tue, 27 Sep 2016 13:49:04 +0800 Subject: [PATCH] Add DI alternative --- doc/Diagrams.pptx | Bin 52902 -> 53370 bytes doc/LearningOutcomes.md | 4 ++++ doc/images/DependencyInjectionWithoutDIP.png | Bin 0 -> 6303 bytes doc/images/LogicStroageFileDIP.png | Bin 5847 -> 5885 bytes 4 files changed, 4 insertions(+) create mode 100644 doc/images/DependencyInjectionWithoutDIP.png diff --git a/doc/Diagrams.pptx b/doc/Diagrams.pptx index f3ddedff337f957983230c5dfc155f7739310bda..1d9a5867d568bb4d42c96be7527e7572d56bd587 100644 GIT binary patch delta 13041 zcmZ8|1z21$)9$jcxVuYncehg9o#Iy9-C=R}#fr5+p+$%nMt-N2m0YFbmcY;;#z;A=`AtGdj9uBAhmxfjqeRC;-O+UU-*^2VULBv*p`ak*d~rWI|w z-xD=-wDblG%~yIRPXvz)mC)7K>~o=goT3>tDqN=P@{HkHh5-ePrOkNb`t_;up3ly@ zTQ(#78v3>(DrolVR;3*=)xz~u9hLlnm?~!TYvJc^aro&f;WUxH zju+O%zGeG!wj_qX+)2QAJ@0Y?!Ry0qOTy>++^qnxVlCCedc8u?4&IK%(>zSpMo(?c zqZ%oF#wu&|Sk` z_mFDrVO-?3Ld+tVg0=T%Nn?;aQJ6KrTp#92_glJ*B<-A??1-ob-Hq-VmOFf z!L0{r_O*^r$7+URJzP%0d~i7>UasojbSh(wbukPqyDHMac+{5(Vz_=b@w>ZwYg3bX zgaZSt5pnqkCo=EAar;x1ahKl`9p7p_5QHuxuepvx?e?I}bXi8GH5f%;{T~oY1k( z9P^nsuWyVlf>LMli}ji`DMKRtVqI*GN68wTDh|2{8q7r? zlMtQpkw>i2*O1TtRZ$oVY@Sv;WLa!yF18tgLLA2r8T7q#6+2Y()nS_0qrYig!9VZn zB_(9h9cZ~&?ep&?Vkosm{WlF&VGbMDI0mb)Y+sA;3p3LjN3KTY&$3i}Mx7KwkCDC? zf6D(f^J%?bNvU6ySJA*HH{;o}Ut;&qs7HoZ8OP>j2K>Z3*LtQIb~7RT%6)ay%|!NG zhsoiaZH?JazQ4I?NQuHqwC`-2^}!Jn+=!?x9PfGu%SYXIKLhJ}ApS;PHY6GSH`{!9 z z$++A;kI=#eaR*i~%BmS3ZEtFY|Qt|Bq zmKK(s)(_6&8D@vYLGmcg3uX6$4WVN%UIB7tPPf$t1N881&2n?Ecw!k@C7oQ*LB;4y z;tx(5tUPgId6;^rwLQ011~8_;4rA(041E(Gj!;eoashv4dyCVFMEx|6;wo3-gZgHl zacB7)0+RBe*3G~H`w!UE&$8MNn;bPA!ON|K!IgI{(C-}4EEJT7QB8DrKL240toKD& zf+)?CTL{kUK`;5hOeCjp$6J`AM8%n>{8Z%}i`&~Xw;%B^dx#lIW(Ox=eR6*&_0s7Z z5otG^4ILKje!c6p<9y;==2VO^{7-$o+G76Ylptk=sm)aoEBI( zVNgCf+u>xZsqbsW9PUXMj^N+BHkTX|`R>w@ZxM8xm7VO&#cPWUslfpX=V~2%vSjY> z#DcVa`(HpYukb7iY)IH^I2$&^WF#I&k5AIANU$~NTI_NzEDhao`-kP@2$j%`WYJ%D%%qG+ zG)!01p^~#ss-fq)CZ%Ysm}jnXFz33`+?RKgzFQCr4b-nr2Y?3>AvE+bV0JW-gkrWU zMn#;{2Yv64#hCuscEo;znvxx}v1`~y4g=q4m${$2OtQ06HQfhwA3SV=`YJzLQv|+i z6^eSThe^Aq;5~5$rFCUhn5BzXkDLxy694&gjQ)aIyU}B^RFfyn(tJ?G3(E8YJvXvE-zJYTPv3yn%Sl~3%# zyiY^Es%b4+#zVqE8%x}{lPW}rJWP^cs<1Pz>Hpnp{ryydy#8MROakw=;(x%Oc~wgCoe!tdZGeyu8=6&dzwy^a-PM>1+tt-3}QYL{ej zC~)pbp55wYTQdAPGqj?leR$Qr3eAl9noFd@@go-wz2^r(lNNGsjg%B6A&(THSPphZ zhjUmj3nK7Xo$}#M$>f?^OuEH|&a1O_Y;dbx!KEKkYg3@UfW$vQsPglSK{AY zRub7HY`%1HR8rU>5P8hk%x=73mBoEdwWEN#l zJ2yyP&S5ZP62B`C_NMBeI(oKEC?IP;{-HCXW3~Who0yTE`m^Dcd9ng^SC3VDETdwa zOnDhue*Dm>lH!LyT5C{4sjp_RU&3hMUMQb4f&Qx6(ll6`FxvkfNIcICQ-K3Wg0shl zvVo!sYhtgYJTQ4jbZD<|>pybC4xcH7%<$cPnxhb`@i5@JPd0SdqI%xje*j7IzH< zx)*|TC}G<;ZSG1whYRmDBwxvJhCc3OO<}th9qx-<_>gA$&3}k0%1KT5>9v}giiSgw z%2i)ycNjA~oN9WqAyAT9`Am=Fsvu1)J(M;96K_rkSo!f|ZppJS!?!WH8oLc8UEdQt zYr8Wp8Z3IMh~-3b(Gz2%q5%O*BQT=1><>b0~24 z3#-=cX~!R@05x)H#= zZSCrak`#Ci^w3tg(%_PapA)kU(*%Ud#AP89&eY^I65AKEg=Z2!-HHr-!ac9zZaMmC zgqtQHWpbZgYH4LjG*>^1wNiP4tG9&r13#+1?*=I#C8v6k{N`M@JP!R?H~ra!kgn#E znGJ=c`?<7moUdTYVav{T=5d*_FK(IM2CQ|YI%5=WLPFsFvBy0>bXmMP8pO%|t7@bK}gaLi{fL2&}Y^9L`D z89h5c`6(0lfSvco-?bburj**cb3JR)6_n$E=k&h=#`7a_`+9t~8(c&! z0po8yb5PZtlIy+PWrf5h{n?oF)Jo)CtOV9I28BiFvPTD!q?~I(C9@~4hJ4k?s(+ry zUv|6gzFWPy1EfB>jyqU-IXqFB1;VAPn>XfSfgm1k^`BVGY(> z`4j~94=cOuK{!GdTZZ2_eZK+5;;)m4UkyDWpsC#~3nUMovHFQ*g*fs=fFA}V|5amo zpk$`q@RLHj-Pp@`N(BL}rBHSYMRHZ8dn1-(N!KH@6woT}z4r)>F=`*f&fCk*Ai{0r{@e#q7kGMz+ zUB7l?<=hOVOh*R8=RlGT%e&_|tW(w>gjO8cgrKg(Y+|3Xo9r*$2>UOscOR<0G@D>6 ztZ<=G@?KlUxTBBO2sQdR=oNE1QZ#>Rxjszq2zYqdIpw@6X`(v5g7NH*3mvKF6d%)? zb$Xe0!+={93LETML8-vwyk&4mpyW*`GRY{sEVXNXK@Rc^$UqkxGrN^%SIVfoTh&;Y zm2eu8cNg>8LfI;uKUdapYvsWz5+xXzCGBy?>vbj`qfPpW31eN`2a81T2TE01F~cjN zrG>N?j+PBg{L#{)I0QjE0iIRC?Z6}7@EMYbhJ!duV0te0_L8>3|9eRt2SGKIN~}O2 zVNZ>Q$~zdCJzNL!8Xt{a81NCG=(N|U!!QuR>-x}RijAU7`Uq>>xqd0v1-2q7{d4HJ z_wAy1JLiR;l7k`dJ7|)mWhTW8=eohu`ptYAbXJ3k$`l#HM;eXs;!4S zES+B3Pb1ey?cBMIx!g2e>p;SBE7LDO)9k}?@r(`T=N_&{L_7SRFTkgaWt!aSzgh&( z6dKEnTa8K-)5B!)Ui!C!9Hlq#nLKIJd_~~PYNAecuqK>Wt%!3a$NMbVTB%Oha24!@ zpVPSXjGbI8ml>2lbuo%SPEB)f51uOwhsZMMyi4jkWjYq6_0;gsFiaoIkC$?_@G8}g znXGKPKr78^$!Sq&wZyH4!P+wvM+;(Mk_Q?HzHW)qq2&~RTGlQFpV1&mXxNCq57KnKnLnxgPyfu{z?x}L zo0f03uxv!iAHMjS`YfT{zO)|+J)a!|__og@Bo(K!om8uKdoSYkk&=px&F5CWXn%2Z z6|7H8Y@}y5N8ztZlh7tp0zdCGDuS3<&y&Z%R6v3_ne!;_)M`Z%X>4`1PtLu%)13_n zTij`9!>2jPTX2a6>I0sugT>Bs+RuLN6Mj6OH9-89ePuLpN1;w1s$ib`YHh-jew|SM z+>r>x7k(_3b6E_oy9hG){cKGUx8;g|UZ&30hChSJ-54IU3>VJvO9s6_H0mY|EC2l% z_{noEewnD;Qh&^muSAYI?~676a|CIT5m8`QNDce*noRe;Y4_pGr)(gWm9uG3Puc+< z%|;3n6+?5^rgLqEp<@^BOboNt026?)3>Re7kRv%Ub{@yykopbAo3T`YF1$Fs?CzaP zPp6W3fTf``H*a^!n4F)Wr0}tvM#7;8*hU1|5b!;dsR_Tzr5L#*1S}k>&akb`LO&H6 zxWotAID@`YFU!y5y4howaA)R}W0UY#&J`N7()1Hcrcl$u^zZ$E8UL+bo-S#iGahE| z>Yc3mnsL0Sy^Pk)2DTP#VO;pxg6bVd612D(nc|=D&0qxrW-)|U_uA-+M3f9AFjM4v zc(kn$yhcqodkGzMR0<>aAKpoaC6;3q2#uX2y=)E?I38kuB4oKHQMr=2pmMTMX!Y8P zeigYM?ALZ#%hE&}7Iu(%#sC{^0bW-P#v$%yPymlg&|&!}6hLK{YuT*?95leL5y=)1 z80TT~hV>X|zX7d(0Ywk6iD2Mnvoh@tevTp=R#2$sQY%M`2F(68rgC-Z$k#Dy_jS_5 z$xmvPMG`5a2&>|)6;bbNjV@LMahT#mPPLAVSGwo7QTL!a!)va5) zE4l(7ix-hmS6FxsGH<@DF=!M{p&k16*Ei#W&V5ZnNH*Fk3s1wq_H*!Uc=f`B^^@53 zu1rG^2gUTwSEIRRn#PpL0*5R6B{5dKM)Ax|glywk=j~IIY-;g&q9xT_lp}IfX%CKA z;NvEfJWDs-<#@<;)|}@qbp}Ie=JwokEadRBz-4Dz{S=hr;ZLjqvTol|z6Vr{m^pwXd zYAqPA5fw0{SG-uoO7>xl!R~U3JaSXa!Z(SxdSh^7sXz$+IEhz*#ZPqH<<$*6aDVL*Orz2vOpT(^BQ%g`vqtU{9TXzZUZUKWH%kSN@z3bznqh-^ z52AZxw4OmZ8PARPFCk@xJjW23M(v_{aHH% zAGz$~2wnkAn%!=7rhYXHu^7)s*t5DmBkf+yc2%lV+RJCVc0Vt19;3B(3i~)BK=5kO zd-r9%s{;NLE2UF-OG{1GVdH%R2>3u|H8962z|k_@vn^4eijvhFhZQpY?C zLAu-0Ps(38oWX+$M{AVjTZ^;cYoiBhWbyQTfX_f)p8YLmgw}1zvV?t+VwGftNKc1F z73sT{Jl{tNIqG2?`y-UrIldl`L4oWW@ba13(agHu=j7H6tSqL{;Byic zJQ!X{)FhnCHh`34Y&;s14;T+kj|II?FVf(|ePEHhRr-S^M)Z4N;!grEfp})GE+0DI zH`5CxOC=q=#AlzuUf@FTU;|1sZ{Gkvnlmhdwl*lQRDMhh%OnCl$Lh zGXU&}?lotg z3WSX%e2Ziw=-@ifq1HRmt{1@p?6Gv$s={lxkuNaw!Yk>o^Km4~14OUk^h%_lk^5>4 z&@Ay9y~E1~v7}45lm&%R$bcm!I9!!5q8=+#EX{`|?x~m{0*c$QV&?7_n%Z7?zfo+S z15>Alrj`&R9^(+1*6{nac=~bE5tO`ir(k~^Sahdr>q9oM8MQ58*(<7d-uHELR8TC< z?kx_avS)CtBgJCV`0TfK+pL+`huv9(ExkshnbEejF#CwHPbh!l<9<0By*}(L&vz)l z*(V=TBCS89rvg@Dx~tOVW(fDZIsHLdQtI!OI3a7jdEPmo_RsgEh5KC1N^Q%mfL3>_ zWchNU{om1fc@aZonP(-VYUVTCuI@>^sdJu}TFZXB)%IUK`l)IoDuB(EH~NHkReN`N zERWngtIx4kT`+b77#=L!zQ07uHjXS1{J?>C5t&3qx_6s_iakgewf;}R?Dweuc1;Or zml&vT8&Dg#f40ca`W+Su(_8%3!E?TRl|ik1j+B;m{|HiLjRh{^@yLjYPLA5oMp1x< zWaHxKD34|xjv^|G%Sa$|E`fjeX{d8N-L{3CrJT59or2SR*Jw6Blr*O zYx0ziarY4J-}-HvS&q0BUdzu=DqZI)VI`7RnDNU!pDDp_0r5DO);#y1rVV1KdR6#p z{mCaK{7|4-pF|8-$I7)gj-NZ`GCuQlSZMzv>bv}At{_pso>gTg#ZDR7gBO&WE$NO( zUZ0q=3)1USi$1!<8SY3p9dp!3UeUAJWw>v@$C6dN)E1 zvkYgn24AOPzocMPSej{m1o5ymj2&|thJRlN6;VJsZRx=(g9sY8za0Gi?(R3vH|7z1 zG#l(h@lE6m;H?6R_U6()I=v=SU955`e05>1Y4yg|t{ElMS+x4&ZH+lTy|GD(Xc>>U zM|`OIT>M817T+lLzG#>qr#8is-~PzMXdyPBCwoe+0@-r%IESRfqy%P)&826Z&)}<^ z|KWoTR4^gMUCB}F?iY-frLHS6c00a5uNqnSN3{+`!cBBX&+*wWu>Y1^bXOI9NS>V_ zSn}6%FyGs{8uPZU{-`1AlyPG!b11a>yWfBQdE{WK;-WF49+n`*H$qy2crHU}NY6`V#tR+=1FhhkfchS%}pVkoVcyEds< zhYiCvOq2h~o+A*vs-anqI3?f`lt35!P*`&d28EBM4#g@Wh{ZT zb4M>yQfdRk9+@!Y#|K?$aH)#84=BttAA&f;r*{rK4JQtKSsK>LPxyz_LJz>?Tm_GL zSP&z5^boZEm}6zcD5*n!R+e#V7*dMED%haqb)y9d%6eQXYdpxRO?9Inc@|SSnhena zVA9x^uD8{J*~dPC7)hO^WY1ev$v) z7?d`@*CGvG8Gyo@fhUFn8`~;XVd@lvGsUQJ-;EQ1?#8K{G4^yWK7%8pE4i??DeYml zBm__oaJj_YC?*mU%M?!OzyFvO;ph*Ra^hGhw@Y*A^lBw>(*qf#cKIt|)&ID_PN|%f zRAFN1q%8z!e1+WsHkD!S)=HcyjNGpBSd|F)c&}&B(2P_?ompHV4Lh1~TbLux29vR; zB#h{-D>vD)(%Q*HpMZN=d{uBobTed_Q??%HB;&hkJaFB}NpjnIkQAk9URAy57I$IS zDP$t{j?NU8d8>Nk)zM>&ks|3xzP7;OzrW6f{Yy4L!|(t=%G2no0`I|Slb&YVN^AtG z0-eTikyZn6g?r)>`+y$d_Y>F3$cXvGyWdQjdQ?}=1Fsvw%EUYtgANE zm+|6M)I+52?0a_wAiE6xADP#UIi2mTaO^7<>J~_&U?{Dak0}uM!I@EJA>t(42E?W} zHrRqH>8P|Wk&9bYF#Bgp+vqjv<8t~P|d6#9Nm1vg31A$t-h3|8SL4%%mXEQuF>8HwcAS>hs# z2~vYWRu{GG9s`(DEbyZk@dM?|e4Dl1q0+k2)#NSl^8*KJg#jy1MfO?guee|I84T6I ziZ!&2?JLY-;hF&od>?u)HrC921Uo_y8+{jE){B3D6-p5;m!456;F`W1qq}x3cRtm9 zBUVyz-9>{PyY02mPPiMUtPzqYXfnV}V13#|Nvd$Ffcq0telPawmtb3OEts_wC$Sa4WawJ5Z?`0zai zgmkv^VO)#6)x)Q{z28=CWH+J7m*8#P*@uT0QCKf zkJJ#k2>cByp$0F29kR)T%lJ>1$^4E}F+RBrubrUh9$7nHk0_k|Vh6LpNAS7{1Ia!I zE1!=&>QYVO65x4DO|9lL@Y}{{* z&WJA@`C|P95hBQ&1UXg@>DVfy+AZUS2HYVgUa5S%M(@uETbzfBn?d)?hYp{N&-+m1 zK7Y^VwxbzW(?VS;%@7;QrK`{>clcB}XRyzNfV@_ZbC+kXXYy_Qog5GMj+M0-$U8k> z?K{ajnXG?@Mh{S*RP2e?ra1iY-C04Xi1@dYhll-(zoP~tjV5PW6Ya?c4Qz$4Y4s5U z!lX2Q_+A6$zXJsJQr7$dAHu=Jm>{Rs%ttVj(r*FbYqx+!KmdRY002n5Whej$&}pCl z=IsFh#yao#{+94M?;y-Yy14CIz_Kj{z$C{647~ByTO$B~t#%8NQ$z^&M#e({0Fd?~ z3Sj#dWTS{g`Y)TV@c(*nc*Fko@YU&m_ki+-Prj-D^P2%+T>toA>b3L#swaT| ztBdt5zv;&ZW4{r9^Z!hL>$-3Gf8w2Q^~yJ;Z^i#gJ#Wwc=k3AR^0$C=Zyc4k{I?zO z?GyMd@84IKfyepx)$R1O#r`&q{ePv3JTw#x#Br3c2LDGJ9H_Ktfy5B9R3QRBE{7Qj zivPjBP9?Q11gMjjMRHC^PBEp0Pn@?Qqg9?JAQiCto`lJ3MMM!ey2HNh_q4mdeYCIG zmCe2Lu3|X%P}sT&m3f9?WW;;I-&NRws+^LFp0m3o`DR6rVdeXt=&PHS=ZKuzc`&?e z6SSJ#6t%D?h54#Ik7V;#5QZ|iBr}bTr_@V~%J0IPb8DMfhE;pUu`b_2>|&bx@SftZ zbdgDU|A*X15OX1JH$5dL7kW%9u9mKUWNoH8lcxGj;V2-cD(Tl*&XE~#DL$T<<= zoxyi15P2+cHt=(ihAr8`FFfh({$ z@FU1+3uloSUA8f|DEV|M7w8LGN?F9&fJtW$ehEyAo&Z2!^4PrN$@ zGr|(xWKvlTx6?hjR~+sh^5xt-7Y~-%O|NsE&bk0@+4Tv$1R-d^4Gn;!wY4YlGn5p7- zcC>KWM96|ea|8r{`^Zx~i(Nc7BodT-E1r$ciqpR7u~3-Zzx#g&7AKuhI9Lx}xa|)P z=jpJJKmhWw_(15&1s}#*!$66}poc2G5*RoSLAMbE#ZnGed;@ilK(C$m@#x^T!TXJA zoQn8Fk#a447F3be>Znh>do^%{q8=}pI-H~*jR(Mw1on^YM_#a~)~p3{7G-CA!?Etf zGM$j=wkoJ9E zCBBn38*iZPI}TVOt9|mIjQ;|Pb7H$7^al&sAOl$uq(TDlZ$lK-nAm2RHZD-(0AEC2 z&PTxC6Tl8RuOBVD8U8Gp!rX<)LlwLKw1HvFybAz%g6%!bs5-U{sb$D)4wxw`ZAh8dESKXm z9GMN$!0B_m7o&}TN~^}?W6f4G7rUvQG?xc+(r>ZK9KYWHkv3yiJ9D~%3R(mi7U(oZIlgV8G5VPl9RSl_>5&%{A-5wLT>$W5VkU!WIbGdU+~TjW@o2p zIcMpD>#B*~66goRQd_#O*d4V6O%`n{^y#fFM^5LZK`MfAq%M*Tfsa&ftAd-Cf1Q(c1y`%lmlMjeLrP@6Ua&NWwN9ycT7gwv{l|L@Y_2v9= zakXL;Q{DB=<5$WG!B+{iZ=2)q8Dj1HKh%vCiR1~jCGcm3_s?1=-Lb*+Npu^>Bv3~& zLp?V>iK!rqY~YfyMz+C!;h+sf$AMN+^@aP|tE@qN1%sY%3W%-;+y?+*1lZyAx&Br? z0nt5xkl~?T{I{B1J%B=>B-@39U7`;#y9h;RGeArGQ;keQa;LN9{$2Z7{VRg+3*O(8 za){X&dQDJ00t|@R$FUGnlh8~91s-!CqCg)wO?^O(be%tn$U>{7aY^2tq)|)Zvzc3l zr{TF~At(3nI~2S^d89I*zv=3K_R87= zlB0_G4j&Z9&6h`neD$Ff{84_O@Y?J2r#KlmY_bB4(>{$GM!{ArsHqdT8%&2mgY)I5 zBSlfc7fv`A1XnZj+%J{5lys4u0w%k#l&kcq#3?6zylwAg!%^z3OpW_~7(3cY{0;~6 zT%|%+&pB^RE3`C5I8ZnA1qGn^0Ok*`tqiW&)n0=ATUz{&q{nLaJ*bnSb!AE2?Nk&} zFYvny>*OyU_gGzG80}NfQKV}^-375Ow{>dl49duH%evq`M%zJ0;)^0G{eo@!l zoV%)`y4xq4_Qk@SpRvES#LFt5*5`04ivTiN~rn-$qQ^vq6LcX*Uf}b{>ZM9KI z>uP4qCJ$+m?M_nav#edR48Hg);KN#{a*cO$c>@(#dY5_qb__rwR_~?gnUo+Lp*G1y z8R?a&3k8*hG8<1?upG}c?vi<~jV|{M%nOORw~t%cq|n-+gR&)B1=D_6k{8}$7w;Le zHFISgZYHnYV6M+=!T7moU~eC`d%QiI=<|&480RA;90KVgts#?noU%<$(LSN%kDaeLzZu|Rf#{HfCkrIjXJmr*-p?N9B z_hQ1Q=&wgWepsQnz==9FV^7tG$KKtTzR^F3AdtY|d=nQNrN0CP7zJ3kCU{3|=6b_e zER1LvA&cVel$-aW^j%bL;bYX~4*^A+{kqzqS$nG~tEyr)ucRqL6^Cfamau`^Pi4|$ z61~)CA5BN+ltws6kk=XI5~EpDt+JgJO8gn#GgUGDk?HQZveJvO>1FX0yi|y6qe_>X zT3V;wJ6WtC6J11^RWsH;a-m(y^<5D1X#FrS(-H2=aY?4WX62jEpt)Oa7U&?Yl;dY0 zhZbG#f+xy%m;I|Ji)N@S#RIxzO9+jt;h3de#FXvedf%2+YtQyX{&qaFCaO~j_&+cF zZ*;2z0bCHC9x-4g4}`ss3PQ?_2+`?6hcxsM0vmZDGdo{4eO$mK$$#XlI3lE}j{*2u>RLiNgTLW)2hb;#F2cH+N>{)=y(ngH>C$_Z%wQ-(BzL;T;z-Tx`1rvFb! z_f6>U+0((>23!y0KZQ_C{s|So3H|qR)PD-`So{;Z8^VG48z+Wf4C4Z^ZU14?!#FVi z!feKGn2EzbEbR^Z>t#YJ-mn_if7s3&_Sc7kyu4v@-v2PJ5jNmAf5?e1)8Dxy{_9YU zzlESDkpO^q|21xZiLQWu^6|W|5b8m62vQLG+aE#xf0_t}ppMcI|8>3q$lly zganQW1238&9dCt83*=>tn)u&B0tEn!ytzehgZw{|aw|l1oRavTF?(bFe47UJ|G@?T Q2s$7E+r|Rk6d!|=cSM9wYb76|JU~2d2kd?A1RcKKF052Flg-=F;iu86Yo;t- zKu*L1La>(}%b2!V+du-Vip=$H?fUQ7&-&I3rGQE+fyb@Gb;X3L+*|dEjiWxcGTBkZ z^R~Nnw9S{x#^|JQh6#K-*P;_=F0IG}3N-w&pYqRVr)OU(n0$8V^T3-|+8zfw zKree|_6Z|-!EE(?(K;A76_K7@WB_YvCR6p^So!66C5NXgpa z^q~V?aZM#(Y(C;tD*3dl*FDT!1K}UQM`fzezeaLjKC-_y9j=(Z)Eyov_&`nOwlh@8 zSK0>fhZ#<%F!X-N8HzV2_&$Gh-{dg{-uHLjhpWIPRJ5r!`|ZJD{c&;*QsE|~bf>75 zN1HzB>CpWMvj6d7nRGBz!eGR7y(2%x&Y9Fa0=j1e+IpQz9L@L;0sA3RB)?7SSD%$K z88HH*9luv|D`ap+wWg2-1g!A0NAl(6&AER?O6Dx6!ovpR&v5KV#6DsxQ3|xy zw723x(UsF3BR~}InR@?^O;i{C7Y|WWkiP~z>cZ>?odqc z?k-oIASbBfZN@g{x&R6Cjx}UF z%6daK%6&P8o}l6FeioPS!Z2lB`cT^R$)%W}cJVRwT>Ta^oXY~H1@F4YluolEeJ%$D zn_}9;2&90W@yJB^nMKE$zPm!neaFP|rUH?3s2cknx)iHwxufaHepk@brO52h1uN76 z_>DYWe<$(PL>UR#{WQBHVWz=3C*SY0LRSNEa;5KPm~|6je`wQoHAahTMN-R(1nicA z7@njI$&YRH9#=pN*8C^5=xJnKuXePec`rU6y!%RK+!jP8AGFVsSeQG+>{n)H zI4U-fS#LSz$V8o5N%CamDo<;I$NOo2fXms7+Z zRGK|VQJI?7-#(bJtOT=A0+Ehm9OOk%bZ$F&WonMpnr+s5cM8y1M#WjC!*R#}O%^zR zs)0wnWTs1!R2R8_Fud=j6ps87YuRw>*JN~|!CXnVTB&QJ-eF)^zayruIVOlFJ^!KH zjOMvyvnv8iMSq~eX^%yV|4jxF%EaqWiG><~R?CEHWN&hgyJ zKo?Ezly&cob+D5V$Z%=NL8iTD(uEtLnN+AvJH^7#GkW4Y2WYQ;fcE1RbRD!>{J`rt z(!kxqI%8q#si>XJspr$k`V<9keX}5Ao#uoUgx_6yrk{O~i9casd&^z)XJnS;K9IAx zkenog)&(8bh8f=1Tel1-Fd;N-8Z~iLSxh-GKU{rEH6O~iK#-LcT?DA#mqk1_qm@@0 zZ(|jx5PW~$=uD{erI0Kfgf>4Z=E;}fi8%Y-NQO-U);7(G6Qyr0d7zj&^drs{qFxw6 zTr9Qo$m9q??g4By5QB-C?~${HSiRYG+vWD=2Huv^cEkTqJe0mX#Sv{qgZsuOQlz5y z1KVrK2Z>jHUtQ;Er20%IIqFry@_OdoqdU5nS}Q8CH==mZH}{zeKqgDko48x&Dume% zht~)tYT=?j=R`?)>~0^W3W%v#w8-k&0tB&pk}Wc-pkJP_Bun!b_lj>d{}WFE(%^=HA#q zCfP?0yJc7zn70TB-dgSqc{~2M$^tKG!--d@8N_a)NCtp=Q7K3j|?-T+7#bhaIFn{V}WU z3=VDzoLFV;-?=rYyqW#lv?Ki$XF$K*-fuu3T?lc>^|H*YOGS3D)b-QGw^6mv(62&L z*c}L}&9U=j2C(8RQ|_z<76I4rxu}gK@rbc5YwIao{c>OBFisu&?O^aL%%i-vIV%`6 zyIHJ%i~Fds8iSA@ZSQ`VTkb0`o9m~4;Sn^Ga)%Mg%D2(5$aS!~oVj)2vnL)ROOoc2 z5tb4jP+G4zi>$(NNVk1*d~hTBs&2I+I4Nb=bCR%6;gBVFucwt-oGA9Q*|u9CS1MRz zu#H^WoNQ{d=T_+P<|)j@kd`bzBZW=V&av$H{yU_@%^gH9RS>>s)$WFHl+l{zH$q8K zToOwye*Ix2BmgQe*e&naDO|P7GVc%*hX^LN%K9Fe2{vBmq=n+R-Qascw1i9R>l9>u zXBDH>0`fTDw-&m&Pt&@QieB^y`6?nb)n(*SaN(CCigcRoJauw7&$Y6+W94TOW{Mdt zD7pEqsTvR|Bz?0sD!XJgIOscEmj%?mE`T3TRGlVwCv>|d{qk$78_3XgK?#|X;@b-OQ zO0H35(}XBbVc`1rybNO#b1*a{S(l?i)0`K*GX^x4QEz6KHTD)NM8Gz9UpGk9(mrnk zPxb}4OQ^x*X-{pbLUON>Y5ogO1@U91SxcSqV{wXsmRB~WS6c9gmQrq$>}VrcVsr!7 zh6)$^j><;Y?U7?~eJ4HS;FP`-*6(#^mEZ4-xNM+f`^|eS=SUh9rwTU%Lo?8(n$?aZ z2to4#!n}A>RU(RdOI@UzM$`zexCtsv7`)qbPLn-Ozt6V&lCZaK&YG9*F?Hd;{!lHw zrJBw<&CN5}9_Hc;({Hs){xiz*%obPp=tf2%WEldP@!iulEDf)7KbIPC>iGUx%cMK6 zbGm?-N^%u#X8+rb<=1*ZmR%U+?3(yv05(WyH8Ff*SU<-idr-vGgJ*@vIFr_-GRVew z&k zG^126=yBu+9kQ1rO?My`e6i#o$Bo`Ng%b*i13OYwDHYco^F+(z+0Uj;Y(Ro;{bI@!p$F_MXE0Aan|5S^vT6P zj&w-9V1VN>-Zh|eF~Y;1<_zIB2nrm-K$$nt3Rj>ZV}7-JZh`>-Qc=LuDpcSn1$;cc zh^~lt6%5~$f(85lVfj=ZjB2!YHDE?XGLU{)v*u`+7s^OaDqnW6JEvWW zG8Y~5VZnBnTTOwBWRVw_)sloHUhf%RWGHERjZPQ)qQ}MGG-Y;C2XGg52wO~S`jy*S zLOw;kIe-o;WA?N`3n#O|S4}w@3&snobRN%%I z%AQw87k()t_w><)_g?tiWT&SoJg8IWTm=uQq(i=OLLn2H(6+@T*V^wHmOgVnOWabI zW=mTxz^gZTu>xi(djmk_z4>l@1B5{skfUt6KzMYS(?F!i(Yon!rIsHnkuC5{`N6fL z$yC4wZEM-q)Y#5iremjIXJAcXd+}S5Cn4}o;FrujcNCwMde!%AH3`Jf7!5!;!t6|~ zlfzmY`O@r4)i~kM>^-%QeOg19zvNeHeIDel5p}g7MRpfdz!mn2nrbFi0?6~=1K$0z z&ZvM$X8$y1V+`gC`nwn2cnyX96{VwWGx3kp@`zM?F-ygv#kG?;L23*DbAwyOjY!nf zW^ULCd{hh;BBmX)7B0KaywZ>Ie3@#}Es3O1&Z&VgPZApudvhi2vCg8vd+E~0qwRr~ ze%|k5?y3n5x1P3se~6eL^FeiJloS=(XfG+oiO8|P$#Wl4wa_Cfojl!2V;pQh@ym%Y zeeIv z29N}z#S6EzJ%2zlbP9Z`GNOb%3)n1|Y-WNx)IWY<&!q))ik&0R8+d~V zCF~dye-5q7!jW|25P^#BC!YDnFW_$&xUdjOlb(iA6+>v~%-#k%bt+icBLxko21V^3 zupn8)1+U#26JRfF=c7l5Z7Svx^)1pNpMj$af5`IagrfLi=bxXHTZBHs^t?61@j&YBt@`_32A|Y$B2ub#RyLqcy7C^T2@d%4^jINdE1#ZcBUyIAbqBtlTSO{`Gelrh z7br9vuDTiRiDvN`l-lZ3`{&1l9Fy+A2hbhvQhB<<=?1AcouM}SCh&Xlgm|GUXzy2V zOMwe&atF@D2Xfe@)xo>U$ir4AF7z3y!(C1SV{9)1l;Y;>K!tQxcD}X-$E1?FZQPtO zFOC_%n-`s$eGJ7!AuR*b!mXbLtcOtUJ(9?dB`It^{M`_0DwLAKhX`u^>+k8cf+-S z=Uw-O;+B|14H7&IJl(CbqIe1CDow+!@MmaOMI8#JG3Cyztkq?Ea+{n&8EF2 zmRmsjvU~T~(uN;liw|-1bBT1=*}H5QteRjs9>KQ7nV4|pDWIO;*7NHwANK5h2GsNz zkTw)2j)mRXpY>r-$ueV(y`-^~$*enxvUXupMKL5$NSf7q*pcY>#qv8zC&^`gKiuFs z2=}Z6drm^<_W7z^dMxN)&y&ogauwDagBABCAn)w2%Ku0`{$vVx zD3_Q*^ZRg9`M?czc=w1EZ6Nz4i`-j`q2$k(9uMWYf5(A)zD@%zdR=zRp%opX|+0&4r%-poAfU*2r!o@Qu(+PS}m zP3&Xkm~V6m`FY23zoQF!A2(dAeFmlM-SHPg1dfr z!G1q8g-sMlJC-ld!H>%!h|%FtH^F8joo(o~r@TqYg)&cO;|S6iVhnT%=NjVV>nq(G z-3nodLHOWh8m_n2^2|U0`9*Pk7S+Jjjo82V;cm}adpQl?w48-GA;}9xxf=gu62@Rn z8lkhQC6<&ocrTq8Bz!)Q8=M}nen!V-JVu~#_Gf`jz}ojWc!LO^-W3kT9>aXsS@&p*oVa_Y~Kitru`~pT*=hgb1zrpgp$o8mAdw zBQj2D-F5haaEZwfUo|nfT}oh_G-qWZ-fyg9#r!LP>*I2NXdpNH0|Sk-(?DXy00qn6 zUIh!5wH5;1F=GSGX_=5M!KPWy0O@>3voZy_wT~^jrl5-F%;$uxJQ~PYaj6=?7ZZoC zMCdbq)oGS1uqxmwXlwY)c~*jgynbshYW5ZA>K5hZh*E}W7gvc_XhTCeeo^gpHLI}Pe4{CS`c{U{dX0>gEob>fa^anCUg#1} z#O+0s!Z59RhsR*Mn=}DJ-G<+whY-XoBn1>0nLm1?2I$(mk9WMo4%fab@6dECc5IWX z5gzEV{!(mMp0?&%+=V8b$4C)QzMZTwNwAbkZu5gacwnJY)~at#cF!VYrhIeMixIOc&AJPM+IBZ9CunB2*Zw@mIi8^ouu`qcF0j z4JJs!p6T5Eho%zJYE5_|@H1~}f-4!r zL(D_yVc2!K%X1>3{SdTr!Wk-81!qAphOv)keA^Nq*xm0`pDDy=zWpAEqCn`}By--q z7nqvH00xs>KKgZbunURwMz{hp}dgqZj>j7ge| zpLM1FfOe5&lhNr#T`c}LLgGr|3^>D%8YKNGS+W@?%`Drem>fZaGg5r3vuip5LNS?1 zEb?HE>S2LYTwZSN)1-@ZTdNL#<*E27SyvggD-`Fvg8lR73KfHJIBI4ei21YEXcP$9 z_=jq*t$Cn{8kAu4`jdhke6~n>#)2;m$%lLc2G^eQ9FqsB<;z*O7_A?hW3^qtENt&IzNP(*wPeFf(@zcK%sD zEhYf(!+Sf*RHs4^b9fjT9mux-RHGcT%Hi-N-}Yn0#gD4$=Sj(B@v~?-TMQF8ceAs$ zKmwX<9Le^d%Pa18ocVA#wWKmDaQGK?ceP;+8O4{+P`l*zPN^r`Q7}AcK*`zLUns-- zf?y6eubg7W5cM!vqH8_+b=V-Z~$64qfou@F%E5D z@@MCrwaxJ1pZ52jlA{T8k;j>6iXp0#R|(bhKc+n1o)k*leExC*TAbgag+9UouTGN| zdI$JNz0KpFNi>IT&7Bf=>l_t2DY+ADqH&P7km>9Tx3wzI40D~obyPcev0sADh>{k6 z?hYC3>Zv8BP7-b|g_iR~QsAnq_N*rw-mcyo)PEAADV&=Fr4*u*%x-E&Y^H^I;s~!nE>P4|Mi}6cqn`(1i_oV)K-j$0pGiRm)PeQ8Q{S1py&JrTAmPoO7$gy zJFOow`PBz?wGqK+6|PjMhlsT?;@=K}cLeQJ;lB~n=@;I+E+0B>^V0u{nN!bUw(Y#2 zpejekxrcFyg|8sA&%BW!2L?G!6|B*-h;U`D_xJGRw0FiUc>*@5`Hj!PMv}Vy6@F>_Dp$rMc zt1@sGjVcM@pG`X+<+q;--8^! zX_THnJWXcNz|ew0YY~_ zn{cL7CNZw)b#^{w{8II;_HO;pv#69$#SVs%GZ7|drjNM46ohFB{cH~@h2Z^jSKaKZr%6?@?CvY6Ady}f61rvm}hb9J@tN%^FHQE;~{ zYcs3BV^rET?Ok`$8e{AXGP3EL$!~|`OFq)thKqK3(P+LrT!_Hk_i|Asb-#|y>>uIF zXqmB-ligx&H_J8zPJjjSOjVfPh{fPLtzP7U|-kZ+i87lJRxY5 zza%nUJg=5_)d*_RA`+=Y%O4y>#w+~s6yf5lZg(&jNY1=4pS`U$o^0W>r z2(oRmGAQ1iOyh*Nw_)GeDo8;Ltj3VVxQ5E@yH$ zi4asRrxu)L8)#wd-!X4$%h|7kGT&-KrOCYfRQi;6@bN&S>SzgP5k(qAO@4*P(h@LQ zzk^c4*L<;7D?7^@d+M89gFYwgA`4^m#q|Rt7_I#p>qTN;7Yisqx+t^W*I${;*)~Qo zed&{=HXBj<6G@&igvHdX{}9x#{%qwS+C2~-w{}$}1ltw`!)8s%2mR8!6m3R()&Im5 zB0p)B_zC{9O74nkeEuH98Be<-$22CRt-u!HO0vjm8+N3gl}F(dzs}jGS{7g#4TrL0 zS!)ETT>t#bTkt3uy`3%OPxO$#nl%ywhd91i-4P%s5n43}J`rWVUO9CEyRV3P#w|Vf z_~d9mNQsedqAv2%`r3`oNt3%+3VJb^oFg%A!eCpa=_8PyMfNM`c96$U6;C*pJ)VdG z@=NtANeJ(n-fVEA_YyiVw^{zB;8L}I46Rq<8{W+3j@m?luK5UKgj6k@WFp?|D$I4B zuL{gRasvvQ_;WD5T?7MbZVSTEDw8XHYV@1#fst(73z`2#ncw)ik1Y4pn;src4c$$> zXWi`Mxp%KGXq_G%g>&B~66S#j5huc{uij^Z@@s-7h8mB#TNa}m_ueU0s;ME^Qth)8)+`eY33wTk~)f4 z=s2qZ>}pgdzc3xsDXwP3sMMcI4%t8Wc^-)esDXD$&Z)d}?jgSmdWqF%+)LuE*19=4 zU}l=8PA3>zJ=Y_QSNn7dNULzzwTk(3id9?!+6?4jDxOkZU|~)Mx}w?zdqR*~JGNf7 zPf9_G6WBIu&**vZZ8>L{Zj9-@PfeE4%Cl}iFyN=|28&JNyw|83Sd{qMjDExcpLTEK zYg}p&jzX#*#9sa5J~rD4X6ZJc8pO*P32->taBu84&ZFP z9GU}PZ)cphdY&N?)#cLF7uUVQyxfKrOdg=`#$Vr^IKM|)SKC(+b@Q`d(|H>+RyG>R z6i9ZI!FhdOU)>YDi`z7y>vD5+DKjq|*t=VS5G52NrI+I7gO~D<>+?XMdBBOUl~z82 zA>d%5s*M_f`*pr0Gq-Ds>HFdrWo8t-?TIhxRqubrYk4tC^|Iuu#aEy8n;XQv`P zApbv)7lMQ3Of-)PP}0c|cy!+;fj>ZR^aoxN>F%shiErzqY3CmAQgx`eIAyZ;+Q-;C zQxT>z@tkUx&Y+ z?Ej+~-uw)pf3a=wiUZRhqhc6&5;1-XX~u#cH6)Xm z9&tujX3MU2`%%e&uczm3bRjq3VH=-lr#;zzo&ix~^(3W~i^tZ+Ydqal+Y#=1dMJr1 z*GNqGiZ3ZUPWnwf0{yt%jj=+xi!FhFD$-jWq}}+r&Th<&Y6m=X!btBd<~w~7Sb+82 zEdjS$ZzfL9M7cyyJlv{&(vGqTQ<*S6Hz?I6sdm2HqEIUn8M8q9g7g@hOL3TGs0W<( z5};I~oLmi6B0b;+1j@=B%OOMyGWWNiTmERfnTQf#3mPl_5+&s^!8oK{_ZXwIcM`S- zlDTsA7!ae2aL)?f|ICi83S*uA$YPp~*V*E4O&dS$JMJcg)w|b=v_p1riH{eLZlpjz zmo?VRo7UrN>hvCT+xxS91E2|U_^NLgb6&A$;E}D704?T3Aa~ShxuQ+Lhbs069L@S(drq+lfQgWvaRca4%$( zJsVfM@Snr^zD(h%Y9eh`SGRuanS1Y5JLkc#RA>&ZXM_?tLPshnWz@6Tbu#MFqj+)2 zLwAYKMjDO2G^6k`?XjXo+3o~Ekyz0$$7pIhz1)Z&+l;Ub!RE6$PetNS_CjTl1_?L} z38}78I>1X$Ek39V1fUs3q_%t?pVS=LOaj~?H!{u>_am`cz&=B<+B*-!W28bc7*yq! zwO#s1!zN=%P#u$z`@egr@|P|8=8Y_J4K|DC*xYzNn(Ck4#a`Y|qOx+1uqc$dC4pCk#X^8M?+lkuv40Y7c=M-* zw9RIh_VSY)PQfbFT&0=S)*~GB&mNYAd4%NrvdYGXM{_sm-DYsgM}W9Jt%1OVEqI}U z#PlC+toFh@^kp8nq5D9I9K}3lUw-3d$)i~A9zAAniEsIrlEg z9ul;0nd;TMSRT)Efn()9(@LWTLFqbl;pziL^M8syudr$b!*q~#9Hi1&#S27NGYE=z zx>C?b^kmsQc^`k(p_e63QeZojAvazfWZZ2y4w)wx1VvU7#>v<2J%gf~9|$~!;KCbI z=IlAOy)!L`1<(ggr-UuJzrMU4`&;kT)9VwS*3S99B$YW$s7ukm1ExH@Jt=b*nD7bk zn9rCt@5ohlC!NrrsNWw#z`NEp-%oj;tgF8J;w|>S%vRhy&DAbpbn+40`k7VWJ0zF~ zrCCFzcsan{U;m0T5e5Z3xt%`s2;gXoE#p!50u51QtC+Q@b+0Nq`@5uiVQa>f+;13;+htOdK2%hT(WG46;ScGW9n({{c)&=i&%@2o!M zy(#xs@X@j^58dNdB$d@tdkQ0OG>G3))rLO&qEXH=nvK`)U2u|Kj;0#gbgoRPv5h{ z4oUW#M#a%avO+z#K8dNK3h&^N18se&PqQj|eFwhXC&!p{||@ z5Z$dYTW#OIF0Mh9;=&VXPSXuz;=-tQ!XeJ79V9kH{&V6jx~N)%hvz)gjhLn;dS?c3 z7sdHcPHhSZT*r$G=9|H6&}>D5g%e;d7JY218oI%9ei{LngxF8mb zMPQf2vw#(tYG^$|@P#27yNR2Di*&|==V^=2t3jtE+w4ky)}S}1CcLp(TB zjJlr!ghhv&Q|Tkg|){e5KES(=SCoc?O||>rKPeepvKB;iu{`=Cx7m4(%0^u`^agjadrtC zPArqoqkGoxPCa;(n}y-N^SR18{yEZKyLx;a7^?9#4v=%RJc!Jp)GFmOf6*~sQ!FfU z(cG%98f4tU$5Xg%uygd7eIl+tKXq0@JDCOe(#(JN2+^tprYo(z5`nC)y~Rxodxg0K2MkMpHz0# zaeFNRl!bjH_O@@%TM&%FR23-fC{l3tv{i1lYC_ZuXNwpKE5pjzAnoTE0Q%*wX$!f2oJ#sCRhA5 z~C)Hy+BeW*# zt@qd=Tj`jyyf?nYk1#LlT=Uk#Wsm_`e*|hDemsX&xSJkrFzQ!^{=ZAUn+7$Y+1`VZhs2;axxi4vG~i1f zWU${56Z8*maLJG^v@-9TRfOc9B`sKp0Km~(_DlJ{iRs^?4ju{cH#s8tSMrW>LC;A2mGN(KS^BR$eUn=+F4l11q;X7=e-9G>_tnJh{({7lxFr7`Zu@U2&fza){|5cL z=KODH=hI)P?G5^;#3Fj@R}Jc0LG>TE(c9}UggC_xJ?{tZ4PXJY4q%e}M*;R9{DuEt zzV?lO{tVuoq9ggI8Us+gL2o<$f3QR0V47(O=*JSU-Lx+BYbkhOnvUdeaRLtjOp*R~ ze@AM-a5GBK7R_MInGdMstpI?Fi#yQ8)yfTQJVOX>o*{zHX#>yC(31Rp@jw9p6L00$ p+dut(Hve`o&MY;_-|+Y5ta|&+nE%K9RwH(S)n}>T<9q+H{y+E=ES&%V diff --git a/doc/LearningOutcomes.md b/doc/LearningOutcomes.md index f3f8a27bb..6a54bcf04 100644 --- a/doc/LearningOutcomes.md +++ b/doc/LearningOutcomes.md @@ -126,6 +126,10 @@ getting the `StorageFile` class involved? That is a situation where we can use * * Update the `LogicTest` to work with the `StorageStub` instead of the actual `StorageFile` object.
i.e. `Logic` injects a `StorageStub` object to replace the dependency of `Logic` on `Storage` before testing `Logic`. +* The example above uses [DIP](#apply-dependency-inversion-principle-lo-dip) as a means to achieve DI. + Note that there is another way to inject a `StorageStub` object, as shown below. + In this case we do not apply the DIP but we still achieve DI.
+ ------------------------------------------------------------------------------------------------------ diff --git a/doc/images/DependencyInjectionWithoutDIP.png b/doc/images/DependencyInjectionWithoutDIP.png new file mode 100644 index 0000000000000000000000000000000000000000..0ff2790e6d1779cf8414d74044d9411b6a34bc70 GIT binary patch literal 6303 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 Wuq#sUnxX#_03A(zM6tT{!~X$XvuGj! literal 0 HcmV?d00001 diff --git a/doc/images/LogicStroageFileDIP.png b/doc/images/LogicStroageFileDIP.png index 971895ffd06f622f79cb5c7cec009ccb5fec7ddf..682260c8c5472736a21b146c1894bd413eeaf944 100644 GIT binary patch literal 5885 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 literal 5847 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