From d4749060f42f2ccaf9ca6ab0f2975cc22dcfb523 Mon Sep 17 00:00:00 2001 From: zedshaw Date: Sun, 12 Mar 2006 07:30:25 +0000 Subject: [PATCH] Finalizes the new look for the config tool and makes it functional for 0.3.10. git-svn-id: svn+ssh://rubyforge.org/var/svn/mongrel/trunk@100 19e92222-5c0b-0410-8929-a290d50e31e9 --- bin/mongrel_rails | 8 +- doc/site/src/default.template | 14 ++ doc/site/src/docs/gem_plugin.page | 51 ++++++ doc/site/src/faq.page | 2 +- doc/site/src/images/config_tool_snap.png | Bin 0 -> 38023 bytes doc/site/src/news.page | 51 ++++++ lib/mongrel/rails.rb | 4 +- projects/gem_plugin/lib/gem_plugin.rb | 1 - projects/mongrel_config/Rakefile | 2 +- .../mongrel_config/lib/mongrel_config/init.rb | 154 +++++++++++----- .../resources/images/0170_bubble.png | Bin 0 -> 130 bytes .../resources/images/0171_new_page.png | Bin 0 -> 135 bytes .../resources/images/bottom.gif | Bin 0 -> 3031 bytes .../resources/images/bottom_orig.gif | Bin 0 -> 4365 bytes .../resources/images/middle.jpg | Bin 0 -> 624 bytes .../mongrel_config/resources/images/top.jpg | Bin 0 -> 490 bytes .../resources/images/topbar.jpg | Bin 0 -> 16031 bytes projects/mongrel_config/resources/index.html | 71 ++++++++ projects/mongrel_config/resources/style.css | 165 ++++++++++++++++++ projects/mongrel_status/Rakefile | 2 +- 20 files changed, 475 insertions(+), 50 deletions(-) create mode 100644 doc/site/src/images/config_tool_snap.png create mode 100644 projects/mongrel_config/resources/images/0170_bubble.png create mode 100644 projects/mongrel_config/resources/images/0171_new_page.png create mode 100644 projects/mongrel_config/resources/images/bottom.gif create mode 100644 projects/mongrel_config/resources/images/bottom_orig.gif create mode 100644 projects/mongrel_config/resources/images/middle.jpg create mode 100644 projects/mongrel_config/resources/images/top.jpg create mode 100644 projects/mongrel_config/resources/images/topbar.jpg create mode 100644 projects/mongrel_config/resources/index.html create mode 100644 projects/mongrel_config/resources/style.css diff --git a/bin/mongrel_rails b/bin/mongrel_rails index eb04b864..0b48b1f6 100644 --- a/bin/mongrel_rails +++ b/bin/mongrel_rails @@ -72,7 +72,7 @@ class Start < GemPlugin::Plugin "/commands" def configure_rails # need this later for safe reloading - @orig_dollar_quote = $".clone + $orig_dollar_quote = $".clone ENV['RAILS_ENV'] = @environment require 'config/environment' @@ -97,6 +97,7 @@ class Start < GemPlugin::Plugin "/commands" # graceful shutdown trap("TERM") { server.stop + File.unlink @pid_file if File.exist?(@pid_file) } # rails reload @@ -109,6 +110,7 @@ class Start < GemPlugin::Plugin "/commands" # restart trap("USR2") { server.stop + File.unlink @pid_file if File.exist?(@pid_file) @restart = true } end @@ -179,8 +181,6 @@ class Stop < GemPlugin::Plugin "/commands" else send_signal("TERM", @pid_file) end - - File.unlink(@pid_file) end end @@ -214,8 +214,6 @@ class Restart < GemPlugin::Plugin "/commands" else send_signal("USR2", @pid_file) end - - File.unlink(@pid_file) end end diff --git a/doc/site/src/default.template b/doc/site/src/default.template index 37fbbcee..9ce3f061 100644 --- a/doc/site/src/default.template +++ b/doc/site/src/default.template @@ -46,6 +46,20 @@

NEWS

+
Mar-12-2006
+
+
Mongrel 0.3.10 -- Big Release Day
+ +

I normally do lots of little releases rather than large big ones, but this + release involved lots of little touches all over the entire code base. It + now has a ton of features and should have the best Rails support yet. It's + even got GemPlugins to a leve that anyone can use it. Read the + news for the full scoop. +

+ Download + more

