PNG  IHDRQgAMA a cHRMz&u0`:pQ<bKGDgmIDATxwUﹻ& ^CX(J I@ "% (** BX +*i"]j(IH{~R)[~>h{}gy)I$Ij .I$I$ʊy@}x.: $I$Ii}VZPC)I$IF ^0ʐJ$I$Q^}{"r=OzI$gRZeC.IOvH eKX $IMpxsk.쒷/&r[޳<v| .I~)@$updYRa$I |M.e JaֶpSYR6j>h%IRز if&uJ)M$I vLi=H;7UJ,],X$I1AҒJ$ XY XzI@GNҥRT)E@;]K*Mw;#5_wOn~\ DC&$(A5 RRFkvIR}l!RytRl;~^ǷJj اy뷦BZJr&ӥ8Pjw~vnv X^(I;4R=P[3]J,]ȏ~:3?[ a&e)`e*P[4]T=Cq6R[ ~ޤrXR Հg(t_HZ-Hg M$ãmL5R uk*`%C-E6/%[t X.{8P9Z.vkXŐKjgKZHg(aK9ڦmKjѺm_ \#$5,)-  61eJ,5m| r'= &ڡd%-]J on Xm|{ RҞe $eڧY XYrԮ-a7RK6h>n$5AVڴi*ֆK)mѦtmr1p| q:흺,)Oi*ֺK)ܬ֦K-5r3>0ԔHjJئEZj,%re~/z%jVMڸmrt)3]J,T K֦OvԒgii*bKiNO~%PW0=dii2tJ9Jݕ{7"I P9JKTbu,%r"6RKU}Ij2HKZXJ,妝 XYrP ެ24c%i^IK|.H,%rb:XRl1X4Pe/`x&P8Pj28Mzsx2r\zRPz4J}yP[g=L) .Q[6RjWgp FIH*-`IMRaK9TXcq*I y[jE>cw%gLRԕiFCj-ďa`#e~I j,%r,)?[gp FI˨mnWX#>mʔ XA DZf9,nKҲzIZXJ,L#kiPz4JZF,I,`61%2s $,VOϚ2/UFJfy7K> X+6 STXIeJILzMfKm LRaK9%|4p9LwJI!`NsiazĔ)%- XMq>pk$-$Q2x#N ؎-QR}ᶦHZډ)J,l#i@yn3LN`;nڔ XuX5pF)m|^0(>BHF9(cզEerJI rg7 4I@z0\JIi䵙RR0s;$s6eJ,`n 䂦0a)S)A 1eJ,堌#635RIgpNHuTH_SԕqVe ` &S)>p;S$魁eKIuX`I4춒o}`m$1":PI<[v9^\pTJjriRŭ P{#{R2,`)e-`mgj~1ϣLKam7&U\j/3mJ,`F;M'䱀 .KR#)yhTq;pcK9(q!w?uRR,n.yw*UXj#\]ɱ(qv2=RqfB#iJmmL<]Y͙#$5 uTU7ӦXR+q,`I}qL'`6Kͷ6r,]0S$- [RKR3oiRE|nӦXR.(i:LDLTJjY%o:)6rxzҒqTJjh㞦I.$YR.ʼnGZ\ֿf:%55 I˼!6dKxm4E"mG_ s? .e*?LRfK9%q#uh$)i3ULRfK9yxm܌bj84$i1U^@Wbm4uJ,ҪA>_Ij?1v32[gLRD96oTaR׿N7%L2 NT,`)7&ƝL*꽙yp_$M2#AS,`)7$rkTA29_Iye"|/0t)$n XT2`YJ;6Jx".e<`$) PI$5V4]29SRI>~=@j]lp2`K9Jaai^" Ԋ29ORI%:XV5]JmN9]H;1UC39NI%Xe78t)a;Oi Ҙ>Xt"~G>_mn:%|~ޅ_+]$o)@ǀ{hgN;IK6G&rp)T2i୦KJuv*T=TOSV>(~D>dm,I*Ɛ:R#ۙNI%D>G.n$o;+#RR!.eU˽TRI28t)1LWϚ>IJa3oFbu&:tJ*(F7y0ZR ^p'Ii L24x| XRI%ۄ>S1]Jy[zL$adB7.eh4%%누>WETf+3IR:I3Xה)3אOۦSRO'ٺ)S}"qOr[B7ϙ.edG)^ETR"RtRݜh0}LFVӦDB^k_JDj\=LS(Iv─aTeZ%eUAM-0;~˃@i|l @S4y72>sX-vA}ϛBI!ݎߨWl*)3{'Y|iSlEڻ(5KtSI$Uv02,~ԩ~x;P4ցCrO%tyn425:KMlD ^4JRxSهF_}شJTS6uj+ﷸk$eZO%G*^V2u3EMj3k%)okI]dT)URKDS 7~m@TJR~荪fT"֛L \sM -0T KfJz+nإKr L&j()[E&I ߴ>e FW_kJR|!O:5/2跌3T-'|zX ryp0JS ~^F>-2< `*%ZFP)bSn"L :)+pʷf(pO3TMW$~>@~ū:TAIsV1}S2<%ޟM?@iT ,Eūoz%i~g|`wS(]oȤ8)$ ntu`өe`6yPl IzMI{ʣzʨ )IZ2= ld:5+請M$-ї;U>_gsY$ÁN5WzWfIZ)-yuXIfp~S*IZdt;t>KūKR|$#LcԀ+2\;kJ`]YǔM1B)UbG"IRߊ<xܾӔJ0Z='Y嵤 Leveg)$znV-º^3Ւof#0Tfk^Zs[*I꯳3{)ˬW4Ւ4 OdpbZRS|*I 55#"&-IvT&/윚Ye:i$ 9{LkuRe[I~_\ؠ%>GL$iY8 9ܕ"S`kS.IlC;Ҏ4x&>u_0JLr<J2(^$5L s=MgV ~,Iju> 7r2)^=G$1:3G< `J3~&IR% 6Tx/rIj3O< ʔ&#f_yXJiގNSz; Tx(i8%#4 ~AS+IjerIUrIj362v885+IjAhK__5X%nV%Iͳ-y|7XV2v4fzo_68"S/I-qbf; LkF)KSM$ Ms>K WNV}^`-큧32ŒVؙGdu,^^m%6~Nn&͓3ŒVZMsRpfEW%IwdǀLm[7W&bIRL@Q|)* i ImsIMmKmyV`i$G+R 0tV'!V)֏28vU7͒vHꦼtxꗞT ;S}7Mf+fIRHNZUkUx5SAJㄌ9MqμAIRi|j5)o*^'<$TwI1hEU^c_j?Е$%d`z cyf,XO IJnTgA UXRD }{H}^S,P5V2\Xx`pZ|Yk:$e ~ @nWL.j+ϝYb퇪bZ BVu)u/IJ_ 1[p.p60bC >|X91P:N\!5qUB}5a5ja `ubcVxYt1N0Zzl4]7­gKj]?4ϻ *[bg$)+À*x쳀ogO$~,5 زUS9 lq3+5mgw@np1sso Ӻ=|N6 /g(Wv7U;zωM=wk,0uTg_`_P`uz?2yI!b`kĸSo+Qx%!\οe|އԁKS-s6pu_(ֿ$i++T8=eY; צP+phxWQv*|p1. ά. XRkIQYP,drZ | B%wP|S5`~́@i޾ E;Չaw{o'Q?%iL{u D?N1BD!owPHReFZ* k_-~{E9b-~P`fE{AܶBJAFO wx6Rox5 K5=WwehS8 (JClJ~ p+Fi;ŗo+:bD#g(C"wA^ r.F8L;dzdIHUX݆ϞXg )IFqem%I4dj&ppT{'{HOx( Rk6^C٫O.)3:s(۳(Z?~ٻ89zmT"PLtw䥈5&b<8GZ-Y&K?e8,`I6e(֍xb83 `rzXj)F=l($Ij 2*(F?h(/9ik:I`m#p3MgLaKjc/U#n5S# m(^)=y=đx8ŬI[U]~SцA4p$-F i(R,7Cx;X=cI>{Km\ o(Tv2vx2qiiDJN,Ҏ!1f 5quBj1!8 rDFd(!WQl,gSkL1Bxg''՞^ǘ;pQ P(c_ IRujg(Wz bs#P­rz> k c&nB=q+ؔXn#r5)co*Ũ+G?7< |PQӣ'G`uOd>%Mctz# Ԫڞ&7CaQ~N'-P.W`Oedp03C!IZcIAMPUۀ5J<\u~+{9(FbbyAeBhOSܳ1 bÈT#ŠyDžs,`5}DC-`̞%r&ڙa87QWWp6e7 Rϫ/oY ꇅ Nܶըtc!LA T7V4Jsū I-0Pxz7QNF_iZgúWkG83 0eWr9 X]㾮݁#Jˢ C}0=3ݱtBi]_ &{{[/o[~ \q鯜00٩|cD3=4B_b RYb$óBRsf&lLX#M*C_L܄:gx)WΘsGSbuL rF$9';\4Ɍq'n[%p.Q`u hNb`eCQyQ|l_C>Lb꟟3hSb #xNxSs^ 88|Mz)}:](vbۢamŖ࿥ 0)Q7@0=?^k(*J}3ibkFn HjB׻NO z x}7p 0tfDX.lwgȔhԾŲ }6g E |LkLZteu+=q\Iv0쮑)QٵpH8/2?Σo>Jvppho~f>%bMM}\//":PTc(v9v!gոQ )UfVG+! 35{=x\2+ki,y$~A1iC6#)vC5^>+gǵ@1Hy٪7u;p psϰu/S <aʸGu'tD1ԝI<pg|6j'p:tպhX{o(7v],*}6a_ wXRk,O]Lܳ~Vo45rp"N5k;m{rZbΦ${#)`(Ŵg,;j%6j.pyYT?}-kBDc3qA`NWQū20/^AZW%NQ MI.X#P#,^Ebc&?XR tAV|Y.1!؅⨉ccww>ivl(JT~ u`ٵDm q)+Ri x/x8cyFO!/*!/&,7<.N,YDŽ&ܑQF1Bz)FPʛ?5d 6`kQձ λc؎%582Y&nD_$Je4>a?! ͨ|ȎWZSsv8 j(I&yj Jb5m?HWp=g}G3#|I,5v珿] H~R3@B[☉9Ox~oMy=J;xUVoj bUsl_35t-(ՃɼRB7U!qc+x4H_Qo֮$[GO<4`&č\GOc[.[*Af%mG/ ňM/r W/Nw~B1U3J?P&Y )`ѓZ1p]^l“W#)lWZilUQu`-m|xĐ,_ƪ|9i:_{*(3Gѧ}UoD+>m_?VPۅ15&}2|/pIOʵ> GZ9cmíتmnz)yߐbD >e}:) r|@R5qVSA10C%E_'^8cR7O;6[eKePGϦX7jb}OTGO^jn*媓7nGMC t,k31Rb (vyܴʭ!iTh8~ZYZp(qsRL ?b}cŨʊGO^!rPJO15MJ[c&~Z`"ѓޔH1C&^|Ш|rʼ,AwĴ?b5)tLU)F| &g٣O]oqSUjy(x<Ϳ3 .FSkoYg2 \_#wj{u'rQ>o;%n|F*O_L"e9umDds?.fuuQbIWz |4\0 sb;OvxOSs; G%T4gFRurj(֍ڑb uԖKDu1MK{1^ q; C=6\8FR艇!%\YÔU| 88m)֓NcLve C6z;o&X x59:q61Z(T7>C?gcļxѐ Z oo-08jہ x,`' ҔOcRlf~`jj".Nv+sM_]Zk g( UOPyεx%pUh2(@il0ݽQXxppx-NS( WO+轾 nFߢ3M<;z)FBZjciu/QoF 7R¥ ZFLF~#ȣߨ^<쩡ݛкvџ))ME>ώx4m#!-m!L;vv#~Y[đKmx9.[,UFS CVkZ +ߟrY٧IZd/ioi$%͝ب_ֶX3ܫhNU ZZgk=]=bbJS[wjU()*I =ώ:}-蹞lUj:1}MWm=̛ _ ¾,8{__m{_PVK^n3esw5ӫh#$-q=A̟> ,^I}P^J$qY~Q[ Xq9{#&T.^GVj__RKpn,b=`żY@^՝;z{paVKkQXj/)y TIc&F;FBG7wg ZZDG!x r_tƢ!}i/V=M/#nB8 XxЫ ^@CR<{䤭YCN)eKOSƟa $&g[i3.C6xrOc8TI;o hH6P&L{@q6[ Gzp^71j(l`J}]e6X☉#͕ ׈$AB1Vjh㭦IRsqFBjwQ_7Xk>y"N=MB0 ,C #o6MRc0|$)ف"1!ixY<B9mx `,tA>)5ػQ?jQ?cn>YZe Tisvh# GMމȇp:ԴVuږ8ɼH]C.5C!UV;F`mbBk LTMvPʍϤj?ԯ/Qr1NB`9s"s TYsz &9S%U԰> {<ؿSMxB|H\3@!U| k']$U+> |HHMLޢ?V9iD!-@x TIî%6Z*9X@HMW#?nN ,oe6?tQwڱ.]-y':mW0#!J82qFjH -`ѓ&M0u Uγmxϵ^-_\])@0Rt.8/?ٰCY]x}=sD3ojަЫNuS%U}ԤwHH>ڗjܷ_3gN q7[q2la*ArǓԖ+p8/RGM ]jacd(JhWko6ڎbj]i5Bj3+3!\j1UZLsLTv8HHmup<>gKMJj0@H%,W΃7R) ">c, xixј^ aܖ>H[i.UIHc U1=yW\=S*GR~)AF=`&2h`DzT󑓶J+?W+}C%P:|0H܆}-<;OC[~o.$~i}~HQ TvXΈr=b}$vizL4:ȰT|4~*!oXQR6Lk+#t/g lԁߖ[Jڶ_N$k*". xsxX7jRVbAAʯKҎU3)zSNN _'s?f)6X!%ssAkʱ>qƷb hg %n ~p1REGMHH=BJiy[<5 ǁJҖgKR*倳e~HUy)Ag,K)`Vw6bRR:qL#\rclK/$sh*$ 6덤 KԖc 3Z9=Ɣ=o>X Ώ"1 )a`SJJ6k(<c e{%kϊP+SL'TcMJWRm ŏ"w)qc ef꒵i?b7b('"2r%~HUS1\<(`1Wx9=8HY9m:X18bgD1u ~|H;K-Uep,, C1 RV.MR5άh,tWO8WC$ XRVsQS]3GJ|12 [vM :k#~tH30Rf-HYݺ-`I9%lIDTm\ S{]9gOڒMNCV\G*2JRŨ;Rҏ^ڽ̱mq1Eu?To3I)y^#jJw^Ńj^vvlB_⋌P4x>0$c>K†Aļ9s_VjTt0l#m>E-,,x,-W)سo&96RE XR.6bXw+)GAEvL)͞K4$p=Ũi_ѱOjb HY/+@θH9޼]Nԥ%n{ &zjT? Ty) s^ULlb,PiTf^<À] 62R^V7)S!nllS6~͝V}-=%* ʻ>G DnK<y&>LPy7'r=Hj 9V`[c"*^8HpcO8bnU`4JȪAƋ#1_\ XϘHPRgik(~G~0DAA_2p|J묭a2\NCr]M_0 ^T%e#vD^%xy-n}-E\3aS%yN!r_{ )sAw ڼp1pEAk~v<:`'ӭ^5 ArXOI驻T (dk)_\ PuA*BY]yB"l\ey hH*tbK)3 IKZ򹞋XjN n *n>k]X_d!ryBH ]*R 0(#'7 %es9??ښFC,ՁQPjARJ\Ρw K#jahgw;2$l*) %Xq5!U᢯6Re] |0[__64ch&_}iL8KEgҎ7 M/\`|.p,~`a=BR?xܐrQ8K XR2M8f ?`sgWS%" Ԉ 7R%$ N}?QL1|-эټwIZ%pvL3Hk>,ImgW7{E xPHx73RA @RS CC !\ȟ5IXR^ZxHл$Q[ŝ40 (>+ _C >BRt<,TrT {O/H+˟Pl6 I B)/VC<6a2~(XwV4gnXR ϱ5ǀHٻ?tw똤Eyxp{#WK qG%5],(0ӈH HZ])ג=K1j&G(FbM@)%I` XRg ʔ KZG(vP,<`[ Kn^ SJRsAʠ5xՅF`0&RbV tx:EaUE/{fi2;.IAwW8/tTxAGOoN?G}l L(n`Zv?pB8K_gI+ܗ #i?ޙ.) p$utc ~DžfՈEo3l/)I-U?aԅ^jxArA ΧX}DmZ@QLےbTXGd.^|xKHR{|ΕW_h] IJ`[G9{).y) 0X YA1]qp?p_k+J*Y@HI>^?gt.06Rn ,` ?);p pSF9ZXLBJPWjgQ|&)7! HjQt<| ؅W5 x W HIzYoVMGP Hjn`+\(dNW)F+IrS[|/a`K|ͻ0Hj{R,Q=\ (F}\WR)AgSG`IsnAR=|8$}G(vC$)s FBJ?]_u XRvύ6z ŨG[36-T9HzpW̞ú Xg큽=7CufzI$)ki^qk-) 0H*N` QZkk]/tnnsI^Gu't=7$ Z;{8^jB% IItRQS7[ϭ3 $_OQJ`7!]W"W,)Iy W AJA;KWG`IY{8k$I$^%9.^(`N|LJ%@$I}ֽp=FB*xN=gI?Q{٥4B)mw $Igc~dZ@G9K X?7)aK%݅K$IZ-`IpC U6$I\0>!9k} Xa IIS0H$I H ?1R.Чj:4~Rw@p$IrA*u}WjWFPJ$I➓/6#! LӾ+ X36x8J |+L;v$Io4301R20M I$-E}@,pS^ޟR[/s¹'0H$IKyfŸfVOπFT*a$I>He~VY/3R/)>d$I>28`Cjw,n@FU*9ttf$I~<;=/4RD~@ X-ѕzἱI$: ԍR a@b X{+Qxuq$IЛzo /~3\8ڒ4BN7$IҀj V]n18H$IYFBj3̵̚ja pp $Is/3R Ӻ-Yj+L;.0ŔI$Av? #!5"aʄj}UKmɽH$IjCYs?h$IDl843.v}m7UiI=&=0Lg0$I4: embe` eQbm0u? $IT!Sƍ'-sv)s#C0:XB2a w I$zbww{."pPzO =Ɔ\[ o($Iaw]`E).Kvi:L*#gР7[$IyGPI=@R 4yR~̮´cg I$I/<tPͽ hDgo 94Z^k盇΄8I56^W$I^0̜N?4*H`237}g+hxoq)SJ@p|` $I%>-hO0eO>\ԣNߌZD6R=K ~n($I$y3D>o4b#px2$yڪtzW~a $I~?x'BwwpH$IZݑnC㧄Pc_9sO gwJ=l1:mKB>Ab<4Lp$Ib o1ZQ@85b̍ S'F,Fe,^I$IjEdù{l4 8Ys_s Z8.x m"+{~?q,Z D!I$ϻ'|XhB)=…']M>5 rgotԎ 獽PH$IjIPhh)n#cÔqA'ug5qwU&rF|1E%I$%]!'3AFD/;Ck_`9 v!ٴtPV;x`'*bQa w I$Ix5 FC3D_~A_#O݆DvV?<qw+I$I{=Z8".#RIYyjǪ=fDl9%M,a8$I$Ywi[7ݍFe$s1ՋBVA?`]#!oz4zjLJo8$I$%@3jAa4(o ;p,,dya=F9ً[LSPH$IJYЉ+3> 5"39aZ<ñh!{TpBGkj}Sp $IlvF.F$I z< '\K*qq.f<2Y!S"-\I$IYwčjF$ w9 \ߪB.1v!Ʊ?+r:^!I$BϹB H"B;L'G[ 4U#5>੐)|#o0aڱ$I>}k&1`U#V?YsV x>{t1[I~D&(I$I/{H0fw"q"y%4 IXyE~M3 8XψL}qE$I[> nD?~sf ]o΁ cT6"?'_Ἣ $I>~.f|'!N?⟩0G KkXZE]ޡ;/&?k OۘH$IRۀwXӨ<7@PnS04aӶp.:@\IWQJ6sS%I$e5ڑv`3:x';wq_vpgHyXZ 3gЂ7{{EuԹn±}$I$8t;b|591nءQ"P6O5i }iR̈́%Q̄p!I䮢]O{H$IRϻ9s֧ a=`- aB\X0"+5"C1Hb?߮3x3&gşggl_hZ^,`5?ߎvĸ%̀M!OZC2#0x LJ0 Gw$I$I}<{Eb+y;iI,`ܚF:5ܛA8-O-|8K7s|#Z8a&><a&/VtbtLʌI$I$I$I$I$I$IRjDD%tEXtdate:create2022-05-31T04:40:26+00:00!Î%tEXtdate:modify2022-05-31T04:40:26+00:00|{2IENDB`Mini Shell

HOME


Mini Shell 1.0
DIR:/proc/self/root/usr/local/lsws/admin/html.6.3.1/classes/ws/
Upload File :
Current File : //proc/self/root/usr/local/lsws/admin/html.6.3.1/classes/ws/ConfCenter.php
<?php

class ConfCenter
{

    public $_confType ; //'serv','admin'
    public $_serv ;
    public $_curOne ; //vh or tp
    public $_info ;
    private $_disp ;
    private $_validator ;
    private static $_instance = null ;

    // prevent an object from being constructed
    private function __construct()
    {

    }

    public static function singleton()
    {

        if ( ! isset(self::$_instance) ) {
            $c = __CLASS__ ;
            self::$_instance = new $c ;
            self::$_instance->init() ;
        }

        return self::$_instance ;
    }

    private function init()
    {
        $mid = DUtil::grab_input("request", 'm') ;
        $this->_confType = ( $mid != null && $mid[0] == 'a' ) ? 'admin' : 'serv' ;

        $this->_disp = new DispInfo('confMgr.php?') ;

        $this->loadConfig() ;

        if ( CLIENT::singleton()->getTimeout() == 0 ) {
            $this->setSessionTimeout() ;
        }
    }

    private function GetValidator()
    {
        if ( $this->_validator == null )
            $this->_validator = new ConfValidation() ;
        return $this->_validator ;
    }

    public function GetDispInfo()
    {
        return $this->_disp ;
    }

    public function &ExportConf()
    {
        $data = [] ;
        $listeners = [] ;
        if ( isset($this->_serv->_data['listeners']) ) {
            $lnames = array_keys($this->_serv->_data['listeners']) ;
            foreach ( $lnames as $ln ) {
                $listeners[$ln] = DUtil::getDataVal($this->_serv->_data['listeners'][$ln], 'address');
            }
        }

        $data['listener'] = $listeners ;
        $vhnames = [] ;
        if ( isset($this->_serv->_data['vhTop']) )
            $vhnames = array_keys($this->_serv->_data['vhTop']) ;
        if ( isset($this->_serv->_data['tpTop']) ) {
            foreach ( $this->_serv->_data['tpTop'] as $tp ) {
                if ( isset($tp['member']) ) {
                    $vhnames = array_merge($vhnames, array_keys($tp['member'])) ;
                }
            }
        }

        $data['vhost'] = $vhnames ;
        $data['serv'] = $this->_serv->_id ;
        $data['servLog'] = $this->getAbsFile(DUtil::getDataVal($this->_serv->_data['general']['log'], 'fileName'), 'SR') ;

        return $data ;
    }

    public function GetAdminEmails()
    {
        return DUtil::getDataVal($this->_serv->_data['general'], 'adminEmails');
    }

    private function setSessionTimeout()
    {
        $timeout = 600 ;
        if ( $this->_confType == 'admin' ) {
            $t = DUtil::getDataVal($this->_serv->_data['general'], 'sessionTimeout') ;
        }
        else {
            $adminFile = $this->GetConfFilePath('admin') ;
            $t = ConfigFileEx::grepTagValue($adminFile, 'sessionTimeout') ;
        }
        if ( ($t != null) && is_numeric($t) && ($t >= 60) ) {
            $timeout = $t ;
        }


        CLIENT::singleton()->setTimeout($timeout) ;
    }

    public function GetConfFilePath( $type, $name = '' )
    {
        $path = null ;
        if ( $type == 'serv' ) {
            $path = $_SERVER['LS_SERVER_ROOT'] . "conf/httpd_config.xml" ; //fixed location
        }
        elseif ( $type == 'admin' ) {
            $servconf = $this->GetConfFilePath('serv') ;
            $adminRoot = $this->getAbsFile('$SERVER_ROOT/admin/', 'SR') ; //fixed loc

            if ( $name == '' ) {
                $path = $adminRoot . 'conf/admin_config.xml' ;
            }
            elseif ( $name == 'key' ) {
                $path = $adminRoot . 'conf/jcryption_keypair' ;
            }
        }
        elseif ( $type == 'vh' ) {
            $path = $this->getAbsFile(DUtil::getDataVal($this->_serv->_data['vhTop'][$name], 'configFile'), 'VR', $name) ;
        }
        else {
            $path = $this->getAbsFile(DUtil::getDataVal($this->_serv->_data['tpTop'][$name], 'templateFile'), 'SR', $name) ;
        }
        return $path ;
    }

    private function loadConfig()
    {
        $confpath = $this->GetConfFilePath($this->_confType) ;
        $this->_serv = new ConfData($this->_confType, $confpath) ;

        $config = new ConfigFile() ;

        $err = '' ;
        $res = $config->load($this->_serv, $err) ;
        if ( ! $res ) {
            $this->_info['CONF_FILE_ERR'] = $err ;
            return false ;
        }

        if ( $this->_confType == 'serv' ) {
            $serverName = DUtil::getDataVal($this->_serv->_data['general'], 'serverName') ;
            if ( $serverName == '$HOSTNAME' || $serverName == '' ) {
                $serverName = php_uname('n') ;
            }
            $this->_serv->setId($serverName) ;
            $this->_disp->init($this->_serv->_id) ;
        }
        $this->genMenuInfo() ;

        if ( $this->_disp->_type == 'vh' || $this->_disp->_type == 'tp' ) {
            $vhpath = $this->GetConfFilePath($this->_disp->_type, $this->_disp->_name) ;
            $this->_curOne = new ConfData($this->_disp->_type, $vhpath, $this->_disp->_name) ;
            $res = $config->load($this->_curOne, $err) ;

            if ( ! $res ) {
                $this->_info['CONF_FILE_ERR'] = $err ;
                return false ;
            }

            if ( $this->_disp->_type == 'vh' ) {
                $this->_info['VH_NAME'] = $this->_disp->_name ;
                $this->getAbsFile('$VH_ROOT/', 'VR', $this->_disp->_name) ; //set $this->_info['VH_ROOT']
                $this->getAbsFile('$DOC_ROOT/', 'DR', $this->_disp->_name) ; // set $this->_info['DOC_ROOT']
            }
        }

        $this->loadSpecial() ;
        $viewActions = array( 'C' ) ;
        if ( ! in_array($this->_disp->_act, $viewActions) ) {
            $this->refreshInfo() ;
        }

        return true ;
    }

    private function genMenuInfo()
    {
        if ( $this->_confType == 'serv' ) {
            $this->_info['LNS'] = [] ;
            if ( isset($this->_serv->_data['listeners']) ) {
                $keys = DUtil::array_string_keys($this->_serv->_data['listeners']) ;
                sort($keys) ;
                foreach ( $keys as $name ) {
                    $this->_info['LNS'][$name] = $name ;
                }
            }

            $this->_info['VHS'] = [] ;

            if ( isset($this->_serv->_data['vhTop']) ) {
                $keys = DUtil::array_string_keys($this->_serv->_data['vhTop']) ;
                sort($keys) ;
                foreach ( $keys as $name ) {
                    $this->_info['VHS'][$name] = $name ;
                }
            }
        }
    }

    private function getAbsFile( $filename, $type, $vn = null )
    {
        // type = 'SR', 'VR', 'DR'
        if ( $vn != null && strpos($filename, '$VH_NAME') !== false ) {
            $filename = str_replace('$VH_NAME', $vn, $filename) ;
        }
        $s = substr($filename, 0, 1) ;
        if ( $s == '$' ) {
            if ( strncasecmp('$SERVER_ROOT', $filename, 12) == 0 ) {
                $filename = $_SERVER['LS_SERVER_ROOT'] . substr($filename, 13) ;
            }
            elseif ( ($type == 'VR' || $type == 'DR') && (strncasecmp('$VH_ROOT', $filename, 8) == 0) ) {
                if ( ! isset($this->_info['VH_ROOT']) && $vn ) {
                    $vhroot = $this->getAbsFile(DUtil::getDataVal($this->_serv->_data['vhTop'][$vn], 'vhRoot'), 'SR', $vn) ;
                    if ( substr($vhroot, -1, 1) !== '/' )
                        $vhroot .= '/' ;
                    $this->_info['VH_ROOT'] = $vhroot ;
                }
                else
                    $vhroot = $this->_info['VH_ROOT'] ;

                $filename = $vhroot . substr($filename, 9) ;
            }
            elseif ( $type == 'DR' && (strncasecmp('$DOC_ROOT', $filename, 9) == 0) ) {
                if ( ! isset($this->_info['DOC_ROOT']) ) {
                    if ( isset($this->_curOne->_data['general']['docRoot']) && $this->_curOne->_data['general']['docRoot']->HasVal() ) {
                        $docroot = $this->getAbsFile(DUtil::getDataVal($this->_curOne->_data['general'], 'docRoot'), 'VR', $vn) ;
                        if ( substr($docroot, -1, 1) !== '/' )
                            $docroot .= '/' ;
                        $this->_info['DOC_ROOT'] = $docroot ;
                    }
					else {
						$docroot = ''; // init to void undefined warning.
					}
                }
                else
                    $docroot = $this->_info['DOC_ROOT'] ;
                $filename = $docroot . substr($filename, 10) ;
            }
        }
        elseif ( $s == '/' ) {
            if ( isset($_SERVER['LS_CHROOT']) ) {
                $root = $_SERVER['LS_CHROOT'] ;
                $len = strlen($root) ;
                if ( strncmp($filename, $root, $len) == 0 )
                    $filename = substr($filename, $len) ;
            }
        }
        else { // treat relative path to SERVER_ROOT
            $filename = $_SERVER['LS_SERVER_ROOT'] . $filename;
        }
        return $filename ;
    }

    private function savePost( $extractData, $disp, $tbl, &$cur_ref )
    {
        $oldConf = &$this->getConfData($disp) ;
        $data = &DUtil::locateData($oldConf, $tbl->_dataLoc, $disp->_ref) ;
        $data0 = &$data ;

        $oldRef = $cur_ref ;
        $newRef = null ;

        if ( $tbl->_holderIndex != null ) {
            $newRef = DUtil::getDataVal($extractData, $tbl->_holderIndex) ;
            if ( $cur_ref != null && $cur_ref != $newRef && isset($data[$cur_ref]) ) {
                $data[$newRef] = $data[$cur_ref] ;
                unset($data[$cur_ref]) ;
            }
            $cur_ref = $newRef ;
            $data = &$data[$cur_ref] ;
        }

        if ( isset($tbl->_defaultExtract) ) {
            foreach ( $tbl->_defaultExtract as $k => $v ) {
                if ( $v == '$$' )
                    $data[$k] = $extractData[$k] ;
                else
                    $data[$k] = new CVal($v) ;
            }
        }

        $index = array_keys($tbl->_dattrs) ;
        foreach ( $index as $i ) {
            $attr = &$tbl->_dattrs[$i] ;
            if ( $attr == null || $attr->bypassSavePost() )
                continue ;
            $data[$attr->_key] = $extractData[$attr->_key] ;
        }

        if ( strncmp('VH_CTX', $tbl->_id, 6) == 0 && $oldRef == null ) {
            $data['order'] = new CVal(count($data0)) ;
        }
        elseif ( in_array($tbl->_id, array( 'VH_BASE', 'TP', 'L_GENERAL', 'ADMIN_L_GENERAL' )) ) {
            $oldRef = $disp->_name ;
            $newRef = DUtil::getDataVal($data, 'name') ;
        }

        $this->checkRefresh($tbl->_id, 's', $oldRef, $newRef, $disp) ;
    }

    private function saveFile( $type, $name, $tid = null, $ref = null )
    {
        $config = new ConfigFile() ;
        $res = false ;
        $restart_required = true ;

        if ( $tid == 'SERV_MIME' ) {
            $res = ConfigFileEx::saveMime($this->_info['MIME_FILE'], $this->_serv->_data['MIME']) ;
        }
        elseif ( $tid == 'VH_UDB' ) {
            DUtil::trimLastId($ref) ;
            $ref = DUtil::getLastId($ref) ;
            $res = ConfigFileEx::saveUserDB($this->_info['UDB_FILE'], $this->_curOne->_data['UDB'][$ref]) ;
            $restart_required = false ;
        }
        elseif ( $tid == 'VH_GDB' ) {
            DUtil::trimLastId($ref) ;
            $ref = DUtil::getLastId($ref) ;
            $res = ConfigFileEx::saveGroupDB($this->_info['GDB_FILE'], $this->_curOne->_data['GDB'][$ref]) ;
            $restart_required = false ;
        }
        elseif ( $tid == 'ADMIN_USR' || $tid == 'ADMIN_USR_NEW' ) {
            $file = $_SERVER['LS_SERVER_ROOT'] . 'admin/conf/htpasswd' ;
            $res = ConfigFileEx::saveUserDB($file, $this->_serv->_data['ADM']) ;
            $restart_required = false ;
        }
        elseif ( $type == 'serv' || $type == 'sltop' || $type == 'sl' || $type == 'vhtop' || $type == 'tptop' || ($type == 'tp' && ($tid == 'TP_MEMBER' || $tid == 'TP')) || ($type == 'vh' && stristr($tid, 'VH_BASE')) ) {
            $res = $config->save($this->_serv) ;
        }
        elseif ( $type == 'admin' || $type == 'altop' || $type == 'al' ) {
            $res = $config->save($this->_serv) ;
            $this->setSessionTimeout() ;
        }
        elseif ( $type == 'vh' || $type == 'tp' ) {
            if ( ! isset($this->_curOne) ) {
                $curpath = $this->GetConfFilePath($type, $name) ;
                $this->_curOne = new ConfData($type, $curpath, $name) ;
            }
            $res = $config->save($this->_curOne) ;
        }

        if ( $restart_required && $res ) {
            CLIENT::singleton()->setChanged() ;
        }
        return $res ;
    }

    private function &loadKeys( $list )
    {
        if ( isset($list) && count($list) > 0 ) {
            $temp = array_keys($list) ;
            return $temp ;
        }
        else {
            $temp = null ;
            return $temp ;
        }
    }

    private function refreshInfo()
    {
        $handler = [] ;

        if ( isset($this->_serv->_data['ext']) ) {
            foreach ( $this->_serv->_data['ext'] as $name => $e ) {
                $handler[$e['type']->GetVal()][$name] = '[Server Level]: ' . $name ;
            }
        }
        $handler['cgi']['cgi'] = 'CGI Daemon' ;

        if ( isset($this->_curOne->_data['ext']) ) {
            foreach ( $this->_curOne->_data['ext'] as $name => $e ) {
                $handler[$e['type']->GetVal()][$name] = '[VHost Level]: ' . $name ;
            }
        }
        $this->_info['ext'] = $handler ;

        if ( isset($this->_curOne) && isset($this->_curOne->_data['sec']['realm']) ) {
            $realms = [] ;
            $rn = $this->loadKeys($this->_curOne->_data['sec']['realm']) ;
            if ( $rn != null ) {
                foreach ( $rn as $name ) {
                    $realms[$name] = $name ;
                }
            }
            $this->_info['realms'] = $realms ;
        }
    }

    private function changeName_VH( $oldName, $newName )
    {

        //$vhconf = $this->GetConfFilePath('vh', $newName);
        //if ( !file_exists($vhconf) ) {
        //$this->saveFile('vh', $newName);
        //}

        $l = &$this->_serv->_data['listeners'] ;
        $lnames = array_keys($l) ;
        foreach ( $lnames as $ln ) {
            if ( isset($l[$ln]['vhMap'][$oldName]) ) {
                $map = $l[$ln]['vhMap'][$oldName] ;
                $map['vhost']->SetVal($newName) ;
                unset($l[$ln]['vhMap'][$oldName]) ;
                $l[$ln]['vhMap'][$newName] = $map ;
            }
        }
        $this->_serv->_data['vhTop'][$newName] = $this->_serv->_data['vhTop'][$oldName] ;
        unset($this->_serv->_data['vhTop'][$oldName]) ;
        $this->_disp->_mid = "vh_$newName" ;
        $this->_disp->_name = $newName ;
        $this->_curOne->_id = $newName ;
        $this->_disp->init() ;
    }

    private function changeName_TP( $oldName, $newName )
    {
        $this->_serv->_data['tpTop'][$newName] = $this->_serv->_data['tpTop'][$oldName] ;
        unset($this->_serv->_data['tpTop'][$oldName]) ;
        $this->_disp->_mid = "tp_$newName" ;
        $this->_disp->_name = $newName ;
        $this->_curOne->_id = $newName ;
        $this->_disp->init() ;
    }

    private function changeName_L( $oldName, $newName )
    {
        if ( $this->_serv->_data['tpTop'] != null && count($this->_serv->_data['tpTop']) > 0 ) {
            $tns = array_keys($this->_serv->_data['tpTop']) ;
            foreach ( $tns as $tn ) {
                $tl = $this->_serv->_data['tpTop'][$tn]['listeners'] ;
                $vals = DUtil::splitMultiple($tl->GetVal()) ;
                foreach ( $vals as $i => $v ) {
                    if ( $v == $oldName )
                        $vals[$i] = $newName ;
                }
                $tl->SetVal(implode(', ', $vals)) ;
            }
        }
        $this->_serv->_data['listeners'][$newName] = $this->_serv->_data['listeners'][$oldName] ;
        unset($this->_serv->_data['listeners'][$oldName]);
        $this->_disp->_mid = "sl_$newName" ;
        $this->_disp->_name = $newName ;
        $this->_disp->init() ;
    }

    private function changeName_EXT( $oldName, $newName )
    {
        if ( isset($this->_curOne) ) {
            $data = &$this->_curOne->_data ;
        }
        else {
            $data = &$this->_serv->_data ;
        }

        if ( $data['scriptHandler'] != null ) {
            $keys = array_keys($data['scriptHandler']) ;
            foreach ( $keys as $key ) {
                $sh = &$data['scriptHandler'][$key] ;
                if ( $sh['handler']->GetVal() == $oldName )
                    $sh['handler']->SetVal($newName) ;
            }
        }

        if ( isset($data['context']) ) {
            $keys = array_keys($data['context']) ;
            foreach ( $keys as $key ) {
                $ctx = &$data['context'][$key] ;
                if ( isset($ctx['authorizer']) && $ctx['authorizer']->GetVal() == $oldName )
                    $ctx['authorizer']->SetVal($newName) ;
                if ( isset($ctx['handler']) && $ctx['handler']->GetVal() == $oldName )
                    $ctx['handler']->SetVal($newName) ;
            }
        }
    }

    private function changeName_REALM( $oldName, $newName )
    {
        $data = &$this->_curOne->_data ;
        if ( $data['context'] != null ) {
            $keys = array_keys($data['context']) ;
            foreach ( $keys as $key ) {
                $ctx = &$data['context'][$key] ;
                if ( isset($ctx['realm']) && $ctx['realm']->GetVal() == $oldName )
                    $ctx['realm']->SetVal($newName) ;
            }
        }
    }

    private function &getConfData( $disp )
    {
        $data = null ;
        if ( $disp->_type == 'vh' ) {
            if ( $disp->_pid == 'base' ) {
                $data = &$this->_serv->_data['vhTop'][$disp->_name] ;
            }
            else {
                $data = &$this->_curOne->_data ;
            }
        }
        elseif ( $disp->_type == 'tp' ) {
            if ( $disp->_pid == 'member' ) {
                $data = &$this->_serv->_data['tpTop'][$disp->_name] ;
            }
            else {
                $data = &$this->_curOne->_data ;
            }
        }
        elseif ( $disp->_type[0] == 'a' ) {
            if ( $disp->_type == 'al' ) {
                $data = &$this->_serv->_data['listeners'][$disp->_name] ;
            }
            else {
                $data = &$this->_serv->_data ;
            }
        }
        else {
            if ( $disp->_type == 'sl' ) {
                $data = &$this->_serv->_data['listeners'][$disp->_name] ;
            }
            elseif ( $disp->_type == 'tptop' && $disp->_pid == 'tpTop1' ) {
                $data = &$this->_serv->_data['tpTop'][$disp->_ref] ;
            }
            else {
                $data = &$this->_serv->_data ;
            }
        }
        return $data ;
    }

    private function loadSpecial()
    {
        $tid = DUtil::getLastId($this->_disp->_tid) ;

        if ( $this->_disp->_type == 'serv' ) {

            if ( $tid == 'SERV_MIME_TOP' || $tid == 'SERV_MIME' ) {
                $file = $this->getAbsFile(DUtil::getDataVal($this->_serv->_data['general'], 'mime'), 'SR') ;
                $this->_serv->_data['MIME'] = &ConfigFileEx::loadMime($file) ;
                $this->_info['MIME_FILE'] = $file ;
            }
        }
        elseif ( $this->_disp->_type == 'admin' ) {

            if ( $this->_disp->_pid == 'security' ) {
                $file = $_SERVER['LS_SERVER_ROOT'] . 'admin/conf/htpasswd' ;
                $this->_serv->_data['ADM'] = ConfigFileEx::loadUserDB($file) ;
            }
        }
        elseif ( $this->_disp->_type == 'vh' ) {

            if ( $tid == 'VH_UDB' || $tid == 'VH_GDB' ) {
                $temp = explode('`', $this->_disp->_ref) ;
                $ref = $temp[0] ;
            }
            else {
                $ref = DUtil::getLastId($this->_disp->_ref) ;
            }

            if ( $tid == 'VH_UDB_TOP' || $tid == 'VH_UDB' ) {
                $loc = DUtil::getDataVal($this->_curOne->_data['sec']['realm'][$ref], 'userDB:location') ;
                $file = $this->getAbsFile($loc, 'VR', $this->_info['VH_NAME']) ;
                $this->_info['UDB_FILE'] = $file ;
                $this->_curOne->_data['UDB'][$ref] = ConfigFileEx::loadUserDB($file) ;
            }
            elseif ( $tid == 'VH_GDB_TOP' || $tid == 'VH_GDB' ) {
                $loc = DUtil::getDataVal($this->_curOne->_data['sec']['realm'][$ref], 'groupDB:location') ;
                $file = $this->getAbsFile($loc, 'VR', $this->_info['VH_NAME']) ;
                $this->_info['GDB_FILE'] = $file ;
                $this->_curOne->_data['GDB'][$ref] = &ConfigFileEx::loadGroupDB($file) ;
            }
        }
    }

    private function checkRefresh( $tid, $act, $oldRef, $newRef, $disp )
    {
        if ( $tid == 'SERV_PROCESS' ) {
            $serverName = DUtil::getDataVal($this->_serv->_data['general'], 'serverName') ;
            if ( $serverName != $this->_serv->_id ) {
                $this->_serv->setId($serverName) ;
                $this->_disp->init($serverName) ;
            }
            return ;
        }

        $isExt = (strncmp($tid, 'A_EXT', 5) == 0) || (strncmp($tid, 'TP_EXT', 6) == 0) ;
        $isRealm = (strncmp($tid, 'VH_REALM', 8) == 0) || (strncmp($tid, 'TP_REALM', 8) == 0) ;

        if ( $act == 's' && $oldRef != null && $oldRef != $newRef ) {
            if ( $tid == 'VH_BASE' ) {
                $this->changeName_VH($oldRef, $newRef) ;
            }
            elseif ( $tid == 'TP' ) {
                $this->changeName_TP($oldRef, $newRef) ;
            }
            elseif ( $tid == 'L_GENERAL' || $tid == 'ADMIN_L_GENERAL' ) {
                $this->changeName_L($oldRef, $newRef) ;
            }
            elseif ( $isExt ) {
                $this->changeName_EXT($oldRef, $newRef) ;
            }
            elseif ( $isRealm ) {
                $this->changeName_REALM($oldRef, $newRef) ;
            }
        }

        $menuTids = array( 'L_GENERAL1', 'L_GENERAL', 'ADMIN_L_GENERAL1', 'ADMIN_L_GENERAL', 'VH_TOP_D', 'VH_BASE', 'TP1' ) ;
        if ( in_array($tid, $menuTids) ) { // for add or remove count in menu
            $this->genMenuInfo() ;
        }
        elseif ( $isExt || $isRealm ) {
            $this->refreshInfo() ;
        }
    }

    private function &doAction( $disp )
    {
        if ( $disp->_act != 'v' ) {
            if ( $disp->_token != $disp->_tokenInput ) {
                $disp->_err = 'Illegal entry point!' ;
                return null ;
            }
        }
        $disp->_info = &$this->_info ;

        //init here
        $data = &$this->getConfData($disp) ;

        $tid = DUtil::getLastId($disp->_tid) ;
        $ref = DUtil::getLastId($disp->_ref) ;
        $needTrim = false ;
        $tblDef = DTblDef::GetInstance() ;

        if ( $disp->_act == 's' ) {
            $tbl = $tblDef->GetTblDef($tid) ;
            $extractedData = null ;
            if ( $tbl->_holderIndex != null ) {
                $curdata = DUtil::locateData($data, $tbl->_dataLoc, $disp->_ref) ;
                $disp->_info['holderIndex'] = DUtil::array_string_keys($curdata) ;
                $disp->_info['holderIndex_cur'] = $ref ;
            } else {
                $disp->_info['holderIndex'] = null ;
			}

            $go = $this->GetValidator()->ExtractPost($tbl, $extractedData, $disp) ;
            if ( $go > 0 ) {
                $this->savePost($extractedData, $disp, $tbl, $ref) ;
                $this->saveFile($disp->_type, $disp->_name, $tbl->_id, $disp->_ref) ;
                $needTrim = true ;
            }
            else {
                $disp->_act = 'S' ;
                $disp->_err = 'Input error detected. Please resolve the error(s). ' ;
                return $extractedData ;
            }
        }
        else if ( $disp->_act == 'c' || $disp->_act == 'n' ) {
            $tbl = $tblDef->GetTblDef($tid) ;
            $extractedData = [] ;
            $this->GetValidator()->ExtractPost($tbl, $extractedData, $disp) ;
            if ( $disp->_act == 'n' ) {
                $tid = DUtil::getSubTid($tbl->_subTbls, $extractedData) ;
                if ( $tid != null ) {
                    DUtil::switchLastId($disp->_tid, $tid) ;
                    $tbl = $tblDef->GetTblDef($tid) ;
                }
            }
            return $extractedData ;
        }
        else if ( $disp->_act == 'D' ) {
            $tbl = $tblDef->GetTblDef($tid) ;
            $oldConf = &$this->getConfData($disp) ;
            $data = &DUtil::locateData($oldConf, $tbl->_dataLoc, $disp->_ref) ;
            if ( ($disp->_tid == 'ADMIN_L_GENERAL1') || ($disp->_pid == 'security' && $disp->_tid == 'ADMIN_USR') ) {
                // for admin listener, do not allow to delete all
                // for admin user, do not allow to delete all
                if ( count($data) == 1 ) {
                    DUtil::trimLastId($disp->_tid) ;
                    DUtil::trimLastId($disp->_ref) ;
                    return $oldConf ;
                }
            }
            unset($data[$ref]) ;

            if ( strncmp('VH_CTX', $tbl->_id, 6) == 0 )
                $this->resetCtxSeq($data) ;

            $this->saveFile($disp->_type, $disp->_name, $tid, $disp->_ref) ;
            $data = &$this->getConfData($disp) ; //reload everything
            $this->checkRefresh($tid, 'D', $ref, null, $disp) ;
            $needTrim = true ;
        }
        else if ( $disp->_act == 'I' ) {
            if ( $this->instantiateTempl($disp) ) {
                $tbl = $tblDef->GetTblDef($tid) ;
                $oldConf = &$this->getConfData($disp) ;
                $data = &DUtil::locateData($oldConf, $tbl->_dataLoc) ;
                unset($data[$ref]) ;
                $this->saveFile($disp->_type, $disp->_name, $tid) ;

                $this->genMenuInfo('serv') ;
                $data = &$this->getConfData($disp) ; //reload everything
                $needTrim = true ;
            }
        }
        else if ( $disp->_act == 'B' ) {
            $needTrim = true ;
        }

        if ( isset($_GET['ctxseq']) ) {
            if ( $this->changeCtxSeq($disp, DUtil::getGoodVal1($_GET['ctxseq'])) )
                $this->saveFile($disp->_type, $disp->_name, $tid) ;
        }

        if ( $needTrim ) {
            DUtil::trimLastId($disp->_tid) ;
            DUtil::trimLastId($disp->_ref) ;
        }


        return $data ;
    }

    private function resetCtxSeq( &$data )
    {
        $keys = array_keys($data) ;
        $i = 1 ;
        foreach ( $keys as $k ) {
            $data[$k]['order']->SetVal($i) ;
            ++ $i ;
        }
    }

    private function changeCtxSeq( $disp, $seq )
    {
        $plus = true ;
        if ( $seq < 0 ) {
            $plus = false ;
            $seq = - $seq ;
        }

        $ctxs = &$this->_curOne->_data['context'] ;

        $c = count($ctxs) ;
        if ( ( ! $plus && $seq == 1) || ($plus && $seq == $c) )
            return false ;

        $newCtxs = [] ;
        $i = 1 ;
        foreach ( $ctxs as $uri => $ctx ) {
            if ( $plus ) {
                if ( $i == $seq ) {
                    $savedUri = $uri ;
                    $saved = $ctx ;
                }
                else if ( $i == $seq + 1 ) {
                    $ctx['order']->SetVal($seq) ;
                    $newCtxs[$uri] = $ctx ;
                    $saved['order']->SetVal($seq + 1) ;
                    $newCtxs[$savedUri] = $saved ;
                }
                else
                    $newCtxs[$uri] = $ctx ;
            }
            else {
                if ( $i == $seq - 1 ) {
                    $savedUri = $uri ;
                    $saved = $ctx ;
                }
                else if ( $i == $seq ) {
                    $ctx['order']->SetVal($seq - 1) ;
                    $newCtxs[$uri] = $ctx ;
                    $saved['order']->SetVal($seq) ;
                    $newCtxs[$savedUri] = $saved ;
                }
                else
                    $newCtxs[$uri] = $ctx ;
            }
            ++ $i ;
        }

        $this->_curOne->_data['context'] = &$newCtxs ;
        return true ;
    }

    private function instantiateTempl( $disp )
    {
        $tn = $disp->_name ;
        $tp = &$this->_serv->_data['tpTop'][$tn] ;
        if ( $tp['listeners']->HasErr() ) {
            $disp->_err = 'Please fix error in Mapped Listeners first.' ;
            return false ;
        }

        $d = $this->_curOne->_data ;
        $configFile = $d['general']['configFile'] ;
		if ( empty($configFile) || $configFile->HasErr() ) {
            $disp->_err = 'Please fix error in General->Config File first.' ;
            return false ;
        }

        $vhRoot = $tp['member'][$disp->_ref]['vhRoot'] ;
        if ( isset($vhRoot) && $vhRoot->HasVal() ) {
            if ( $vhRoot->HasErr() ) {
                $disp->_err = 'Please fix VHRoot error in Member Virtual Host first.' ;
                return false ;
            }
        }
        else {
            $vhRoot = $d['general']['vhRoot'] ;
            if ( $vhRoot->HasErr() ) {
                $disp->_err = 'Please fix error in General->VHost Root first.' ;
                return false ;
            }
        }
        $vn = $disp->_ref ;
        $vr = $this->getAbsFile($vhRoot->GetVal(), 'SR', $vn) ;
        if ( ! file_exists($vr) ) {
            $disp->_err = 'Please fix error: Virtual Host Root ' . $vr . ' does not exist.' ;
            return false ;
        }


        $path = $configFile->GetVal() ;
        if ( strncasecmp('$VH_ROOT', $path, 8) == 0 )
            $path = $vr . substr($path, 8) ;
        $path = $this->getAbsFile($path, 'SR', $vn) ;

        if ( ! file_exists($path) && ! PathTool::createFile($path, $disp->_err) ) {
            return false ;
        }
        $confData = new ConfData('vh', $path, $vn) ;
        $confData->_data = &$this->_curOne->_data ;

        $config = new ConfigFile() ;
        $res = $config->save($confData) ;
        if ( ! $res ) {
            $disp->_err = 'failed to save to file ' . $path ;
            return false ;
        }

        $v = [] ;
        $v['name'] = new CVal($vn) ;
        $v['vhRoot'] = $vhRoot ;
        $v['configFile'] = $configFile ;
        $v['maxKeepAliveReq'] = $d['general']['maxKeepAliveReq'] ;
        $v['smartKeepAlive'] = $d['general']['smartKeepAlive'] ;
        if ( is_array($d['sec']['file']) )
            $v = array_merge($v, $d['sec']['file']) ;
        if ( is_array($d['sec']['cgi']) )
            $v = array_merge($v, $d['sec']['cgi']) ;
        if ( is_array($d['sec']['conn']) )
            $v = array_merge($v, $d['sec']['conn']) ;
        $this->_serv->_data['vhTop'][$vn] = $v ;

        $lns = preg_split("/, /", DUtil::getDataVal($tp, 'listeners'), -1, PREG_SPLIT_NO_EMPTY) ;
        $vhmap['vhost'] = new CVal($vn) ;
        $domains = DUtil::getDataVal($tp['member'][$vn], 'vhDomain') ;
		$vhalias = DUtil::getDataVal($tp['member'][$vn], 'vhAliases');
        if ( $vhalias != '' ) {
            if ( $domains != '' )
                $domains .= ', ' ;
            $domains .= $vhalias ;
        }

        $vhmap['domain'] = new CVal($domains) ;
        foreach ( $lns as $ln ) {
            $l = &$this->_serv->_data['listeners'][$ln] ;
            $l['vhMap'][$vn] = $vhmap ;
        }

        return true ;
    }

    public function enableDisableVh( $act, $actId )
    {
        $haschanged = false ;
        $cur_disabled = [] ;
        if ( isset($this->_serv->_data['service']['suspendedVhosts']) ) {
            $cur_disabled = preg_split("/[,;]+/", DUtil::getDataVal($this->_serv->_data['service'], 'suspendedVhosts'), -1, PREG_SPLIT_NO_EMPTY) ;
        }
        $found = in_array($actId, $cur_disabled) ;
        if ( $act == 'disable' ) {
            if ( ! $found ) {
                $cur_disabled[] = $actId ;
                $haschanged = true ;
            }
        }
        else if ( $act == 'enable' ) {
            if ( $found ) {
                $key = array_search($actId, $cur_disabled) ;
                unset($cur_disabled[$key]) ;
                $haschanged = true ;
            }
        }
        if ( $haschanged ) {
            $vals = implode(',', $cur_disabled) ;
            $this->_serv->_data['service']['suspendedVhosts'] = new CVal($vals) ;
            $this->saveFile('serv', '') ;
        }
    }

    public function GetPageData( $disp, &$confErr )
    {
        $disp->_err = null ;

        $data = &$this->doAction($disp) ;

        if ( isset($this->_info['CONF_FILE_ERR']) ) {
            $confErr = $this->_info['CONF_FILE_ERR'] ;
        }
        return $data ;
    }

}