From 0b44a73d9801f38f76057c6ec70de32ccc8bb931 Mon Sep 17 00:00:00 2001 From: Patrik Henningsson Date: Mon, 3 Sep 2012 19:08:07 +0200 Subject: [PATCH] Complete path in circular dependencies is now printed (and marked as red in image graphs). Fixes #4 --- README.md | 3 +++ examples/small.png | Bin 12728 -> 12680 bytes lib/analysis/circular.js | 39 ++++++++++++++++++++++++++++++++--- lib/graph.js | 4 ++-- lib/print.js | 17 ++++++++++----- package.json | 2 +- test/amd.js | 2 +- test/cjs.js | 2 +- test/files/amd/circular/e.js | 3 +++ test/files/amd/circular/f.js | 3 +++ test/files/amd/circular/g.js | 3 +++ 11 files changed, 65 insertions(+), 13 deletions(-) create mode 100644 test/files/amd/circular/e.js create mode 100644 test/files/amd/circular/f.js create mode 100644 test/files/amd/circular/g.js diff --git a/README.md b/README.md index c68e2c58..188655d9 100644 --- a/README.md +++ b/README.md @@ -132,6 +132,9 @@ Coming soon .. # Release Notes +## v0.1.0 (September 3, 2012) +Complete path in circular dependencies is now printed (and marked as red in image graphs). + ## v0.0.5 (August 8, 2012) Added support for CoffeeScript. Files with extension .coffee will automatically be compiled on-the-fly. diff --git a/examples/small.png b/examples/small.png index 71777849d449241b0c1575ab1d631462fe70ba6e..a3ee2a13f8dc95afaad9c3cb7f91c940235d1c97 100644 GIT binary patch literal 12680 zcmYj%1yCGK)a~K~cL>2DxO)ihK|%rv4oh&C;O_2_1s0d!4#8zvG(d273+@`6H{bui zSM`R1rE0dPdv0Gjea?;i^icsDgB$|{0%3nplvM{lw}IaWbVT4UxqELJ@PTTqtRM?| z`R^yUqc|A^q5*x7mHOh5d7R}bsiC#_a@w)ruJ{`fxjU&Q6d8{_0;5^)(CCzSBqZovi&|Q*Mi+D#cS)#m6qLYnG6*nbzE(_jC;3UfIn5t3msH^FV)kSl*l< zdD0QNItI4;(=n#?`2D11H*?n$1VZ|MSC1!Xf+XM@9|iAVvi$aE7GXS7f>$ZH3bFE8 zaA9L^OVqGM1sD1H*9M8)fp;?#ufChfIlkkKQ$}BUJ3rGG{jp%(Nv*TjQm`q0Z+a2o zYqjRWQt{pdiTh2=>)7AuVZ?u`<080{JD2C!;8VVh@8cC{53%~oI-gnX{J*XRm^+qu zS~gobHv7u{I}25zn~45+X+9p}QkK?-_1z4mUdP__qGZCOzTiR0X244Ivf+j^c`B|m z4NQrSAKb~K-QGR+{!i=*pNLy+%kg&`1u5mWvL*)+oXgzLTcWp4*^i#tCsI`vari5d z_eC9F8&dV&A2CzC=7xzNV|IwT{SHcb@NzwrkDsx=uog(weUHVMyn=+%QaAZ1SKceW zVSiLdbzB@ZBnD}qM-5&qbQbA4AN4Vx0>@g(0UR*;!ZU)vS#ae z=w*(A8&lBG-OLR1TU=c9W`{3~Y;*en2lL?27wHsx2=BeK<$Yzx5f4HRn4|w`vQ+1< zlJ4)ogt(=Hj24u`*t^$c0b|FN*BfT|^S4D{=jWP1^3jKa{7MugY;?RUna#(%%EM%z z5KEg{3^nowTRSC_kF65XfsG_srh$@cNWdvC>Bic7?}$XjxBq(H(ixua z-5>wq#(_@riJ*diFa_TcllY`v@x^k~ghhyC`k%t$=Y$YI3F|BY0>%(G5HbiqIPUJ+ z3aM7=cc`pB^&aekZY-9+`2p`T|`+^FMC8 zcA{G7Htd)wzhp6RMtE@EfWJw-7d%l4a;NZepN$cslU`$Py`Cc=t_VDVGbVySdz3PE zyda}3HkGTGxE6Rj_Jgz{;A$yP=yW)d{tBF-SRhbTvKHu)O@-O}SE49R1ubg-H3$T3 zB5y>jd3t@Ux8P_$C4=tlvl9CFUhKyoyW#X-$c76z#Y)d28s!YxD zobplk^MmYAM2(m08+P|5>3%9kM_;+egnu15^gwXd^3@1nEQiKeu= zr8yg1__46^IFOO3B7{pA*^b*nohL|)(bRo9R9oIn_*e|3_SQg;X#9bw96MhbC*kE_ z_RyEx8KO?!DF8;9)8L6Fw`+HZLq0lg>ax5<#qaw%Wkn!tDZLIW=qgrU6slZp5+41) zrfwGDtJ3nW^qKBgs1c1^CK|Yj4bRE^8PhLP zE<3u>;5FFW%Lh50C$gz;(C!_lz3!)c^Gxt2G`3<)gw{5-u7SmXtK!4WwY1(a{h8S$<`e;1qiGfH zm4Y5-n298O>zSC^WN74F_OC9dvajmrw?YN<@`gjLkXn_^ZdpB?uweXMxK^cJ-cri- z+&eywU8M;`T&WBhhIH(GBt2d*Hm1|rzJQ>d6gDDq2LVa@ev6_**X>wcl-dxhUbsR6 zk!1JAtfG&ArVCZ4+P#ljQz!oV2-{b-;z;Y*OCv^ukj8Tvb=3 zEM#4chaPZ8j8gLDUId02y;ff5SMF1htt-Xh03Fe z6q^UzvVIiA0NiBGt>&<{T8oxT<6C`Ff?9jazsji9l?`@khS_{>V*QU%{1iA$0s_S0 zJ(Ta=D$2_boxuN{8^k5uZE%3&Q&x% z-6s2$AyZyeMh!Ew?NW{6KOY5#j8FA`<5N*}8o`5FTU(Qv)Z*fo#`Whl80e-fUs^nL z%4ftcFcT9K>n+Bf=jPVPW0S|+A08f{DvZcdz~v#j+9IzLZfNUm4U%$%2cblhaJ0G} z&c;hTTPEuOxomiQWMm|sj|~K}Zb+A<^Yr%Cb8hPF6pxmoMJI^v8&2g4r|=%R_REwn zxs;~COG-}e>FF8E7W2NlFw@I{@sp2?jj82*65V(o92|Und`uAe)xZ)J4eivbMqBXR zy9FKgLkiX`Qu5eFuWRc>MVF)b+R4dDmSrhc$iemf(9jT*e`RZ{E;~uE=Clnp1x5Rd z4Ic8{!^8V%vnRycSFYS?TeuyrQmN#2TotVeg)>AnsT0e zgM)+fv8ISnXLjQH9haY<9~24|$+ACP?O0h^(P)eO#O&hg%E88#ah0K4*;rgWkj?_{ z>Y~TMco%I(shfF8fRA7MeR~M7FcKOL7Oq+cYr6{L;n9(;LsMCA0x+b%Iyg9f)vG~U zkcVd?{R4`wkzWH}N?|}KCaEFJPfS9>e{%PhkcJ>KFfdT5utBc5th`)@og_!%1OCtR zbEgi&m){bIQlHpK-d{wqH$Gddp(9JHt0%!=FJlrfkAH={Y|wFV!e~m`+n0w<-CbO; zu&@*vlH%gxnEag`9TP^(*IpvcHX48Zx|*%j)6j^I8EcvHk zc`A(MrKJ=5ww8D5hK8IFrRb=rY*G1}fB)7l%gs163)P89NIqH|1YynlbcvtcJzgKq z5u%5PdEdI$bCgAX;rKMtGVhV8-p36%ym9h#7Q~Ot#q@43EkdMWL(S7{nl|@B6ufRPUj&zA7 zKYubvNPsIfGgON9_V()P>IOz^DAE2@Pnq?{ypD{Fv~IY+J>P1y|0Rw?fs>k+rmd^H zI6ZB8*x(`R2YjQiuTM>wcpTX5%N^BNc@rK>H8nL^*^og~YkT|b6#HBF4w431P;Or| zDVKK5`eK6(lUnw#or*|EM4vG)RJ1{;F)9i}ld;xTE+St@owqQcBP(7on)p-{uRQeSbR;IKp1N>2h zI89{-h^1Sf=Z&6lrj>=9?h#)fA6wt4R%(dS_Tiy&!9)ej)Y7t~wN-?b)p|%O5#h3Y zL^}o1QFyu2_d!?pXw8L>pZ`nol-OP9{^0cVG#M7E9@_Bcrm=XA!^kUSBKV{A8{=A! zFMd~>qZ$>)>c+l4i51#E_>D?X<$1V z5fQJxC}JQ)0Pmor41HVqg@J&FEM{K?m7N))go}$SB($XDz1HEaMVC0fAE%d2c3J*a z67QGkU{Z_ou3@{!`PKfEn?6QbfC{6HjZMadXO*`lu%()BsHp6xz5?@aZEf*FZPO<< zkS-7ZCMf>=_3PLA`Z^)gMS|FDqh7T%)}QM5 zx6I6zfB`8fDba8!YUWA)| zpg>SuY!4G-$Qc@Dcc8X2(Wef3dwCtT1v_{i)?Gi9mX#?LPlbksEq;#d=z0{vM-NKj zG!U_wtpEZb^SwI`wC4sHkycoE{{9Q%;b&Hedg*jg6X!66E@$fdbv@FZIW(F?#d6I` z3@j{Bw{bczS21eb!QGj7}byXG4t5<<)GejOmPf-I~sa#+xLPF=A zKTwu0#`T!MF7uOPcMb-GUR-?7`bbJbVm|ei6{19gH}7SMs+ny71I!o`1K4BDWFSuU zMRfW{;-IOjs;VP}YCCnoM9C-S?w+1=k2k!xZ{EB?LqoG$nFxhgOjp|qzUSjhh8w9A z6D(cjP3;2{{eEl&%65VxLk3CXA9H6pxzNf|ftm~U`1$ox^z7gkDY z>hK4$*wDN@+6G4^Y3>mvmN#+EoqIypHR9UVROeh`tzx}9z(!Hq=W)gaK1)YO6A-b@L9 zs!olA*~^OCnaLbgy2SZHf((P2>7mSDf*A&YLjmFT`SWM2{udYRPItleRi^lYx;kEQ z@zsHW;>Jc2Lx|>?%6~&+dp73F0rSu%DgwYEmD50)h9rJKSyi=xz4N1RH;_abuMdG# z4{ zd9u|nh?as8KqX~mNs0`Dm7(xnjqSPSX5mQLq@*M|JaqOP4{z^ky(W80OUt!RU$s57 z5Yg`~?X9g|wzjqx)gLo1E-uQos>Ltj9fc{P`_iv)0K6he6Cq3Ity~W+9;l|GqDs+F z#6vbSHEnKf4GRx1E-s#%nV}T-nJ;23bL`nVM@B?Qn%c|H&mYj4?dvm}91af;*VEGj zkn2(9usKCXXDTFsCM_jJKJOE|nizTz1HlJLNl7QCb08m5RQiKmT=*eM4Go$*{8rZ1 zh*INqVXhLw6es<$Z;}l^GA8$QciXRZ#@aXB7MuD&lnU+b?f-dYNaD#BPXU<&0~3?7 zl3W5O924+=dWexa)w?0U5;lxQDI`(2OO)TTQDI4nKSM%7UQtWq^=^MpW!DJ`%V*-r z(uGd#CZ;s(K+0h-SbaU=H4A)deJ(AHj3DyrY?upKik6m^hli)6#ESwjSY95&okrt7 zkNLXUTjJX_zYlwiuCz_kfjt`www;nRbjhU*bfJoLdg9bnRNT-QT{{acEoFcI_{t_% zC#T4m7$5yqK0M^zKhT0t%oIO`C6Wh;B4wFAW=d*>nR#;w3X*_8^$U-Gr|mGPc1LnC zONe%iB)ElZL>Rh+1-TS!_SVsgR=(0{J4Gy6*bt~@=bcJTIx zqc9?R`rm7NTa~$qg`ZX>CFNQ(v#jOir`G(*U$hKrjNtVCTdItN=s~E#Qiba8BL2gv zgQg-`qxdAN0Hgt+)0Zzq=t2K-wszEi^Lg6y#+CorqBCoYAalWiUUfk(&Bc70vL|>( z))UH_)D{Z9-dwF5?VW@bQ)P<{xSq?I>_EH8nndg@^pk79o}C?|BGfU{jNO?(g^GOYak8^DP^)3e7^_x^ohfY&SIs zs5FlQuz`cat~;DD`BhNv{k>PH^k)r?E%dfk5=p$}R#zJ{GczeEghk!waA1d_d=_Ox zLwgNhG22CVyv~C4br|b)_=LZd9#`)j&tc(Mp@yf2%jg zbNj*Vq_$LVuOh=9v>+M@*m%U*ZA3(KLd1v?8100tFu>7pxv3i7kK*#CM)tD~dC(gpzp%3XJ|VeoUNvtZz1vF&nc zsJv9S87NG-IXpI?pAzPk@7uC?)$EiVgscW7e%yF=PuRi5i(&~3V6=rn@kuKse zNQa~}u8eVgspM?&IM;?3wtvW3*8qk0jHM;wQNz9)N|Q(TwfJn`)|%uXO1?baT?W4R zUfJ-c0|_jg{1a0`X67Fw?wjMK@J76@)DLU4n5$&$MTF=QLX8yVcE76~CgT<)++$T4 zIsTn1U6OK~-%v~+!Z@p+zvwJ*b6>lUu-rr7jw8A+<f?48s?_M>Z|4V(^ zDyR?Dx~lHD$A?(Y(9!AIE;l>vPZnCrjp1CJ&bQ0g(~21!1xIO|q9MWs2-b=+uWnS! z>k;kt2+fgb(9KPc+P~yJ><;X?f)_sDA1^4RFgDM-=N3-sP`CSUs>AovXR6;Bjfj9i z+U%p?=Zmevpoyz1t?}6lbP_JZcB?7Izgyx1?o+mk)x(Cw^y_rgE9B;{nz7$#&RA4O z{dGEWR-jUA-hG&CH@TJy#97%#MTXCmgE`vs{f`^`Ra$uh8ITdb?T%*gS&YgG+t*dk zohcvsD`t*KJ51VQb24n6|3s0|o8!8K-h3nH;u<`s&ggu&iOa|c7yAVtU4A!6I*QwI zxl1pcSs?l#Eh7W=e{v1MEVjc)By+R973L(rUMLe-mplWX^8jzRAT^aXdg0LxEC%dj zC|mH(*y?P6Hn}fbLg=<_&3B7NBelV1uIT4an%7Q{`GFdf9_pO>N+|w8J0+hCOw2np z=ie93q6Djl8`hg+jXG_&bZr_%l|Pfisr`-izHjVkK^Y?ej1x*a*4$~nRA@4L;^QQ* zjd1&0AEMK0r=tP2dzq`2c)4>C%8__m{~pAqY0J@W91*1(P!-eM++3;GL?<{|AJH3z zUH*|1yhk(@5DpJqhyLwrSg=yb$3{5{Y;jJiCV}pZ=%HkAGkE;VG8yo<&7Wc#Qww^9 z9@OZtCT=lG(M#tCv$TIGni0i#4NN|eCBMJizLSBX`7(}y`F8_Hq?vLpdXg$;j`Qyam*~hz&D?7d=o|)^ zbIJ_pAT6!826a29KxxL6uryq`b5HxJ&pK|v!E3-F&HN1_N%M3ovlU0_FU7e0G`@c| z2ll6|^*X3M5p}j7wRK<8?NN;d2)&(U3TJy9A6f!Y6oBA_wnxew_3|g}?WUYHcel5X z8BOBnNCxhY#>-Yy50AZ!)%{dOMzp$cSRz)g{Bv+%ZQ9*|N7u5nqBlJoDan3e;k}OY zd3@4vapfW3#n@|07B-p#Qz~p-oezzri$sr?5w22UWCN0IktQP!vetd% z&6oTfa}$M|(nCNCAtVuDycZA^J?S5*M=$ZT-^mX~V;#+T6W|T`)lk`4`+<^5oOG6% z5P*HM6@Prv-YkX6icZZV+Wgq=G$e+y0Yu{ta`ZQB(~X#-P*ui3;i`ZBw*g=S{bnjE zKh~MQGvYYl2sa{T3boT&gGK{GqRmOge&Ogi$r+8{GK}rk_*mm@c?q9oE*H#qZ%?gU}vX@ggMgY^P}wSsd@L{vjcCpyB!= zgSyIoQP%WZTUUfxwQMD7FCx=G71n!x&Rt=ruUD8}dNmWF1v#v?FNx626d5F0*op%RsOD-{&Az{HGtf`486u>huocW0 z9v;Sz{!N?gCBMPpDm)-07|wfdBPeyMU3ygxw&5OsL@Yx?WIEm7!KAIBB;wq zl)ERC7$X!1B&n=SS@AhdrE$AD43we^MHjl7jEk)wJmZ|#sk3PLeR5Sd*t?46e@wlh zMM{zsKMDnb0N748%Us22|MY}@%>m2^kW8heub_@3Uh)IWMmL8eahxE~rWi_qZ*+wy zz7Vfxx9BbcOi-|FU_b#WczuMv=8wLKNwP2nyeJk{?ZCVSdy&zmM@5yJouT~ha$(iCuB5Y*_gZ5hUr|oCRnxv8V`sOAbLF72=+J&pAxgkOV4@7tqGq7bvo(iC zm+FDU_9m#8NYp-OF^byU!((}dPQ%ug;IYhTH{O5V`!*q6GC(ZvH8MQa(2GS}oa#hU zZGEeGZ*;`Qc9_9QQCrp+(8`_#2M(}qaV37QHK~1I5OLB)0fF-J>M^RxfYKH&$qpQ1 zSK8d$TIrfxp16Hj&5V?HylZg`7`w^E(&&Bd8If4 ze(@rJ>cjs2{R+eB0{ciV`|^#TslgFmFLZ`^I?iRfyN>rgKFqA+4#o$s|D ze+1Cb0i5VDZ|0pr_yPIHn-3)x>{r&7C`Ug-}%`#g(pVpz!l=6d)XiJ6kY71 zeYd@g3#8-_dcR4}`}Wq$Q&KLhVbj{*Api(pY;k4^T*o6+AW7726fAVHi^_^Ffyc8& zmgqO-o2p(A35iSM`CP_7jAl=S4JHmNW;4>D19-%3gV>qO(H@h(d@IOH9y}{BbULX>j;#F=^+<) zcLnx*0pw=x!#XVh0G*lBI5m2u-*WFmplmjElf4yIIn%*3d;h&d^&Z$`BR)<;_V`<~ z{+Pe-_w%FI9Nhv2DeO7`p&e{0%eJAxLiTl@5(L8M`L7qCi8rOeLAT@gaGuRIfEthH z+jr#edA(Ea6n*@9?wpZweBE9T2H(%}x!VtwYGkeXYta#)(7sMpWB{-lAM23RA;T2< zZS~HWARr|f+A_S_b@VEN%AXEqL_tp8YBR@)(f8SpJl-_6R|}A84=Sd&JDJ_tI&+A?r;A7Y$I*wp zz2c62T^naMb4Mcn_B5y3zUsy}ty4&X8L&$T%z$oXCV;I@`i46)q%tq?txeKM%R9h#lsk%7-A!91 zY_zltH!t5LC4HxPqByrfdlHG6S=tC&3SKB zpnC|&_L1V0uh_=51G*O_%jp$Ws3Pp0XbL+Vd1GK8=OS17~NF8p*Bo^(_SjwH*cfJWnlm z`q>Es#I0=)jx9m8=d_G6z){EP-^uo5U4BxM@|0B;78=0z18m3dM0!iiTHG(9;$T62xEfeLfhEb_`9>SQ(P0` z%QPPkbwBcXEjN>TP?s&ToCh1z$_zEBs@Fs*pq{?wuH6150jdYHC@a6%5HyrC6+% zk&(H+zQ(zj4b`kviFt6cgdu`*KQa6G_@t?LVD{?;1BIL*G7UV@H}Ryap;0ik|5Kf1 zQ5pnQ(bUos62&qp)s6Y!)ChD18)c|1tbWJgLx(3pak&~CHm#Q#^EJm4#;xL^7vLi+)9Su!@ihOZr zaeO>(FuaQqDK5bIwxOays?07dEUd1^ zY0JhiZK?QCQc+cvmnRQz{|=!ihy=V~e*NH+aPt2;1zqCrzCM&dZ9oOYLx!ZL(&J(F zC}sYsc6D_H?Ejm>AE2uR1Oxz%7rnQ;hJfjk&3FJTOc7UH%+z>vU?~j!-^T!JXCQ!+ z%P}ScTV};iu3ca>A9Z>6wR}cUNT{b34^t`uc=ggRXQ5qbimzvK9-S~?zdSE;dm+}G+b1ncO$nv!M@hM!$u_n~SH z^s@Y~Bfd@@CPqJ6tN%}(b!kmcCvRJOZE`PM4qjSZ1jNx3|HIA8JB^HqI&F5k^A}yD z;qCw2ze2OfWV886fJv_OOMidAVVfI3Lx+Tix3#pmy1V;djtB{^gusn#SKAkC1+_Fa zQy`EHM`4oaP*qe45~dp)e}8}%t#=`+v!zy{{T8OesCPga3h-oMVR11rSJ&6EF){OC z&M+}Yaaf&pMNJJiR7Ji}9bgENpVoeuV<=#s8W^|W{*PBKH90ug+jFw8lvY*sf5)Q4 z*uAs?%Hymuj=aGfr4!n(O1Ja`mggkL~QcaO+(lK z_8<*<`iMFE!1x3(XSS$kT|>ilV!TybOf`uLqsE61ADo;WM47#gnjq@;J>dc6qS0V(4JFlq2Tt z)*aq>4|FrEyuY^-%!rlWnkY~R4+}e@$M0DcuKiyx5(3Ur{y(xtZvkN;l8{N{{rh7U z{GKY|Cg66n&)s)ByJN92)o;&U4n7?o=X9DpQ*b9QSo+8g&}CrVpgYX`KJ=UzSt@z( z=O<=>*~X5S$74J>jUMsi#T5#~ z49WOA!Bh0c!Qp@tHo2_vzKq^A8c~d#RWAWQhR1B&7K59T1|2IJJM-x=CZYwN$JZyz zE43u>3A`}*X<_oq)avT=%Ea`_?7SFnNrodWdJsh*CiwRT=DQQRD(3MXrtvAJ@nBin z8@HQOBF$CKPX?o~mBoM#*LQTIyK^PTR>tP~KHrHl2CPeLTU{Kae)n`=n*MiB zi++WB9T$@--xn_XR#AsSer6>MQ({^8e5CKD$o_rQKpNx6EiH`LA3um;UIXe*CGKV) zo>~g#Mt4^NwqC{cY~>UD#8fXJ{n^*-NJbjJCh}OF<6zkJ(a}U3Z3=QT5i791tC4Ki04(1Z15YN9|syp&P|DFzZz#tq(fPcjH$BAd|900}dlhviCx;YPK%eO8uXnYZVS?uT(jGUO4|Fgl{BD1F8ullB zgY$AgoneX9tmJAWOihDcwFGrBx$4^8eF>PKT2o4?fciFWM-$HEgvj0%RHF1CxJ3ljt;;#xy41E4}qu8btXjsZHZq1Lx&GPyOnL!uPaLYY7hk&bUv_w zrmgVfVZ4wkK*ycCY;rhBOg;9&lW<$8Y=1Rq%lTaVvFUjb7rjTtad4)>33Kit{r*wF z=VoQb-BQKE3-T%&yIthhsoL6($j&qh5(zW^9WCo-Tl5;|Xq-_(!0{p?8z z^dly0{sXsv8NaOTTEe!Y)i9lzmFw%LALEd$3>HTH-pe$`&O>d`Y)!H#UDOA@bjz`N z4%(2G(L+bg#EZCnOjlcde?|`6!;J1>-n(<#1<(H1W%h9v)_4?l5)h6%X%MqPV>5U0 zrWNUgjuV(~9U-V|D)wddX+j?8gF~Z>JaeAft?tYT1zO2G(w=;JDW~v12bdf;e+;km z|INJj9HvN@%kj4qWuyZtw_h7|I79Br7DawEthPp4BOLSEi57qx)>2c|iB9mj(bdrR z7}2UP$FL^Dy~kEZqcMd6f9%6D9cABQ`4tg*oT`2SvXZ+Q$ne$GR;odDm;eS;>Ar4V zjR(_=i>agjk3-uy_^hcN3@5KWO4p?#1ldGbyq_ zInY!E|67O3$a&DUv%tw+52tFEH_~!l$WQA%7WJy z1~u|Whg2?3&YcEk76<~cq*4YDsNdx*1>x#y8wmvZm*yo=KyQ))BS)pk-I;q{l>&j% zs?Lf`W8-1~A$0li)9_23a14ZtJwSjiS(SRPZ|F@oinU+EV?p=R9(xCHWbU$|Hbo12 zXl`liYNAOZz5^Z<||NMC1WWas-If+FN;}TSa`*M_WFFGIEZabC??_WxY*L#^~^qc zH>QwV0`II?Y}IxuXq8`x_@BE^i|T7S>e_eHrgE6=%RALE;^)V5K<{B!e@t@%!R18D zheQBJBb^>CdFI~}A_m!XkTIW~tHItC-R~K`vSpGJXUm=U_(3p1H!^R)E1#kqFrV-j^AaLIXIAmGLrqn5asUc+H1BN5(xHb`Di;f9b46)o%PT zo?Qx0y(@|^QEPl;q$k!_tE=0O)6lL7)y)l$?svvlaD9VBCuV~-$RZF$Z`S-?7SB3? zxS;tQVL5z9-QFAI|Mz7Fco%=)i=cWgGL!k&6jT6b?g>0e13TyK?jIRoya)x7JIhO> zl*2DA^qBp16~6|fcRes>-`V`H^~kIC!M;6abJJ#XGhg3c3k>zAcrD!%5k`3Um!|rc zH1Q9C#o1`Mmr29JhpI})s5-r#=da^-sM4NE$TWKH9=&k!kl%iv0Q~2*b8wFZnr^EL z7VaMZ!ED@4_D%o5^)9L~qE=@@4{4p4kB6Z#0!}<1d5kMDhdXB~Q0$1n>6(Y8SlUj; zu#W+K-y&o>9t#au3EZ=p!gmMV{%`ee|L+u*%SW!-k@b|tA(l1Lajd#>O+3<2R&*bg na?T^xde6iC|6k);?N}sNO#B3h;)~9cXz$}`@gl` zdc%TQ%zSaadr$1M_X$^3mc_-Qz=A*^xbkvR>fn7H{N7?BgTEARodw_x-SnNT6y)*0 zpUmdGI0%FeA}=MO>7Kfu=JAGTYWC5R=@#z`>l-@T_t;P9UWQe?Jb1|*ajR`psAW)G zeA(i*ZRfSWu&{7p?A16wEB)!M+Rp<@%(`dq+M(arBAF)y#3k^cKM+x$|zi(Dj za-mR)Ys-|?VN^8nt#I^AW>Ax9=`kbA5-RI=gVn;gJFNnNISmY$b`SYl%jdWUw z+qQ{KM8x0O#eQ;*yS+91uhFf#jC0diLR(3x*PUu(Z;yh4f|7!QNbG&GD%tSlWNJ#v zrvq>6_se`N5wht0rLWsM!+GKv9nyqcB)q(Av?q^?_K48XW<2k|O`tppMjBg5P)w~_>Utvuwz;wOaJ{a_!NE1_1VQgOu4bdPusrv>w2O|3LA4VktC3P2{$=)2 zi#$*B$ymbA;&m<&QIyMr=I?0}2^D89wwYbP&veW025e?fGQ3j<&4s`*ul(uioYoCy z^zJi!omQ5WQM)5CQI{8dZ&Oljf?mCY$r|*%L`7E?`IL1~3&R$m;;*VU$wZ=2xmsI2 z>q}_J$|f3_G=)+{&pj+gD5w5*c0QFbz(%ilLvVJ`c*|k5M-Z7kJZXybS!fp_z915> zy}q{>Q3J(6ovGO$+bepIC$h|9>old(9Sp^X-(T3!Cn-vU^BEMAd09Ag#Qh#*s)D~h z)gdj#-kbwQQC0<;wBiRXCnk*?ffcsGCMV_jQ1qv7Vy>^B(rmBk;fB<5@VA}w_Fo3E zY3H>+%UB}m{xt+R(~d6ZgM&No{VE%HpG~h3K#GaKb3JDGMGcNHR{iV0{xAmdERnq;67wp1b z{k;`-ImP)oiG_t*t_m!o1V^M{IYUSCt=Z1b-;|WyWo-IbsZzaW1J-C$?le!YM*GG3 zs|g+9x!L69NcY=|;O!?h@a&-X)E5u8CmD}tFx|I%b8ee=g18wRjD)?PK1G&pl8fD+ zF%~_|&L%o_I%kDaPQH8=6jfT*>UP}Zv5QImWNq>KdNq-Uj>3Xto)KxM_fg#3)3;F8Z*o5Z z0>pIRE;(N9&x!R35`Ua_vecj^MA)tQ&YsFG#x&dmrsE}1Uy!RA&_q~a7V`_2*kf% zWK++?H#m65+QZ*ZporenQwRx?$Yq8G|Er657?Q~bCX$k>Trr?ugGHbz)g2_mz zBFZz&>I^TFcyy?~oXQ(%Xiz|*!Y(_=0j-xuv8C=JZtPP&CYhy~bdWYJVl2H7}6qY2nqu_mU)!(U)y=&+tHI9l{qY?A(~HFW|@m*4F9eCOQqM{ zq}=cyfGw}=B`vP3CW!FMDr%@3bFlW?+ZIXdVW2A#V0Knz!w>JyNvnc&0}>O1J?cF_ zsWQ$=axR%4{Bx-nY{<-%|Ia}g3D<|)MpeWG1ArqY2GDI4`lSmy)dfoa%r3UrYr3B_ z)-c8W@3fxY@Jp``t6qmRWn&Tlh4A|N&g$y-5olll@z0;-dOBXP#RtJzNmeEiZ%S#Ndrvu3XqR@`7O8LN{88OoyfrNIE<|x=Y$cn+i^%{hW#mx5Be9ak9R}(0;$w% zWJ($7AR$~nc;!!%ACM-<$9*tr8g98l+wV#35vyE^+I} zBIGPX&BOP^j!mU)qHDL&!I|A?FHzJBcUGU%7KJeU1jG#R%M4%7QP%>k@4e$nDGQCB zIhKnmwe$1RR()+{T)-*~jrIQ?!S5bh!}ygxa4@t}m{_c_*S2ZT$-3~qsb^FGvb)Ip z^}n^zG;mnUc)dkm=pPm9C#a)M^}8`NYHNm+cYPUt6_J`4wvtgyv9YmSTwD~m- zBfAEB1zlFwE-w#^f*WDEjg2o~ebg{rdB@9qdUuV2xVsq%!k8$Nse&fLMv!89hEn*4 zhK3GzCJL{wufaWc#(zm;!@|Q7M-~>G_Gf!R%9oZF)E242l=xQb=BU`;{_!}{$6NA; zg0#$risj(l?81U+F#)FkH3`~p&7GC5$h5RH9&T=HYipYOXEakjvsF1`c^o8>*=INO z!C9HV);@fknFoGuXP2+cZ{er6tXj<`w(Ubo2fteXTR#tW?q34W@-D5neg~fU5Y5Mxf6qGg- zY|Ji|3S$>V5C4#9hJyM?+}*D<@^K&#eSM0E2{7qobqG&dv@F?0HHV2zyIgZWP=u31YYYt~Q*y9}H6Q%VOZ6E-UhJ z-`vd3%~5WD_Vx2~(9ke?_wMbxcR}iUdPW-RMr^dM$X=%#1By&zCY(PK5;6pxyFaUr z7`H+>zCGjR<)x?p+0bxvwmlXU1QnT?pPzq8>}0*;SFOLVfgqrv5wrOF!=dF`rgSRC zvo<;!k16hngzB3&5Sp0UQZ=YBeh?}hCKDrLf2!c=V4Cm?mGr7VMG%Nwjyhc7oV5}e zlBxPqj`4eFXsDo@je`R}IdLEz47P}d4V_jaF>QQmjUd4M^6S^H;o)IyQg*{e*MZSZ zjwqSai;MVP^Jm_9g@uLr`SOh1Hn4)i!rhKpM{W)UQm%u@a72Fd; z%fZY{(Lvp5TCSYO!ofj%Z3BnHTUuH+%zuA&aS^@Y!wmHH_6Fy<(vA3ja&FN0Q%Y5(ls;`+2OC&FP6#XvQ!wJnYmsIy)e~Ffm$NI1P8MjH`RgF9sc=N zR8-WgB}R%tt#Cp~Nkz}vhcH<3eKf4Gp&|XIzPAEwQ001+PJgL(cNH!kL+4Gc7Nt)=jf=KHzs->1IqgOdG$Jpp6&faGFZ&c zPAOX24Cl?ks5==4ynuiJ0#tZ>eDd}E#>U3rpmMC-_&*Vasi=|?_7{0Q4eZHK`^boh zgMalrudDy~Ur$(bl6_rUGlxdH>`j+9G&CG9sxriCYH6LH>wP;>*Vku;MxLIW$k03! z780VlnW%yqsH=ZZNfA!Z$L2OUMcQp$J)SJmdrL=fak%I}Qt4E0NJ>iTyii4xQ&sh& z*BlEqFcvX6GxL#`;@tCocvw|JB0#$kO=9?B0L$bYRvZ`;qvGULA(Jit?w!}<+}9i_ z8JW@TGZvi^-OpMuSVn0n@Q%WQ0*YlD0V?H}#86^l^A8`GiLrv(2*}Cx3=Qv!Jc{@I zuU(oH6FJ{6GDpJ1jJ1WijNaf84Hi7x8WX@&qKCXXa>DyvcL5 z4pS2oNjL=~R_*QWIOstNITQ)@S8W?8W*C8)dX*nQc>k;WvhQCu*b^n?Cf;E zuHM?;FD@)3itK_Kxg0Kt0xJ&>#Y4j601@KGp%4C&?7IB|#{n5oIk#==55 zWUHGurlqBYhK{cPS?lfFw;CE6?gCAAiQP{&bg;v|el@JJQj?bMDmUx7xxHP+q$kEA z$LV%wLSb5Sss{mES!vO1jE#*g&G0nMzHtK1g-Aw2m8i5FiVhF2_dMU3skAJvBj&^j zml~a(7TEAE2_2u9_*gv)mM^k|85lrC^+S$v^(!82B1|?^ih)h9f{~Mx^Vzd!;^MR| zZ-}v^8407rk6Wd{VymhW1ei!j^#A+`U@DZ5(6sWEJ~*qbinw*zF`7y+OZBBm6bTvG z@2TCszkiFI_>&YvdR9@8ky#rG>gp2POx(S^45Wi5+U|r1y~X?nlKIes-akIvM@2rvbR`9 z$Fi;sw@KFT-+v}1;C<_0{XTsvkBPyL>#fQnvTPV7n67jU<_7(%;abqN6AK z{b=YmLeSdqo{3r2X zdpp0Rq~@~%XwGug^KFlcu}^m&83-`7ON~VZ1l*Te1D^gxZw~;z{)VpXAZ0T9U$d7E z9YI}Po$hD2A^YX=@lW-9&U^~WL>LkT5*Qd5&t@<=JnVRN^!~IDT|aVZX$cg$E1AzZ z>iOD*FBB6^MznGnsNYR;qA{L<4Z_L9OYA>a8$vL-R}a?u(PtV1~bIPLlkVa+ves{WU|}%$vM^Z^=GH1 zNP(}6Xn}z87F!(sMXu}d>0Tj6J%P<&V}0G_?&|n>^KBG)xKx%V^Rk?hH*vEuM_jMu z+qcK=*vdy!Q&Vm(E_w~w*eo2sVE_(*br>+=?A8dky90(eI5?O;R1*^uf0JX3gw}kO zG1Jpa%8|7(S(iR5Y;3#*7zZ?{JsRNy%wb(CZEX^DV^)fv-P~A+BV@_j z)iXuNG%@&3o`i>mnQ)Tjs?cnpi`=d00f^Dl)#c&oxq$GaHHLpUlDwK2&xjiMU{FXn zcSRp7hlGSQGc$wPx#Cpc+uNJlHTC`#D+oGGgsY27z9zGupP#|euJd_|bdEYHn?COz zb>P5&M?_@(~Q!eYI(6@px@@a|nH4Dm27 z-oEU}3bh#*eo2gl96(2mRm?VEnof%VRWP~Y8y%*8jcrnPwwaZcm4bqTi_7^)wk%sg z78buDd&1D>Gr_3AzCN#b3u-DVndYXvyv?>C3}0X0$w>>Y8so)2#Ww_o73NQZCAmb; z=`abyrNDP!|3E-jR6qCtX4cp?MHCZ1|I}o`@v388W+t6LG~w638nSwX;pT&#PnUEE!-;8W#rNJ~1`1FO?#)z=sPYo7=EDVj)2;QKjq8PkgvPD;b~FMv+e+2c z)EEi3dlO)oAW#EA2&t-_vx4Qavtv8atHJjet=PCCxq7_+J}f#O{0|EaFVxLx<@j2X zJ4t~-J&dtp`!qdWIY^>(qQF3(LP&@=eqpk$jb23LPS0rY4MD1qOMxO&W$enGB9q2T z;t%HLnJgVu&7{=SxDfvlE2`_Q*Jv@PCd1d7Se1n+TRVm{Yk9O}oMchdK|*P5!_#Ah zdk5Q;l2*Ie>*w~M*VHR6Dr74xc~$QRGuG47 z)!|ognfUVMOWs2yKN$`kCLS&>{Kt>!Fg+v)h$fJ5Ys!w&6B1g(&?#*a4`I}Hu*W@pzaiVeqn8|$k{(mmZLspjZ0 zzoW{^Dy0)q5E79I#L6+&*4Bgo&SR9$sLMFcE%>40MOFSesO`Pc4-k^?6@Sv><; zBONy*o!WxN+MjuDN8yW%PeX}@^N}eAf+UEzwb8e;8!rojXBO^34w49tAOilB0VilF4A3uI% z_}=6f7vtKo0Y;2i#6I|sm-W>bDWP< zk6)Y$qGumh6mS(6T*z4rT;<`ep0ETfrtnzqe}8V!+#Ey_5m=}bV`-5WbAw8YB0vQ| z-&I{*7vK!bboXoo^P*`V@gbiTGsLK`9%CLrsIRP;rckJc#{T%xX~L5Ib-`Q#dk4HO*PJYhskDV zEJ4e4t^>5+<7)A6x4F4}@9xhy010FUeJ@6U8XT$uOFUBm%tqy=*zooZz;ghHuQ^?7 z%qh>|X)?R?#j}xe7)$XBvwmGYyZlq;At~|E;1&_t7p*zzO6S!1U7C@d)T8AoA@SB9 zA&orG%?}dqSs3uiF$2GUHx_hmxNg6$0ZqRdcbW_W9sTaE{o?L^lW2Qg+&g1;lQbj( zJrWZif3e&QBUVo8oj+01nbDp3{G>|-99t)>iHuj zBSB}pSVjK$T&gQS2035}D>lLDt-@IMy3IY?7SRVJI!tzhnrFg=hl`I5Ys>EqjFLa} z>&AXka5)QOplg+xI|eXfZ=snIKFJczxN=-ShF)88%PJHo^G2Nhi2gJ3^69Im4aK{o z8=bl;7w+WNB4sg%Ac*jGxEFN9eT~}qF3*<4vJmu z*Shg3XREoJOD4U^eoPm!u;k3S2K(6B9$og_Zy)n9%=7b|pnVEN*r?$V$> zLDc_{^Ynkzo}b?%U24HM|1Q%E;kgEv-4|9*j?T}0Zue^k1pTc^m`(*l_9?&n42yRO zDXV*n;?D6at|aO7ICq`!SC(8f)Va6QOTWa?t-VmexOk?Ca9WQr0{qvt_vZ&JfL#+f zV9~mDP0vqDo)1aWeftw|?W*fIqEKhdAOWds;pLi3%|HvxBzm#qdT{kZQN5z_reu@6 zWRw203H%LRnur?0ZY~dyti(cT50eHC^x7(-v%xn1THZ%QS`;sL%RJiHM9uM&)jIfd zNHtL|*77&WdqALvt0Y})R~i;d>p*odwLO*)|Kneg4ue`OG5KKn z{E%sRhosrlXqH$xfO2B<;o&H4T?_5^>sz#y5Yxe>TbzCu7 z;PmKcMPGu@vhj1DVO@<<%`YL{trQkyx%x?A@Fe_Cu1<7Mho<rr6mgl zTi7;qM4P)5sec%s%pH&5)1DRvq4Z2lH2yL_v!-1Q?I3At@KCU@7`bur3-MZ3WJl0L zpLrG-FvDN-^FN#HVfo&(O-98!7OmOsk}7p9_+mq83J>RoT8?!1;}M#toVb(pOHYn(wK zKYsi}g|zlzFEFX>Qy1gm{oz}Gf`h|L5e14?n6!DEe6p|mJ8EUuWn_q>>^y+Wl>Oy2 zqqB>LioUjot6Yfhy_!HkME}OJo;Oi|1o0Qn$VDI$q$Jrz6&Paav{}Yb(PAiv!nK__ z_mlLF&1(eDaJTbgrY=1DO9536fpC(=3^=|Imi&nV0c|m^4KdSL?^!lI0PRfexXo24 zLCWUtq(L|CBC7PW}jJ6!6`ttkduLEsm%IyHYrP+OFhj|SXw$= zW2X-j|9W2hhJYAD`tKV5GWIb63G>1t1AZOHNm%Z?v)=q`Py_~^Ufzy%}Qy06ffSt|1@=qv#`*H*$Du= zo|6+dazOeoQ>BwBF4v^&d)A9?X?TgT$X>_ttpURFVAb&-lZp((00udf&Aa;785H>x z2?GP;r)rq?b-Ygwd>6&%_v_*IF6Lp(tLg`_TZK?d7|!KxPBFk!XVrM;}|T6{^y7ulT8Ee$tuRw?X6@9{EJ!ma#V z;Al3@CG5tegSE}|rz`?mZP-!WKngsM@k^E2D1xc0j{>&gDJCy>X~g~6++xEE~A~}lHZVb%8Lqvk-a?@+6h=1X0pO6EW z03rb(#MF$G9(tCOU|f+e1GDF~p1=74GWwD-a~Xpz_x1+`(}9MZRZngp6^VM`SsLwE zM~43=o%X>lfN(pM-i%(J2@)MUJA0TkFNQeAhx3M<=Y>!Y&ToH;X_yZxB-b5aeqPaJ^W^ah^X?Y zpZweb0mTePlIwm>7%uF(7Zz4FBGk)^{E)Y;0rtX=kXpHY<{ynPc__d{?PWe4_+wec z2%gR5gIXYTgR{KG*8y!vpqI#RM6zSymyM}IQf zQc>V!cY@6Eqme}XuOvsz?QXmkOs~3sil~GP0B2Av6F6LQX-nl(Ymw%+1LBArdMIHZ zEYGQ@VN`^HTgOwOMTYgWede zdQ1P!p_P&FHO4JzksP=E;#XB{%*!-#Ld9HvC zU+KNtze6csg4mg9e=U}ZYvfrURBxzhh{3ssG`{Vzr7j7zu4No#KBryEL)sErh~*$5E&@Pc%kB)(*x#5Ha2}&*rg;S zn_N0UA~Q?kS;b`K2_ka$Q@8LlX{;^2XMLj!z(!UwH#s_<8J0{Hb(c z6fSzRcA@>pkE(@Q1J>)`N@C@ZeQ&m3q~X;+yMs#PjR6?z4V17GCr0KpIvh-hv0_N# zKAo!*0rwWN&_s~Lrp7B&Ow*@Na*=J(v&+p?^LWT8ygcFaq6G&FpvV4R<619cFgJs1 zmPStbrDGX1Ee3Q1nQUuGQqt0Pi!IcaUMxpLq8&pW)5vUWY)VQ>gyE=m^g~h%u|MGO z8QayHO)`Ts76=4z!*q21QWafi3~p|2AWpxq)R`ofsUhOwaPp{be~45ZQoj^{PJDdy z+AKt?YPRF0C@3g^0DUd+oGz{xP)pNG5zyB=IuJ-iWTcUyp#asKH7hj%fe9}KpuvZs zCxNDozFN$1{o+X(JZVvIEoS0~Hi%fdF3m#XKFCKHSmf<7f6A~zKLRwqjXlA`*B!nyEOjyf4 zGNboThr+;mvoJHOCK0OUYXS&jtI{U}PC$mxCG>fS&?NLp3)riw0=-gI8jVmilS`({ z{;ohhpO*snSp1!kVov#_8D8LX)MnK??Tk<+s^cw6)k|Gl^ z7GM`abw51Bmr(uq@fC78XMgA5oxYI~&~2j>Zz81_@(T)f4i9DNpdm@qNwBBy{N7j2 z*xTDrR}>b%xBR~g!bOJjQx(&O80aqx3&uJ+7&gQ>@5;py*46rO1+-mBR#XYo^15HY zP+JJd%sL+adkRG+qHw7r7u+Mj=9ickQo{ReO{Lp`kK59!todClbbyxqgM#Wb1WicAjk z4O%(sB*es;+S;a;ICfaKr@OP&Hu8+$dyQj~L0aO{4DlLW$@RiQMRs$$1pMi{1oo)6 ztRe7n#AWf*3%SslDXMfn#vnQ?UW#&_keZPD>vJF};?sz@@0iUpuNFQDYExBJ{g#p8 zP%efe0Ct4}CxqyQ@_#D!L`A&v`-~eOaD;}2^ZH*nmqMpM?(Hea7(nZhjiCW6ui~0t z{W+{_^|-@6Yif6HcGmat-i@WEwW|#3x(y-;%n6K*jb&7glXXwY_IwO#8(v(@h>s7^ z@~%|^`v8Ib)+_)*JkIT~I%37KE;N5pCR+`ZAz{~|#>P1zLaw4H>f8T0qwDR(zO3xb z@mHWM02cT6gtd)AXBqRwKDbMXQKKsm(L&QHJMPYxuYl&KRb-kQWp?SyM-i2$k}+vr zovY@Gv&w=Qh#n-t6gS`OMM@Jzrrq&yQJZe==y)_;ZU(sTY}J>!$0VUW&k2={R+oH5puZiFI&3k!!D_1P(H#K{LZjNg9m7F&P`6~t{^4qNY zyneuT5|N3FB*-yY83@_@rL^v&{Gp|!^mp=ug^ihyjf2i&8E8VyPpRFJU#qmbK6U!? zP?G*&pZ-w7h*hpMulCKrm%ngLe`6k_dfFg?&D75~DvWfwOaeTnWKb^sJoK7KUmDvvK_|!^qK7xKmRH!op;tn{({&bwzaB`jT z+merdKKu9UtS^L^xsltO9%5T=)9Lr8c4^VRc>K&l>X>{gFXG#KdvwvdyiZ$_Rr%Yh z4@rtJ=8*k?&2MXqwq-%itW~Q3rQ-q6)DzL22KS*Yh&y&u6+fP&X4AjHA++4gm*~=0 znZ;-w=$VzjVU`cu;8J`JgR-?4o0TTz{5kiZv*CjDw}3loN+rqp4K?SkuD_t%R z;Abaprw(41dhBycDgAx9?t1XJGfw;7h|lJ?+SDr=#jxPQPq^sTzAkH=^GzOI{4DRI zBy+#}_TPAo*qP!UKU=O|{O&*R7nA;kxSl0Dd=m z*#-#2M5x`1u@K<~1{vkYf|MTnOnIOV3jTZyW8n)kA#naL*yDHBH}8UPNAx~7BSZZ8 z#bKMYJKK9JSI2E>5>H#oWInHPRu`w0g}BE`43xS=bhr5$nFuuHW%^FX<wSP2veWye%xJ zK7J)HojK&yB@BR3e*NB(LGz~PR5hE!U>SOa@Jk;Q5AH!DA&a?2_X23K9!;q<^=_Mc zYT)C}KTcvk-GrPJ%U*je?cUuH=*hppTo|SGI9mPs&_KRbOXKNTS1dWgP#R1f+A4I%Hzlygppjmbdi-=H%1P$X(oGlRJ!>1xoNF1^m*An@wPd_+h_Kl7T14HM$XT1 zz_(xOcjftPR z2*_X4=Uoj3KB0SDV;+|}9P@jkWQ6-Mz&TNoB#u^tgq>&ouu~}fYoN|Z5{|c_g(soW z$_Bh(Vv#KDE!~Q^XvMDfB7I{b+0v7`OTPtIuO-KoWZnNpnNd*#8e4P|#6O=^Unb0f z&c7sO%&+nxee8i!dkhUlw@gf|bhou772lReP26|6vye@k_SIcGPb(0Q$Z7(Hht8Mg zhwRUO+55VYhf7Ks3_h+L^gRlls$AlHe5`bfYvv#`(e+a^lW! zBc*H}U5NAl+Y$f4bn7IE<9bK3N`8d8CyHqC)p1)h??Mnxb<@Kl0(UpgKt?Tb%QLor z_;@~e?H;&4SiohA<_2rowz!M%T%^n>`gFP8LH)E{LXGEbi$Ke5$-$p44DpirYKSo0 z0(*Mw;U`f-wTX}S2@8*i6#F_FpU$X*MOuT=bDdl2cq3F9I zCJJ+>EpJpQ3l(UW6`C0mAIA<2jc|C$PSxyteKqg_j-H!=Y-T&10i#6@%#>qJC7|S` zXX5-EfyjR+t6~XDTaf_6i<*yMdJ&Rx_=l*>1NnuHN=YLJZD`MS=-Gq??qvxax)#4~ z8B^%Ojb1ce4hwBF= 0) { + cyclic = true; + } + }); + return cyclic; + } + }; }; \ No newline at end of file diff --git a/lib/graph.js b/lib/graph.js index 3b09be36..6da48df9 100644 --- a/lib/graph.js +++ b/lib/graph.js @@ -57,7 +57,7 @@ module.exports.image = function (modules, opts, callback) { if (opts.colors && modules[id]) { if (!modules[id].length) { noDependencyNode(nodes[id], colors.noDependencies); - } else if (circular[id]) { + } else if (circular.isCyclic(id)) { nodeColor(nodes[id], (colors.circular || '#ff6c60')); } } @@ -97,7 +97,7 @@ module.exports.image = function (modules, opts, callback) { */ module.exports.dot = function (modules) { var nodes = {}; - + checkGraphvizInstalled(); Object.keys(modules).forEach(function (id) { diff --git a/lib/print.js b/lib/print.js index bbb6e3ad..80c5744e 100644 --- a/lib/print.js +++ b/lib/print.js @@ -64,16 +64,23 @@ module.exports.summary = function (modules, opts) { * @param {Object} circular * @param {Object} opts */ -module.exports.circular = function (modules, opts) { +module.exports.circular = function (circular, opts) { + var arr = circular.getArray(); if (opts.output === 'json') { - return process.stdout.write(toJSON(modules)); + return process.stdout.write(toJSON(arr)); } - if (!Object.keys(modules).length) { + if (!arr.length) { console.log(c('No circular references found', 'green', opts.colors)); } else { - Object.keys(modules).forEach(function (id) { - console.log(c(id, 'grey', opts.colors) + c(' -> ', 'cyan', opts.colors) + c(modules[id], 'grey', opts.colors)); + arr.forEach(function (path, idx) { + path.forEach(function (module, idx) { + if (idx) { + process.stdout.write(c(' -> ', 'cyan', opts.colors)); + } + process.stdout.write(c(module, 'grey', opts.colors)); + }); + process.stdout.write('\n'); }); } }; diff --git a/package.json b/package.json index 95f789dd..794ab0af 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "madge", - "version": "0.0.5", + "version": "0.1.0", "author": "Patrik Henningsson ", "repository": "git://github.com/pahen/node-madge", "homepage" : "https://github.com/pahen/node-madge", diff --git a/test/amd.js b/test/amd.js index f9e50b36..7e9365f9 100644 --- a/test/amd.js +++ b/test/amd.js @@ -32,7 +32,7 @@ describe('module format (AMD)', function () { }); it('should find circular dependencies', function () { - madge([__dirname + '/files/amd/circular'], {format: 'amd'}).circular().should.eql({ c: 'a' }); + madge([__dirname + '/files/amd/circular'], {format: 'amd'}).circular().getArray().should.eql([ ['a', 'c'], ['e', 'f', 'g'] ]); }); it('should find modules that depends on another', function () { diff --git a/test/cjs.js b/test/cjs.js index ab74b6bd..e39c5764 100644 --- a/test/cjs.js +++ b/test/cjs.js @@ -38,7 +38,7 @@ describe('module format (CommonJS)', function () { }); it('should find circular dependencies', function () { - madge([__dirname + '/files/cjs/circular']).circular().should.eql({ 'c': 'a' }); + madge([__dirname + '/files/cjs/circular']).circular().getArray().should.eql([ ['a', 'b', 'c'] ]); }); it('should compile coffeescript on-the-fly', function () { diff --git a/test/files/amd/circular/e.js b/test/files/amd/circular/e.js new file mode 100644 index 00000000..1c5639ba --- /dev/null +++ b/test/files/amd/circular/e.js @@ -0,0 +1,3 @@ +define(['f'], function (F) { + return 'E'; +}); \ No newline at end of file diff --git a/test/files/amd/circular/f.js b/test/files/amd/circular/f.js new file mode 100644 index 00000000..8b0b9464 --- /dev/null +++ b/test/files/amd/circular/f.js @@ -0,0 +1,3 @@ +define(['g'], function (G) { + return 'F'; +}); \ No newline at end of file diff --git a/test/files/amd/circular/g.js b/test/files/amd/circular/g.js new file mode 100644 index 00000000..468ec94a --- /dev/null +++ b/test/files/amd/circular/g.js @@ -0,0 +1,3 @@ +define(['e'], function (E) { + return 'G'; +}); \ No newline at end of file