+
+
Mar-06-2006
Mongrel 0.3.9 -- Gem Based Plugins
diff --git a/doc/site/src/docs/gem_plugin.page b/doc/site/src/docs/gem_plugin.page index 346f7b72..40586bf0 100644 --- a/doc/site/src/docs/gem_plugin.page +++ b/doc/site/src/docs/gem_plugin.page @@ -17,6 +17,57 @@ new commands. such as "mongrel_rails dostuff". Handlers and Filters are on their way. +h2. Why Plugins for Mongrel? + +If you've ever used other systems that have plugins you'll find there are +several painful parts to writing your own plugin: + +* You don't have their developer tools so it takes forever to get started. +* You don't know how to structure the project or even where to start. +* Once you get it built you have to figure out how to register and install it. +* When you want to update it you have to somehow get the update out to users. +* You have to manage dependencies between your plugin and other plugins. +* Including and using your own resources (images, html files, etc.) or config files + is really painful. Not sure why this is but it's really annoying. + +Most people solve many of the problems by the "sourdough method". They +take a plugin that currently works, copy it, and base their plugin +on the prototype. This works great until you want to do something +original or until you find out the original author did something wrong. + +GemPlugin solves this problem by relying on the regular RubyGems +package management system to give you: + +* A simple way to package, distribute, manage, and update your Mongrel plugins. +* Dynamic loading based on the gem dependencies and not on specific configurations. +* Segregated extensions for Mongrel in case you want a different license than LGPL. +* All the capabilities of RubyGems. GemPlugin doesn't mess with them at all. +* A little generator that starts your project off right similar to how Rails generators work. +* The ability to package resources (images, configs, etc.) with your gem and then load them + dynamically no matter where the gem eventually gets installed. + +In the end GemPlugins are just RubyGems that get loaded a special way +so they are activated right away. The only extra thing is a bit of +"magic" that puts plugins into a nice little namespace outside of +the usual Ruby module and class hierarchy. + +The advantage for Mongrel is that people can write their own +plugins and distribute them easily without anything more complex +than what all Ruby developers already have: RubyGems. + +h2. How They Work + +Mongrel plugins (a.k.a. GemPlugins) are really very simple. Basically +when you use the GemPlugin API you tell it what kind of dependencies +will trigger a gem to be loaded. GemPlugin then goes through all of +the installed gems and loads any that meet the dependency description. +Then your plugin just registers itself in the right "plugin category" +and everything starts working. The user of your plugin won't have to +do too much unless you want to give them additional configuration. + +The best way to understand this is to actually build a plugin +and watch it work. + h2. Your First Plugin diff --git a/doc/site/src/faq.page b/doc/site/src/faq.page index 1c55d509..9bcab425 100644 --- a/doc/site/src/faq.page +++ b/doc/site/src/faq.page @@ -83,7 +83,7 @@ h3. Q: How did you make this site? The site was actually incredibly easy to create. I simply went to "OSWD":http://openwebdesign.org/ and found a design that fit what I wanted for the site. I then went to "Flickr":http://flickr.com/ and found pictures of various animals that were licensed under the -"Creative Commons":http://openwebdesign.org/ license. Once I chopped the images up, worked them +"Creative Commons":http://creativecommons.org/ license. Once I chopped the images up, worked them into the design structure, and wrote an initial set of content I was done. The tool I use to generate the site is called "webgen":http://webgen.rubyforge.org/ which diff --git a/doc/site/src/images/config_tool_snap.png b/doc/site/src/images/config_tool_snap.png new file mode 100644 index 0000000000000000000000000000000000000000..05e1b143b6c14dd2163030c34a4aac5e722f6301 GIT binary patch literal 38023 zcmd?QgIqg`c96INF(+!ItX3)ZElUH7+!X-GLt7gC6|7nyu z82kfO>~L3t<&nr)AJ*N@4PKeRX|pVlEg1377rsVeb~E9cJZIAt&Hb)4VyHsTr0 zeF!u0<3wv+5`24)L~Z{bJUOt$@@MAHZxTw3pI7$qKcuc5yP9mpcH9`*@=t%fVRp*g zwZQ((ve=R<8iO~PyGnx2pEQ->tK`E$S?o0CyYpGsm|?MQn!TcEq?7%gT`W)8ouZ2M z%LWCco6*818w!eJZ{hnhr3<5%+d5O03*%&$G&Ycq`%P^7IR%6oGZOr`K<1OU{ic(F3OBY>$l`#HP-x*Iz#j-@^zEpu@Mh z&+zS=oP^h0-$~p8jbyaBz=NkSw&E%bVE^}Pq$(pnfArs{P9!e#KHc3dLJA=TY7N`TRQn@3s1IN*;lKFL?qG=l^PX$)AiMm;U80{B-;d zXt8W}bH@Px(S!(0{&m6O-NN6B+8iZIx|HBP9@?k<1op~QAK#c#JuNNyb@vhnbRLXi zGY;i4N%?*zK{JF>T-W>ay`YX28#JhC-;Gb8i|`kwvzaJ)Wb!hs>=$EXmxWv;yXfEZ zJlULadP;FxiUmx_r0F8GUEFLH?Sq)dQz_A@%BJl26BHRExtg65zv%`F&lwnj0Z{*` zRS7iL34+kw6UbMmi+saC7{ujou9G0u`pUH=EQ4L1EvKgw#M2Y0xylVELHlb(|DpUF-B};Mv0YbXu-9k<<U6d=?GBea@>b0+C_*tmzs?%jbQNkaESf<2V^XIN zS3RInzuB(%Mvz2;uH;%Mn0cH)yF*AQNhxnEcg#k< z)s%~jEvCHJ0_v_sf`;}}rr32P;?1*%{u1|Hf5_Fyt#u!T!1BVsDXK4p!A+=AbEM(0 z5b1Pq&rMfcT->iEesA$T-P}=NLVuP_1+0;WEd`Ouw*0vs_lag8e9+;{*7Fs?9bIig z^>ntxRhDEL_N#B3nV|AJc;PPvl08h|aC*Arr*vhSMUmYMsyXV6k#P!)VBnQXj3yzl zFHRl9Mjif$oUTr3g-ZgkJ~s~_A#)y*lArZCVtP;(Wy8bDX}eQ zc8$(OfpGT0;z3Cm{x1Be0Q0Z0@p=+OtSP2gl*Q3I?{I@_;B(=ajwI4oz6yjqMru>k zS=@RMf}GGR0sgGCgeh9Pqp_if8)KsQ?~ntSQm+GygCh2Eg7$`^ z{IyMzNEUHZKnq>l{*yRQ=}}ywNBBs%*Dbixu`3(F3p)Fer!H`9tkXnbx33ZeU*&(c z_`3$Jcx2$P!N2R5R@0=>i^1uGHrC$FJ@7>A2S&cmAGBqzgu!e1$wYL{S%KavWTD>* zrURd)WZ{d{BLXCFAf{&AaWOHyJ;6K_6`r1R21&cWaPXMQbhPwm=N>yhd+F!(d|buQ zei5zY(FGFC_4{fh6Y_!NFV^>#JQxfw+6~x-jgRjqE#n^()XB``mB%bh!h) zz3;D4td#tOl7HOi)?U1Ob+a{AOLy;;!0+>sl>-QlU^CSC3GFz+xyCEB4%m4MUPAyb zcAV(Up~M9)~?WmKf7aW=hf3!d6* z5O7+PqjTAt5m;Kd<(Mx?ACTun`D`-KZCy8G*GWn$!eDa-Is}`)j<9~V2ukFCz7Z1b z>Ybiu%!=8bPpW+P+ExzkhZ?K4OfE?=taaZT@;sW>5X_3K^5QEn^jShpFeM8ylv}>_ zzFF4hKM7(=yE!BsxPxxD?u04%=K`g3dl93Przqy~%&#v##4^QRxlj0;k?QcIsCP(3 zMWAKha77gpv&h<7%z;FmVmEsx4b$F}otu@8Do^L+6*n($ zcYT;{#^(VVCxtYhg)BZSIPA%a39ak5Av-I5nwoqJ zzkba!kB#~+sZlI$KJiB0E)K#vznzCe~zM84Pdl?fyrb=Mo$THdQX1R`)y-dz`UhD9vF_E+J&2-fOyO1t9{wqj``t$Ei z$bHYF_tGJ>X6^t7 zx=a{EYcnBR@Yv_*`x`H|Hc-eGivbcbw-pY1#5ww-Ktxv~pGT%JPj%QAqsf))K9NFPIS;8I@2DnmEeddds7em}glnk}UJC_u(aYu50%u0G-CEeefQTf-5FN`4m&Oow<$*0P#i^6l-_x^D z-bILv#l=jN5HP-$e>CrI_^%javq=ru6LB?j>FP;!f)0G^%4^@#NU2)TOecaly4mgWUkapei+Hw>$6kckxV{;j~LRjF|fnLuX(d3_-fv4e`iSSay{?i zl+0AFN)A)o$aJX29NL;&6E-meZOtAx>wUOwQta-QOMRL0x7T~c?hB7){itG!xl#ql z2;y)9b_-N}930kyhyrSLFMT>^LT1c6ul6PVQ;Y=0o9q#IuVS3PXm{L+@A$c5aC@@4 zc^JvV@_T2!{p_BWb;O3Lia<@DlG#KC$(qMO*09`PORJVY-Yx$B%3%bWBjNui%FU^Cw1y`zeAWc3fuH zdw#%;Oyz%ycvByU^MFj4|J}B>`P;XO($X+5FKZi{xwc^ToiM%gV9KlYglKsb>FrU< zIGc7g6anVNJYlnFgs-Ey!QF9U--(V;2=BpFN7z`DL0$3~SksxsgFIq}yF2WshlH4M zfgMv-^ESIIuM5O~_U**c`(4{&U-mWEHibzoo$UC}RLxjAT;FVGV?0=xq?H5V^QTm~ zhZIfb!O9Y!%uO~% za}Jb6oX=7NIs8yj*K(qlD9Y=FTg*_(ELP5eh1!bcvxC7LH6lZwF)_=F!?i3UpNg)i z=X0}+*JtULD-D7TH1D0%-hL~|Z2vB^gb?sOTK{>l!Y3t_(R8f|y?MWJyy-*j`Gto< zS>*Q0vyNllz8do>42Jtep#QMsus04&sQ0F-hF9&BRe9HJR7cvtN_dCBJgt31wQqyD z$k9sp5x;$We7sF0Vi=KP`|zP1{5Xf5>m*oi~RtlQwbpbEeWi6vI3yWlr zgSLyFn1+i}n*HrERZ`L*Rl$o$<*z5ZW6`sNoxk>vQm#gn3yqCyySwLtf?zQmgeqVT zgKQ^Gbc;X0zxtiG9pZU;>QW5w7P{`}`p3j@%~@^?ioZWM2Ww0aIgaaj4Ws+cOdJ7S zH}g4ftHAk;sXSTP$Ii`td%1@<>(`X?nqGnC@|@H;m^56wqMP;U(%`a`;;y|7%1Hlr zwX?*rEaW2hdAjsm_hpGY4!MGBi+?PK7>Q?sz=UD_8%XZ&->-}6=@djN?BW`8<;aTq zJDEj`Z)b{&2dzh>3w0Tw?p50i2}vUX=+l@24FTrqxR+%~*p*9HcQ)kg+_e_hJ*Xwa zpL|JQ@VIMMphKUChtt!3bw0o!H|N!MFOt&-p^;l8(l%;web}8`VK)GyZ(l-$tte!ueQ0d)kSg|M;$qXw}b2GbEu9qv)dbN z8XwoC^zhOG>Q9Lk7NJ}R%`!AmzcLR+tiOKc@VW7v9#O6;hE6-Znkfx-a1*QY^Q*M{ zQ<)@AmS~NC6bZWr?ANLF-9|(UF4L<&yK~d+fs7sO`kgNX%)$)nV+9g83k})dmj}VN zvBUiiW%q8bgR;*MDbOlkOCBvFEx)Z$fiG<`jkk@h08Tm7jD@}nr1o4rY*!qI%7;H; zpRJIOMT%N|L$MjsJxCJLh}B5^ZXzmgpsw$E_>6$X$H(;M%JTAI43)5j&gPN~O`mRE z7=0!idx6ubLo%W#oQ89=>lSO0$i4I6&aYA6MFRF8z{WHa#7^BfM&LmBDVd+5cSF-KNm6fxm6* zYH3I5X-(6@H}jq^HG+Co{52<6G`?JvIFMBeLhi*W%L2=|J`4FJfAMRxCOaupW$n`q zE955i!GUU&TKf+Dh=2UtBUVQqlb#Mi{Oq+aFb`EtMm|+)hMMi?OXfAmhvJ`pT#Ca^Ty( zE(6_nPY-Qn0o}P~dYF5a&ew*6b;SBfz_lDK>T&b|7-#D3*UaqBpM{QT4x#p@+yVkp zuU?I;Rqdk1Rp|E66{e=z3wO`K*tSU>-C7a`MhelrSX*!(TOFWPc>1}mezaO>H*sqH z2w70>A-G@+zLB7H#YEl+ed<0w?ml*1c>Nj9Y;$6_nI8Vo{r8DM=`Rj}DyIdp9)Ut1 zKPp?pP%1@_WG&LieD0sDDU1$Q=895a$jw_mwiG- zGIse~s$OT{g%s%Ln2-D_EL3Y;ut@oHG0yqle6zh(!Ft%YBDG_-r>cs$((>|o6Kd8SY=?NovO4&9)t8ry z^Yf}W6K%Jy%6ZqO3#WUjJP+C)82PkuDO@ewxZRWuutV?4gdc{5Go{rgCiX1&IU21i zYCYfInouS)&QOi{_KopKyY_|*@Gmd-i2jO`GHQ zEGn$>zL#kv4y`svH`{~gA04-;Wws;2BwK~(9LYZ`nfT!LEH4Wzgy__KkCF?@-dk=% zh+XENrrat(NHvQbc122>lqU)A?K7%jTgJ$`UvKuRYH3OO5E&u+<_3L5TSB3ng?d>< z1xaV9i90QU;hyemONbPNV87^do8}24q6n3Oc^>b|#*=mBetU1 z{{2RrB^#Bl-t)3^@vpUsw&80qY}|$n@x*B4?5}wFn61M@k+ifg;m+73iSLmG<3&TN zZv?1=$G684)~#pmG%&bL6vvCcvY$_(@}%7lor`pW5VqfG)&qHL>s$?`P^h{bBt+i< zdNN;C(f$W!1>Ax?#COo{bw6qJAN6|E%$EjcJiC-oa z$w^Yt_3m?o+zJWXH)dj)Xm+0Q38=KGqNb*~bUMxY-QD(f zzdFaSRTS3OM*8hcDIxYDj+o*{y_=f`nG+pOE`^{ol^f(dZUZSP z6`s&Yq`fNZf|rUpsxYrpc(;0Vw1+o-)Fmka>N1wwc)GAR(?_gd#PP+Q8dr1Jo9LS-THdS`sl_E@zHAL96c=fDO~`;^nPqR!3!e4 zaJr4uAB~NWRcdl;o+KU$PThvujaftrk-P0e;aZl`*!udz73U*_KwL+bpWhNwBBFW( zKvMa&s^6>}9A51>bZPz8D0Vr;g6>}8b}Z2gtFm)#w`Qi4GhB+%{xN51)9w~Ly~gzb z(aU@-ef^%`YX87+okkJljHCR>aJF8!RN%%ox>w$Gy*SnNt5>8eLDlW7Nly-NTDX?O zTtMcz#C6>H$M4LE?r>*ep+So?K?gxWQ{ED%KyKt~-NcrsuG>!|omw1cJBsx4JTo?S zn4PV87C99&=r~j{A(f<8mMKEtV&Txkgh2T@k+oYyb923oaSJn_hW*Vgh^N$MVv8uKUM35XGJm~Bs1V_?Vk@^9B5Ft2tTyFYvwAFWwi z>i&q1&@3V$fgPNtfboH|`C@d|*I*OLq7NPS&^a3?cRJEg-YBo+N1{IqXxPHHp3(&+ z=wS=a)c+H<-h;3;_|X!MD5`Kh1nG2rb;|=4Ev3O7tjCfQc=>tAY`?3|aP1t|Z9T^W z)g099_edtz{$z%<9$~j^c{w{$%h=9#rc)x7(b1ffHN?&F$hl+VQ@V+tKZ8Pxq^oc~ znzla^ImRd0w6S?~vqHlU1!U~~`peTQ&e`vO7-&DhoJ*2nsL7H;9!vO}_2uvTRZR@H zmkU)zhCUtZePyTHHK&8ASlryy1vzoKUlKIOSSZ%w^DmdID8S%0o(3T2}=|kBQNSIKPW}dy3 z)!^+u`U{+ZWUe;``d$MG6Sp6+9BvQgPummTU0~Fd1Lp&C}v-LVlOU``k_C2dzD6K+ml7o<-2l8@q`X$W_w6B;& zwoYb3DMDYT4{2(06Ur{`FM*Rnyp}MQ#_r(s1TZjIv$9e?f36@z^#aF|-)Op2YH4YS zh=#M|!gB7Du}(M~eg`lg$>K(yOA=7lwV-Em8I6TX%qIaKnW5KS0~=PiAJNGJf|7+` zoh#vi3=HRZ6ugJ$2&Nl^ctfV5@cAFCCJqBRNNee9dg<2wc)sO0%V!TU2xK3B-9K1? z@$uoBn=2B}kG|t4hM>tj~J zn+q+vX>NO6W1C#X2L^s@BI)UpL_{48sAyYL%bCs@N2Y*?>T0sBtq@)I7a=~>#*b^` zDGXp0Z$tT?3~E05lP>MAoH*(J=Ti`k@5Xd>D1=zl$7_FMXg4C_x!-MfZ!cqveansA z$|ovkU;(oqnUcu@$W&*Y1M~9ooYNGlX2ao?LH@J1vlTD;MzJ#M|+BT|8SmR8!&xSh^LhgW&MN|CljUFtF_(warLwPqkB_g74fv^(w_&%p z-|=sEOXuH+HywIfyY^u|mw!(gO9+1uMJD6@;TQ8=4zw%;AsO=($Kexq-<5U}7ZMuL z=OMsf*QQwvGQRvd7&-NYpKkNV$lY>KGr^cxd}j<%Gc@#Dp=7r^<85@V-5-3Kc$Mal z{*ZPN&Oj$U%PtIuq18&rN(X?I4OTx18CiU+_GB;AdX1VI{pOg7?)ginpZlEz|2k_B zPCwLiG=~RYW%T`3^l5@V(2^7HV_Wq3J&h+PcC3*y)1g@c#C>==R zxx4S63E{9twJO9BCM9lD;4g0N6&;^AWM^lyv*ok0<=4JHUk;;UOlqt{-mgN#BBq5L zmxM_kPY_7)Vh%oi8M(Q7W2PD5=?bEKN)i_@+?-(i!w3Ae1WWQw$OsCn!Anr}~Z0pyJw5!!k4n zb!g~mZMp<~Uadk#3tPBC@MpO+wWFo#K=u5?%NM=4P1EDzYjXw_NC+`fyKLSFyjf84 zlZ9KciBFB5MYIy{!q+G?BQN3RIuZ49e@pL$wpT;zo}fm8BzZ_c=vWtKes4zz9G~+y zE^K1Fx_IeG4yYYcYDVU1CmB%5hW(KI=c2V;6;=UNUSA#!5D~DtaxRh6CBx0h9uU|b z9kD-83x?%CAfWsE&>tLr3tazvbyOj*-Mq&m6RHw%KmEzaYOj__fh~|RZ90Q{ZE!~$ zy$dk*3?K_2t)2XS=EZ>BI$3B6MNXsKsE}vF1k`eWOV_;~VQ_8D=l%E{68bwruBIbl z3`%xFOfNz{izHEi`fuvg)gt#Z0>;CTR>naB<5v21H>%naYbJ-a?&<02t*tHKoi8rD zLZ#D3HgPaN|9SVb{qzmE{VN10YlHf7>f25;Zg+QOJOM56hm(_&#!-3c&Wp5$2f+|Z zBGUE;!MZaa>l}_0KLhS~fy;fUhwd5%{iXSm$xBjv}^O7y-Fi?-JBup`jY3cdT zE;DY5&^ZG>(4#m*GY?FT0wWJaC}X7T*-~YVli)k~8m)f~WU&|j zpH;vk`Tv%1{2$&(%khtT0_M){pk#+4*7HGoCGu;|;0{`Kz)JOxA3qKcT>^|}XJ>b- zS02#~Z@S{NFcW`eB(?S|^w_daH_e;7xo{;e(5&-3T31PzMs1E{u})y4v4csXC6SVn zYHMpNvm9`9cFxJmqo*sIx&n%zuqT40jth+^=X%Mk$zIbN`!-c&VrYxUV1D8LhDA(i z08DIbSOJ5i6M}6K6J%s%QQ`#5H+a*CcodhG4v&q&I=?+lO-&t#rl+T$?##H)*jHg- zU|gTfIC5}s(9489OM@c%4QgFwize`%ye#&+y_r*0PEx7@VxC5yOAAX&fZDR_>u0|U zK7E>6hK&67?ORk7Y`vHK^B;T?5`LRe=CBpFy?H7cnv|rZzS8aer51E_^ckbj^~rn# zj+m^hEK3WEfG=NS`z+!V_}#X(w-V_w(C!{j+`$jt-*@8VEJDY6^hD65)sCM?<^6jR z0@Th-mHXa2TTgpiTVFh1PfN>6ZyXOlR4_~}Z;UZA2u?vkQLf8QU|lgC$)w!g(J_!H z$iv2#U$@nDRIghg=6Ca6Uq7*`stUFaij9Uv;x4OiiVPbV72{pkx}$nxII&SRuA8a= zF$`IWfbj&Xr^}w$PS{jzZf=&8l=xg6=VWJFSy}y55>`c{ef9U{JoGo&8qFafAc)~G zn67f988`xPFSbzq`I<{jQ`2n}t5&&gfm24imqR2*H#ny6yWShOyljGp7rvXD^=|Oz z>w|*>YHDhM0=JIwtm5Kth;uNv7nhe<_wKDC5ZLm#PhN8I^Yb$@X6EL~S&?tyoY-=5 za4@EUUYPgp-7k1MYAy2+?H=&15C}(1IE{FtQIoH^xw(dh#(3El5?SRir>mg>8@Z_z z8Nj9|3|b8n-rYYvy}dqN@B@E#3$oOwgS2|}vcvH^?%T$6nE^wN?dQTFC}Hd2!s&4v z7f8LH_D^VgM)&~M6>%3$0z5S}3g1#x69Ih?p4ni(_kWYS;=PA))&7#{_L19Vw#T<7V7#t*vGj7Q3@G zz$_G=M;TT-8880+7+sSt9r_gxe+k=Chd{oBhljs?=i_q?ruc^(Lx;0u0M2HiS9^QA zE@wYi2&_W5P7L&?5OUq1 z&CSii(q*v&78S7P-v0haj~<;I9T9yRRT2Vb^o}hwdrtmL`Ayb{b%k!Iv>KRJH8nNx z{tOKpot7k?hQG;uIOqvNk71EJ6iQTBd><&kTDS;OpAu@vLtO>StM`?u$$jR#pDyqt6!jTmdUT?9vfm&x^C$Y9 zXMt-2Inm>XQhW0amnfuVSHLT*pOLiVcRnObWvI@1?={R-xJ8?1DJHZZ)x(I0(OjRa z@N(QiJ7&J`idIYbZyn!1VB&Y&zh!;_+JB>4BKiMyjZer1oGWy6%meXkd%9~q#uB^K z%iSGGi$)EnmRc@yfzA@hAK~%kb*yOi>fW2fHzjheUUChg>LFk*bz;Qj4H& zBB1}m(yZ@av(T4;1Mny`Bbw0U%`LSb9K z(eXCAd$O)i5*FYDsG1s#naUFGIIg_sqN0{7?RS*L3yx3sLNroz82p|JVqvyPE(T!TfQL6&k|fWOZA z7AtGf&4um8YF9K1Lr%{0cfy{IZ?ciIX=%gJ9Eum~36Ex90f{LiP%C{eOiOz%>hpWy zc30enn835O6~|+pyl3_+5mSHDt#3-xO$Cn$mA$p~1*K!i^%XQnZcW&u*t`~KnBE#t zae0+r(}_t2*2+ln>BR31rWP(O5%5@Y6Ly`SE^rFFGG8Qnf6;N_uq9kdTzUdZ?QADd9qBaI@zCpg|CWL!!e(1K%g+w(Imnmr#`*dM)J>1ktf>h+`?=_KU@L@<;&RH8e!-`Tkq0`lF;v?vXG~zPqcgTS5=i4yez83@ ziADYH+4p0=o1^WzJ^q@lPxdpQG9qkdT43&T;19{cky9v7CgXE2EGg_CesIy9EDES6 zg*cP4d_7m!r7$Xy4wy#)0Pqih2!6}qp@Hn0kARTX&=LEImu!VBjw6~LpRnNxb#XlRKM{Fver^uc5kA(f4@Qo<$gd@eEk~Q=5@NK3<=n>N!ZMX(5WyhQ1r2DaC`mvG%p{0 z|8w)qjMsSn@o~-6)I;&6V}beNCLn zfHw758?43T;RV0h=?a`468^FE*N}%sMgiuye0<|X;7|8@imd6V6}*#ychomp{taA6 zpvp(1@#FA-<7%!3AEH0W_ZoIt^M{C$`ThGte#ic~>K9%&?*ojtkM5(aOaDF}90q~p zjaBZKVB|~u(KTowq%Kc)w2Lw}=N|CAem*?RMjm1VgGmRtOElwVXruaB#Jxs=0B?8G zx{0GHf_}`?vmjra6|4bLe$)0EP=pcn7_=Z^jgsz-*8r0R98L7hkbU;ip@@lTLOwgV zBUm{@y4FwiP*Y_xDPFnDlP}5)7v8G7ZjEX6>DrIZ)-=z43nB_KE}h7Kkvo<+r2zSC z_#laj9^LdYnYvbU^ONt3dgP)G2 zrY5mh_A?y57c4EMA{|{KA^`>3L$-hJ8fVJCd2^c~&*^hAl`$Z$JYD?MWjr5Vw_Cg8 zcPo5zb<_-_tJ>I*t#k8i>(C=5_wAq(S4yM z#-B5bxeDW^fdH7RPn5eb_#Xu5`j5(}PD1%?q@H77Jj`=fsR-zuYlz$$@d7XjZ83AO5d9g<+4}G~SXdv3 zUezguM^>5lG?Me+z+hB*Yy-}h7QLM|B}90Z+&YG$M&r)$CpWAqdS?N=j?* zo>(|jXzp2fe^eo-an-}w+|d#)c2OZ`UV9)Y>7AvdX#GCq8;W|8nEGa=H3&o44L?FQ zeJV0BpPdysxC59a8Gr4LlF)@}=c`ObuCUaM7yUvqM zXAySIuCpEG{Z~N8(JM)7Ss2_DcD33+JMf`-&vi2-;~7>L|6Kw?uUW`8S(5&YuflW! z0I9J1C1H_H!C&dWtl$NPI^!9tZe=YPYqz1{>xGv%{h zAu0mT{{~@10buH$VEhw=Ycep(8qXxs)G-+tAJVWYB~A*Pf3@{EqiMVv<`cP!iQ_>g zcnW%IcwOKH1wnXE$_AtxFC7#u)(eNyVNp@dv)|FNwn|G)cANZqWoX9qtG}J}@ zDkn_~mTYi8z(O;IE-VqL;F!X%T`{*wNk<1DDj}C;AC-)=e)5jxw_RMKOUE5p>jMRqw&!PAm zTsx@M{cOM4pbns5cFxXjv*hawodpSV^}IYD?l07h@vK_U!)f+TCr#(CF9Eh#fxp?^ z%-KIE@%1w9QRY6T6jb$Di9~nore_R*KM$jBFcb)tPD)_aPpoBu872d<((K3)7{wq@ zQg!UaoCewk1jt0BY}cYmo?QRI;&wlkl#eDGv!SCnSx>0%`T+tS#!MCE*w$fr`KKh| z1bwG{)*^LFvqYVe=4?%5cTc#;Nvv$Ttj7`tohk*DQ?lCJo`(jqm z_|K$NFt5LV)Ad0(02r1FJ_0*AS@7(d#;&0wL>~6T5EQClAq~W4RsS!Ex|R7N?4gL4 zl8Su?h~$-!c0+8Ea*KnlGRt&;fKhqq8(jgYpsn5KXs#e5Q)*^-W_C8?n0Is(E_%sE zfDuA1>Up{wke0Tv+u;7W>2|<(XgdwVH5VC4u6g(KD)SgYY%~V>Q4VMsHl4OFh) zhKAGxaSE9ah#0^4`yYrn@=~nzUG-IpkUo*Hu*e*;`q5=36HbjfJv{~dA7E+$-wA_h zoPUVb=iHVJk4KXOD z+t1evGBaDvRy!+l3?J%$2=mv*s#R+3jr-HpmDCXZFQ}2!K!RpD+Q7bJPLx}ZsH&;u<>tbfd3jxrH-@s5Q!0CtxXrr@4eBnAH%FTM zZa;ncw9*mI1WNrE7lw`R1$lVNGBW{sUarmb)S9UUD828MB{XR=n_ z80P1Xa6l637VszZF-Eemv-bg-IN5twRzU&s6Mg3k;EH}`*;>|xLFnRmt%nCwC6P!Z zV3iHDwX@$clLbV`0k)%%tp~8H#DGJ5{Fp$+z#s`V%ZN>Ev9`WWE$%zp)|Md(L#G8b zWYo*Z9IL%~O^bEGLVnh~?R{f=ovDJt&io0jC&HQuQEfVNWU6jw#f`aJn!$IS9Cn)U zf{kPEpkpeeh$SJ;0c_PCu(7h51jX&KJT3noJw-wX(WU(4NHIV*zy6E~psf#JY54@i z_J|iXpZt=Azojpr!P|M2fO=1n1Fsv=N?Ty`e z@IYKKxn7XlMe^-8hGlEdqaNQ|pMftAC_jJlO%{ZDOEmWzw>(!)Cbo#b-)E|pG4_{O_ot|tgNi^ z^74Rqrzf`Jr9f_N0SfkJKTtfjZyl7=+#G0+o&E;gvrx(o$7y1IAFq>mKJP5W5&fFs z^|ajKk?^LoWks5b*?z*m+{=zXHrS^y6n_^_WdB29{rhQ44u z6C6jayx6t5nu_<6mzQ%`SOD)eDt-eb4?)ak!_TU+vjM3!QyYb*l%2FAq*Y{i4H6E1 zyUG0)Jn?&2Sm9(ZKEW?g$ce#0KwJk54!+gWnlPwy1Eh7Jzkiabw`SIe&N`t=ikOd_ zoZKU@l{-(1Gxb%H(&^EFxZ`Z~!Q!9KDk>_V0%_Y zF3kfURh%3DdCa7g2tc72*am`hRBIX|EYHZ;bgX}Iax|cKB&TE`B?Um+ho;*(zfoqo zLwFGRelHKdXZ+07U{@r&=iT;@pm=fdBk|ju23J{+sWx~Nt2+**=J$AzsE<~%V>of| z*i8h1d?Yj!NQ<1H(8xE>np-C)Ck-3CfLE;17xO-`OMMUsKlW;nNGI$zZvr`+TygPk z&DVP`+9yJc&JQ{wiyA3_E^Gy$QilVRxIip|{~hVI`uk&Tetzub9?j8^3?C`SFCD%- ztDf#$r4+HNPI|Bh1m%6@tl{Jo$uRjZSX~>X*V=6cc(W)P!NZkbvI0J-wSDU|)uoo< zAX^R8h?-4H$9CUdED(~odu--GL-JBUzlHEWU>o=6{|dIFGlSK7qH{idYWKP3BfwBj ztbW0@4{#>lB|~-*(a;gp1IH zAoFs=L~cBM913B@bTC-b{+#=S7z8pI^Ddo3Sg)FPOs-|Yv*WE+Or7%zVA(KlS7@%2 z-+!+;a9-)NZ>$K3VgGN4LvX_y$Z%6%q%R31V^wZgR1s@&3@QG^ud!XR#qM$ z`2WSuUJ(Y9&exy1$aS#*EEuGEa#ZgBhfN!vL{sXsYph7brBrG@EWKLgi*%vC3kbfal{c`$9RVHzGyxlWF4{*hmd0 zF`){~IzFPTvC-(Ofo2)`8N{aTpIVxiF0QWD=;%ZnH%GHK>jxNLh~AuSA0bSsJr-wk zHL{}FZ3|b8ECx7c8@w+*qMs6zJkn{@*RB@TfIWDiBH%_zN2dYGX;ZW5g++y$nD-_f z(wlCpD{RT5*=K7;+@j~!vA>?|2v?hR?YqwhHQf4M#@`=vdVmYqVYHWc<;V|E$$WY` z{sySSv`z<|*L;03IS*i84FM|;X_b4{*b+#(J3ZE%?w~Ir>3F&4_qjd1snolQOUlDF zw6RwAEW5@fV4`XEK>G|Ng{$EXHU?FB*h>IC|OUB?Tn#lUXT7gE)HGRs`AARJTZVR zXmm?kvo(o^iUk%{6*EUKcUdPJ=dv|pvN9g?R>IBl_2bH%(}9TlVzy>01m|>8+t{nK zHK>(q%61%p`hGjj|2;&nA=!GT_Q@w;15m#`m98wR;k+HIQ{>3}TnM$5XHmePdl1ph?&#Y-G_xLJ$#PvX`kOhszs5)?)be#CW>)&a>?S6L8CqvH z3RK4c^0%pfV8?L2*3dgb5fa}5jYUvi zpL!2;RcGL|#hTfOI&aY3Xz4$362||kjP$uieAP)z@p*GH3p>v}uJT7>97^hDjtPSV z1fSn{-3-LuDdaFJfjbtQnMqz8u+b9=gN^Qm_}XlUU5I~eXca1uirK{E~u@OM!8+7BWku@`q0alRh6jBPyzYm63SA+ ze}McmTk-p}I-Ov{I5@XTM&fH!D2Ivr_&M|HODF=Ud}818O>Lf($iKN>r`6DuqaF(# zE2u}=EPZ3NQW_fbLj^qQMyvB?!@Y>FXt+x#$_=}A^%XP&uXBm+*yvkYTRY?k8czsR z_(?eAP(FymS@N{O7oWxZ#RV(R4V8Pq8M-XxUFy6JMeTu{pFO3e`CB_@Z(tPnJEF8c zXPNBigq|bT+n-f|CLVC`y7XXBvsbUb-Il=VsvyGDKL9_0+R?uM zOWt#4b-gr>7wYns_ip;!C5t^W4F1zI%miskIt$;P$0-6xJ}2yo4;2$DuU~T$mL}@` z>Hk4ra-@_R<7_`NB}byIM4d8DxLOJ7E;>#cqn zLetR&D$4OTLOTK=-K#rdoq|kujM`DUGx<{MWE~wH&CNIJUtjWP5*8Nb;(8YKN=?o6 z=(km9>)gTuxBd?j2L}h*kpi7&z^Z`Eb-2hR0?7#R@I=IXe0-XNC;=%xeE1N^^s-6! zst-l5%pxTv6)9zTksHTr1-fMr2l0$-#7b?=1`Er^aJ4oz&W}~t92^{6@zR=W3Hip% znjHWOwG(JBZ&vThMoTLxDq3&PG^VDeE-(+ziM5ld)~R=gZ&lIKej(2z%~a_bT>#-X zxHhAT-D{3VsYbG)o5sfc<(iUi2OD#nvPK>o+xq)&7e47x_U86wy~qQ_2raBZc7Oc} z<8gmMA>``#^Rt4(q??1JWD6(?eEdOs#=>GU^WFa#i4gWU5y0IR@c6wo4c~dfX)zw8 z7ZFcH$O6+-Q+1o(lhV-82y|tnrO6}+IQ6DJ23*d;v%4AhC}rAdLYEVSQgTroTCgyM zld|u`+K3mDCf=sY`SPTzI8XN)zE2rRiF?&27Fdm$0>aUczYTWnAm$HuW1&I4Um)w3 z*HU`aB1vn^bbBLp=fbDU@E!0eD6;#OLE#M&8Rxx~o6^~zKWmaOaBzIkiUNGDUSZvc z_vt;weZ@3ICnu+STwFK`PEHll4A(F*bzcsoU)SH7`YJN_?A0rC&gf3iYpndd1qRLb zc988nV+I!CbUsp}t*tG_l_fN7h-m0pp^tw@hnZH@r*`1-O}$>Z-?#3J19&)ZHaN{w4ols@k%eWX*-1v9QGa7&x0OTgX$9U6oD7ESCBBsdzMh^Q zV)j><7#Iadm1v-#-gBP53P+_NDG4ik6YJsn`g&hqU-(Q=XWljFGV`m<=uSJHEbGQhK67LV8AW%;E=3iEX)m$q?b@ zD7j?0h5Ac=QM_p}anwM4vb9?6)Q8x#=*VhOUEs0So!_2S&!;t6sTK$xQm)7_K#RaY z$@!_Uc^?}corKTU5L82YSKA9uCnw_l#H|*P7d^5N=~YSM`{G1|VhT8y#lzlu_LTcX zS#dH(e{ZGdX`hSJ*@$;pkhTteY@X}X86BO~8W$RUzm=Y}$3KXH`JD-YxH!$*H`m_K zR*f4Lao4avM+Cof;~)2Ax?$Fj*p*1wD4Y1=Tvb_6chIk@ZnN;?zU7psR9c}jD_lFT z92OjOYa1KTwzYBmNPQf7ML>`~vYi+*JZ8RQgiDF{{aPC?^5bRE<&F)exSy<;NrBZ| z?X>Gl<)oroCg$hTGeOnCFIHIWqtS&-`2Zch>8h7_3$hE!L7%t%nN zpZSh%VL@7EuHL>ezJKDr$#08gBQZ{VJE}xw@ad^H>hO1eQTCMz>zfgA#%$KSNbl@W7MU~+zT zW%Wx|R?+CXc0qY^GA%DJF9(NwjuH}yWFfd(p>{j8Rg5+y_(%J`|3l9_jF`KOE~^8+ zbtii?Ygq@Yc^Nf3SKnaO^X`NowJ=aGmZ)?TJa|x!tfZph^}Bp2w%FOuQMOZbNMSA5 zo$DLMBNPr1>;s`im=qpAevCLWi{1W~U`kf?RAp<6X0`rP^&&&?WmHN}D<1n@yHe1h zI`0|#hX7wiAw4s*aeV@?xj^N@pTL>D4+^3R zxO8#$;!89X&&{UX+#>sRmC^@=AWVg#;5mJqEB5MDf?_5sJ9{0d+?w@PDk>^2T)4m` z1KK)jUdyRg#>8JyZUPP)W8U7VhzL+=7GnR<-<@vo^YZdSTg{YbDl96JgW17@9nY0& z0TjzyeeJ=lr9YoMa4DtKs8GE!SxoB1?jqKMHF zyAb+{lY#lUAis249bk(|ALdBvG34Xp6M@!z`Gn)rr~xp8kFp^2Lch{I+VTOGUxUsS zE11M!YSh+FmUx?FR0%_oj;_Hj!1t^3MMj#xk00jPnwlCjGc!;a139LWQ(98ee=LhT z;d?S19v2t){{8zc7)l#d^R|2?DrTCRpAZpn@?ricHW%)3KR&dpQ0qK#-0l{99r^*< zVZY72?I@GvNyx}R&Pqs0Nl8I526t1BA+3iai-y10jwYg>6i22nl3fGDl>x!Q)cK+o z78Z_a;$4Gd>*+|D#0WM(qd6j(aRSf%FBO{ zXVPU~vX6AQhYbz^- zDmizAtJSwX1@Dn{z~w<69s;1$fQt|rDS>_;h5{5_E9xu>vJKn|DD@6HZo;e)Ni0#}e*SYV8xF?j{I;Ha*Di335}v+$lu&;`2)7&s zMUPj1%dBLUmH9t|J++`u9P8?sq#z&SHO(d@*~`-%E}}(scC8RAdQ9wh=70q zQ1Yxqo5Mwn+}s1&1;r&LGBI4Y?%v&n7Z3%c!EIVz?s%{>4?61c@p11DEiEm;1VcHi zipW(in1O`_^r$j3Gre&(L+)bE)*OdW^O2aGkItpeL0oiH@PA=8{DNlI-d?FEa5YP1^1&AGj&OtG&!JTio9)@<{-h8%?QQO<{*KT4>FL# z6A;*foer?_+?+0OJWvTr4WPpV=f5qS1#T_qI1N3A)0nQ9nVg(#K33k-*LTf^>Gcp_IQ4m?Mx8%5D{Q2$IFkB<3Rxiisy zzU}YZ`)Wa_B1}q8MC4)v2dL(aEi5vOoME-_`t@t5cJA)(qNc{6_4oJpH@#;#QSAgL z1&TC8GUD`tPsoxtTWPf;mZwqM%D{lJO3Ku94ZI1%&mr6L8FL!bJ2rj{)HfeK-~>Lh zfl4d#7R1~dE47msB!s5+B@o?Tl^=kOYpSXzXO%ZzHb;qtD1h+l!U}tA%NlEn4&wb0a2Me*F@t>%5Q)MDxU|_JfwG9go2QfdkO)y-QYecNw z%eH6B_s)2J6Jz5mtM_3TgtivDA@^HaBz;5_U>x-I;S&? zPyCLpFOWYbof6BhQ5%*Du+YgHM8Gg`a9FjigmzGoo2%|;kcVi1hC`W^Gy2DIHTEb| zxRg3$5mXChR(H>J@LD0(G2b3XXnBY=FWVL_CS@zJs7_h2QFgYxhW=4=tsWsE;n%NU z;aH7JMkXgUz$-Ry4b2!lf7dyl2v=>;`*H*|9Xf>GdiSw?p33UAneFLq*ZfbS=-We` zo~Rcukn0Uax0uqA+m1zI8O&|9JUkmD{A1YH%CG+!z?Q#o(R#S$0KQ|T|(K|^NiAvRj{+J~BBK7MqwSy+>m;;S@$>G2eQw47bA z#_sfF=Eo0cX2yKPD=o+=cXUuxR4_Jf^t~<-aocXsl!gpNkzhRim2p!}kWj$mdh zSDKTuK>qD-z5Oeg`bUj}UvxsKgvzP(ZW0*i1lxBXUGb%j&R!>ESRn z`)7#eeyMeuvy!-h*O;q5Dz7}Gpb}GHgdc0S_9#W30a@!MCc;lqJl@HG`C3v8ora+C zww($n=NywzCllXrn3T{83v&m3Cm=wjr^n=ust+Tu&ooim!J$jq2>N<23OP>soA-Q7 z=1dOyyDUW0RaE%r)htM{B?S<@tg6IhV{40wQuV_UpIZzFZ@VyfUA??JwV&JL*si|V zC{pO?1K!mdq&KUwX3sJzt-@Bd6N0~VI#~CaJ(|$v^Qj~)R}>v1T3C3!0h=*LW!@MU z-3J(afe+zn?}E$5DngIT>aLgOK49%+W3H?;!k@L2W@h5Bvvov-`1!Dn6wZIIwEI%d zJ7S)Ae1gPva%!L$-ICyBuDX;catHJ7gw73boc~C*GR){37-zeNMWufl6G)EC)##ci z)T>X!Y*4o4duhqB*YH$U=gvpmji6CjZT%@^xt~9ygChwO^I2B^$;rvzK?PuL#rggH zru_LdZ`f~lg%0PcA3i(Q;$r(7uXqN0v!b-q6U5p2SBeUcGo6k!XZ&^WpGl0Lx`KM3 z*9&d$`gOdL5q1IB>gJ1aGx&`+QBX)Egsg>GUn^(JN{Mv8R`C0SO@$N(FObmv!K90H zc9foX-u%}=R=T`Z(_KVerBl)B@DcEwCmVuCmpDew z=Tw4)Rr#M`d#hbFCwvVY8y)L@*u-gRlx?j>BNd@I*43XrWmU%D^cFf;Y#$w%E^fLX zwDZr;zYsq8t!ckM5k}BaphHKAS&x0bbo%^bFd9aH@4^B(q0_KcImB|sOt8E#^h*J8-QKU|d(^J^x`+)%6XS2z){lfpP#pf8 zR37F*Eq}syKZH*TR&vUu$*zw=2gM;u`USUHOc~Ij(NTLG4U|px+Pi3|kN+gr z_!$;v8y4ZKtM~Zm*y}E5P~J!VByEwPuT}wxNvGMap;nTawpV|HI zj*hgiUWG^DwQK#4AJbeT`ZX|6N=WQ?Ta6?nHjC|+(Rh_ZZ_GXK4`av344^pDgb!K+ z>rU*RUAZ(x`*)#goE(fsj!qJFB$!p$_~GCcYQ7fFz<(?Db$6kH&-=ET^4@@Iw8xRo z*3ki!vO{v7UJnF+M#m!(hUv6O65nNBC+n5Ny_9=YC~wX%`1_g7RY^was4}O!S|lQG z1z1gcBG?!Qa`=lKw_j(o+V@(`%?7KwIExTd;yl^@TMKZT;BDhWBO`o>li`ehnKjOD zv(Tg0Zf-u#cbs@)RD9)9eX_v9k6_~e-+R*GQf)9MAqt9buog*xEaNq-bSC4agoxbR zK#5@+Jmati`MQ0TIxEqOXU{-}0yHP2r+avK_=wO%w(D_5OVZ<^yC$d3;Cq39+lni_ zE>>D0On`na;h`VSn@^Yi0Ljrpu3WlSB5|Yw+(CrD8$w1Wo~n7wUb%@g^y?5b7LKL|3BJR_u1NdijKogI-3~Mo zn)mEK|F8vfcJVM*vtPTe{#3nYF4kgTU@%X>#Xdiw3Lk%OFwaH!)oAw=G2tFcRjtjw z>1KbHTpVA?(OfH`p5BCNZ3c1$Gnn@LuGdn}C@S2MeK}nGLL&`z(j%j#;oA_}zux7F zApT^?*`K@H6?Z!5Vdo)@em^eOWMk=u_u3OVi}AWT-n%w()`jV*-s7^WR@)n?smVWo zzPnBy#Hzkh>mbF%Rb0A1FaQl1>x$-A=rnrlb*>!zE|YQhuY({a>+C)LMk+s2ikdw! zXx9C()@7xbV+5;C`s5_6!!#-W!MwQb?d{~}V-)E-72n0&9rwL{(Aek%sVz0frG5HO zz~uB&zI%p}f8k`bu0oi>n?zNG#Lvska(1`NCg7cZ^@0BSLWehwZ+chF_M-uV#GEhL zzXINKm6lX&-gKO(Hp;7Y)|~#JWA1^1@^hLSmkeDX6pP=X0j=pw?nlIb6&vYBw=-&}Q;W zr?bRzt3&_GH{EW2zF|zWX`y511CE{I$HysJWpql+qTuv++Xxfn#PL&5!a8&%tR{N6 zAGIjnPTX& zR{=0Y@$&%)8qO$9Ncf_08iS)fU@Y$Le&_OKcntgatfZ!Dnakh6!xd>6Z~Z2lwTF!O z>La*6)V5;{qL28hr}oOe5fS5$AIC3t$;I7mt{Jzh?1)ErUhnAm=;^72MgBLa1)eP| z1UD?iYCTlWuxh+UQ1|OaC=EFNB1MJp(Ea+=8^>S8tkx}ded@#!J?R>8O!3G}5@WjJ-Y)cFPEm={ANnL?cesDl0hej00fj7rExN1t0+Z5X7F zm6`Uf-aI)e9^WV){(iL)h0bAhO;FQsm=z~r(}^n3;(w2dNS4%qCw9OB>hQ}-ti(Jw zuC@>DjXOOlA<0Zmk}cSkx56(8QGJ^}a(!u;-=~{wR{Cr5bV4Uno_Q}(VAzJkTvb1V z=Gu4d*UAE0E#rJH*ikiMlvL{H@CS)#P;uV+RGaiLSqTY=bO`0Cp4q>UQ>{m$&ELog z?R@;!Y5;P=_*15Kk1Mh2CI2i+{xd1QS=GTiMqCU04gzHBk5Vd9bl#RwFg(?8tEs6w zy9ZH7e_1v@l04;~+Mt2d}FNj4pFPJ6-)?#=#c%xZ_8CbcfJHM@VMtsR4=xGxik`>7v4O0Hjb zS5WZEi7m1*0G8niHg$xLck$YA1Ghf--U?@%sfDe@a0&aj2J4)&tyc~f^^%fIzGOwZ z?skkE9)=rqVcjWBLSPBJ{=1rZ3+|J|+HHh|i|461Esot6ku=cLo63GE;y-6;e%poH zSi{+Q_2jrQIvSim_io)VoYLxgVWCl8oq5l)G+E%ns0H25E(T3g1X0tpCiU3wqg_yZl3LWhba7~U zf6y6^FMP7iRH8J!;gB|-?EQd)1f&*4h-su=LSfOx& z3j=d&5?y8k*S>uVCnSUwjXmzaU&)40pl<2?eQZGjtkR_TDOsPF1U!W3@7^`sP=mUf zlOjO}qRFM`0;eJYda?L0-Cn~XA|p-B75>d1hy8iX9tZ8CdV0AD#~mGMr(4+9giqB3 z-71kpB)(Q2#(k@Kko+bnG32)VQJxkdJkc@!H{1Ore*%5-07aJaaN6=I=q$I8=Xh@rp8ONminB2!6L-Be+`K|5P4IPl2TOo(am^uIrDHYZ}Yx@s7(?5jrx?He}|6| z+i#{r&euA0r*852jR6)!M85iZxFT;ByDUZu=xBKycv&h}xQ=CH@IQtQHygZiHrlc2 z^3m0IMqszKptrS@@3%5SEt`;42ouZUHY&0An%>!TU%X$vwl-18C;H@C14qZCYXi6M z-z!%`B_%_p2$PREmcfSAXQ>IZ*|6~TwqmsHp&c>DewpuygC}4Crv~>GWB!$Aa1YXQ z_Vy0n!a&!|SWvdDgt@iq%a@@RJP3b3Xl2Yj`7@J@Rt#!PhQR-4Fok`ygBg0rqs|u1$0j|vJBYd@uf>p)e$Ahs*I-KYwsA61qAK8TEI!tm{nhekfB*2heSxwX$hRpdC`d>?D`g!YAH)7e zuoY0NE^Ub9jV=E^386daXA9Ta-&L&_ljI4>UFraW(<(7t#KRx=!lKcA3v?ZB>pT@a zD{=eTxuBuZ&H zwXdj%xU~jYHx)=#RM2JcMJO0TUuM}+uXv8?{yR#5dj;(()y4C}s#?tl@0)fSr|q=J zYh?<6;I<yZTPxmcP}S+B0Uu-*>uA-6*B^>m6a3{Lu5~{r^-VaSslt;sqHF&k?z8 zmpW#-jJi`rgKlM^QC}lsLg$R(bMIRB#1{F}ttbG!kWtB1vE&QHZj-VKh$@)^6*EKg z2vk(e0h${$U&nfSUcPJ?D%jHF}CJ8%5}!o)kVE|1CO`73xeIbFqTwyJq{p^Z#JXu8ixatc7 zLnAGc^n+Lnfzp4)*YU|r0H=G6*RM3pPab#bn~42b$a8akjU}&~?6S5MD7;`wAcmy|C>&b7F+@#i{>H-%+#A6dG&$npleub6 z^uiwdkW?u`|F6KdONak|j@J3>P z(w}Xrh3-X}DQR->xF*h9F%f88{I!Vg{dD6s(0T#t@s#>S4_K+zC`f6(n{&mCj1uB&WkDXl*PmjAzbMxQ1-Zc#>)G z_xa-CvC&;D3gy8OzB_E|({mhKxaXMb>aHCVvvdEKbV~jq1E3KlZmTv44TOcQ#oje= z00Ed@`(bR%P?Ov8at;zfY@omKSQh>@KhUhP@eFG!K4sxHf9^Gt6`Nmin)VEwbx^7=JzHG~hNr!`;s+cL27Q<_$ z4H6N@U|96cKAPvt-WpSTVqoAPBQyI#qfr>iIy&_7&L1DrPpxfCQD~mhqzL4yCayb4W8n!`>oYa=CCDR|s;LQ#PKz%JoGNN$H0V0p2Pu*#yHv0xxbzEdR_P zS}^lFt*C9POICdGpop5b1SvySzwsZS3KxY06Hp|mqfL1V~0vJ*zi(#fB3uBLN@<%=5WQ#U%R`Zf2u5aE9vpo~uig)D1W;CRy@6T(oqrW#t_*;_Ts8J>2vVR_1w^JV!&5!uMe6yzjLOsy{YC zNBPO_8wy#+-x``-SnF>^WnBho(0|L0jNp&I`^iZ4_VmG3iwRvrXI9_u&iSvu(p@;O zf3F6I7dGo$MvChs#KQ%Si))j#-X@%bRKGes8;RzE{;XhVzn%o27Qm|xyM)NcY0R)O z?v$2X_t1nvz8Mk{e!9axfgJglGHbjvi-L`Rj!2;2zghn}gPhz)ak)QOi0oiMO;+&K z^?~-xm(ALCXlESw_aclvis#VoHTnIWNE~3mpxU zWC9fDHCScW&Ku94lc7lq*7GF3!-8fpXlFn0h_${ z?V3!LeL+AjgaDLy{PxN+FnHb%)F1vUXMeX9Vp7r)*9sQt|AB0tOAw{?4y!rZ`MS0S zy>Twn@wQTm&W?Kyw&i)&d$YmV`Uaaak9#Qi7izweYq;KlWh|8 zIwLNAy6rsv`HnC*!EG@2K>X1adWK3B+MS)lTy-64a#a;`*Apjmg`W33li8G?V`c$G*0afCQrvpaGRzrb7nYVO@w}Hwr-5e4gB<;pK~IM zz0lm48WOX1vV7FEea~bgEb^MSNN^fY?GY!aQvG^Jp2~k>yLG3yw2~AJD34R4?Ze5SA7$bXbw!c%sk|lZ!7-8b0^j|_ z29b8*@nikK^t{@M=ObXDMU{?SSh<1Yk503(Z19!_@Br500>f$7>3yrtI2zxuDi4o_ zNR5b-ImXPogN~njtLp2;4OTXz+;uH27B8}IcuO+MR#(`Ww2fL6J+ZN0-;p$$;)f;U znH(u551-TH1iG7Yr)vhqeUJZ@XPC$-%MHTmwV8jXoQWC57mmX@??VhTzfW#5Ex=_& z!b6({Z+!!e(<7Vx%;kX`zzCaJmNP=BqZx8Yxp=d^M^^tkT2kB^QssleYY*|TQhaqOfrKY!lQ zewp`&RE?vVrP*LGnlY_xH;*F?Ya!1zoF#Z}u?yVpr8l`)o@C2^7v6m@PrE&&X|JU< zSz>~O{w9!&ApHn~SY7uSe>8H%xt;m+{r%+PViV9=06SN0Sw=tGnccq;e}8wWP>-j~ zJpM%Pbgp*kkXS?7ZCiY>@3F}MFXokXe|*F}hyx94&g{0Dw&eqTQNwipuqh-~X%|4y zZD^}52MGvJcXxM(&1*TH!3-_r;!&rZW^GZhxA*wsMG8RX^muO@P3hKcH)LcxN9!g% z+QKfB>8!36+1uUH(Yf_i@|1WyeelWAu~F5yQ4w@@FCdjGD|PW1gDfS~Zico}V4=~# zK1!YDWuSRlSkMobN_)n9d~^hm%RdZsj6fNx7-z-u0po zYx~Pmc_G%ySvK(-Z_oryp-e%@J08kov4_ugtP!7PP5LP{e(>ccV<9JX1AH`{ zVc>hRSAa^gZNzMJcu>L_C&7O8G}kR<)blPy#t{?$>~d_7+F@b(*L&@9(0TdUj6Tk?WNr{7pl zClFpGNe?CDcxJz&Hz-e+k|@?r?Y;sl5r4ewyJR&&O2j0g7?3h3j=X9bRckzj@=WyJ za57#D;QEV+Bz5lz3Qf!&Ur21>qbiE_7NL>pGkqvc8-kNZOX9+$9*l7Ycj}e3>4GFW z9^JqJ^?_f*S9iUlG)n5Yq&57Pe)E<4ZFWBQ$!#HH8;%KL=113|w!tA&V7*X4Lj=Lu zBjMk;D?KCI;WY6$s+t`gd4w&Ws`zv%v&tqYgPul^o?v)~50M+^VbZ`rYJ z|Lj@!v~Xm#&fsgE;7pd8a=E@Ut`UXgY1pV+oZ9Oq!EN-h^2GX`kn-8HZ~ZQiOQs4d zVinIecvq?X;65CH=!4@egu7s;LBV9tMx^01#eiV>Opwd4Z_Z)9LAKgr4$j#o?^Ia9 z<)Y|XUG?QJtXyrBI0JU#v!|#u#yswJ&oV4-T-uNS3UPOqQ7*1l!s7EG7GqvPoAgxF zZG3Zn!;LA9v+6C|nIUJdh;?|oEy+#gv_yk#fnFPKr#vAlQVU1CMJY;P;mSOp?|KJ( z0%uJ4*FRc!6iv*tHZKZF&`V3)0XdNxQ${!zRnTb;k8}>yDUH+e3WX@ zpWq%BVuny7-av00*l(dk1#PspVVcA;2MO&&kXTy?4OPN?de0XrD1^vLNzqy3mfhIf zz&6X)K%xg8Zn+-qT@)ZWQ~pn#_8FHz&QgudVvu4cbP$U4J5*|24?dd?>vEcbk)!|1 z^S%r@#4FQ7>0pnX2J?EFP3OT%eCoaU7sI9eJwz&W&UXklhHUhC!}CDm4_*IqrCY;?Gq zS2tkDMIe3|6*U{2x%snqRm>r}N$Z<;5|23tiO|6u{(b>CMX|BFT3a!&u&6rs{oE0L z_H}vjl#Eq*rKP2UF8kHLX9A?scH9yCT!V}@OVbrtF=Dj-@87FI@l2?29MJf$ev*7YA=7vankG(97@lD5*S>Y2p`0|jf)X#+HfA#9s zZ{NPz@{JRNTMimCsj2iLlHeJGymu9qkw^`9r{&(XA3uIvAUBGc00lW{vhn2v9-?o5 z=HkGF=)@54_J&LK4-9aFi?OhfGhB+0h^WaPOby5L>>iKND?rUXkfS;~J4?N02+2e5 z8fRdv938oGXH}S(nwlCLYft)sIvs7ak)*Y~J@$@H6Sye$*GCZ@Jd@Q&JM9y*h<%jJ zla`k`12Z!-M@L5r*nF4VIsNjD`Z+9-+!j~ds zQOduxw7EH1X_wWg{j$PZ&(ZNW7`4!8;D5th0%~_n4u(t^9*8$4_yAlB7 z)YJs#Dm{IDtf8UaUNBPN;o}>{5TT=P5Yp|VOD6~nYjU_E*UR9dT=Ak|XWsOhY3x=M)0JlVpkXxn8^!M4{U{{0f4RVyoad7etdy--NgTM_e zCxUSEfNKkemU@xC41BdoP>;gJ0531D#{+a4u^Tuox`puau2`N;$P8m+V*`W5gv2NC zc>LK40GutIu{>S6oY%KEik>WX#5#bee=uuz2x#z47<+fVFS3CTO(z^8qPRIZKL&pL zzG_Bhnc)@qT}K@uw~+m^sCtqtIOMGu?Y`SHCW47ga5D~SNa^aPB35s{^6=F!asu~{ zoWS;XaLmG{Ea2M!lrG2}9u>vQY{6IG008fMI=p4vt3e#O@*xITEIo*{wsxg z9PG0@^X*(RV1WVYKe%2-O-pr}gK$N_9H*+H0z)=Vb`eaD>9X-{_7GAF)j$bs4#=PS zMWmR%;9~v}bI$}ml`OES2I8&1`Gkc5t^hB!D0(!%!)+RRI3f4$^}7^NVs#%OuGBX~;#zZ*K}06}J00+x-LRPuTy$ZsjL@H+|S=V+u38sp%0EGdQF) z#h0q8tK;DAqk-_a)01Nu2*84QQBuEt@Zsafoi>&{)GJrOp&o&QM?mm%XvnZcg`Aum zyl`MY416>Tc8;bQQ*`8IFlO8x!j+Vh^H@%cOqY%pK_@*NH;9agjI65T!!9W)5%ri5 zI2?qZ{(kUR70A_~-Jg<0GyU~y5E;6>J>dBH%a_B^$&*sc>2Ke^i)}h|%(Cm%53U{? zfDs%%Zq1&b=DQ|G{()n?%!S|39NQw~f;JlJ8){buaxzHf07s-OxYxlZ>E^g9HJF*1nV4GKG@_%U z*XnwlYZ7q2b((I$kV%;7h8QvMtINxOQp&=hS>rN(myAvWE~j+xnq4u~U8M8#^{qWQ zTqO!P3sTsKg$)4#qQQDi%!^2^L*K^8$O!CCaQe|{c+AIcc>mhp-$x)|L?t973=AlV zw7~z;(bm2a*Quzg3a7VyAP!(zHRH>6-NMBL7qHbQRaQE~XvS>7baaL20x>Z$h-mw& zshLsuNL(CO1YD3{_<@a2pr8(njr~w6z2b784hmUKuqULrNz%g(A`qTPwU;_whotg7 zaI%34B%5(I#Mho~KEx_`8vJO}u0}Xo6#EsJAm?`?A|k-0y6F%&za2TV?Tm)JOYs3g zO<7+KP85x=C$mdd<2b6(I020yaTC)nP#&`1Uwz6%phy5ytu#YGU|v%P=BaK8wk(BB|TthA!_;emUdUVz2+XeFBKG-Ww1{hK+ zD=X9W=9^qxP-|chnrH}hFa+ngv2o$(I+YhIl0E1`)C7u zcXt8qK~A{6o@U6}+1h@1J&{ghztY1yRM|j%W=eEF>`UC=+Y1j5cd9dC4Xz^y9^@ZN zq-md(bUy95@Sgu{D1-M;fjJy*V(n9hr+I^A;FHNX8oo;hmDsui1zb^Bekqxmw`ghK z9KVv2l3H0?TU%WPDc&=#S!!oNrC{0-_-LU{Rf;N9nIO;)g_nF zSHSp?K|1QwGiKnSbCj|krD#3v^bCaQ1^^ISjjg@Cvl>nKhYxUv5K~drnhqC2T}+a9 zga8h(Ay)B$0~3CJ{(J`3-ZJQ?@Vh+l7MYH_Z}TxU^d=sLD&UTJDHoTjM=9Hm3NXac zuU$iKI>#MS4*Wc4A_yR6k7(7!^79gm$Hm9D z0ZSp|K*BypS^X*+8p4$?!H5MV^ehV_CMG{W|MO?2O*(*(;

