From ee86cb6b8a41843826c9ebbada220c7d9ebdc38d Mon Sep 17 00:00:00 2001 From: crazy-max Date: Thu, 7 Apr 2016 23:30:50 +0200 Subject: [PATCH] Init repo with Webgrind bundles from Neard Retrieve changes from git commit 78850a70 on jokkedk/webgrind repository --- .gitignore | 13 + CHANGELOG.md | 8 + README.md | 37 + bin/webgrind1.0/config.php | 85 ++ bin/webgrind1.0/img/asc.gif | Bin 0 -> 54 bytes bin/webgrind1.0/img/bg.gif | Bin 0 -> 64 bytes bin/webgrind1.0/img/blank.gif | Bin 0 -> 1061 bytes bin/webgrind1.0/img/call_blue.png | Bin 0 -> 308 bytes bin/webgrind1.0/img/call_green.png | Bin 0 -> 311 bytes bin/webgrind1.0/img/call_grey.png | Bin 0 -> 330 bytes bin/webgrind1.0/img/call_orange.png | Bin 0 -> 324 bytes bin/webgrind1.0/img/desc.gif | Bin 0 -> 54 bytes bin/webgrind1.0/img/down.gif | Bin 0 -> 58 bytes bin/webgrind1.0/img/file.png | Bin 0 -> 157 bytes bin/webgrind1.0/img/file_line.png | Bin 0 -> 2830 bytes bin/webgrind1.0/img/gradient_blue.png | Bin 0 -> 215 bytes bin/webgrind1.0/img/gradient_green.png | Bin 0 -> 243 bytes bin/webgrind1.0/img/gradient_grey.png | Bin 0 -> 238 bytes bin/webgrind1.0/img/gradient_left.png | Bin 0 -> 304 bytes bin/webgrind1.0/img/gradient_markers.png | Bin 0 -> 190 bytes bin/webgrind1.0/img/gradient_orange.png | Bin 0 -> 257 bytes bin/webgrind1.0/img/gradient_right.png | Bin 0 -> 315 bytes bin/webgrind1.0/img/head.png | Bin 0 -> 311 bytes bin/webgrind1.0/img/marker.png | Bin 0 -> 2251 bytes bin/webgrind1.0/img/reload.png | Bin 0 -> 354 bytes bin/webgrind1.0/img/right.gif | Bin 0 -> 59 bytes bin/webgrind1.0/index.php | 159 ++++ bin/webgrind1.0/js/jquery.blockUI.js | 361 +++++++++ bin/webgrind1.0/js/jquery.js | 11 + bin/webgrind1.0/js/jquery.scrollTo.js | 10 + bin/webgrind1.0/js/jquery.selectboxes.js | 464 +++++++++++ bin/webgrind1.0/js/jquery.tablesorter.js | 864 +++++++++++++++++++++ bin/webgrind1.0/js/sprintf.js | 55 ++ bin/webgrind1.0/library/FileHandler.php | 205 +++++ bin/webgrind1.0/library/Preprocessor.php | 149 ++++ bin/webgrind1.0/library/Reader.php | 259 ++++++ bin/webgrind1.0/license.txt | 30 + bin/webgrind1.0/neard.conf | 4 + bin/webgrind1.0/package.sh | 16 + bin/webgrind1.0/styles/style.css | 176 +++++ bin/webgrind1.0/templates/fileviewer.phtml | 51 ++ bin/webgrind1.0/templates/index.phtml | 329 ++++++++ img/star-20160403.png | Bin 0 -> 500 bytes releases.properties | 2 + 44 files changed, 3288 insertions(+) create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 README.md create mode 100644 bin/webgrind1.0/config.php create mode 100644 bin/webgrind1.0/img/asc.gif create mode 100644 bin/webgrind1.0/img/bg.gif create mode 100644 bin/webgrind1.0/img/blank.gif create mode 100644 bin/webgrind1.0/img/call_blue.png create mode 100644 bin/webgrind1.0/img/call_green.png create mode 100644 bin/webgrind1.0/img/call_grey.png create mode 100644 bin/webgrind1.0/img/call_orange.png create mode 100644 bin/webgrind1.0/img/desc.gif create mode 100644 bin/webgrind1.0/img/down.gif create mode 100644 bin/webgrind1.0/img/file.png create mode 100644 bin/webgrind1.0/img/file_line.png create mode 100644 bin/webgrind1.0/img/gradient_blue.png create mode 100644 bin/webgrind1.0/img/gradient_green.png create mode 100644 bin/webgrind1.0/img/gradient_grey.png create mode 100644 bin/webgrind1.0/img/gradient_left.png create mode 100644 bin/webgrind1.0/img/gradient_markers.png create mode 100644 bin/webgrind1.0/img/gradient_orange.png create mode 100644 bin/webgrind1.0/img/gradient_right.png create mode 100644 bin/webgrind1.0/img/head.png create mode 100644 bin/webgrind1.0/img/marker.png create mode 100644 bin/webgrind1.0/img/reload.png create mode 100644 bin/webgrind1.0/img/right.gif create mode 100644 bin/webgrind1.0/index.php create mode 100644 bin/webgrind1.0/js/jquery.blockUI.js create mode 100644 bin/webgrind1.0/js/jquery.js create mode 100644 bin/webgrind1.0/js/jquery.scrollTo.js create mode 100644 bin/webgrind1.0/js/jquery.selectboxes.js create mode 100644 bin/webgrind1.0/js/jquery.tablesorter.js create mode 100644 bin/webgrind1.0/js/sprintf.js create mode 100644 bin/webgrind1.0/library/FileHandler.php create mode 100644 bin/webgrind1.0/library/Preprocessor.php create mode 100644 bin/webgrind1.0/library/Reader.php create mode 100644 bin/webgrind1.0/license.txt create mode 100644 bin/webgrind1.0/neard.conf create mode 100644 bin/webgrind1.0/package.sh create mode 100644 bin/webgrind1.0/styles/style.css create mode 100644 bin/webgrind1.0/templates/fileviewer.phtml create mode 100644 bin/webgrind1.0/templates/index.phtml create mode 100644 img/star-20160403.png create mode 100644 releases.properties diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..e241443 --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Eclipse +.settings +.buildpath +.project +.jsdtscope +*.launch + +# Ant +build.properties +build.xml + +# Neard +.dev diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..3bbfe75 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,8 @@ +# Changelog + +## r1 (2016/04/07) + +This release works since **[Neard 1.0.0](https://github.com/crazy-max/neard/releases/tag/v1.0.0)** + +* Init repo with Webgrind bundles from [Neard](https://github.com/crazy-max/neard) +* Retrieve changes from [git commit 78850a70 on jokkedk/webgrind repository](https://github.com/jokkedk/webgrind/tree/78850a704538040d3d5326cfe7a9d039abdc4d56) diff --git a/README.md b/README.md new file mode 100644 index 0000000..a115192 --- /dev/null +++ b/README.md @@ -0,0 +1,37 @@ +This a sub-repo of [Neard project](https://github.com/crazy-max/neard) involving Webgrind app bundles. + +## Installation + +* Download and install [Neard](https://github.com/crazy-max/neard). +* If you already have installed Neard, stop it. +* Download [a Webgrind bundle](#download). +* Extract archive in `neard\apps\webgrind\`. Directory structure example : + +``` +[-] neard + | [-] apps + | | [-] webgrind + | | | [-] webgrind1.0 + | | | neard.conf +``` + +* Edit the `neard.conf` file and replace the key `webgrindVersion` with the correct version. +* Edit the `alias/webgrind.conf` file and replace the lines with the correct version. +* Start Neard. + +## Download + +![](https://raw.github.com/crazy-max/neard-app-webgrind/master/img/star-20160403.png) : Default bundle on Neard. + +| | Webgrind release date | Neard release | Download | +| -----------------|:---------------------:|:-------------:|:--------:| +| **Webgrind 1.0** | 2009/02/20 | [r1](https://github.com/crazy-max/neard-app-webgrind/releases/tag/r1) | [neard-webgrind-1.0-r1.zip](https://github.com/crazy-max/neard-app-webgrind/releases/download/r1/neard-webgrind-1.0-r1.zip) | + +## Sources + +* https://github.com/jokkedk/webgrind + +## Issues + +Issues must be reported on [Neard repository](https://github.com/crazy-max/neard/issues).
+Please read [Found a bug?](https://github.com/crazy-max/neard#found-a-bug) section before reporting an issue. diff --git a/bin/webgrind1.0/config.php b/bin/webgrind1.0/config.php new file mode 100644 index 0000000..de758f3 --- /dev/null +++ b/bin/webgrind1.0/config.php @@ -0,0 +1,85 @@ +M@W*QU^T)Mmv@NIy@0Q?xj zNkOdXv21q6&9r~~{*e-sy+6fr#qjjP2R)d65nEWkvzq#{U;kI6-=GBnPmrQRC5NMo z3l8TQUpIA=G-bwOS&)ct5(kZZjwgOh++T9|8RLS(FBvz)5}W&pIHXyUq5<4Naw3vk z6N#h5f>aY#;#K0Ws#>K5yvxKVMBSjt-WKt3Ru~$|7Po=(4@v)EFE)Q4cybmvvbGl+ z&C!0(0qdK4v7KSNSf1fmwPKhWK<4Q)fSwE5RmG8frM*OqQ(^DfsKv(qjYm3Y!+NtjBv`P#|<4U;XxClO4TWo9<|q%6V2TTVvF7b1q-4raO8` zp6YB)t7K+ejbbJ{2LKNR8f2&toVSov=p6v=9pn6mBhTNOO%~}kQ(m;Y%UAUqhEgh< lff#*+axjq8#M8mRcqlYM9}1hn{s-WCZ{1yceY*!|{s7#_y%qof literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/call_blue.png b/bin/webgrind1.0/img/call_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd051aeda32a7b31c3cca1bdf83b97a8d87e218 GIT binary patch literal 308 zcmeAS@N?(olHy`uVBq!ia0vp^AT}2VGmzZ%#=aj&NtU=qlmzFem6RtIr7}3C>>Gmt_ z$m3q6kE0uIIOg5ias1KI%daBqZ`kMD$)EBfck+u}Cm$cV^hz`Qctq0+^}wCQQ=fX2 zKX=G`q#Jw5Jni=LH?NIP@@D{Tkt+%E3;vG}FuakFi36&1^K@|xsko(crj_@A0}soF z>NcatZ}+FI){r}(P|V<@=2*_!D!>Cd__)prW(m-Y|;PtWM_ eocM=Df?+K)`=vW4x=Vp3GI+ZBxvXD6YtVyv4?r&XmzxmFKJMBl(k6t-);?co1 zPbO@=v~uy)?pfEX7hUPv`gHF3N2e}4K7HfWm90ikXLFW5Zkczl_W7IFS{b4mKwIQWg8YL2;{yzDBxK@%Dm^`2978H@>6~%rJ7B=W z>}d7Q@BP&O|I>IJi*H?S`f~Et6HkHZD-55|2F zjoY^#JbAKj-@f_t=N~_DV$-Hgl{NJzPM$n-?&6Kxw~rq`K5^p2dGqF-IB{aqq)F@6 zty{l-{oJ{8_wL=hef#!9hYl@Uw(R+v*HfNM7XsR)P!i-9{2xDHh>4MY3sf88>Eakt zaZBe+IA4PT1ItC$Blli*y!)HK(s0k2?+r4AG7_Ez2KOrR{haPhJy7&_S$4bD)I(Cq zT`#j;e}}OCeY5GbpGd6nQX6XC2wT1JvqDO_0@e}<_A6LwR?Pe(~mZ#4-3M7v?-oQ zVE#VAvI0bd90u6C7!=|ebj&PR-j!9B|(0{|M3Hcm>B7|K(&6JE{-7;w{*_9 z3pFS(upDGnnJIeo&A^y0o$LSr literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/desc.gif b/bin/webgrind1.0/img/desc.gif new file mode 100644 index 0000000000000000000000000000000000000000..3b30b3c58eabdb47a1c420ad03c8e30b966cc858 GIT binary patch literal 54 zcmZ?wbhEHb6lGvxXkcJa);0M5|G(l-7DfgJMg|=QAOOiQF!A>EGoD<#VNP?1QCB1* GgEatI(+xQQ literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/down.gif b/bin/webgrind1.0/img/down.gif new file mode 100644 index 0000000000000000000000000000000000000000..5ce89902721cc5129d230081e9b6666ae1a970dd GIT binary patch literal 58 zcmZ?wbhEHbWM^P!n8*ME|G@yrQ2fcl$iTqFpaT*G$ulrV~YFZe&h)9nUcK%Ts(i(^Q| yt)v77CO3nIpaeCU2?||@S=e+IIjA`_Ff#CeU~pK?DeMMR%HZkh=d#Wzp$Pz}{wwzY literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/file_line.png b/bin/webgrind1.0/img/file_line.png new file mode 100644 index 0000000000000000000000000000000000000000..042173a3d1caa1e1eb162f6fef797212a5cb1aa6 GIT binary patch literal 2830 zcmV+p3-R=cP)KLZ*U+IBfRsybQWXdwQbLP>6pAqfylh#{fb6;Z(vMMVS~$e@S=j*ftg6;Uhf59&ghTmgWD0l;*T zI709Y^p6lP1rIRMx#05C~cW=H_Aw*bJ-5DT&Z2n+x)QHX^p z00esgV8|mQcmRZ%02D^@S3L16t`O%c004NIvOKvYIYoh62rY33S640`D9%Y2D-rV&neh&#Q1i z007~1e$oCcFS8neI|hJl{-P!B1ZZ9hpmq0)X0i`JwE&>$+E?>%_LC6RbVIkUx0b+_+BaR3cnT7Zv!AJxW zizFb)h!jyGOOZ85F;a?DAXP{m@;!0_IfqH8(HlgRxt7s3}k3K`kFu>>-2Q$QMFfPW!La{h336o>X zu_CMttHv6zR;&ZNiS=X8v3CR#fknUxHUxJ0uoBa_M6WNWeqIg~6QE69c9o#eyhGvpiOA@W-aonk<7r1(?fC{oI5N*U!4 zfg=2N-7=cNnjjOr{yriy6mMFgG#l znCF=fnQv8CDz++o6_Lscl}eQ+l^ZHARH>?_s@|##Rr6KLRFA1%Q+=*RRWnoLsR`7U zt5vFIcfW3@?wFpwUVxrVZ>QdQz32KIeJ}k~{cZZE^+ya? z2D1z#2HOnI7(B%_ac?{wFUQ;QQA1tBKtrWrm0_3Rgps+?Jfqb{jYbcQX~taRB;#$y zZN{S}1|}gUOHJxc?wV3fxuz+mJ4`!F$IZ;mqRrNsHJd##*D~ju=bP7?-?v~|cv>vB zsJ6IeNwVZxrdjT`yl#bBIa#GxRa#xMMy;K#CDyyGyQdMSxlWT#tDe?p!?5wT$+oGt z8L;Kp2HUQ-ZMJ=3XJQv;x5ci*?vuTfeY$;({XGW_huIFR9a(?@3)XSs8O^N5RyOM=TTmp(3=8^+zpz2r)C z^>JO{deZfso3oq3?Wo(Y?l$ge?uXo;%ru`Vo>?<<(8I_>;8Eq#KMS9gFl*neeosSB zfoHYnBQIkwkyowPu(zdms`p{<7e4kra-ZWq<2*OsGTvEV%s0Td$hXT+!*8Bnh2KMe zBmZRodjHV?r+_5^X9J0WL4jKW`}lf%A-|44I@@LTvf1rHjG(ze6+w@Jt%Bvjts!X0 z?2xS?_ve_-kiKB_KiJlZ$9G`c^=E@oNG)mWWaNo-3TIW8)$Hg0Ub-~8?KhvJ>$ z3*&nim@mj(aCxE5!t{lw7O5^0EIO7zOo&c6l<+|iDySBWCGrz@C5{St!X3hAA}`T4 z(TLbXTq+(;@<=L8dXnssyft|w#WSTW<++3>sgS%(4NTpeI-VAqb|7ssJvzNHgOZVu zaYCvgO_R1~>SyL=cFU|~g|hy|Zi}}s9+d~lYqOB71z9Z$wnC=pR9Yz4DhIM>Wmjgu z&56o6maCpC&F##y%G;1PobR9i?GnNg;gYtchD%p19a!eQtZF&3JaKv33gZ<8D~47E ztUS1iwkmDaPpj=$m#%)jCVEY4fnLGNg2A-`YwHVD3gv};>)hAvT~AmqS>Lr``i7kw zJ{5_It`yrBmlc25DBO7E8;5VoznR>Ww5hAaxn$2~(q`%A-YuS64wkBy=9dm`4cXeX z4c}I@?e+FW+b@^RDBHV(wnMq2zdX3SWv9u`%{xC-q*U}&`cyXV(%rRT*Z6MH?i+i& z_B8C(+grT%{XWUQ+f@NoP1R=AW&26{v-dx)iK^-Nmiuj8txj!m?Z*Ss1N{dh4z}01 z)YTo*JycSU)+_5r4#yw9{+;i4Ee$peRgIj+;v;ZGdF1K$3E%e~4LaI(jC-u%2h$&R z9cLXcYC@Xwnns&bn)_Q~Te?roKGD|d-g^8;+aC{{G(1^(O7m37Y1-+6)01cN&y1aw zoqc{T`P^XJqPBbIW6s}d4{z_f5Om?vMgNQEJG?v2T=KYd^0M3I6IZxbny)%vZR&LD zJpPl@Psh8QyPB@KTx+@RdcC!KX7}kEo;S|j^u2lU7XQ}Oo;f|;z4Ll+_r>@1-xl3| zawq-H%e&ckC+@AhPrP6BKT#_XdT7&;F71j}Joy zkC~6lh7E@6o;W@^IpRNZ{ptLtL(gQ-CY~4mqW;US7Zxvm_|@yz&e53Bp_lTPlfP|z zrTyx_>lv@x#=^!PzR7qqF<$gm`|ZJZ+;<)Cqu&ot2z=0000WV@Og>004R=004l4008;_004mL004C`008P>0026e000+nl3&F} z0000vNkl00RR630N(lZ402IGhX4Qo07*qoM6N<$g0(w6b^rhX literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/gradient_blue.png b/bin/webgrind1.0/img/gradient_blue.png new file mode 100644 index 0000000000000000000000000000000000000000..7e13315de3256ff88ad54f56ee8807340e5bcc44 GIT binary patch literal 215 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Em!3-pOAL(cSDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MV0|RA+CNkue2ghE4a>aD|u>|c-1EBu0#H#2`e6Jh8@ue z*{>F`RXh4(%YrA_{ZD1ATH@NCo2A{VnDNxB;)U*ypK3ruOgvp2Ln?0Z9BgM~P~bSQ zVV63`zxp+5TaMk^p?t`)=KCa}twCIAPtHWOIK1yUIOj;mE8zqN%?QTuBmP3XK>ZA! Lu6{1-oD!M<*kez) literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/gradient_green.png b/bin/webgrind1.0/img/gradient_green.png new file mode 100644 index 0000000000000000000000000000000000000000..4721c6dfce2b08b0c30a5ae99d2b695b38bca7c0 GIT binary patch literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Em!3-pOAL(cSDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MS%f6A+C!bHm!d$dC|kB-49l5emraHmD1(|$?G0Z%9t4t z-r&6F;mXWe0h=DpifD9c+@Cz{T509Rn9dU!2Og|n_M~ma)6QA9DjRkuPP|yK{n5ht z_v*S&XH_kZ`T{iE!qdeuq~aFKK~AOy0S1PHzKW-6fB$zrJHdE+s^35M+Cc544GFqY q${xoO@`IcztJK~0i9haRU}mu2$mIUw_(7l%3=E#GelF{r5}E*H1!M*Q literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/gradient_grey.png b/bin/webgrind1.0/img/gradient_grey.png new file mode 100644 index 0000000000000000000000000000000000000000..51754d7289ded0a1d724697af77754d9df43f8a4 GIT binary patch literal 238 zcmVVu%~1dx1=b+h`be!~QgkKg0Gn z$ZV+QPeF8Rp$+Z#q-A}(WT`haJ|VxjHW%*?0R{j?-VdizCxJNt0000wvZI zCZ~j7^|aq#_m}T~t@rhR&$$jLEMn~tYsg^i5L1X^Sj4Ij1!e;Y5F03fkn~;0z|3$U WuiUt0RmdEmT@0SCelF{r5}E)w*gVAm literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/gradient_orange.png b/bin/webgrind1.0/img/gradient_orange.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad1aeffcb56552951882bc0ac7ec19892f253bf GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^Oh7Em!3-pOAL(cSDajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_d9MX>=sA+Dci``*oD{xsY7-KyMoD|3EzYpe=leqST{D2Msu z;@A(1Vt;g~yxvgrvrGMJi~Pz!=6+Y^A05gMvzhx`n7_5iy{i^^v$5t*CiD4Z=Fjz# zugmzpPO&`_$9yG~`B@QXOUUJQK#QzAT^vIyZm}F}XKYXqVA$x)svWVC|Bd}J&W8ze zBFxzY9HYNUf1hYvw@joey|Sb0nn!1pCGYj$+y)E|{!IPtsa;!urZ9NA`njxgN@xNA D>U3d3 literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/gradient_right.png b/bin/webgrind1.0/img/gradient_right.png new file mode 100644 index 0000000000000000000000000000000000000000..91ff5335809193830b487cfe8fe36343ccf7d33e GIT binary patch literal 315 zcmV-B0mS}^P)$o-;%o!;vw8N_xaxNgs!{{yatZi|BN7ik)||JQWAJKFNJTTGd>SV8}>>nTILH~_j)gNSHJiRFaWt>4uC5r0j6)5&ItD}zyR`OIA7dj$H4#q002ov JPDHLkV1h~9k5>Qy literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/marker.png b/bin/webgrind1.0/img/marker.png new file mode 100644 index 0000000000000000000000000000000000000000..6060167140541cc72ec9d6ac3763fefa31f29542 GIT binary patch literal 2251 zcmV;+2sHPJP)WdKcYATc)}MrC3kGB7YRATc>QFgH3dGaxH4F)%QXmiRIN000McNliru z(+UO@862aFeWw5b010qNS#tmY3h)2`3h)6!tTdPa000DMK}|sb0I`n?{9y$E00<*V zL_t(|+U;6fj1*NG{?4iD9vEPQr~x(LCd$QlC@!KbGoy$y4${L+!(4j$R(1UU|5R63_0U82OqUwt z>HJjHsp?bT_uo$sz|Z3h;|W|u@*6s9Bhg8|%1LC^8!!(k?7+o1g8k^DnLLR};#J9L z$0PAE1DD__+>XD{)wxM2D;WZ1C?bGgtynx0tME8(6B2WhAmJuLz>>fpZ&-=8w$zO6 z>eI(*M&VVwOveFO8~un0cm$R_K3^>1_Ul)|b)5D$)q%%oR$(jFw~|D17Ep}Phbd~@ zdhH4!u?_nl#WV`<^;k*cPG|{-2$_&1-PeJIjD4m;n$Od^4VvcJpG@GNN(GiMMo8SeY%wpD zUZ*-ABxZ_o6O+g^LLwT((^8I29a>aPjf-&ucUPgC@R0%VGgWQVIr*Iq?kTP0T1lE= zcXO$)o`s^xjRU}zC{V?|Y1tBfXL_9>5{&BE#z>4yqiku`F2BCF*cE`U0%dm*zzk1E z2t=M^z>d-p3u!58rcOuAB*rKvZd|g6*3_vr`n?D7H^TNbeJqLc*$IR`V_#GD3+O8x z5qF9DwboHLX+g0|u2)%aun2a_vj% z$(cr@->oH6^vYN|>q7i#=_;2h(}X0d1cK5pV7L|bhR+J{Y+#!q5hdbz)Q_h@JJNIU z=gU?(MB+Xo@lRTAUM-233yH(XVq^g#pdy_`GeD*y6;I&38@uxYB5}tuBC(u$g})1l zm?fe?Y<%An9!ilf`lDyndLx4ax7LD^<${2&oXb)3(Z}$KB1Zc2wiwb^+f^H9JniSq zeELcU2?Z#I;siY8%bpPn6ukmvp|WJ4?{jdS8SWoL_Ny^yZ4<~za~f;9b{o8fE!c=G z?7lj5jVb|S|KWaS%o}N{Eo~%5>U}RvwFG$RL=LBpS)vDVA8aQ0+;Z!IbBo;;`fa@2Y+7We!dLZjv+vMS6=y-u7FGRQq_Lj2P(6i5ie^tQ09|-@> z6xM`zA(JMHe2FYzBE3tJgWYB*GlpRzAngljzPFgg#_kUdwiEbmG4Q>pDQHm(_`YNU z>q2P40#Qpe>Q4NeLtWtTi80YWYu+Wt?=57psplgfZ(q`HmBF$2Dj>kDf;7;6CE_f0HYy}3NKUI=NQsnbroX+6ihyU;4 zb<%uiO!Ezcj}ypAzI_`uaH1p9VTFKI>`v|c63nN2cjZXirQtG^YqJ-#bhV4mPxWIv zgMW>{?-B63g7-EBK288A!us9R$I8lPm?{a2Z)8F{7W`Y?hpo?l5X&}AgRdnJ*XdM7 z+15Z4^!Gg2l|IjA@b;l@4{r$gistuB7W|nAv~<|b5#N4Wt9Lh%2cD)?jx7~7bAlIcTd&rt^d3J!|T?+n0C_;bk*Pk>U+ zq2tHV*>$vptpxs4(fkgQ4_XC2IRcLDC3YS7vLu@SEYy5U!6!$+juLG~o+0qX0Q}xo zgHMh?iohSm-IQ&(8hjN2-?BfiRz~aoA~Rkw=aXCj+YV3auP;C3V8x_JrX#8UkMUC( Z-vJX>e_tQcmJk2{002ovPDHLkV1gi`A)){P literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/reload.png b/bin/webgrind1.0/img/reload.png new file mode 100644 index 0000000000000000000000000000000000000000..8badc01437653f09c9fa80b8c58677a5e352fab0 GIT binary patch literal 354 zcmeAS@N?(olHy`uVBq!ia0vp^AT~b-Gmw0xxXuPhNtU=qlmzFem6RtIr7}3CPdBqS^?ExEb5)z#Hy zWMs~tKW|`Quyf~54-b!N)25v~dD6_xth~HjQBiT~)TtXbY>17Gt*EF-PEK}laaq59 z{mhv&w`|#BZ*OmGY`kgHrfILXKLpyPP!i-9{2xDHh>4MY3sjrq>EaktaVzHRaiL}d z9+nGR59;19v2NY<|NnH26t=WY;(MFJnASg-|8d#(yC+pE4&)yaf8(5F|6hz)+ya V)2Q2ZycB3JgQu&X%Q~loCIC?6n;rlF literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/img/right.gif b/bin/webgrind1.0/img/right.gif new file mode 100644 index 0000000000000000000000000000000000000000..040606be3b2f577a36a4b1a84dcf356051eb9004 GIT binary patch literal 59 zcmZ?wbhEHbWM^P!n8*ME|G@yrQ2fcl$iTqFpaT*G$ultVOi9#iI8_@rNqAle1A{dH D#?ubK literal 0 HcmV?d00001 diff --git a/bin/webgrind1.0/index.php b/bin/webgrind1.0/index.php new file mode 100644 index 0000000..254d209 --- /dev/null +++ b/bin/webgrind1.0/index.php @@ -0,0 +1,159 @@ +getTraceList()); + break; + case 'function_list': + $dataFile = get('dataFile'); + if($dataFile=='0'){ + $files = Webgrind_FileHandler::getInstance()->getTraceList(); + $dataFile = $files[0]['filename']; + } + $reader = Webgrind_FileHandler::getInstance()->getTraceReader($dataFile, get('costFormat', Webgrind_Config::$defaultCostformat)); + $functions = array(); + $shownTotal = 0; + $breakdown = array('internal' => 0, 'user' => 0, 'class' => 0, 'include' => 0); + + for($i=0;$i<$reader->getFunctionCount();$i++) { + $functionInfo = $reader->getFunctionInfo($i); + + + if (false !== strpos($functionInfo['functionName'], 'php::')) { + $breakdown['internal'] += $functionInfo['summedSelfCost']; + $humanKind = 'internal'; + $kind = 'blue'; + } elseif (false !== strpos($functionInfo['functionName'], 'require_once::') || + false !== strpos($functionInfo['functionName'], 'require::') || + false !== strpos($functionInfo['functionName'], 'include_once::') || + false !== strpos($functionInfo['functionName'], 'include::')) { + $breakdown['include'] += $functionInfo['summedSelfCost']; + $humanKind = 'include'; + $kind = 'grey'; + } else { + if (false !== strpos($functionInfo['functionName'], '->') || false !== strpos($functionInfo['functionName'], '::')) { + $breakdown['class'] += $functionInfo['summedSelfCost']; + $humanKind = 'class'; + $kind = 'green'; + } else { + $breakdown['user'] += $functionInfo['summedSelfCost']; + $humanKind = 'procedural'; + $kind = 'orange'; + } + } + if (!(int)get('hideInternals', 0) || strpos($functionInfo['functionName'], 'php::') === false) { + $shownTotal += $functionInfo['summedSelfCost']; + $functions[$i] = $functionInfo; + $functions[$i]['nr'] = $i; + $functions[$i]['kind'] = $kind; + $functions[$i]['humanKind'] = $humanKind; + } + + } + usort($functions,'costCmp'); + + $remainingCost = $shownTotal*get('showFraction'); + + $result['functions'] = array(); + foreach($functions as $function){ + + $remainingCost -= $function['summedSelfCost']; + + $result['functions'][] = $function; + if($remainingCost<0) + break; + } + $result['summedInvocationCount'] = $reader->getFunctionCount(); + $result['summedRunTime'] = $reader->formatCost($reader->getHeader('summary'), 'msec'); + $result['dataFile'] = $dataFile; + $result['invokeUrl'] = $reader->getHeader('cmd'); + $result['runs'] = $reader->getHeader('runs'); + $result['breakdown'] = $breakdown; + $result['mtime'] = date(Webgrind_Config::$dateFormat,filemtime(Webgrind_Config::xdebugOutputDir().$dataFile)); + echo json_encode($result); + break; + case 'callinfo_list': + $reader = Webgrind_FileHandler::getInstance()->getTraceReader(get('file'), get('costFormat', Webgrind_Config::$defaultCostformat)); + $functionNr = get('functionNr'); + $function = $reader->getFunctionInfo($functionNr); + + $result = array('calledFrom'=>array(), 'subCalls'=>array()); + $foundInvocations = 0; + for($i=0;$i<$function['calledFromInfoCount'];$i++){ + $invo = $reader->getCalledFromInfo($functionNr, $i); + $foundInvocations += $invo['callCount']; + $callerInfo = $reader->getFunctionInfo($invo['functionNr']); + $invo['file'] = $callerInfo['file']; + $invo['callerFunctionName'] = $callerInfo['functionName']; + $result['calledFrom'][] = $invo; + } + $result['calledByHost'] = ($foundInvocations<$function['invocationCount']); + + for($i=0;$i<$function['subCallInfoCount'];$i++){ + $invo = $reader->getSubCallInfo($functionNr, $i); + $callInfo = $reader->getFunctionInfo($invo['functionNr']); + $invo['file'] = $function['file']; // Sub call to $callInfo['file'] but from $function['file'] + $invo['callerFunctionName'] = $callInfo['functionName']; + $result['subCalls'][] = $invo; + } + echo json_encode($result); + + break; + case 'fileviewer': + $file = get('file'); + $line = get('line'); + + if($file && $file!=''){ + $message = ''; + if(!file_exists($file)){ + $message = $file.' does not exist.'; + } else if(!is_readable($file)){ + $message = $file.' is not readable.'; + } else if(is_dir($file)){ + $message = $file.' is a directory.'; + } + } else { + $message = 'No file to view'; + } + require 'templates/fileviewer.phtml'; + + break; + case 'version_info': + $response = @file_get_contents('http://jokke.dk/webgrindupdate.json?version='.Webgrind_Config::$webgrindVersion); + echo $response; + break; + default: + require 'templates/index.phtml'; +} + + +function get($param, $default=false){ + return (isset($_GET[$param])? $_GET[$param] : $default); +} + +function costCmp($a, $b){ + $a = $a['summedSelfCost']; + $b = $b['summedSelfCost']; + + if ($a == $b) { + return 0; + } + return ($a > $b) ? -1 : 1; +} diff --git a/bin/webgrind1.0/js/jquery.blockUI.js b/bin/webgrind1.0/js/jquery.blockUI.js new file mode 100644 index 0000000..2b0a360 --- /dev/null +++ b/bin/webgrind1.0/js/jquery.blockUI.js @@ -0,0 +1,361 @@ +/* + * jQuery blockUI plugin + * Version 1.33 (09/14/2007) + * @requires jQuery v1.1.1 + * + * $Id$ + * + * Examples at: http://malsup.com/jquery/block/ + * Copyright (c) 2007 M. Alsup + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + */ + (function($) { +/** + * blockUI provides a mechanism for blocking user interaction with a page (or parts of a page). + * This can be an effective way to simulate synchronous behavior during ajax operations without + * locking the browser. It will prevent user operations for the current page while it is + * active ane will return the page to normal when it is deactivate. blockUI accepts the following + * two optional arguments: + * + * message (String|Element|jQuery): The message to be displayed while the UI is blocked. The message + * argument can be a plain text string like "Processing...", an HTML string like + * "

Please wait...

", a DOM element, or a jQuery object. + * The default message is "

Please wait...

" + * + * css (Object): Object which contains css property/values to override the default styles of + * the message. Use this argument if you wish to override the default + * styles. The css Object should be in a format suitable for the jQuery.css + * function. For example: + * $.blockUI({ + * backgroundColor: '#ff8', + * border: '5px solid #f00, + * fontWeight: 'bold' + * }); + * + * The default blocking message used when blocking the entire page is "

Please wait...

" + * but this can be overridden by assigning a value to $.blockUI.defaults.pageMessage in your + * own code. For example: + * + * $.blockUI.defaults.pageMessage = "

Bitte Wartezeit

"; + * + * The default message styling can also be overridden. For example: + * + * $.extend($.blockUI.defaults.pageMessageCSS, { color: '#00a', backgroundColor: '#0f0' }); + * + * The default styles work well for simple messages like "Please wait", but for longer messages + * style overrides may be necessary. + * + * @example $.blockUI(); + * @desc prevent user interaction with the page (and show the default message of 'Please wait...') + * + * @example $.blockUI( { backgroundColor: '#f00', color: '#fff'} ); + * @desc prevent user interaction and override the default styles of the message to use a white on red color scheme + * + * @example $.blockUI('Processing...'); + * @desc prevent user interaction and display the message "Processing..." instead of the default message + * + * @name blockUI + * @param String|jQuery|Element message Message to display while the UI is blocked + * @param Object css Style object to control look of the message + * @cat Plugins/blockUI + */ +$.blockUI = function(msg, css, opts) { + $.blockUI.impl.install(window, msg, css, opts); +}; + +// expose version number so other plugins can interogate +$.blockUI.version = 1.33; + +/** + * unblockUI removes the UI block that was put in place by blockUI + * + * @example $.unblockUI(); + * @desc unblocks the page + * + * @name unblockUI + * @cat Plugins/blockUI + */ +$.unblockUI = function(opts) { + $.blockUI.impl.remove(window, opts); +}; + +/** + * Blocks user interaction with the selected elements. (Hat tip: Much of + * this logic comes from Brandon Aaron's bgiframe plugin. Thanks, Brandon!) + * By default, no message is displayed when blocking elements. + * + * @example $('div.special').block(); + * @desc prevent user interaction with all div elements with the 'special' class. + * + * @example $('div.special').block('Please wait'); + * @desc prevent user interaction with all div elements with the 'special' class + * and show a message over the blocked content. + * + * @name block + * @type jQuery + * @param String|jQuery|Element message Message to display while the element is blocked + * @param Object css Style object to control look of the message + * @cat Plugins/blockUI + */ +$.fn.block = function(msg, css, opts) { + return this.each(function() { + if (!this.$pos_checked) { + if ($.css(this,"position") == 'static') + this.style.position = 'relative'; + if ($.browser.msie) this.style.zoom = 1; // force 'hasLayout' in IE + this.$pos_checked = 1; + } + $.blockUI.impl.install(this, msg, css, opts); + }); +}; + +/** + * Unblocks content that was blocked by "block()" + * + * @example $('div.special').unblock(); + * @desc unblocks all div elements with the 'special' class. + * + * @name unblock + * @type jQuery + * @cat Plugins/blockUI + */ +$.fn.unblock = function(opts) { + return this.each(function() { + $.blockUI.impl.remove(this, opts); + }); +}; + +/** + * displays the first matched element in a "display box" above a page overlay. + * + * @example $('#myImage').displayBox(); + * @desc displays "myImage" element in a box + * + * @name displayBox + * @type jQuery + * @cat Plugins/blockUI + */ +$.fn.displayBox = function(css, fn, isFlash) { + var msg = this[0]; + if (!msg) return; + var $msg = $(msg); + css = css || {}; + + var w = $msg.width() || $msg.attr('width') || css.width || $.blockUI.defaults.displayBoxCSS.width; + var h = $msg.height() || $msg.attr('height') || css.height || $.blockUI.defaults.displayBoxCSS.height ; + if (w[w.length-1] == '%') { + var ww = document.documentElement.clientWidth || document.body.clientWidth; + w = parseInt(w) || 100; + w = (w * ww) / 100; + } + if (h[h.length-1] == '%') { + var hh = document.documentElement.clientHeight || document.body.clientHeight; + h = parseInt(h) || 100; + h = (h * hh) / 100; + } + + var ml = '-' + parseInt(w)/2 + 'px'; + var mt = '-' + parseInt(h)/2 + 'px'; + + // supress opacity on overlay if displaying flash content on mac/ff platform + var ua = navigator.userAgent.toLowerCase(); + var opts = { + displayMode: fn || 1, + noalpha: isFlash && /mac/.test(ua) && /firefox/.test(ua) + }; + + $.blockUI.impl.install(window, msg, { width: w, height: h, marginTop: mt, marginLeft: ml }, opts); +}; + + +// override these in your code to change the default messages and styles +$.blockUI.defaults = { + // the message displayed when blocking the entire page + pageMessage: '

Please wait...

', + // the message displayed when blocking an element + elementMessage: '', // none + // styles for the overlay iframe + overlayCSS: { backgroundColor: '#fff', opacity: '0.5' }, + // styles for the message when blocking the entire page + pageMessageCSS: { width:'250px', margin:'-50px 0 0 -125px', top:'50%', left:'50%', textAlign:'center', color:'#000', backgroundColor:'#fff', border:'3px solid #aaa' }, + // styles for the message when blocking an element + elementMessageCSS: { width:'250px', padding:'10px', textAlign:'center', backgroundColor:'#fff'}, + // styles for the displayBox + displayBoxCSS: { width: '400px', height: '400px', top:'50%', left:'50%' }, + // allow body element to be stetched in ie6 + ie6Stretch: 1, + // supress tab nav from leaving blocking content? + allowTabToLeave: 0, + // Title attribute for overlay when using displayBox + closeMessage: 'Click to close', + // use fadeOut effect when unblocking (can be overridden on unblock call) + fadeOut: 1, + // fadeOut transition time in millis + fadeTime: 400 +}; + +// the gory details +$.blockUI.impl = { + box: null, + boxCallback: null, + pageBlock: null, + pageBlockEls: [], + op8: window.opera && window.opera.version() < 9, + ie6: $.browser.msie && /MSIE 6.0/.test(navigator.userAgent), + install: function(el, msg, css, opts) { + opts = opts || {}; + this.boxCallback = typeof opts.displayMode == 'function' ? opts.displayMode : null; + this.box = opts.displayMode ? msg : null; + var full = (el == window); + + // use logical settings for opacity support based on browser but allow overrides via opts arg + var noalpha = this.op8 || $.browser.mozilla && /Linux/.test(navigator.platform); + if (typeof opts.alphaOverride != 'undefined') + noalpha = opts.alphaOverride == 0 ? 1 : 0; + + if (full && this.pageBlock) this.remove(window, {fadeOut:0}); + // check to see if we were only passed the css object (a literal) + if (msg && typeof msg == 'object' && !msg.jquery && !msg.nodeType) { + css = msg; + msg = null; + } + msg = msg ? (msg.nodeType ? $(msg) : msg) : full ? $.blockUI.defaults.pageMessage : $.blockUI.defaults.elementMessage; + if (opts.displayMode) + var basecss = jQuery.extend({}, $.blockUI.defaults.displayBoxCSS); + else + var basecss = jQuery.extend({}, full ? $.blockUI.defaults.pageMessageCSS : $.blockUI.defaults.elementMessageCSS); + css = jQuery.extend(basecss, css || {}); + var f = ($.browser.msie) ? $('') + : $(''); + var w = $('
'); + var m = full ? $('
') + : $(''); + w.css('position', full ? 'fixed' : 'absolute'); + if (msg) m.css(css); + if (!noalpha) w.css($.blockUI.defaults.overlayCSS); + if (this.op8) w.css({ width:''+el.clientWidth,height:''+el.clientHeight }); // lame + if ($.browser.msie) f.css('opacity','0.0'); + + $([f[0],w[0],m[0]]).appendTo(full ? 'body' : el); + + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) + var expr = $.browser.msie && (!$.boxModel || $('object,embed', full ? null : el).length > 0); + if (this.ie6 || expr) { + // stretch content area if it's short + if (full && $.blockUI.defaults.ie6Stretch && $.boxModel) + $('html,body').css('height','100%'); + + // fix ie6 problem when blocked element has a border width + if ((this.ie6 || !$.boxModel) && !full) { + var t = this.sz(el,'borderTopWidth'), l = this.sz(el,'borderLeftWidth'); + var fixT = t ? '(0 - '+t+')' : 0; + var fixL = l ? '(0 - '+l+')' : 0; + } + + // simulate fixed position + $.each([f,w,m], function(i,o) { + var s = o[0].style; + s.position = 'absolute'; + if (i < 2) { + full ? s.setExpression('height','document.body.scrollHeight > document.body.offsetHeight ? document.body.scrollHeight : document.body.offsetHeight + "px"') + : s.setExpression('height','this.parentNode.offsetHeight + "px"'); + full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') + : s.setExpression('width','this.parentNode.offsetWidth + "px"'); + if (fixL) s.setExpression('left', fixL); + if (fixT) s.setExpression('top', fixT); + } + else { + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); + s.marginTop = 0; + } + }); + } + if (opts.displayMode) { + w.css('cursor','default').attr('title', $.blockUI.defaults.closeMessage); + m.css('cursor','default'); + $([f[0],w[0],m[0]]).removeClass('blockUI').addClass('displayBox'); + $().click($.blockUI.impl.boxHandler).bind('keypress', $.blockUI.impl.boxHandler); + } + else + this.bind(1, el); + m.append(msg).show(); + if (msg.jquery) msg.show(); + if (opts.displayMode) return; + if (full) { + this.pageBlock = m[0]; + this.pageBlockEls = $(':input:enabled:visible',this.pageBlock); + setTimeout(this.focus, 20); + } + else this.center(m[0]); + }, + remove: function(el, opts) { + var o = $.extend({}, $.blockUI.defaults, opts); + this.bind(0, el); + var full = el == window; + var els = full ? $('body').children().filter('.blockUI') : $('.blockUI', el); + if (full) this.pageBlock = this.pageBlockEls = null; + + if (o.fadeOut) { + els.fadeOut(o.fadeTime, function() { + if (this.parentNode) this.parentNode.removeChild(this); + }); + } + else els.remove(); + }, + boxRemove: function(el) { + $().unbind('click',$.blockUI.impl.boxHandler).unbind('keypress', $.blockUI.impl.boxHandler); + if (this.boxCallback) + this.boxCallback(this.box); + $('body .displayBox').hide().remove(); + }, + // event handler to suppress keyboard/mouse events when blocking + handler: function(e) { + if (e.keyCode && e.keyCode == 9) { + if ($.blockUI.impl.pageBlock && !$.blockUI.defaults.allowTabToLeave) { + var els = $.blockUI.impl.pageBlockEls; + var fwd = !e.shiftKey && e.target == els[els.length-1]; + var back = e.shiftKey && e.target == els[0]; + if (fwd || back) { + setTimeout(function(){$.blockUI.impl.focus(back)},10); + return false; + } + } + } + if ($(e.target).parents('div.blockMsg').length > 0) + return true; + return $(e.target).parents().children().filter('div.blockUI').length == 0; + }, + boxHandler: function(e) { + if ((e.keyCode && e.keyCode == 27) || (e.type == 'click' && $(e.target).parents('div.blockMsg').length == 0)) + $.blockUI.impl.boxRemove(); + return true; + }, + // bind/unbind the handler + bind: function(b, el) { + var full = el == window; + // don't bother unbinding if there is nothing to unbind + if (!b && (full && !this.pageBlock || !full && !el.$blocked)) return; + if (!full) el.$blocked = b; + var $e = $(el).find('a,:input'); + $.each(['mousedown','mouseup','keydown','keypress','click'], function(i,o) { + $e[b?'bind':'unbind'](o, $.blockUI.impl.handler); + }); + }, + focus: function(back) { + if (!$.blockUI.impl.pageBlockEls) return; + var e = $.blockUI.impl.pageBlockEls[back===true ? $.blockUI.impl.pageBlockEls.length-1 : 0]; + if (e) e.focus(); + }, + center: function(el) { + var p = el.parentNode, s = el.style; + var l = ((p.offsetWidth - el.offsetWidth)/2) - this.sz(p,'borderLeftWidth'); + var t = ((p.offsetHeight - el.offsetHeight)/2) - this.sz(p,'borderTopWidth'); + s.left = l > 0 ? (l+'px') : '0'; + s.top = t > 0 ? (t+'px') : '0'; + }, + sz: function(el, p) { return parseInt($.css(el,p))||0; } +}; + +})(jQuery); diff --git a/bin/webgrind1.0/js/jquery.js b/bin/webgrind1.0/js/jquery.js new file mode 100644 index 0000000..74cdfee --- /dev/null +++ b/bin/webgrind1.0/js/jquery.js @@ -0,0 +1,11 @@ +/* + * jQuery 1.2.3 - New Wave Javascript + * + * Copyright (c) 2008 John Resig (jquery.com) + * Dual licensed under the MIT (MIT-LICENSE.txt) + * and GPL (GPL-LICENSE.txt) licenses. + * + * $Date: 2008-02-06 00:21:25 -0500 (Wed, 06 Feb 2008) $ + * $Rev: 4663 $ + */ +eval(function(p,a,c,k,e,r){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(J(){7(1e.3N)L w=1e.3N;L E=1e.3N=J(a,b){K 1B E.2l.4T(a,b)};7(1e.$)L D=1e.$;1e.$=E;L u=/^[^<]*(<(.|\\s)+>)[^>]*$|^#(\\w+)$/;L G=/^.[^:#\\[\\.]*$/;E.1n=E.2l={4T:J(d,b){d=d||T;7(d.15){6[0]=d;6.M=1;K 6}N 7(1o d=="25"){L c=u.2O(d);7(c&&(c[1]||!b)){7(c[1])d=E.4a([c[1]],b);N{L a=T.5J(c[3]);7(a)7(a.2w!=c[3])K E().2s(d);N{6[0]=a;6.M=1;K 6}N d=[]}}N K 1B E(b).2s(d)}N 7(E.1q(d))K 1B E(T)[E.1n.21?"21":"3U"](d);K 6.6E(d.1k==1M&&d||(d.5h||d.M&&d!=1e&&!d.15&&d[0]!=10&&d[0].15)&&E.2I(d)||[d])},5h:"1.2.3",87:J(){K 6.M},M:0,22:J(a){K a==10?E.2I(6):6[a]},2F:J(b){L a=E(b);a.54=6;K a},6E:J(a){6.M=0;1M.2l.1g.1i(6,a);K 6},R:J(a,b){K E.R(6,a,b)},4X:J(b){L a=-1;6.R(J(i){7(6==b)a=i});K a},1J:J(c,a,b){L d=c;7(c.1k==4e)7(a==10)K 6.M&&E[b||"1J"](6[0],c)||10;N{d={};d[c]=a}K 6.R(J(i){Q(c 1p d)E.1J(b?6.W:6,c,E.1l(6,d[c],b,i,c))})},1j:J(b,a){7((b==\'27\'||b==\'1R\')&&2M(a)<0)a=10;K 6.1J(b,a,"2o")},1u:J(b){7(1o b!="3V"&&b!=V)K 6.4x().3t((6[0]&&6[0].2i||T).5r(b));L a="";E.R(b||6,J(){E.R(6.3p,J(){7(6.15!=8)a+=6.15!=1?6.6K:E.1n.1u([6])})});K a},5m:J(b){7(6[0])E(b,6[0].2i).5k().3o(6[0]).2c(J(){L a=6;2b(a.1C)a=a.1C;K a}).3t(6);K 6},8w:J(a){K 6.R(J(){E(6).6z().5m(a)})},8p:J(a){K 6.R(J(){E(6).5m(a)})},3t:J(){K 6.3O(18,P,S,J(a){7(6.15==1)6.38(a)})},6q:J(){K 6.3O(18,P,P,J(a){7(6.15==1)6.3o(a,6.1C)})},6o:J(){K 6.3O(18,S,S,J(a){6.1a.3o(a,6)})},5a:J(){K 6.3O(18,S,P,J(a){6.1a.3o(a,6.2B)})},3h:J(){K 6.54||E([])},2s:J(b){L c=E.2c(6,J(a){K E.2s(b,a)});K 6.2F(/[^+>] [^+>]/.17(b)||b.1f("..")>-1?E.57(c):c)},5k:J(e){L f=6.2c(J(){7(E.14.1d&&!E.3E(6)){L a=6.69(P),4Y=T.3s("1x");4Y.38(a);K E.4a([4Y.3d])[0]}N K 6.69(P)});L d=f.2s("*").4R().R(J(){7(6[F]!=10)6[F]=V});7(e===P)6.2s("*").4R().R(J(i){7(6.15==3)K;L c=E.O(6,"2R");Q(L a 1p c)Q(L b 1p c[a])E.16.1b(d[i],a,c[a][b],c[a][b].O)});K f},1E:J(b){K 6.2F(E.1q(b)&&E.3y(6,J(a,i){K b.1P(a,i)})||E.3e(b,6))},56:J(b){7(b.1k==4e)7(G.17(b))K 6.2F(E.3e(b,6,P));N b=E.3e(b,6);L a=b.M&&b[b.M-1]!==10&&!b.15;K 6.1E(J(){K a?E.33(6,b)<0:6!=b})},1b:J(a){K!a?6:6.2F(E.37(6.22(),a.1k==4e?E(a).22():a.M!=10&&(!a.12||E.12(a,"3u"))?a:[a]))},3H:J(a){K a?E.3e(a,6).M>0:S},7j:J(a){K 6.3H("."+a)},5O:J(b){7(b==10){7(6.M){L c=6[0];7(E.12(c,"2k")){L e=c.3T,5I=[],11=c.11,2X=c.U=="2k-2X";7(e<0)K V;Q(L i=2X?e:0,2f=2X?e+1:11.M;i<2f;i++){L d=11[i];7(d.2p){b=E.14.1d&&!d.9J.1A.9y?d.1u:d.1A;7(2X)K b;5I.1g(b)}}K 5I}N K(6[0].1A||"").1r(/\\r/g,"")}K 10}K 6.R(J(){7(6.15!=1)K;7(b.1k==1M&&/5u|5t/.17(6.U))6.3k=(E.33(6.1A,b)>=0||E.33(6.31,b)>=0);N 7(E.12(6,"2k")){L a=b.1k==1M?b:[b];E("98",6).R(J(){6.2p=(E.33(6.1A,a)>=0||E.33(6.1u,a)>=0)});7(!a.M)6.3T=-1}N 6.1A=b})},3q:J(a){K a==10?(6.M?6[0].3d:V):6.4x().3t(a)},6S:J(a){K 6.5a(a).1V()},6Z:J(i){K 6.2K(i,i+1)},2K:J(){K 6.2F(1M.2l.2K.1i(6,18))},2c:J(b){K 6.2F(E.2c(6,J(a,i){K b.1P(a,i,a)}))},4R:J(){K 6.1b(6.54)},O:J(d,b){L a=d.23(".");a[1]=a[1]?"."+a[1]:"";7(b==V){L c=6.5n("8P"+a[1]+"!",[a[0]]);7(c==10&&6.M)c=E.O(6[0],d);K c==V&&a[1]?6.O(a[0]):c}N K 6.1N("8K"+a[1]+"!",[a[0],b]).R(J(){E.O(6,d,b)})},35:J(a){K 6.R(J(){E.35(6,a)})},3O:J(g,f,h,d){L e=6.M>1,3n;K 6.R(J(){7(!3n){3n=E.4a(g,6.2i);7(h)3n.8D()}L b=6;7(f&&E.12(6,"1O")&&E.12(3n[0],"4v"))b=6.3S("1U")[0]||6.38(6.2i.3s("1U"));L c=E([]);E.R(3n,J(){L a=e?E(6).5k(P)[0]:6;7(E.12(a,"1m")){c=c.1b(a)}N{7(a.15==1)c=c.1b(E("1m",a).1V());d.1P(b,a)}});c.R(6A)})}};E.2l.4T.2l=E.2l;J 6A(i,a){7(a.3Q)E.3P({1c:a.3Q,3l:S,1H:"1m"});N E.5g(a.1u||a.6x||a.3d||"");7(a.1a)a.1a.34(a)}E.1s=E.1n.1s=J(){L b=18[0]||{},i=1,M=18.M,5c=S,11;7(b.1k==8d){5c=b;b=18[1]||{};i=2}7(1o b!="3V"&&1o b!="J")b={};7(M==1){b=6;i=0}Q(;i-1}},68:J(b,c,a){L e={};Q(L d 1p c){e[d]=b.W[d];b.W[d]=c[d]}a.1P(b);Q(L d 1p c)b.W[d]=e[d]},1j:J(d,e,c){7(e=="27"||e=="1R"){L b,46={43:"4W",4U:"1Z",19:"3D"},3c=e=="27"?["7O","7M"]:["7J","7I"];J 5E(){b=e=="27"?d.7H:d.7F;L a=0,2N=0;E.R(3c,J(){a+=2M(E.2o(d,"7E"+6,P))||0;2N+=2M(E.2o(d,"2N"+6+"5X",P))||0});b-=24.7C(a+2N)}7(E(d).3H(":4d"))5E();N E.68(d,46,5E);K 24.2f(0,b)}K E.2o(d,e,c)},2o:J(e,k,j){L d;J 3x(b){7(!E.14.2d)K S;L a=T.4c.4K(b,V);K!a||a.4M("3x")==""}7(k=="1w"&&E.14.1d){d=E.1J(e.W,"1w");K d==""?"1":d}7(E.14.2z&&k=="19"){L c=e.W.50;e.W.50="0 7r 7o";e.W.50=c}7(k.1D(/4g/i))k=y;7(!j&&e.W&&e.W[k])d=e.W[k];N 7(T.4c&&T.4c.4K){7(k.1D(/4g/i))k="4g";k=k.1r(/([A-Z])/g,"-$1").2h();L h=T.4c.4K(e,V);7(h&&!3x(e))d=h.4M(k);N{L f=[],2C=[];Q(L a=e;a&&3x(a);a=a.1a)2C.4J(a);Q(L i=0;i<2C.M;i++)7(3x(2C[i])){f[i]=2C[i].W.19;2C[i].W.19="3D"}d=k=="19"&&f[2C.M-1]!=V?"2H":(h&&h.4M(k))||"";Q(L i=0;i]*?)\\/>/g,J(b,a,c){K c.1D(/^(aa|a6|7e|a5|4D|7a|a0|3m|9W|9U|9S)$/i)?b:a+">"});L f=E.3g(d).2h(),1x=h.3s("1x");L e=!f.1f("<9P")&&[1,"<2k 74=\'74\'>",""]||!f.1f("<9M")&&[1,"<73>",""]||f.1D(/^<(9G|1U|9E|9B|9x)/)&&[1,"<1O>",""]||!f.1f("<4v")&&[2,"<1O><1U>",""]||(!f.1f("<9w")||!f.1f("<9v"))&&[3,"<1O><1U><4v>",""]||!f.1f("<7e")&&[2,"<1O><1U><6V>",""]||E.14.1d&&[1,"1x<1x>",""]||[0,"",""];1x.3d=e[1]+d+e[2];2b(e[0]--)1x=1x.5o;7(E.14.1d){L g=!f.1f("<1O")&&f.1f("<1U")<0?1x.1C&&1x.1C.3p:e[1]=="<1O>"&&f.1f("<1U")<0?1x.3p:[];Q(L j=g.M-1;j>=0;--j)7(E.12(g[j],"1U")&&!g[j].3p.M)g[j].1a.34(g[j]);7(/^\\s/.17(d))1x.3o(h.5r(d.1D(/^\\s*/)[0]),1x.1C)}d=E.2I(1x.3p)}7(d.M===0&&(!E.12(d,"3u")&&!E.12(d,"2k")))K;7(d[0]==10||E.12(d,"3u")||d.11)k.1g(d);N k=E.37(k,d)});K k},1J:J(d,e,c){7(!d||d.15==3||d.15==8)K 10;L f=E.3E(d)?{}:E.46;7(e=="2p"&&E.14.2d)d.1a.3T;7(f[e]){7(c!=10)d[f[e]]=c;K d[f[e]]}N 7(E.14.1d&&e=="W")K E.1J(d.W,"9u",c);N 7(c==10&&E.14.1d&&E.12(d,"3u")&&(e=="9r"||e=="9o"))K d.9m(e).6K;N 7(d.28){7(c!=10){7(e=="U"&&E.12(d,"4D")&&d.1a)6Q"U 9i 9h\'t 9g 9e";d.9b(e,""+c)}7(E.14.1d&&/6O|3Q/.17(e)&&!E.3E(d))K d.4z(e,2);K d.4z(e)}N{7(e=="1w"&&E.14.1d){7(c!=10){d.6k=1;d.1E=(d.1E||"").1r(/6M\\([^)]*\\)/,"")+(2M(c).3X()=="96"?"":"6M(1w="+c*6L+")")}K d.1E&&d.1E.1f("1w=")>=0?(2M(d.1E.1D(/1w=([^)]*)/)[1])/6L).3X():""}e=e.1r(/-([a-z])/95,J(a,b){K b.2E()});7(c!=10)d[e]=c;K d[e]}},3g:J(a){K(a||"").1r(/^\\s+|\\s+$/g,"")},2I:J(b){L a=[];7(1o b!="93")Q(L i=0,M=b.M;i*",6).1V();2b(6.1C)6.34(6.1C)}},J(a,b){E.1n[a]=J(){K 6.R(b,18)}});E.R(["8f","5X"],J(i,c){L b=c.2h();E.1n[b]=J(a){K 6[0]==1e?E.14.2z&&T.1h["5e"+c]||E.14.2d&&1e["8e"+c]||T.6F=="79"&&T.1F["5e"+c]||T.1h["5e"+c]:6[0]==T?24.2f(24.2f(T.1h["5d"+c],T.1F["5d"+c]),24.2f(T.1h["5L"+c],T.1F["5L"+c])):a==10?(6.M?E.1j(6[0],b):V):6.1j(b,a.1k==4e?a:a+"2S")}});L C=E.14.2d&&4s(E.14.5K)<8c?"(?:[\\\\w*4r-]|\\\\\\\\.)":"(?:[\\\\w\\8b-\\8a*4r-]|\\\\\\\\.)",6v=1B 4q("^>\\\\s*("+C+"+)"),6u=1B 4q("^("+C+"+)(#)("+C+"+)"),6s=1B 4q("^([#.]?)("+C+"*)");E.1s({6r:{"":J(a,i,m){K m[2]=="*"||E.12(a,m[2])},"#":J(a,i,m){K a.4z("2w")==m[2]},":":{89:J(a,i,m){K im[3]-0},2Z:J(a,i,m){K m[3]-0==i},6Z:J(a,i,m){K m[3]-0==i},3j:J(a,i){K i==0},3J:J(a,i,m,r){K i==r.M-1},6n:J(a,i){K i%2==0},6l:J(a,i){K i%2},"3j-4p":J(a){K a.1a.3S("*")[0]==a},"3J-4p":J(a){K E.2Z(a.1a.5o,1,"4t")==a},"83-4p":J(a){K!E.2Z(a.1a.5o,2,"4t")},6B:J(a){K a.1C},4x:J(a){K!a.1C},82:J(a,i,m){K(a.6x||a.81||E(a).1u()||"").1f(m[3])>=0},4d:J(a){K"1Z"!=a.U&&E.1j(a,"19")!="2H"&&E.1j(a,"4U")!="1Z"},1Z:J(a){K"1Z"==a.U||E.1j(a,"19")=="2H"||E.1j(a,"4U")=="1Z"},80:J(a){K!a.2Y},2Y:J(a){K a.2Y},3k:J(a){K a.3k},2p:J(a){K a.2p||E.1J(a,"2p")},1u:J(a){K"1u"==a.U},5u:J(a){K"5u"==a.U},5t:J(a){K"5t"==a.U},59:J(a){K"59"==a.U},3I:J(a){K"3I"==a.U},58:J(a){K"58"==a.U},6j:J(a){K"6j"==a.U},6i:J(a){K"6i"==a.U},2G:J(a){K"2G"==a.U||E.12(a,"2G")},4D:J(a){K/4D|2k|6h|2G/i.17(a.12)},3Y:J(a,i,m){K E.2s(m[3],a).M},7X:J(a){K/h\\d/i.17(a.12)},7W:J(a){K E.3y(E.3G,J(b){K a==b.Y}).M}}},6g:[/^(\\[) *@?([\\w-]+) *([!*$^~=]*) *(\'?"?)(.*?)\\4 *\\]/,/^(:)([\\w-]+)\\("?\'?(.*?(\\(.*?\\))?[^(]*?)"?\'?\\)/,1B 4q("^([:.#]*)("+C+"+)")],3e:J(a,c,b){L d,2m=[];2b(a&&a!=d){d=a;L f=E.1E(a,c,b);a=f.t.1r(/^\\s*,\\s*/,"");2m=b?c=f.r:E.37(2m,f.r)}K 2m},2s:J(t,p){7(1o t!="25")K[t];7(p&&p.15!=1&&p.15!=9)K[];p=p||T;L d=[p],2r=[],3J,12;2b(t&&3J!=t){L r=[];3J=t;t=E.3g(t);L o=S;L g=6v;L m=g.2O(t);7(m){12=m[1].2E();Q(L i=0;d[i];i++)Q(L c=d[i].1C;c;c=c.2B)7(c.15==1&&(12=="*"||c.12.2E()==12))r.1g(c);d=r;t=t.1r(g,"");7(t.1f(" ")==0)6w;o=P}N{g=/^([>+~])\\s*(\\w*)/i;7((m=g.2O(t))!=V){r=[];L l={};12=m[2].2E();m=m[1];Q(L j=0,3f=d.M;j<3f;j++){L n=m=="~"||m=="+"?d[j].2B:d[j].1C;Q(;n;n=n.2B)7(n.15==1){L h=E.O(n);7(m=="~"&&l[h])1Q;7(!12||n.12.2E()==12){7(m=="~")l[h]=P;r.1g(n)}7(m=="+")1Q}}d=r;t=E.3g(t.1r(g,""));o=P}}7(t&&!o){7(!t.1f(",")){7(p==d[0])d.4l();2r=E.37(2r,d);r=d=[p];t=" "+t.6e(1,t.M)}N{L k=6u;L m=k.2O(t);7(m){m=[0,m[2],m[3],m[1]]}N{k=6s;m=k.2O(t)}m[2]=m[2].1r(/\\\\/g,"");L f=d[d.M-1];7(m[1]=="#"&&f&&f.5J&&!E.3E(f)){L q=f.5J(m[2]);7((E.14.1d||E.14.2z)&&q&&1o q.2w=="25"&&q.2w!=m[2])q=E(\'[@2w="\'+m[2]+\'"]\',f)[0];d=r=q&&(!m[3]||E.12(q,m[3]))?[q]:[]}N{Q(L i=0;d[i];i++){L a=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];7(a=="*"&&d[i].12.2h()=="3V")a="3m";r=E.37(r,d[i].3S(a))}7(m[1]==".")r=E.55(r,m[2]);7(m[1]=="#"){L e=[];Q(L i=0;r[i];i++)7(r[i].4z("2w")==m[2]){e=[r[i]];1Q}r=e}d=r}t=t.1r(k,"")}}7(t){L b=E.1E(t,r);d=r=b.r;t=E.3g(b.t)}}7(t)d=[];7(d&&p==d[0])d.4l();2r=E.37(2r,d);K 2r},55:J(r,m,a){m=" "+m+" ";L c=[];Q(L i=0;r[i];i++){L b=(" "+r[i].1t+" ").1f(m)>=0;7(!a&&b||a&&!b)c.1g(r[i])}K c},1E:J(t,r,h){L d;2b(t&&t!=d){d=t;L p=E.6g,m;Q(L i=0;p[i];i++){m=p[i].2O(t);7(m){t=t.7V(m[0].M);m[2]=m[2].1r(/\\\\/g,"");1Q}}7(!m)1Q;7(m[1]==":"&&m[2]=="56")r=G.17(m[3])?E.1E(m[3],r,P).r:E(r).56(m[3]);N 7(m[1]==".")r=E.55(r,m[2],h);N 7(m[1]=="["){L g=[],U=m[3];Q(L i=0,3f=r.M;i<3f;i++){L a=r[i],z=a[E.46[m[2]]||m[2]];7(z==V||/6O|3Q|2p/.17(m[2]))z=E.1J(a,m[2])||\'\';7((U==""&&!!z||U=="="&&z==m[5]||U=="!="&&z!=m[5]||U=="^="&&z&&!z.1f(m[5])||U=="$="&&z.6e(z.M-m[5].M)==m[5]||(U=="*="||U=="~=")&&z.1f(m[5])>=0)^h)g.1g(a)}r=g}N 7(m[1]==":"&&m[2]=="2Z-4p"){L e={},g=[],17=/(-?)(\\d*)n((?:\\+|-)?\\d*)/.2O(m[3]=="6n"&&"2n"||m[3]=="6l"&&"2n+1"||!/\\D/.17(m[3])&&"7U+"+m[3]||m[3]),3j=(17[1]+(17[2]||1))-0,d=17[3]-0;Q(L i=0,3f=r.M;i<3f;i++){L j=r[i],1a=j.1a,2w=E.O(1a);7(!e[2w]){L c=1;Q(L n=1a.1C;n;n=n.2B)7(n.15==1)n.4k=c++;e[2w]=P}L b=S;7(3j==0){7(j.4k==d)b=P}N 7((j.4k-d)%3j==0&&(j.4k-d)/3j>=0)b=P;7(b^h)g.1g(j)}r=g}N{L f=E.6r[m[1]];7(1o f=="3V")f=f[m[2]];7(1o f=="25")f=6c("S||J(a,i){K "+f+";}");r=E.3y(r,J(a,i){K f(a,i,m,r)},h)}}K{r:r,t:t}},4u:J(b,c){L d=[];L a=b[c];2b(a&&a!=T){7(a.15==1)d.1g(a);a=a[c]}K d},2Z:J(a,e,c,b){e=e||1;L d=0;Q(;a;a=a[c])7(a.15==1&&++d==e)1Q;K a},5i:J(n,a){L r=[];Q(;n;n=n.2B){7(n.15==1&&(!a||n!=a))r.1g(n)}K r}});E.16={1b:J(f,i,g,e){7(f.15==3||f.15==8)K;7(E.14.1d&&f.53!=10)f=1e;7(!g.2D)g.2D=6.2D++;7(e!=10){L h=g;g=J(){K h.1i(6,18)};g.O=e;g.2D=h.2D}L j=E.O(f,"2R")||E.O(f,"2R",{}),1v=E.O(f,"1v")||E.O(f,"1v",J(){L a;7(1o E=="10"||E.16.5f)K a;a=E.16.1v.1i(18.3R.Y,18);K a});1v.Y=f;E.R(i.23(/\\s+/),J(c,b){L a=b.23(".");b=a[0];g.U=a[1];L d=j[b];7(!d){d=j[b]={};7(!E.16.2y[b]||E.16.2y[b].4j.1P(f)===S){7(f.3F)f.3F(b,1v,S);N 7(f.6b)f.6b("4i"+b,1v)}}d[g.2D]=g;E.16.2a[b]=P});f=V},2D:1,2a:{},1V:J(e,h,f){7(e.15==3||e.15==8)K;L i=E.O(e,"2R"),29,4X;7(i){7(h==10||(1o h=="25"&&h.7T(0)=="."))Q(L g 1p i)6.1V(e,g+(h||""));N{7(h.U){f=h.2q;h=h.U}E.R(h.23(/\\s+/),J(b,a){L c=a.23(".");a=c[0];7(i[a]){7(f)2V i[a][f.2D];N Q(f 1p i[a])7(!c[1]||i[a][f].U==c[1])2V i[a][f];Q(29 1p i[a])1Q;7(!29){7(!E.16.2y[a]||E.16.2y[a].4h.1P(e)===S){7(e.67)e.67(a,E.O(e,"1v"),S);N 7(e.66)e.66("4i"+a,E.O(e,"1v"))}29=V;2V i[a]}}})}Q(29 1p i)1Q;7(!29){L d=E.O(e,"1v");7(d)d.Y=V;E.35(e,"2R");E.35(e,"1v")}}},1N:J(g,c,d,f,h){c=E.2I(c||[]);7(g.1f("!")>=0){g=g.2K(0,-1);L a=P}7(!d){7(6.2a[g])E("*").1b([1e,T]).1N(g,c)}N{7(d.15==3||d.15==8)K 10;L b,29,1n=E.1q(d[g]||V),16=!c[0]||!c[0].36;7(16)c.4J(6.4Z({U:g,2L:d}));c[0].U=g;7(a)c[0].65=P;7(E.1q(E.O(d,"1v")))b=E.O(d,"1v").1i(d,c);7(!1n&&d["4i"+g]&&d["4i"+g].1i(d,c)===S)b=S;7(16)c.4l();7(h&&E.1q(h)){29=h.1i(d,b==V?c:c.71(b));7(29!==10)b=29}7(1n&&f!==S&&b!==S&&!(E.12(d,\'a\')&&g=="4V")){6.5f=P;1S{d[g]()}1X(e){}}6.5f=S}K b},1v:J(c){L a;c=E.16.4Z(c||1e.16||{});L b=c.U.23(".");c.U=b[0];L f=E.O(6,"2R")&&E.O(6,"2R")[c.U],42=1M.2l.2K.1P(18,1);42.4J(c);Q(L j 1p f){L d=f[j];42[0].2q=d;42[0].O=d.O;7(!b[1]&&!c.65||d.U==b[1]){L e=d.1i(6,42);7(a!==S)a=e;7(e===S){c.36();c.44()}}}7(E.14.1d)c.2L=c.36=c.44=c.2q=c.O=V;K a},4Z:J(c){L a=c;c=E.1s({},a);c.36=J(){7(a.36)a.36();a.7S=S};c.44=J(){7(a.44)a.44();a.7R=P};7(!c.2L)c.2L=c.7Q||T;7(c.2L.15==3)c.2L=a.2L.1a;7(!c.4S&&c.5w)c.4S=c.5w==c.2L?c.7P:c.5w;7(c.64==V&&c.63!=V){L b=T.1F,1h=T.1h;c.64=c.63+(b&&b.2v||1h&&1h.2v||0)-(b.62||0);c.7N=c.7L+(b&&b.2x||1h&&1h.2x||0)-(b.60||0)}7(!c.3c&&((c.4f||c.4f===0)?c.4f:c.5Z))c.3c=c.4f||c.5Z;7(!c.7b&&c.5Y)c.7b=c.5Y;7(!c.3c&&c.2G)c.3c=(c.2G&1?1:(c.2G&2?3:(c.2G&4?2:0)));K c},2y:{21:{4j:J(){5M();K},4h:J(){K}},3C:{4j:J(){7(E.14.1d)K S;E(6).2j("4P",E.16.2y.3C.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4P",E.16.2y.3C.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3C";K E.16.1v.1i(6,18)}},3B:{4j:J(){7(E.14.1d)K S;E(6).2j("4O",E.16.2y.3B.2q);K P},4h:J(){7(E.14.1d)K S;E(6).3w("4O",E.16.2y.3B.2q);K P},2q:J(a){7(I(a,6))K P;18[0].U="3B";K E.16.1v.1i(6,18)}}}};E.1n.1s({2j:J(c,a,b){K c=="4H"?6.2X(c,a,b):6.R(J(){E.16.1b(6,c,b||a,b&&a)})},2X:J(d,b,c){K 6.R(J(){E.16.1b(6,d,J(a){E(6).3w(a);K(c||b).1i(6,18)},c&&b)})},3w:J(a,b){K 6.R(J(){E.16.1V(6,a,b)})},1N:J(c,a,b){K 6.R(J(){E.16.1N(c,a,6,P,b)})},5n:J(c,a,b){7(6[0])K E.16.1N(c,a,6[0],S,b);K 10},2g:J(){L b=18;K 6.4V(J(a){6.4N=0==6.4N?1:0;a.36();K b[6.4N].1i(6,18)||S})},7D:J(a,b){K 6.2j(\'3C\',a).2j(\'3B\',b)},21:J(a){5M();7(E.2Q)a.1P(T,E);N E.3A.1g(J(){K a.1P(6,E)});K 6}});E.1s({2Q:S,3A:[],21:J(){7(!E.2Q){E.2Q=P;7(E.3A){E.R(E.3A,J(){6.1i(T)});E.3A=V}E(T).5n("21")}}});L x=S;J 5M(){7(x)K;x=P;7(T.3F&&!E.14.2z)T.3F("5W",E.21,S);7(E.14.1d&&1e==3b)(J(){7(E.2Q)K;1S{T.1F.7B("26")}1X(3a){3z(18.3R,0);K}E.21()})();7(E.14.2z)T.3F("5W",J(){7(E.2Q)K;Q(L i=0;i=0){L i=g.2K(e,g.M);g=g.2K(0,e)}c=c||J(){};L f="4Q";7(d)7(E.1q(d)){c=d;d=V}N{d=E.3m(d);f="61"}L h=6;E.3P({1c:g,U:f,1H:"3q",O:d,1y:J(a,b){7(b=="1W"||b=="5U")h.3q(i?E("<1x/>").3t(a.4b.1r(/<1m(.|\\s)*?\\/1m>/g,"")).2s(i):a.4b);h.R(c,[a.4b,b,a])}});K 6},7n:J(){K E.3m(6.5T())},5T:J(){K 6.2c(J(){K E.12(6,"3u")?E.2I(6.7m):6}).1E(J(){K 6.31&&!6.2Y&&(6.3k||/2k|6h/i.17(6.12)||/1u|1Z|3I/i.17(6.U))}).2c(J(i,c){L b=E(6).5O();K b==V?V:b.1k==1M?E.2c(b,J(a,i){K{31:c.31,1A:a}}):{31:c.31,1A:b}}).22()}});E.R("5S,6d,5R,6D,5Q,6m".23(","),J(i,o){E.1n[o]=J(f){K 6.2j(o,f)}});L B=(1B 3v).3L();E.1s({22:J(d,b,a,c){7(E.1q(b)){a=b;b=V}K E.3P({U:"4Q",1c:d,O:b,1W:a,1H:c})},7l:J(b,a){K E.22(b,V,a,"1m")},7k:J(c,b,a){K E.22(c,b,a,"3i")},7i:J(d,b,a,c){7(E.1q(b)){a=b;b={}}K E.3P({U:"61",1c:d,O:b,1W:a,1H:c})},85:J(a){E.1s(E.4I,a)},4I:{2a:P,U:"4Q",2U:0,5P:"4o/x-7h-3u-7g",5N:P,3l:P,O:V,6p:V,3I:V,49:{3M:"4o/3M, 1u/3M",3q:"1u/3q",1m:"1u/4m, 4o/4m",3i:"4o/3i, 1u/4m",1u:"1u/a7",4G:"*/*"}},4F:{},3P:J(s){L f,2W=/=\\?(&|$)/g,1z,O;s=E.1s(P,s,E.1s(P,{},E.4I,s));7(s.O&&s.5N&&1o s.O!="25")s.O=E.3m(s.O);7(s.1H=="4E"){7(s.U.2h()=="22"){7(!s.1c.1D(2W))s.1c+=(s.1c.1D(/\\?/)?"&":"?")+(s.4E||"7d")+"=?"}N 7(!s.O||!s.O.1D(2W))s.O=(s.O?s.O+"&":"")+(s.4E||"7d")+"=?";s.1H="3i"}7(s.1H=="3i"&&(s.O&&s.O.1D(2W)||s.1c.1D(2W))){f="4E"+B++;7(s.O)s.O=(s.O+"").1r(2W,"="+f+"$1");s.1c=s.1c.1r(2W,"="+f+"$1");s.1H="1m";1e[f]=J(a){O=a;1W();1y();1e[f]=10;1S{2V 1e[f]}1X(e){}7(h)h.34(g)}}7(s.1H=="1m"&&s.1T==V)s.1T=S;7(s.1T===S&&s.U.2h()=="22"){L i=(1B 3v()).3L();L j=s.1c.1r(/(\\?|&)4r=.*?(&|$)/,"$a4="+i+"$2");s.1c=j+((j==s.1c)?(s.1c.1D(/\\?/)?"&":"?")+"4r="+i:"")}7(s.O&&s.U.2h()=="22"){s.1c+=(s.1c.1D(/\\?/)?"&":"?")+s.O;s.O=V}7(s.2a&&!E.5H++)E.16.1N("5S");7((!s.1c.1f("a3")||!s.1c.1f("//"))&&s.1H=="1m"&&s.U.2h()=="22"){L h=T.3S("6f")[0];L g=T.3s("1m");g.3Q=s.1c;7(s.7c)g.a2=s.7c;7(!f){L l=S;g.9Z=g.9Y=J(){7(!l&&(!6.39||6.39=="5V"||6.39=="1y")){l=P;1W();1y();h.34(g)}}}h.38(g);K 10}L m=S;L k=1e.78?1B 78("9X.9V"):1B 76();k.9T(s.U,s.1c,s.3l,s.6p,s.3I);1S{7(s.O)k.4C("9R-9Q",s.5P);7(s.5C)k.4C("9O-5A-9N",E.4F[s.1c]||"9L, 9K 9I 9H 5z:5z:5z 9F");k.4C("X-9C-9A","76");k.4C("9z",s.1H&&s.49[s.1H]?s.49[s.1H]+", */*":s.49.4G)}1X(e){}7(s.6Y)s.6Y(k);7(s.2a)E.16.1N("6m",[k,s]);L c=J(a){7(!m&&k&&(k.39==4||a=="2U")){m=P;7(d){6I(d);d=V}1z=a=="2U"&&"2U"||!E.6X(k)&&"3a"||s.5C&&E.6J(k,s.1c)&&"5U"||"1W";7(1z=="1W"){1S{O=E.6W(k,s.1H)}1X(e){1z="5x"}}7(1z=="1W"){L b;1S{b=k.5q("6U-5A")}1X(e){}7(s.5C&&b)E.4F[s.1c]=b;7(!f)1W()}N E.5v(s,k,1z);1y();7(s.3l)k=V}};7(s.3l){L d=53(c,13);7(s.2U>0)3z(J(){7(k){k.9t();7(!m)c("2U")}},s.2U)}1S{k.9s(s.O)}1X(e){E.5v(s,k,V,e)}7(!s.3l)c();J 1W(){7(s.1W)s.1W(O,1z);7(s.2a)E.16.1N("5Q",[k,s])}J 1y(){7(s.1y)s.1y(k,1z);7(s.2a)E.16.1N("5R",[k,s]);7(s.2a&&!--E.5H)E.16.1N("6d")}K k},5v:J(s,a,b,e){7(s.3a)s.3a(a,b,e);7(s.2a)E.16.1N("6D",[a,s,e])},5H:0,6X:J(r){1S{K!r.1z&&9q.9p=="59:"||(r.1z>=6T&&r.1z<9n)||r.1z==6R||r.1z==9l||E.14.2d&&r.1z==10}1X(e){}K S},6J:J(a,c){1S{L b=a.5q("6U-5A");K a.1z==6R||b==E.4F[c]||E.14.2d&&a.1z==10}1X(e){}K S},6W:J(r,b){L c=r.5q("9k-U");L d=b=="3M"||!b&&c&&c.1f("3M")>=0;L a=d?r.9j:r.4b;7(d&&a.1F.28=="5x")6Q"5x";7(b=="1m")E.5g(a);7(b=="3i")a=6c("("+a+")");K a},3m:J(a){L s=[];7(a.1k==1M||a.5h)E.R(a,J(){s.1g(3r(6.31)+"="+3r(6.1A))});N Q(L j 1p a)7(a[j]&&a[j].1k==1M)E.R(a[j],J(){s.1g(3r(j)+"="+3r(6))});N s.1g(3r(j)+"="+3r(a[j]));K s.6a("&").1r(/%20/g,"+")}});E.1n.1s({1G:J(c,b){K c?6.2e({1R:"1G",27:"1G",1w:"1G"},c,b):6.1E(":1Z").R(J(){6.W.19=6.5s||"";7(E.1j(6,"19")=="2H"){L a=E("<"+6.28+" />").6y("1h");6.W.19=a.1j("19");7(6.W.19=="2H")6.W.19="3D";a.1V()}}).3h()},1I:J(b,a){K b?6.2e({1R:"1I",27:"1I",1w:"1I"},b,a):6.1E(":4d").R(J(){6.5s=6.5s||E.1j(6,"19");6.W.19="2H"}).3h()},6N:E.1n.2g,2g:J(a,b){K E.1q(a)&&E.1q(b)?6.6N(a,b):a?6.2e({1R:"2g",27:"2g",1w:"2g"},a,b):6.R(J(){E(6)[E(6).3H(":1Z")?"1G":"1I"]()})},9f:J(b,a){K 6.2e({1R:"1G"},b,a)},9d:J(b,a){K 6.2e({1R:"1I"},b,a)},9c:J(b,a){K 6.2e({1R:"2g"},b,a)},9a:J(b,a){K 6.2e({1w:"1G"},b,a)},99:J(b,a){K 6.2e({1w:"1I"},b,a)},97:J(c,a,b){K 6.2e({1w:a},c,b)},2e:J(l,k,j,h){L i=E.6P(k,j,h);K 6[i.2P===S?"R":"2P"](J(){7(6.15!=1)K S;L g=E.1s({},i);L f=E(6).3H(":1Z"),4A=6;Q(L p 1p l){7(l[p]=="1I"&&f||l[p]=="1G"&&!f)K E.1q(g.1y)&&g.1y.1i(6);7(p=="1R"||p=="27"){g.19=E.1j(6,"19");g.32=6.W.32}}7(g.32!=V)6.W.32="1Z";g.40=E.1s({},l);E.R(l,J(c,a){L e=1B E.2t(4A,g,c);7(/2g|1G|1I/.17(a))e[a=="2g"?f?"1G":"1I":a](l);N{L b=a.3X().1D(/^([+-]=)?([\\d+-.]+)(.*)$/),1Y=e.2m(P)||0;7(b){L d=2M(b[2]),2A=b[3]||"2S";7(2A!="2S"){4A.W[c]=(d||1)+2A;1Y=((d||1)/e.2m(P))*1Y;4A.W[c]=1Y+2A}7(b[1])d=((b[1]=="-="?-1:1)*d)+1Y;e.45(1Y,d,2A)}N e.45(1Y,a,"")}});K P})},2P:J(a,b){7(E.1q(a)||(a&&a.1k==1M)){b=a;a="2t"}7(!a||(1o a=="25"&&!b))K A(6[0],a);K 6.R(J(){7(b.1k==1M)A(6,a,b);N{A(6,a).1g(b);7(A(6,a).M==1)b.1i(6)}})},94:J(b,c){L a=E.3G;7(b)6.2P([]);6.R(J(){Q(L i=a.M-1;i>=0;i--)7(a[i].Y==6){7(c)a[i](P);a.72(i,1)}});7(!c)6.5p();K 6}});L A=J(b,c,a){7(!b)K 10;c=c||"2t";L q=E.O(b,c+"2P");7(!q||a)q=E.O(b,c+"2P",a?E.2I(a):[]);K q};E.1n.5p=J(a){a=a||"2t";K 6.R(J(){L q=A(6,a);q.4l();7(q.M)q[0].1i(6)})};E.1s({6P:J(b,a,c){L d=b&&b.1k==92?b:{1y:c||!c&&a||E.1q(b)&&b,2u:b,3Z:c&&a||a&&a.1k!=91&&a};d.2u=(d.2u&&d.2u.1k==51?d.2u:{90:8Z,9D:6T}[d.2u])||8X;d.5y=d.1y;d.1y=J(){7(d.2P!==S)E(6).5p();7(E.1q(d.5y))d.5y.1i(6)};K d},3Z:{70:J(p,n,b,a){K b+a*p},5j:J(p,n,b,a){K((-24.8V(p*24.8U)/2)+0.5)*a+b}},3G:[],3W:V,2t:J(b,c,a){6.11=c;6.Y=b;6.1l=a;7(!c.47)c.47={}}});E.2t.2l={4y:J(){7(6.11.30)6.11.30.1i(6.Y,[6.2J,6]);(E.2t.30[6.1l]||E.2t.30.4G)(6);7(6.1l=="1R"||6.1l=="27")6.Y.W.19="3D"},2m:J(a){7(6.Y[6.1l]!=V&&6.Y.W[6.1l]==V)K 6.Y[6.1l];L r=2M(E.1j(6.Y,6.1l,a));K r&&r>-8Q?r:2M(E.2o(6.Y,6.1l))||0},45:J(c,b,d){6.5B=(1B 3v()).3L();6.1Y=c;6.3h=b;6.2A=d||6.2A||"2S";6.2J=6.1Y;6.4B=6.4w=0;6.4y();L e=6;J t(a){K e.30(a)}t.Y=6.Y;E.3G.1g(t);7(E.3W==V){E.3W=53(J(){L a=E.3G;Q(L i=0;i6.11.2u+6.5B){6.2J=6.3h;6.4B=6.4w=1;6.4y();6.11.40[6.1l]=P;L b=P;Q(L i 1p 6.11.40)7(6.11.40[i]!==P)b=S;7(b){7(6.11.19!=V){6.Y.W.32=6.11.32;6.Y.W.19=6.11.19;7(E.1j(6.Y,"19")=="2H")6.Y.W.19="3D"}7(6.11.1I)6.Y.W.19="2H";7(6.11.1I||6.11.1G)Q(L p 1p 6.11.40)E.1J(6.Y.W,p,6.11.47[p])}7(b&&E.1q(6.11.1y))6.11.1y.1i(6.Y);K S}N{L n=t-6.5B;6.4w=n/6.11.2u;6.4B=E.3Z[6.11.3Z||(E.3Z.5j?"5j":"70")](6.4w,n,0,1,6.11.2u);6.2J=6.1Y+((6.3h-6.1Y)*6.4B);6.4y()}K P}};E.2t.30={2v:J(a){a.Y.2v=a.2J},2x:J(a){a.Y.2x=a.2J},1w:J(a){E.1J(a.Y.W,"1w",a.2J)},4G:J(a){a.Y.W[a.1l]=a.2J+a.2A}};E.1n.5L=J(){L b=0,3b=0,Y=6[0],5l;7(Y)8M(E.14){L d=Y.1a,41=Y,1K=Y.1K,1L=Y.2i,5D=2d&&4s(5K)<8J&&!/a1/i.17(v),2T=E.1j(Y,"43")=="2T";7(Y.6G){L c=Y.6G();1b(c.26+24.2f(1L.1F.2v,1L.1h.2v),c.3b+24.2f(1L.1F.2x,1L.1h.2x));1b(-1L.1F.62,-1L.1F.60)}N{1b(Y.5G,Y.5F);2b(1K){1b(1K.5G,1K.5F);7(48&&!/^t(8H|d|h)$/i.17(1K.28)||2d&&!5D)2N(1K);7(!2T&&E.1j(1K,"43")=="2T")2T=P;41=/^1h$/i.17(1K.28)?41:1K;1K=1K.1K}2b(d&&d.28&&!/^1h|3q$/i.17(d.28)){7(!/^8G|1O.*$/i.17(E.1j(d,"19")))1b(-d.2v,-d.2x);7(48&&E.1j(d,"32")!="4d")2N(d);d=d.1a}7((5D&&(2T||E.1j(41,"43")=="4W"))||(48&&E.1j(41,"43")!="4W"))1b(-1L.1h.5G,-1L.1h.5F);7(2T)1b(24.2f(1L.1F.2v,1L.1h.2v),24.2f(1L.1F.2x,1L.1h.2x))}5l={3b:3b,26:b}}J 2N(a){1b(E.2o(a,"a8",P),E.2o(a,"a9",P))}J 1b(l,t){b+=4s(l)||0;3b+=4s(t)||0}K 5l}})();',62,631,'||||||this|if||||||||||||||||||||||||||||||||||||||function|return|var|length|else|data|true|for|each|false|document|type|null|style||elem||undefined|options|nodeName||browser|nodeType|event|test|arguments|display|parentNode|add|url|msie|window|indexOf|push|body|apply|css|constructor|prop|script|fn|typeof|in|isFunction|replace|extend|className|text|handle|opacity|div|complete|status|value|new|firstChild|match|filter|documentElement|show|dataType|hide|attr|offsetParent|doc|Array|trigger|table|call|break|height|try|cache|tbody|remove|success|catch|start|hidden||ready|get|split|Math|string|left|width|tagName|ret|global|while|map|safari|animate|max|toggle|toLowerCase|ownerDocument|bind|select|prototype|cur||curCSS|selected|handler|done|find|fx|duration|scrollLeft|id|scrollTop|special|opera|unit|nextSibling|stack|guid|toUpperCase|pushStack|button|none|makeArray|now|slice|target|parseFloat|border|exec|queue|isReady|events|px|fixed|timeout|delete|jsre|one|disabled|nth|step|name|overflow|inArray|removeChild|removeData|preventDefault|merge|appendChild|readyState|error|top|which|innerHTML|multiFilter|rl|trim|end|json|first|checked|async|param|elems|insertBefore|childNodes|html|encodeURIComponent|createElement|append|form|Date|unbind|color|grep|setTimeout|readyList|mouseleave|mouseenter|block|isXMLDoc|addEventListener|timers|is|password|last|runtimeStyle|getTime|xml|jQuery|domManip|ajax|src|callee|getElementsByTagName|selectedIndex|load|object|timerId|toString|has|easing|curAnim|offsetChild|args|position|stopPropagation|custom|props|orig|mozilla|accepts|clean|responseText|defaultView|visible|String|charCode|float|teardown|on|setup|nodeIndex|shift|javascript|currentStyle|application|child|RegExp|_|parseInt|previousSibling|dir|tr|state|empty|update|getAttribute|self|pos|setRequestHeader|input|jsonp|lastModified|_default|unload|ajaxSettings|unshift|getComputedStyle|styleSheets|getPropertyValue|lastToggle|mouseout|mouseover|GET|andSelf|relatedTarget|init|visibility|click|absolute|index|container|fix|outline|Number|removeAttribute|setInterval|prevObject|classFilter|not|unique|submit|file|after|windowData|deep|scroll|client|triggered|globalEval|jquery|sibling|swing|clone|results|wrapAll|triggerHandler|lastChild|dequeue|getResponseHeader|createTextNode|oldblock|checkbox|radio|handleError|fromElement|parsererror|old|00|Modified|startTime|ifModified|safari2|getWH|offsetTop|offsetLeft|active|values|getElementById|version|offset|bindReady|processData|val|contentType|ajaxSuccess|ajaxComplete|ajaxStart|serializeArray|notmodified|loaded|DOMContentLoaded|Width|ctrlKey|keyCode|clientTop|POST|clientLeft|clientX|pageX|exclusive|detachEvent|removeEventListener|swap|cloneNode|join|attachEvent|eval|ajaxStop|substr|head|parse|textarea|reset|image|zoom|odd|ajaxSend|even|before|username|prepend|expr|quickClass|uuid|quickID|quickChild|continue|textContent|appendTo|contents|evalScript|parent|defaultValue|ajaxError|setArray|compatMode|getBoundingClientRect|styleFloat|clearInterval|httpNotModified|nodeValue|100|alpha|_toggle|href|speed|throw|304|replaceWith|200|Last|colgroup|httpData|httpSuccess|beforeSend|eq|linear|concat|splice|fieldset|multiple|cssFloat|XMLHttpRequest|webkit|ActiveXObject|CSS1Compat|link|metaKey|scriptCharset|callback|col|pixelLeft|urlencoded|www|post|hasClass|getJSON|getScript|elements|serialize|black|keyup|keypress|solid|change|mousemove|mouseup|dblclick|resize|focus|blur|stylesheet|rel|doScroll|round|hover|padding|offsetHeight|mousedown|offsetWidth|Bottom|Top|keydown|clientY|Right|pageY|Left|toElement|srcElement|cancelBubble|returnValue|charAt|0n|substring|animated|header|noConflict|line|enabled|innerText|contains|only|weight|ajaxSetup|font|size|gt|lt|uFFFF|u0128|417|Boolean|inner|Height|toggleClass|removeClass|addClass|removeAttr|replaceAll|insertAfter|prependTo|contentWindow|contentDocument|wrap|iframe|children|siblings|prevAll|nextAll|prev|wrapInner|next|parents|maxLength|maxlength|readOnly|readonly|reverse|class|htmlFor|inline|able|boxModel|522|setData|compatible|with|1px|ie|getData|10000|ra|it|rv|PI|cos|userAgent|400|navigator|600|slow|Function|Object|array|stop|ig|NaN|fadeTo|option|fadeOut|fadeIn|setAttribute|slideToggle|slideUp|changed|slideDown|be|can|property|responseXML|content|1223|getAttributeNode|300|method|protocol|location|action|send|abort|cssText|th|td|cap|specified|Accept|With|colg|Requested|fast|tfoot|GMT|thead|1970|Jan|attributes|01|Thu|leg|Since|If|opt|Type|Content|embed|open|area|XMLHTTP|hr|Microsoft|onreadystatechange|onload|meta|adobeair|charset|http|1_|img|br|plain|borderLeftWidth|borderTopWidth|abbr'.split('|'),0,{})) \ No newline at end of file diff --git a/bin/webgrind1.0/js/jquery.scrollTo.js b/bin/webgrind1.0/js/jquery.scrollTo.js new file mode 100644 index 0000000..b9d696e --- /dev/null +++ b/bin/webgrind1.0/js/jquery.scrollTo.js @@ -0,0 +1,10 @@ +/** + * jQuery.ScrollTo - Easy element scrolling using jQuery. + * Copyright (c) 2008 Ariel Flesler - aflesler(at)gmail(dot)com | http://flesler.blogspot.com + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * Date: 2/19/2008 + * @author Ariel Flesler + * @version 1.3.3 + */ +;(function($){var o=$.scrollTo=function(a,b,c){o.window().scrollTo(a,b,c)};o.defaults={axis:'y',duration:1};o.window=function(){return $($.browser.safari?'body':'html')};$.fn.scrollTo=function(l,m,n){if(typeof m=='object'){n=m;m=0}n=$.extend({},o.defaults,n);m=m||n.speed||n.duration;n.queue=n.queue&&n.axis.length>1;if(n.queue)m/=2;n.offset=j(n.offset);n.over=j(n.over);return this.each(function(){var a=this,b=$(a),t=l,c,d={},w=b.is('html,body');switch(typeof t){case'number':case'string':if(/^([+-]=)?\d+(px)?$/.test(t)){t=j(t);break}t=$(t,this);case'object':if(t.is||t.style)c=(t=$(t)).offset()}$.each(n.axis.split(''),function(i,f){var P=f=='x'?'Left':'Top',p=P.toLowerCase(),k='scroll'+P,e=a[k],D=f=='x'?'Width':'Height';if(c){d[k]=c[p]+(w?0:e-b.offset()[p]);if(n.margin){d[k]-=parseInt(t.css('margin'+P))||0;d[k]-=parseInt(t.css('border'+P+'Width'))||0}d[k]+=n.offset[p]||0;if(n.over[p])d[k]+=t[D.toLowerCase()]()*n.over[p]}else d[k]=t[p];if(/^\d+$/.test(d[k]))d[k]=d[k]<=0?0:Math.min(d[k],h(D));if(!i&&n.queue){if(e!=d[k])g(n.onAfterFirst);delete d[k]}});g(n.onAfter);function g(a){b.animate(d,m,n.easing,a&&function(){a.call(this,l)})};function h(D){var b=w?$.browser.opera?document.body:document.documentElement:a;return b['scroll'+D]-b['client'+D]}})};function j(a){return typeof a=='object'?a:{top:a,left:a}}})(jQuery); \ No newline at end of file diff --git a/bin/webgrind1.0/js/jquery.selectboxes.js b/bin/webgrind1.0/js/jquery.selectboxes.js new file mode 100644 index 0000000..ca0af31 --- /dev/null +++ b/bin/webgrind1.0/js/jquery.selectboxes.js @@ -0,0 +1,464 @@ +/* + * + * Copyright (c) 2006/2007 Sam Collett (http://www.texotela.co.uk) + * Licensed under the MIT License: + * http://www.opensource.org/licenses/mit-license.php + * + * Version 2.2.1 + * Demo: http://www.texotela.co.uk/code/jquery/select/ + * + * $LastChangedDate$ + * $Rev$ + * + */ + +(function($) { + +/** + * Adds (single/multiple) options to a select box (or series of select boxes) + * + * @name addOption + * @author Sam Collett (http://www.texotela.co.uk) + * @type jQuery + * @example $("#myselect").addOption("Value", "Text"); // add single value (will be selected) + * @example $("#myselect").addOption("Value 2", "Text 2", false); // add single value (won't be selected) + * @example $("#myselect").addOption({"foo":"bar","bar":"baz"}, false); // add multiple values, but don't select + * + */ +$.fn.addOption = function() +{ + var add = function(el, v, t, sO) + { + var option = document.createElement("option"); + option.value = v, option.text = t; + // get options + var o = el.options; + // get number of options + var oL = o.length; + if(!el.cache) + { + el.cache = {}; + // loop through existing options, adding to cache + for(var i = 0; i < oL; i++) + { + el.cache[o[i].value] = i; + } + } + // add to cache if it isn't already + if(typeof el.cache[v] == "undefined") el.cache[v] = oL; + el.options[el.cache[v]] = option; + if(sO) + { + option.selected = true; + } + }; + + var a = arguments; + if(a.length == 0) return this; + // select option when added? default is true + var sO = true; + // multiple items + var m = false; + // other variables + var items, v, t; + if(typeof(a[0]) == "object") + { + m = true; + items = a[0]; + } + if(a.length >= 2) + { + if(typeof(a[1]) == "boolean") sO = a[1]; + else if(typeof(a[2]) == "boolean") sO = a[2]; + if(!m) + { + v = a[0]; + t = a[1]; + } + } + this.each( + function() + { + if(this.nodeName.toLowerCase() != "select") return; + if(m) + { + for(var item in items) + { + add(this, item, items[item], sO); + } + } + else + { + add(this, v, t, sO); + } + } + ); + return this; +}; + +/** + * Add options via ajax + * + * @name ajaxAddOption + * @author Sam Collett (http://www.texotela.co.uk) + * @type jQuery + * @param String url Page to get options from (must be valid JSON) + * @param Object params (optional) Any parameters to send with the request + * @param Boolean select (optional) Select the added options, default true + * @param Function fn (optional) Call this function with the select object as param after completion + * @param Array args (optional) Array with params to pass to the function afterwards + * @example $("#myselect").ajaxAddOption("myoptions.php"); + * @example $("#myselect").ajaxAddOption("myoptions.php", {"code" : "007"}); + * @example $("#myselect").ajaxAddOption("myoptions.php", {"code" : "007"}, false, sortoptions, {"dir": "desc"}); + * + */ +$.fn.ajaxAddOption = function(url, params, select, fn, args) +{ + if(typeof(url) != "string") return this; + if(typeof(params) != "object") params = {}; + if(typeof(select) != "boolean") select = true; + this.each( + function() + { + var el = this; + $.getJSON(url, + params, + function(r) + { + $(el).addOption(r, select); + if(typeof fn == "function") + { + if(typeof args == "object") + { + fn.apply(el, args); + } + else + { + fn.call(el); + } + } + } + ); + } + ); + return this; +}; + +/** + * Removes an option (by value or index) from a select box (or series of select boxes) + * + * @name removeOption + * @author Sam Collett (http://www.texotela.co.uk) + * @type jQuery + * @param String|RegExp|Number what Option to remove + * @param Boolean selectedOnly (optional) Remove only if it has been selected (default false) + * @example $("#myselect").removeOption("Value"); // remove by value + * @example $("#myselect").removeOption(/^val/i); // remove options with a value starting with 'val' + * @example $("#myselect").removeOption(/./); // remove all options + * @example $("#myselect").removeOption(/./, true); // remove all options that have been selected + * @example $("#myselect").removeOption(0); // remove by index + * + */ +$.fn.removeOption = function() +{ + var a = arguments; + if(a.length == 0) return this; + var ta = typeof(a[0]); + var v, index; + // has to be a string or regular expression (object in IE, function in Firefox) + if(ta == "string" || ta == "object" || ta == "function" ) v = a[0]; + else if(ta == "number") index = a[0]; + else return this; + this.each( + function() + { + if(this.nodeName.toLowerCase() != "select") return; + // clear cache + if(this.cache) this.cache = null; + // does the option need to be removed? + var remove = false; + // get options + var o = this.options; + if(!!v) + { + // get number of options + var oL = o.length; + for(var i=oL-1; i>=0; i--) + { + if(v.constructor == RegExp) + { + if(o[i].value.match(v)) + { + remove = true; + } + } + else if(o[i].value == v) + { + remove = true; + } + // if the option is only to be removed if selected + if(remove && a[1] === true) remove = o[i].selected; + if(remove) + { + o[i] = null; + } + remove = false; + } + } + else + { + // only remove if selected? + if(a[1] === true) + { + remove = o[index].selected; + } + else + { + remove = true; + } + if(remove) + { + this.remove(index); + } + } + } + ); + return this; +}; + +/** + * Sort options (ascending or descending) in a select box (or series of select boxes) + * + * @name sortOptions + * @author Sam Collett (http://www.texotela.co.uk) + * @type jQuery + * @param Boolean ascending (optional) Sort ascending (true/undefined), or descending (false) + * @example // ascending + * $("#myselect").sortOptions(); // or $("#myselect").sortOptions(true); + * @example // descending + * $("#myselect").sortOptions(false); + * + */ +$.fn.sortOptions = function(ascending) +{ + var a = typeof(ascending) == "undefined" ? true : !!ascending; + this.each( + function() + { + if(this.nodeName.toLowerCase() != "select") return; + // get options + var o = this.options; + // get number of options + var oL = o.length; + // create an array for sorting + var sA = []; + // loop through options, adding to sort array + for(var i = 0; i o2t ? -1 : 1; + } + } + ); + // change the options to match the sort array + for(var i = 0; i 1) { + arr = arr.concat(checkCellColSpan(table, headerArr,row++)); + } else { + if(table.tHead.length == 1 || (cell.rowSpan > 1 || !r[row+1])) { + arr.push(cell); + } + //headerArr[row] = (i+row); + } + } + return arr; + }; + + function checkHeaderMetadata(cell) { + if(($.meta) && ($(cell).data().sorter === false)) { return true; }; + return false; + } + + function checkHeaderOptions(table,i) { + if((table.config.headers[i]) && (table.config.headers[i].sorter === false)) { return true; }; + return false; + } + + function applyWidget(table) { + var c = table.config.widgets; + var l = c.length; + for(var i=0; i < l; i++) { + + getWidgetById(c[i]).format(table); + } + + } + + function getWidgetById(name) { + var l = widgets.length; + for(var i=0; i < l; i++) { + if(widgets[i].id.toLowerCase() == name.toLowerCase() ) { + return widgets[i]; + } + } + }; + + function formatSortingOrder(v) { + + if(typeof(v) != "Number") { + i = (v.toLowerCase() == "desc") ? 1 : 0; + } else { + i = (v == (0 || 1)) ? v : 0; + } + return i; + } + + function isValueInArray(v, a) { + var l = a.length; + for(var i=0; i < l; i++) { + if(a[i][0] == v) { + return true; + } + } + return false; + } + + function setHeadersCss(table,$headers, list, css) { + // remove all header information + $headers.removeClass(css[0]).removeClass(css[1]); + + var h = []; + $headers.each(function(offset) { + if(!this.sortDisabled) { + h[this.column] = $(this); + } + }); + + var l = list.length; + for(var i=0; i < l; i++) { + h[list[i][0]].addClass(css[list[i][1]]); + } + } + + function fixColumnWidth(table,$headers) { + var c = table.config; + if(c.widthFixed) { + var colgroup = $(''); + $("tr:first td",table.tBodies[0]).each(function() { + colgroup.append($('').css('width',$(this).width())); + }); + $(table).prepend(colgroup); + }; + } + + function updateHeaderSortCount(table,sortList) { + var c = table.config, l = sortList.length; + for(var i=0; i < l; i++) { + var s = sortList[i], o = c.headerList[s[0]]; + o.count = s[1]; + o.count++; + } + } + + /* sorting methods */ + function multisort(table,sortList,cache) { + + + if(table.config.debug) { var sortTime = new Date(); } + + var dynamicExp = "var sortWrapper = function(a,b) {", l = sortList.length; + + for(var i=0; i < l; i++) { + + var c = sortList[i][0]; + var order = sortList[i][1]; + var s = (getCachedSortType(table.config.parsers,c) == "text") ? ((order == 0) ? "sortText" : "sortTextDesc") : ((order == 0) ? "sortNumeric" : "sortNumericDesc"); + + var e = "e" + i; + + dynamicExp += "var " + e + " = " + s + "(a[" + c + "],b[" + c + "]); "; + dynamicExp += "if(" + e + ") { return " + e + "; } "; + dynamicExp += "else { "; + } + + // if value is the same keep orignal order + var orgOrderCol = cache.normalized[0].length - 1; + dynamicExp += "return a[" + orgOrderCol + "]-b[" + orgOrderCol + "];"; + + for(var i=0; i < l; i++) { + dynamicExp += "}; "; + } + + dynamicExp += "return 0; "; + dynamicExp += "}; "; + + eval(dynamicExp); + + cache.normalized.sort(sortWrapper); + + if(table.config.debug) { benchmark("Sorting on " + sortList.toString() + " and dir " + order+ " time:", sortTime); } + + return cache; + }; + + function sortText(a,b) { + return ((a < b) ? -1 : ((a > b) ? 1 : 0)); + }; + + function sortTextDesc(a,b) { + return ((b < a) ? -1 : ((b > a) ? 1 : 0)); + }; + + function sortNumeric(a,b) { + return a-b; + }; + + function sortNumericDesc(a,b) { + return b-a; + }; + + function getCachedSortType(parsers,i) { + return parsers[i].type; + }; + + /* public methods */ + this.construct = function(settings) { + + return this.each(function() { + + if(!this.tHead || !this.tBodies) return; + + var $this, $document,$headers, cache, config, shiftDown = 0, sortOrder; + + this.config = {}; + + config = $.extend(this.config, $.tablesorter.defaults, settings); + + // store common expression for speed + $this = $(this); + + // build headers + $headers = buildHeaders(this); + + // try to auto detect column type, and store in tables config + this.config.parsers = buildParserCache(this,$headers); + + + // build the cache for the tbody cells + cache = buildCache(this); + + // get the css class names, could be done else where. + var sortCSS = [config.cssDesc,config.cssAsc]; + + // fixate columns if the users supplies the fixedWidth option + fixColumnWidth(this); + + // apply event handling to headers + // this is to big, perhaps break it out? + $headers.click(function(e) { + + var totalRows = ($this[0].tBodies[0] && $this[0].tBodies[0].rows.length) || 0; + + if(!this.sortDisabled && totalRows > 0) { + // store exp, for speed + var $cell = $(this); + + // get current column index + var i = this.column; + + this.order = (this.count++) % 2; + + + // user only whants to sort on one column + if(!e[config.sortMultiSortKey]) { + + // flush the sort list + config.sortList = []; + + if(config.sortForce != null) { + var a = config.sortForce; + for(var j=0; j < a.length; j++) { + config.sortList.push(a[j]); + } + } + + // add column to sort list + config.sortList.push([i,this.order]); + + // multi column sorting + } else { + // the user has clicked on an all ready sortet column. + if(isValueInArray(i,config.sortList)) { + + // revers the sorting direction for all tables. + for(var j=0; j < config.sortList.length; j++) { + var s = config.sortList[j], o = config.headerList[s[0]]; + if(s[0] == i) { + o.count = s[1]; + o.count++; + s[1] = o.count % 2; + } + } + } else { + // add column to sort list array + config.sortList.push([i,this.order]); + } + }; + + // trigger sortstart + $this.trigger("sortStart"); + + //set css for headers + setHeadersCss($this[0],$headers,config.sortList,sortCSS); + + // javascript threading.. + setTimeout(function() { + // sort the table and append it to the dom + appendToTable($this[0],multisort($this[0],config.sortList,cache)); + // trigger sortstart + $this.trigger("sortEnd"); + }, 0); + + // stop normal event by returning false + return false; + } + // cancel selection + }).mousedown(function() { + if(config.cancelSelection) { + this.onselectstart = function() {return false}; + return false; + } + }); + + // apply easy methods that trigger binded events + $this.bind("update",function() { + + // rebuild parsers. + this.config.parsers = buildParserCache(this,$headers); + + // rebuild the cache map + cache = buildCache(this); + + }).bind("sorton",function(e,list) { + + config.sortList = list; + + // update and store the sortlist + var sortList = config.sortList; + + // update header count index + updateHeaderSortCount(this,sortList); + + //set css for headers + setHeadersCss(this,$headers,sortList,sortCSS); + + // sort the table and append it to the dom + appendToTable(this,multisort(this,sortList,cache)); + + }).bind("appendCache",function() { + + appendToTable(this,cache); + + }).bind("applyWidgetId",function(e,id) { + + getWidgetById(id).format(this); + + }).bind("applyWidgets",function() { + // apply widgets + applyWidget(this); + }); + + if($.meta && ($(this).data() && $(this).data().sortlist)) { + config.sortList = $(this).data().sortlist; + } + // if user has supplied a sort list to constructor. + if(config.sortList.length > 0) { + $this.trigger("sorton",[config.sortList]); + } + + // apply widgets + applyWidget(this); + }); + }; + + this.addParser = function(parser) { + var l = parsers.length, a = true; + for(var i=0; i < l; i++) { + if(parsers[i].id.toLowerCase() == parser.id.toLowerCase()) { + a = false; + } + } + if(a) { parsers.push(parser); }; + }; + + this.addWidget = function(widget) { + widgets.push(widget); + }; + + this.formatFloat = function(s) { + + var i = parseFloat(s); + return (isNaN(i)) ? 0 : i; + }; + this.formatInt = function(s) { + var i = parseInt(s); + return (isNaN(i)) ? 0 : i; + }; + + this.clearTableBody = function(table) { + + if($.browser.msie) { + + function empty() { + + while ( this.firstChild ) this.removeChild( this.firstChild ); + + } + + empty.apply(table.tBodies[0]); + + } else { + table.tBodies[0].innerHTML = ""; + } + }; + } + }); + + // extend plugin scope + $.fn.extend({ + tablesorter: $.tablesorter.construct + }); + + var ts = $.tablesorter; + + // add default parsers + ts.addParser({ + id: "text", + is: function(s) { + return true; + }, + format: function(s) { + return $.trim(s.toLowerCase()); + }, + type: "text" + }); + + ts.addParser({ + id: "integer", + is: function(s) { + return /^\d+$/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat(s); + }, + type: "numeric" + }); + + ts.addParser({ + id: "currency", + is: function(s) { + return /^[£$€?.]/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/[^0-9.]/g),"")); + }, + type: "numeric" + }); + + ts.addParser({ + id: "floating", + is: function(s) { + return s.match(new RegExp(/^(\+|-)?[0-9]+\.[0-9]+((E|e)(\+|-)?[0-9]+)?$/)); + }, + format: function(s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/,/),"")); + }, + type: "numeric" + }); + + ts.addParser({ + id: "ipAddress", + is: function(s) { + return /^\d{2,3}[\.]\d{2,3}[\.]\d{2,3}[\.]\d{2,3}$/.test(s); + }, + format: function(s) { + var a = s.split("."), r = "", l = a.length; + for(var i = 0; i < l; i++) { + var item = a[i]; + if(item.length == 2) { + r += "0" + item; + } else { + r += item; + } + } + return $.tablesorter.formatFloat(r); + }, + type: "numeric" + }); + + ts.addParser({ + id: "url", + is: function(s) { + return /^(https?|ftp|file):\/\/$/.test(s); + }, + format: function(s) { + return jQuery.trim(s.replace(new RegExp(/(https?|ftp|file):\/\//),'')); + }, + type: "text" + }); + + ts.addParser({ + id: "isoDate", + is: function(s) { + return /^\d{4}[\/-]\d{1,2}[\/-]\d{1,2}$/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat((s != "") ? new Date(s.replace(new RegExp(/-/g),"/")).getTime() : "0"); + }, + type: "numeric" + }); + + ts.addParser({ + id: "percent", + is: function(s) { + return /^\d{1,3}%$/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat(s.replace(new RegExp(/%/g),"")); + }, + type: "numeric" + }); + + ts.addParser({ + id: "usLongDate", + is: function(s) { + return s.match(new RegExp(/^[A-Za-z]{3,10}\.? [0-9]{1,2}, ([0-9]{4}|'?[0-9]{2}) (([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(AM|PM)))$/)); + }, + format: function(s) { + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, + type: "numeric" + }); + + ts.addParser({ + id: "shortDate", + is: function(s) { + return /\d{1,2}[\/\-]\d{1,2}[\/\-]\d{2,4}/.test(s); + }, + format: function(s,table) { + var c = table.config; + s = s.replace(/\-/g,"/"); + if(c.dateFormat == "us") { + // reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$1/$2"); + } else if(c.dateFormat == "uk") { + //reformat the string in ISO format + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{4})/, "$3/$2/$1"); + } else if(c.dateFormat == "dd/mm/yy" || c.dateFormat == "dd-mm-yy") { + s = s.replace(/(\d{1,2})[\/\-](\d{1,2})[\/\-](\d{2})/, "$1/$2/$3"); + } + return $.tablesorter.formatFloat(new Date(s).getTime()); + }, + type: "numeric" + }); + + ts.addParser({ + id: "time", + is: function(s) { + return /^(([0-2]?[0-9]:[0-5][0-9])|([0-1]?[0-9]:[0-5][0-9]\s(am|pm)))$/.test(s); + }, + format: function(s) { + return $.tablesorter.formatFloat(new Date("2000/01/01 " + s).getTime()); + }, + type: "numeric" + }); + + + ts.addParser({ + id: "metadata", + is: function(s) { + return false; + }, + format: function(s,table,cell) { + var c = table.config, p = (!c.parserMetadataName) ? 'sortValue' : c.parserMetadataName; + return $(cell).data()[p]; + }, + type: "numeric" + }); + + // add default widgets + ts.addWidget({ + id: "zebra", + format: function(table) { + if(table.config.debug) { var time = new Date(); } + $("tr:visible",table.tBodies[0]) + .filter(':even') + .removeClass(table.config.widgetZebra.css[1]).addClass(table.config.widgetZebra.css[0]) + .end().filter(':odd') + .removeClass(table.config.widgetZebra.css[0]).addClass(table.config.widgetZebra.css[1]); + if(table.config.debug) { $.tablesorter.benchmark("Applying Zebra widget", time); } + } + }); + +})(jQuery); \ No newline at end of file diff --git a/bin/webgrind1.0/js/sprintf.js b/bin/webgrind1.0/js/sprintf.js new file mode 100644 index 0000000..7889776 --- /dev/null +++ b/bin/webgrind1.0/js/sprintf.js @@ -0,0 +1,55 @@ +/** + * sprintf() for JavaScript v.0.4 + * + * Copyright (c) 2007 Alexandru Marasteanu + * Thanks to David Baird (unit test and patch). + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License as published by the Free Software + * Foundation; either version 2 of the License, or (at your option) any later + * version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program; if not, write to the Free Software Foundation, Inc., 59 Temple + * Place, Suite 330, Boston, MA 02111-1307 USA + */ + +function str_repeat(i, m) { for (var o = []; m > 0; o[--m] = i); return(o.join('')); } + +function sprintf () { + var i = 0, a, f = arguments[i++], o = [], m, p, c, x; + while (f) { + if (m = /^[^\x25]+/.exec(f)) o.push(m[0]); + else if (m = /^\x25{2}/.exec(f)) o.push('%'); + else if (m = /^\x25(?:(\d+)\$)?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosuxX])/.exec(f)) { + if (((a = arguments[m[1] || i++]) == null) || (a == undefined)) throw("Too few arguments."); + if (/[^s]/.test(m[7]) && (typeof(a) != 'number')) + throw("Expecting number but found " + typeof(a)); + switch (m[7]) { + case 'b': a = a.toString(2); break; + case 'c': a = String.fromCharCode(a); break; + case 'd': a = parseInt(a); break; + case 'e': a = m[6] ? a.toExponential(m[6]) : a.toExponential(); break; + case 'f': a = m[6] ? parseFloat(a).toFixed(m[6]) : parseFloat(a); break; + case 'o': a = a.toString(8); break; + case 's': a = ((a = String(a)) && m[6] ? a.substring(0, m[6]) : a); break; + case 'u': a = Math.abs(a); break; + case 'x': a = a.toString(16); break; + case 'X': a = a.toString(16).toUpperCase(); break; + } + a = (/[def]/.test(m[7]) && m[2] && a > 0 ? '+' + a : a); + c = m[3] ? m[3] == '0' ? '0' : m[3].charAt(1) : ' '; + x = m[5] - String(a).length; + p = m[5] ? str_repeat(c, x) : ''; + o.push(m[4] ? a + p : p + a); + } + else throw ("Huh ?!"); + f = f.substring(m[0].length); + } + return o.join(''); +} diff --git a/bin/webgrind1.0/library/FileHandler.php b/bin/webgrind1.0/library/FileHandler.php new file mode 100644 index 0000000..9aed0fa --- /dev/null +++ b/bin/webgrind1.0/library/FileHandler.php @@ -0,0 +1,205 @@ +getFiles(Webgrind_Config::xdebugOutputFormat(), Webgrind_Config::xdebugOutputDir()); + + // Get list of preprocessed files + $prepFiles = $this->getPrepFiles('/\\'.Webgrind_Config::$preprocessedSuffix.'$/', Webgrind_Config::storageDir()); + // Loop over the preprocessed files. + foreach($prepFiles as $fileName=>$prepFile){ + $fileName = str_replace(Webgrind_Config::$preprocessedSuffix,'',$fileName); + + // If it is older than its corrosponding original: delete it. + // If it's original does not exist: delete it + if(!isset($files[$fileName]) || $files[$fileName]['mtime']>$prepFile['mtime'] ) + unlink($prepFile['absoluteFilename']); + else + $files[$fileName]['preprocessed'] = true; + } + // Sort by mtime + uasort($files,array($this,'mtimeCmp')); + + $this->files = $files; + } + + /** + * Get the value of the cmd header in $file + * + * @return void string + */ + private function getInvokeUrl($file){ + if (preg_match('/.webgrind$/', $file)) + return 'Webgrind internal'; + + // Grab name of invoked file. + $fp = fopen($file, 'r'); + $invokeUrl = ''; + while ((($line = fgets($fp)) !== FALSE) && !strlen($invokeUrl)){ + if (preg_match('/^cmd: (.*)$/', $line, $parts)){ + $invokeUrl = isset($parts[1]) ? $parts[1] : ''; + } + } + fclose($fp); + if (!strlen($invokeUrl)) + $invokeUrl = 'Unknown!'; + + return $invokeUrl; + } + + /** + * List of files in $dir whose filename has the format $format + * + * @return array Files + */ + private function getFiles($format, $dir){ + $list = preg_grep($format,scandir($dir)); + $files = array(); + + $scriptFilename = $_SERVER['SCRIPT_FILENAME']; + + # Moved this out of loop to run faster + if (function_exists('xdebug_get_profiler_filename')) + $selfFile = realpath(xdebug_get_profiler_filename()); + else + $selfFile = ''; + + foreach($list as $file){ + $absoluteFilename = $dir.$file; + + // Exclude webgrind preprocessed files + if (false !== strstr($absoluteFilename, Webgrind_Config::$preprocessedSuffix)) + continue; + + // Make sure that script never parses the profile currently being generated. (infinite loop) + if ($selfFile == realpath($absoluteFilename)) + continue; + + $invokeUrl = $this->getInvokeUrl($absoluteFilename); + if (Webgrind_Config::$hideWebgrindProfiles && $invokeUrl == dirname(dirname(__FILE__)).DIRECTORY_SEPARATOR.'index.php') + continue; + + + $files[$file] = array('absoluteFilename' => $absoluteFilename, + 'mtime' => filemtime($absoluteFilename), + 'preprocessed' => false, + 'invokeUrl' => $invokeUrl, + 'filesize' => $this->bytestostring(filesize($absoluteFilename)) + ); + } + return $files; + } + + /** + * List of files in $dir whose filename has the format $format + * + * @return array Files + */ + private function getPrepFiles($format, $dir){ + $list = preg_grep($format,scandir($dir)); + $files = array(); + + $scriptFilename = $_SERVER['SCRIPT_FILENAME']; + + foreach($list as $file){ + $absoluteFilename = $dir.$file; + + // Make sure that script does not include the profile currently being generated. (infinite loop) + if (function_exists('xdebug_get_profiler_filename') && realpath(xdebug_get_profiler_filename())==realpath($absoluteFilename)) + continue; + + $files[$file] = array('absoluteFilename' => $absoluteFilename, + 'mtime' => filemtime($absoluteFilename), + 'preprocessed' => true, + 'filesize' => $this->bytestostring(filesize($absoluteFilename)) + ); + } + return $files; + } + /** + * Get list of available trace files. Optionally including traces of the webgrind script it self + * + * @return array Files + */ + public function getTraceList(){ + $result = array(); + foreach($this->files as $fileName=>$file){ + $result[] = array('filename' => $fileName, + 'invokeUrl' => str_replace($_SERVER['DOCUMENT_ROOT'].'/', '', $file['invokeUrl']), + 'filesize' => $file['filesize'] + ); + } + return $result; + } + + /** + * Get a trace reader for the specific file. + * + * If the file has not been preprocessed yet this will be done first. + * + * @param string File to read + * @param Cost format for the reader + * @return Webgrind_Reader Reader for $file + */ + public function getTraceReader($file, $costFormat){ + $prepFile = Webgrind_Config::storageDir().$file.Webgrind_Config::$preprocessedSuffix; + try{ + $r = new Webgrind_Reader($prepFile, $costFormat); + } catch (Exception $e){ + // Preprocessed file does not exist or other error + Webgrind_Preprocessor::parse(Webgrind_Config::xdebugOutputDir().$file, $prepFile); + $r = new Webgrind_Reader($prepFile, $costFormat); + } + return $r; + } + + /** + * Comparison function for sorting + * + * @return boolean + */ + private function mtimeCmp($a, $b){ + if ($a['mtime'] == $b['mtime']) + return 0; + + return ($a['mtime'] > $b['mtime']) ? -1 : 1; + } + + /** + * Present a size (in bytes) as a human-readable value + * + * @param int $size size (in bytes) + * @param int $precision number of digits after the decimal point + * @return string + */ + private function bytestostring($size, $precision = 0) { + $sizes = array('YB', 'ZB', 'EB', 'PB', 'TB', 'GB', 'MB', 'KB', 'B'); + $total = count($sizes); + + while($total-- && $size > 1024) { + $size /= 1024; + } + return round($size, $precision).$sizes[$total]; + } +} \ No newline at end of file diff --git a/bin/webgrind1.0/library/Preprocessor.php b/bin/webgrind1.0/library/Preprocessor.php new file mode 100644 index 0000000..5022431 --- /dev/null +++ b/bin/webgrind1.0/library/Preprocessor.php @@ -0,0 +1,149 @@ +substr(trim($line),3), 'invocationCount'=>0,'nr'=>$nextFuncNr++,'count'=>0,'summedSelfCost'=>0,'summedInclusiveCost'=>0,'calledFromInformation'=>array(),'subCallInformation'=>array()); + } + $functions[$function]['invocationCount']++; + // Special case for ENTRY_POINT - it contains summary header + if(self::ENTRY_POINT == $function){ + fgets($in); + $headers[] = fgets($in); + fgets($in); + } + // Cost line + list($lnr, $cost) = fscanf($in,"%d %d"); + $functions[$function]['summedSelfCost'] += $cost; + $functions[$function]['summedInclusiveCost'] += $cost; + } else if(substr($line,0,4)==='cfn=') { + // Found call to function. ($function should contain function call originates from) + $calledFunctionName = substr(trim($line),4); + // Skip call line + fgets($in); + // Cost line + list($lnr, $cost) = fscanf($in,"%d %d"); + + $functions[$function]['summedInclusiveCost'] += $cost; + + if(!isset($functions[$calledFunctionName]['calledFromInformation'][$function.':'.$lnr])) + $functions[$calledFunctionName]['calledFromInformation'][$function.':'.$lnr] = array('functionNr'=>$functions[$function]['nr'],'line'=>$lnr,'callCount'=>0,'summedCallCost'=>0); + + $functions[$calledFunctionName]['calledFromInformation'][$function.':'.$lnr]['callCount']++; + $functions[$calledFunctionName]['calledFromInformation'][$function.':'.$lnr]['summedCallCost'] += $cost; + + if(!isset($functions[$function]['subCallInformation'][$calledFunctionName.':'.$lnr])) + $functions[$function]['subCallInformation'][$calledFunctionName.':'.$lnr] = array('functionNr'=>$functions[$calledFunctionName]['nr'],'line'=>$lnr,'callCount'=>0,'summedCallCost'=>0); + + $functions[$function]['subCallInformation'][$calledFunctionName.':'.$lnr]['callCount']++; + $functions[$function]['subCallInformation'][$calledFunctionName.':'.$lnr]['summedCallCost'] += $cost; + + + } else if(strpos($line,': ')!==false){ + // Found header + $headers[] = $line; + } + } + + + // Write output + $functionCount = sizeof($functions); + fwrite($out, pack(self::NR_FORMAT.'*', self::FILE_FORMAT_VERSION, 0, $functionCount)); + // Make room for function addresses + fseek($out,self::NR_SIZE*$functionCount, SEEK_CUR); + $functionAddresses = array(); + foreach($functions as $functionName => $function){ + $functionAddresses[] = ftell($out); + $calledFromCount = sizeof($function['calledFromInformation']); + $subCallCount = sizeof($function['subCallInformation']); + fwrite($out, pack(self::NR_FORMAT.'*', $function['summedSelfCost'], $function['summedInclusiveCost'], $function['invocationCount'], $calledFromCount, $subCallCount)); + // Write called from information + foreach($function['calledFromInformation'] as $call){ + fwrite($out, pack(self::NR_FORMAT.'*', $call['functionNr'], $call['line'], $call['callCount'], $call['summedCallCost'])); + } + // Write sub call information + foreach($function['subCallInformation'] as $call){ + fwrite($out, pack(self::NR_FORMAT.'*', $call['functionNr'], $call['line'], $call['callCount'], $call['summedCallCost'])); + } + + fwrite($out, $function['filename']."\n".$functionName."\n"); + } + $headersPos = ftell($out); + // Write headers + foreach($headers as $header){ + fwrite($out,$header); + } + + // Write addresses + fseek($out,self::NR_SIZE, SEEK_SET); + fwrite($out, pack(self::NR_FORMAT, $headersPos)); + // Skip function count + fseek($out,self::NR_SIZE, SEEK_CUR); + // Write function addresses + foreach($functionAddresses as $address){ + fwrite($out, pack(self::NR_FORMAT, $address)); + } + + } + +} diff --git a/bin/webgrind1.0/library/Reader.php b/bin/webgrind1.0/library/Reader.php new file mode 100644 index 0000000..c5e1b56 --- /dev/null +++ b/bin/webgrind1.0/library/Reader.php @@ -0,0 +1,259 @@ +fp = @fopen($dataFile,'rb'); + if(!$this->fp) + throw new Exception('Error opening file!'); + + $this->costFormat = $costFormat; + $this->init(); + } + + /** + * Initializes the parser by reading initial information. + * + * Throws an exception if the file version does not match the readers version + * + * @return void + * @throws Exception + */ + private function init(){ + list($version, $this->headersPos, $functionCount) = $this->read(3); + if($version!=self::FILE_FORMAT_VERSION) + throw new Exception('Datafile not correct version. Found '.$version.' expected '.self::FILE_FORMAT_VERSION); + $this->functionPos = $this->read($functionCount); + } + + /** + * Returns number of functions + * @return int + */ + function getFunctionCount(){ + return count($this->functionPos); + } + + /** + * Returns information about function with nr $nr + * + * @param $nr int Function number + * @return array Function information + */ + function getFunctionInfo($nr){ + $this->seek($this->functionPos[$nr]); + + list($summedSelfCost, $summedInclusiveCost, $invocationCount, $calledFromCount, $subCallCount) = $this->read(5); + + $this->seek(self::NR_SIZE*self::CALLINFORMATION_LENGTH*($calledFromCount+$subCallCount), SEEK_CUR); + $file = $this->readLine(); + $function = $this->readLine(); + + $result = array( + 'file'=>$file, + 'functionName'=>$function, + 'summedSelfCost'=>$summedSelfCost, + 'summedInclusiveCost'=>$summedInclusiveCost, + 'invocationCount'=>$invocationCount, + 'calledFromInfoCount'=>$calledFromCount, + 'subCallInfoCount'=>$subCallCount + ); + $result['summedSelfCost'] = $this->formatCost($result['summedSelfCost']); + $result['summedInclusiveCost'] = $this->formatCost($result['summedInclusiveCost']); + + return $result; + } + + /** + * Returns information about positions where a function has been called from + * + * @param $functionNr int Function number + * @param $calledFromNr int Called from position nr + * @return array Called from information + */ + function getCalledFromInfo($functionNr, $calledFromNr){ + // 5 = number of numbers before called from information + $this->seek($this->functionPos[$functionNr]+self::NR_SIZE*(self::CALLINFORMATION_LENGTH*$calledFromNr+5)); + $data = $this->read(self::CALLINFORMATION_LENGTH); + + $result = array( + 'functionNr'=>$data[0], + 'line'=>$data[1], + 'callCount'=>$data[2], + 'summedCallCost'=>$data[3] + ); + + $result['summedCallCost'] = $this->formatCost($result['summedCallCost']); + + return $result; + } + + /** + * Returns information about functions called by a function + * + * @param $functionNr int Function number + * @param $subCallNr int Sub call position nr + * @return array Sub call information + */ + function getSubCallInfo($functionNr, $subCallNr){ + // 4 = number of numbers before sub call count + $this->seek($this->functionPos[$functionNr]+self::NR_SIZE*3); + $calledFromInfoCount = $this->read(); + $this->seek( ( ($calledFromInfoCount+$subCallNr) * self::CALLINFORMATION_LENGTH + 1 ) * self::NR_SIZE,SEEK_CUR); + $data = $this->read(self::CALLINFORMATION_LENGTH); + + $result = array( + 'functionNr'=>$data[0], + 'line'=>$data[1], + 'callCount'=>$data[2], + 'summedCallCost'=>$data[3] + ); + + $result['summedCallCost'] = $this->formatCost($result['summedCallCost']); + + return $result; + } + + /** + * Returns array of defined headers + * + * @return array Headers in format array('header name'=>'header value') + */ + function getHeaders(){ + if($this->headers==null){ // Cache headers + $this->seek($this->headersPos); + $this->headers['runs'] = 0; + while($line=$this->readLine()){ + $parts = explode(': ',$line); + if ($parts[0] == 'summary') { + $this->headers['runs']++; + if(isset($this->headers['summary'])) + $this->headers['summary'] += $parts[1]; + else + $this->headers['summary'] = $parts[1]; + } else { + $this->headers[$parts[0]] = $parts[1]; + } + } + } + return $this->headers; + } + + /** + * Returns value of a single header + * + * @return string Header value + */ + function getHeader($header){ + $headers = $this->getHeaders(); + return isset($headers[$header]) ? $headers[$header] : ''; + } + + /** + * Formats $cost using the format in $this->costFormat or optionally the format given as input + * + * @param int $cost Cost + * @param string $format 'percent', 'msec' or 'usec' + * @return int Formatted cost + */ + function formatCost($cost, $format=null) + { + if($format==null) + $format = $this->costFormat; + + if ($format == 'percent') { + $total = $this->getHeader('summary'); + $result = ($total==0) ? 0 : ($cost*100)/$total; + return number_format($result, 2, '.', ''); + } + + if ($format == 'msec') { + return round($cost/1000, 0); + } + + // Default usec + return $cost; + + } + + private function read($numbers=1){ + $values = unpack(self::NR_FORMAT.$numbers,fread($this->fp,self::NR_SIZE*$numbers)); + if($numbers==1) + return $values[1]; + else + return array_values($values); // reindex and return + } + + private function readLine(){ + $result = fgets($this->fp); + if($result) + return trim($result); + else + return $result; + } + + private function seek($offset, $whence=SEEK_SET){ + return fseek($this->fp, $offset, $whence); + } + +} diff --git a/bin/webgrind1.0/license.txt b/bin/webgrind1.0/license.txt new file mode 100644 index 0000000..781751c --- /dev/null +++ b/bin/webgrind1.0/license.txt @@ -0,0 +1,30 @@ +Software License Agreement (BSD License) + +Copyright (c) 2008, Jacob Oettinger & Joakim Nygård +All rights reserved. + +Redistribution and use of this software in source and binary forms, with or without modification, are +permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above + copyright notice, this list of conditions and the + following disclaimer. + +* Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the + following disclaimer in the documentation and/or other + materials provided with the distribution. + +* Neither the name of Jacob Oettinger and Joakim Nygård nor the names of its + contributors may be used to endorse or promote products + derived from this software without specific prior + written permission of Jacob Oettinger and Joakim Nygård. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED +WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS +INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR +TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF +ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. \ No newline at end of file diff --git a/bin/webgrind1.0/neard.conf b/bin/webgrind1.0/neard.conf new file mode 100644 index 0000000..75b73aa --- /dev/null +++ b/bin/webgrind1.0/neard.conf @@ -0,0 +1,4 @@ +webgrindVersion = "1.0" +webgrindConf = "config.php" + +bundleRelease = "@RELEASE_VERSION@" diff --git a/bin/webgrind1.0/package.sh b/bin/webgrind1.0/package.sh new file mode 100644 index 0000000..d0bfb3e --- /dev/null +++ b/bin/webgrind1.0/package.sh @@ -0,0 +1,16 @@ +#!/bin/sh +if [ "$1" == "" ] +then + echo "Usage: package.sh " +else + mkdir package_tmp + rm webgrind-$1.zip + cd package_tmp + svn export https://webgrind.googlecode.com/svn/tags/$1 webgrind + svn export https://webgrind.googlecode.com/svn/wiki webgrind/docs + for i in webgrind/docs/*.wiki; do mv "$i" "${i%.wiki}.txt"; done + rm webgrind/package.sh + zip -r ../webgrind-$1.zip webgrind + cd .. + rm -rf package_tmp +fi diff --git a/bin/webgrind1.0/styles/style.css b/bin/webgrind1.0/styles/style.css new file mode 100644 index 0000000..3806473 --- /dev/null +++ b/bin/webgrind1.0/styles/style.css @@ -0,0 +1,176 @@ +body { + font-family : Helvetica, Verdana, Arial, sans-serif; + font-size : 12px; + color : #000000; + margin:0px; +} + +a { + color:#000000; + text-decoration:none; +} + +a:hover { + text-decoration:underline; +} + +#footer a { + text-decoration:underline; +} + +img { + border: 0; +} + +h2 { + font-size:16px; + margin:0px 0 5px 0; + font-weight:normal; +} + +#head { + padding:5px 10px 10px 10px; + border-bottom:1px solid #404040; + background:url(../img/head.png) repeat-x; +} +#logo { + float:left; + width:200px; +} +#logo h1 { + font:normal 30px "Futura", Helvetica, Verdana; + padding:0px; + margin:0px; +} +#logo p { + font:normal 11px "Verdana"; + margin:0px; + padding:0px; +} + +#options { + float:right; + width:580px; + padding:10px 0 0 0; +} +#options form { + margin:0px; +} + +#main { + margin:10px; +} + +#hello_message { + text-align: center; + margin: 30px 0; +} + +#trace_view { + display:none; +} + +#runtime_sum, +#invocation_sum, +#shown_sum { + font-weight: bold; +} + +#footer { + text-align: center; + font: normal 11px; +} + +div.hr { + border-top: 1px solid black; + margin:10px 5px; +} + +div.callinfo_area { + display: none; + margin: 5px 5px; +} + +table.tablesorter { + border-width: 1px 0 1px 1px; + border-style: solid; + border-color: #D9D9D9; + font-family:arial; + margin:10px 0pt 15px; + padding:0px; + font-size: 8pt; + width: 100%; + text-align: left; +} +table.tablesorter thead tr th, table.tablesorter tfoot tr th { + background-color: #D7DDE4; + border-right: 1px solid #CDCDCD; + border-bottom: 1px solid #CDCDCD; + font-size: 8pt; + padding: 4px; +} +table.tablesorter thead tr .header { + background-image: url(../img/bg.gif); + background-repeat: no-repeat; + background-position: center right; + cursor: pointer; +} +table.tablesorter tbody td { + color: #000000; + border-right:1px solid #D9D9D9; + padding: 4px; + vertical-align: top; +} +table.tablesorter tbody tr.odd { + background-color:#F1F5F9; +} +table.tablesorter tbody tr.even { + background-color:#FFFFFF; +} + +table.tablesorter thead tr .headerSortUp { + background-image: url(../img/asc.gif); +} +table.tablesorter thead tr .headerSortDown { + background-image: url(../img/desc.gif); +} +table.tablesorter thead tr .headerSortDown, table.tablesorter thead tr .headerSortUp { + background-color: #9BA8C6; +} + +td.nr { + text-align: right; + font-family: "Lucida Console", "Andale Mono", "Monaco", monospace; +} + +th span{ + margin-right: 13px; +} + +img.list_reload { + margin:0px 5px; +} + +.block_box { + margin: 10px 10px; +} + +.num { + float: left; + width:25px; + color: gray; + text-align: right; + margin-right: 6pt; + padding-right: 6pt; + border-right: 1px solid gray; +} + +#line_emph { + background-color: #bbbbff; +} +a.load_invocations { + display: none; + background-color: #999; + border: 1px solid #333; + padding: 2px; +} \ No newline at end of file diff --git a/bin/webgrind1.0/templates/fileviewer.phtml b/bin/webgrind1.0/templates/fileviewer.phtml new file mode 100644 index 0000000..2142b43 --- /dev/null +++ b/bin/webgrind1.0/templates/fileviewer.phtml @@ -0,0 +1,51 @@ + + + + + + + + + webgrind - fileviewer: <?php echo $file?> + + + + + + +
+

+
+ + + + ', str_replace(array('', ''), '', highlight_file($file, true))); + foreach ($syntax as $num => $string): $num++;?> + id="line_emph"> + +
+ +
+ +

+ +
+ + \ No newline at end of file diff --git a/bin/webgrind1.0/templates/index.phtml b/bin/webgrind1.0/templates/index.phtml new file mode 100644 index 0000000..2e7fc7c --- /dev/null +++ b/bin/webgrind1.0/templates/index.phtml @@ -0,0 +1,329 @@ + + + + + webgrind + + + + + + + + + + +
+ +
+
+

+ @ +
+
+
+ different functions called in milliseconds ( runs, shown) +
+
+ + + + + + + + + + + + + +
Function Invocation CountTotal Self CostTotal Inclusive Cost
+
+

Select a cachegrind file above

+ +
+ + \ No newline at end of file diff --git a/img/star-20160403.png b/img/star-20160403.png new file mode 100644 index 0000000000000000000000000000000000000000..d632091659f4025a4b2044289403587ceff287ce GIT binary patch literal 500 zcmVrl09ovVHC%I=Xnxy^(ObW zq*~iS1f@bg)ZZEm%OHA%L z4iafnQg9H@_zwDhB903^%lqJ3ILs#Q#1WN8EUbj)(P`ifV^!t)0N{JL&m_i%ePw10)VNW zcO_dPF#YWYE!i$(4GS24?As*q+`6nlb>h=W&fAJk}ZJDUR9u6Zp<2>B_xm zIeiZx`}yYDbXa!X7j`ngY=Mi1%sZO$!@rBRkKU0+bLY>R(Gq(~F$*U?+G(5HkGl<7 zFMmnrL*9fg@37ftxuMI?FyWv7k zNG4Z-4`UaYAz(|iSa*qUMD?u)aeeE)PkcjKe9l#`jP?x$v{$Fjx;|fBuTYDYleYsr qx}Ci79bc22Z|Rfh%z@Sa^?m_q3yxmJOD%c;0000