B-UM&9E4c3v{eGt# zE{>jEqX4qztPf6(k!IYnh#P)&CYyF>N4i*F&C6D8q33B1*wb}zxZhrxW)N-n71Os!*NB< z<})8ZKe?7FYL)$74v`ixV?x4Rj$)=^3@9pK zqsvRLaGGVWp6s-Ug&7y-Jlak;5_rXCASBLDRJ?Tl+W>QARqPwsKm@rwCvWMX7ZqGJ@ z(|hAi3ml8q#t8B<6og8l=-ijPqD;4M1NMOv1c(Xf0IJOqFk)^VIA6MWQQ!m)6j6q6ItViEJZF})ud3MnwRjjGAK|s<&K5!c9xG8Nk(65r?%Cx`(rSLx~Sug zE&{BCTHvu>GI)jGZMJu8jDm`4qOT8v4oYF`E;f~7!?&HF>c4@5x%f?g9}Q*PPf#qS zQJZu|Q5PCSB`SggWHI0nJzXdrU8lPr4g(Xa{euVf-Cui_Z50V_;-JIYTAt}wl*v6; zD8Z0a<>*OWXSHaB3h@M<87>>E;|`0Kyi{wu+~03(1|U=ge#oW!Y1NugTSc|dmm+xcpBY-7-sW&jQU2M zYnQIXBi#_=f [:test, :package] -version="0.1" +version="0.2" name="mongrel_config" setup_gem(name, version) do |spec| diff --git a/projects/mongrel_config/lib/mongrel_config/init.rb b/projects/mongrel_config/lib/mongrel_config/init.rb index 554cc62b..47caf196 100644 --- a/projects/mongrel_config/lib/mongrel_config/init.rb +++ b/projects/mongrel_config/lib/mongrel_config/init.rb @@ -1,7 +1,7 @@ require 'mongrel' require 'gem_plugin' require 'camping' - +require 'erb' Camping.goes :Configure @@ -16,75 +16,149 @@ module Configure::Controllers end class Start < R '/start' - def get - `mongrel_rails start -d -p 4000` - redirect Index + def get + render :start + end + + def post + @results = `mongrel_rails start -d -p #{input.port} -e #{input.env} -n #{input.num_procs} -a #{input.address}` + render :start_done end end + class Kill < R '/kill/(\w+)' + + def get(signal) + if _running? + @signal = signal.upcase + pid = open($PID_FILE) {|f| f.read } + begin + Process.kill(@signal, pid.to_i) + @results = "Mongrel sent PID #{pid} signal #{@signal}." + rescue + puts "ERROR: #$!" + @results = "Failed to signal the Mongrel process. Maybe it is not running?

#$!

" + end + else + @results = "Mongrel does not seem to be running. Maybe delete the pid file #{$PID_FILE} or start again." + end + + render :kill + end + end + + class Stop < R '/stop' def get - `mongrel_rails stop` - redirect Index + render :stop end end - class Shutdown < R '/shutdown' + class Logs < R '/logs' def get - Thread.new do - STDERR.puts "Shutdown requested..." - sleep 2 - $server.stop - STDERR.puts "Bye." - end - render :shutdown + @log_files = Dir.glob("log/**/*") + render :logs end end + end module Configure::Views def layout - html do - head do - title 'Mongrel Configure Tool' - end - body do - h1 "Mongrel Configure Tool" - - p do - a 'start', :href => R(Start) - a 'stop', :href => R(Stop) - a 'shutdown', :href => R(Shutdown) - a 'logs', :href => "../logs" - end - - div.content do - self << yield - end - end + body_content = yield + currently_running = _running? + pid = _pid + open(GemPlugin::Manager.instance.resource("mongrel_config", "/index.html")) do |f| + template = ERB.new(f.read) + self << template.result(binding) end end def show - body do + div do + h2 { "Status" } if _running? - p { "Running..." } + p { "Currently running with PID #{_pid}." } else - p { "Not running..." } + p { "Mongrel is not running." } end end end - def shutdown - body do - p { "Shutdown shortly..." } + def start + div do + form :action => "/start", :method => "POST" do + p { span { "Port:" }; input :name => "port", :value => "4000" } + p { span { "Environment:" }; input :name => "env", :value => "development" } + p { span { "Address:" }; input :name => "address", :value => "0.0.0.0" } + p { span { "Number Processors:" }; input :name => "num_procs", :value => "20" } + input :type => "submit", :value => "START" + end end end + def start_done + div do + p { @results } + end + end + + def kill + div do + p { @results } + + case @signal + when "HUP": + p { "A reload (HUP) does not stop the process, but may not be complete." } + when "TERM": + p { "Stopped with TERM signal. The process should exit shortly, but only after processing pending requests." } + when "USR2": + p { "Complete restart (USR2) may take a little while. Check status in a few seconds or read logs." } + when "KILL": + p { "Process was violently stopped (KILL) so pending requests will be lost." } + end + end + end + + def stop + if _running? + ul do + li { a "Stop (TERM)", :href => "/kill/term" } + li { a "Reload (HUP)", :href => "/kill/hup" } + li { a "Restart (USR2)", :href => "/kill/usr2" } + li { a "Kill (KILL)", :href => "/kill/kill" } + end + else + p { "Mongrel does not appear to be running (no PID file at #$PID_FILE)." } + end + end + + def logs + div do + h2 { "Logs" } + table do + tr do + th { "File"}; th { "Bytes" }; th { "Last Modified" } + end + @log_files.each do |file| + tr do + td { a file, :href => "../#{file}" } + td { File.size file } + td { File.mtime file } + end + end + end + end + end + def _running? File.exist? $PID_FILE end + + def _pid + open($PID_FILE) {|f| f.read } if _running? + end end def Configure.create @@ -139,7 +213,9 @@ class ConfigTool < GemPlugin::Plugin "/commands" end # add our log directory - $server.register("/logs", Mongrel::DirHandler.new("log")) + $server.register("/log", Mongrel::DirHandler.new("log")) + resources = GemPlugin::Manager.instance.resource "mongrel_config", "/" + $server.register("/config/resources", Mongrel::DirHandler.new(resources)) $server.acceptor.join end diff --git a/projects/mongrel_config/resources/images/0170_bubble.png b/projects/mongrel_config/resources/images/0170_bubble.png new file mode 100644 index 0000000000000000000000000000000000000000..57a289e91c6b84e0ab24e3d574b05204fb72f24b GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^JRr=(3?#Lsx0HZ50X`wF|NsB5uCBg)`}W6=A1CfT z_#Y^4=;`7Z!Z9;Bfr07b1%b9d|K%lv*56~jR4*Cioh`X3?0<>?Z}p)A2P_y@C^2-f bI(RXbf8%vs{D@&8P&0$4tDnm{r-UW|KDsPZ literal 0 HcmV?d00001 diff --git a/projects/mongrel_config/resources/images/0171_new_page.png b/projects/mongrel_config/resources/images/0171_new_page.png new file mode 100644 index 0000000000000000000000000000000000000000..929d49904d1e86ae41f9d71d50e7d5c3da49840f GIT binary patch literal 135 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 literal 0 HcmV?d00001 diff --git a/projects/mongrel_config/resources/images/bottom_orig.gif b/projects/mongrel_config/resources/images/bottom_orig.gif new file mode 100644 index 0000000000000000000000000000000000000000..a2cfcfcac1d9d0d91d2137b7cbd297caa2799f1b GIT binary patch literal 4365 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 Rg0_Bf+rU;^j;=i5@PA>lYg7OL literal 0 HcmV?d00001 diff --git a/projects/mongrel_config/resources/images/middle.jpg b/projects/mongrel_config/resources/images/middle.jpg new file mode 100644 index 0000000000000000000000000000000000000000..447b1a2d348cde42e1e11cde37a2e549b55c0d6f GIT binary patch literal 624 zcmex=PKf)jZaU25@;ACRw0?KFzFfuSOvGO9xFtM_5n3Zf|WM*SGG%_zLZ``>3B2c9W z(6eX&Br1q0dW(UFnGt9?vmk>#!}qsxZ(?@VFu7iTb^6@9FKYyu<{aO?{XznoQKWEL z7OpE7d@|SN!u$C1j_zMsQ&*JdoMR~ekY;;hXVDLq?)6uv&%OIHLW$L~KR>;YPFr|)vjyY*ga2;=07nhILRsh{_1 z2Rv0<&^Y(ZuE&;}g*SgqWa`;0s;JGWrW4pH8^JMW(w)1h>t%})-?Z*>zwL8-|GA@0 zImgYVb9&@Rr4v=$ a9k0q4EcyLV>sQu)2A=wP8a-+MZvp_zm3ch? literal 0 HcmV?d00001 diff --git a/projects/mongrel_config/resources/images/topbar.jpg b/projects/mongrel_config/resources/images/topbar.jpg new file mode 100644 index 0000000000000000000000000000000000000000..83269b082d73a04dbd4686157ce9dd46d4c17038 GIT binary patch literal 16031 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 literal 0 HcmV?d00001 diff --git a/projects/mongrel_config/resources/index.html b/projects/mongrel_config/resources/index.html new file mode 100644 index 00000000..a0700f8a --- /dev/null +++ b/projects/mongrel_config/resources/index.html @@ -0,0 +1,71 @@ + + + +Mongrel Config Tool + + + + +
+
+
Mongrel Config Tool
+
+
+ +
+
+ <% if currently_running %> + Status
+
+ Mongrel is running with PID <%= pid %>. + <% else %> + Status
+
+ Mongrel is not running. + <% end %> +

+
+ Documentation
+
+ Mongrel Home
+
+ + News
+
+ + Getting Started
+
+ + Win32 Guide
+
+ + Lighttpd Guide
+
+ + Mongrel API
+
+ + Ruby On Rails API
+
+ +

+
+ + <%= body_content %> + +
+
+
+ +
 
+ +
Copyright 2006 © Zed A. Shaw   |   Design by Kenneth Barbour.
+ + diff --git a/projects/mongrel_config/resources/style.css b/projects/mongrel_config/resources/style.css new file mode 100644 index 00000000..4c546f90 --- /dev/null +++ b/projects/mongrel_config/resources/style.css @@ -0,0 +1,165 @@ +/* CSS Document */ +body { + margin: 25px auto 0px auto; + background-image: url(/config/resources/images/top.jpg); + background-repeat: repeat-x; + background-position: top; + font-family: "Lucida Grande", Verdana, Halvetica, sans-serif; + text-align: center; + +} +a:hover { + color: #990000; + text-decoration: underline; +} +a { + color: #990000; + text-decoration: none; +} +#container { + font-weight: normal; + margin: 0px auto 0px auto; + width: 686px; + text-align: center; + +} +#main { + padding-top: 50px; + padding-bottom: 50px; + border: 1px solid #CC0000; + height: auto; +} +#title { + font-family: Georgia, "Times New Roman", Times, serif; + font-size: 36px; + color: #FFF; + font-weight: normal; + font-size:36px; + text-align: center; + color: #FFFFFF; + padding-top: 28px; +} +#top { + margin: 0px auto; + width: 686px; + height: 96px; + background: url(/config/resources/images/topbar.jpg) no-repeat +} +#middle { + background: url(/config/resources/images/middle.jpg) no-repeat; + background-repeat: repeat-y; + margin: -2px auto 0px auto; +} +#bottom { + margin: -100px auto 0px; + width: 686px; + height: 106px; + background: url(/config/resources/images/bottom.gif) no-repeat; + clear: center; + +} +#nav { + width: 455px; + padding: 20px 30px 10px; + margin: 0px auto; + color: #999; + font-weight: normal; + font-size: 11px; + text-align: center; + +} +#nav li { + list-style: none; + display: inline; + margin-right: 20px; +} +#nav a { + font-size: 10px; + font-weight: bold; + color: #999; + text-decoration: none; +} +#nav a:hover { + color: #990000; + text-decoration: underline; +} +#content { + padding: 0px 68px 1px 68px; + margin: 0px auto 0px auto; + text-align: left; + height: 370px; +} +#side { + margin: 30px auto 0px auto; + width: 110px; + border-left: 1px dotted #C4D0D7; + padding: 0px 10px 0px 20px; + color: #999; + float: right; + font-size: 70%; +} +#content h2 { + color: #990000; + font-weight: bolder; + font-size: 14px; + padding: 0px 135px 0px 10px; +} +#content h2 a:hover{ + color: #990000; + text-decoration: underline; +} +#content h2 a{ + text-decoration: none; +} +#content h3 { + color: #000000; + font-size: 10px; + letter-spacing: .3em; + padding: 0px 135px 0px 10px; + text-decoration: underline; + +} +#content p { + padding: 0px 170px 0px 10px; + font-size: 70%; + line-height: 1.7em; + margin: 0px 0px 1.7em 0px; + vertical-align: top; + color: #666666; + +} +#footertext { + font-size: 10px; + font-weight: bold; + margin: 20px auto 0px; + height: 20px; + width: 686px; + height: 31px; + text-align: center; + color: #888; +} +#footertext a { + font-size: 10px; + font-weight: bold; + color: #999; + text-decoration: none; +} +#footertext a:hover { + text-decoration: underline; +} + +table { + border-collapse: collapsed; +} + +td { + font-size: 11px; + padding: 5px; +} + +th { + border: 1px #990000 solid; + font-size: 12px; + background-color: #955; + color: #eeeeee; +} \ No newline at end of file diff --git a/projects/mongrel_status/Rakefile b/projects/mongrel_status/Rakefile index cacfa84f..8f48d2c2 100644 --- a/projects/mongrel_status/Rakefile +++ b/projects/mongrel_status/Rakefile @@ -15,7 +15,7 @@ setup_rdoc ['README', 'LICENSE', 'COPYING', 'lib/**/*.rb', 'doc/**/*.rdoc'] desc "Does a full compile, test run" task :default => [:test, :package] -version="0.1" +version="0.2" name="mongrel_status" setup_gem(name, version) do |spec|