From 55ae194e24cb0b31c7e88246058f19f863291b2c Mon Sep 17 00:00:00 2001 From: Bert Freudenberg Date: Sat, 20 Dec 2014 01:32:33 +0100 Subject: [PATCH 01/19] delete unneeded image --- play/img/new_board.png | Bin 6112 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 play/img/new_board.png diff --git a/play/img/new_board.png b/play/img/new_board.png deleted file mode 100644 index 49e733c77552cac3db53b023dff52b836f7c3dda..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6112 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 onPs!n|Ks^dHr)S&{_}ve5h`BEl$ Date: Sat, 20 Dec 2014 01:36:19 +0100 Subject: [PATCH 02/19] add image translator --- translator/fonts/ostrich-sans-black.woff | Bin 0 -> 9232 bytes translator/fonts/ostrich-sans-light.woff | Bin 0 -> 9516 bytes translator/fonts/ostrich-sans-regular.woff | Bin 0 -> 9224 bytes translator/fonts/ostrich-sans.css | 12 + translator/lib/FileSaver.js | 244 +++++++++++++++++++++ translator/lib/canvas-toBlob.js | 124 +++++++++++ translator/translator.html | 154 +++++++++++++ 7 files changed, 534 insertions(+) create mode 100644 translator/fonts/ostrich-sans-black.woff create mode 100644 translator/fonts/ostrich-sans-light.woff create mode 100644 translator/fonts/ostrich-sans-regular.woff create mode 100644 translator/fonts/ostrich-sans.css create mode 100644 translator/lib/FileSaver.js create mode 100644 translator/lib/canvas-toBlob.js create mode 100644 translator/translator.html diff --git a/translator/fonts/ostrich-sans-black.woff b/translator/fonts/ostrich-sans-black.woff new file mode 100644 index 0000000000000000000000000000000000000000..40473ec33071bc78141ad1f3d5ccb22db60b9345 GIT binary patch literal 9232 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 literal 0 HcmV?d00001 diff --git a/translator/fonts/ostrich-sans-light.woff b/translator/fonts/ostrich-sans-light.woff new file mode 100644 index 0000000000000000000000000000000000000000..d3a376187c3982ecc4e110468f26e0e492c18f75 GIT binary patch literal 9516 zcma)iRa6{J)a~Hz?i$<%4G>&|yADopcXxsZ3GNw^r{} zb@n+WU40&U)h8{a^e4Ez;5&iU0tV9fT!;fK>k;`iG39 zlr)5kgxF*dPy#9eFv{xeoDi-IV#`BdoYZ5-V`gvS1mW%=_A{ie*lv~gG4pVv1OT9~ zAROI)z)Z%_ws5kv2LNCQAu;t3-#3ik?7u8cTp@j7Cm=D1{|ih@J8ugJw*XlR7XZNT zMT-aFkS~D{?HZ})@?16dL5oYNFZ9(C4d{Cxx zi0gp=eCEc++c2g`@R-J?fNR@eT9ou*001c)PzxF4KflFVf7zejvEE*Rn8ozqU{!K) zE+cbUGgHW*rp5;Vbr#X2L?|R&4SYNp#&85wJ5+EGs+Poe%5-8a11*CDQWzS*I3D8p z|BPj9Y!PHk1TPJbsRO+a40&cjB@@;AAqHURAI6+k8LkU5`SeEsjtveA?kk)w+$T65 zIREe`1XM5>W|5JDHsoNLiGu-=L6%{JavU7^2A&0nf;~UB9w_g{`a@R`W-yoD;y&S85)~>GdtSe-#y$p*dxHi#m2|N!%0g>PD)Ko`Khg< zp{Av(slGh3Ft;?jIM2ty&B+Vo;cBV--Oya$)adEtX6oeO?C$z_b$9b{eSeFAh>DDk zgoY9y85{j0DlSIZm=alolcSgxOGP~eu{2tKj9G4+FcKc%KPm`G6i9(%hGT~05i)=Z z;0g$Y%7o5@w2`5@p>CiZp`D?9q5Yxr|J!c^)ea?nG0Y7#44B}76-xd!+{TOq=*w_k zS;`u={t*u|e(|+9(7q|C7eR$mHT1z2-ikrJSTQsKg;qFNIWjqeC#sNJP_WT;DuYXY zEV07Vy6dRi6<>D8A=Dx(fWCN5DhOfjK2BPCt&fJ4m&@m%-M=Tk&w~3viCENoT7OJJ zdR{3X|6f}mr%33IFnIh6LTIW*X0Dzkl~7o(AD4sm6;F|_=ew9uy#NRe{yXlx#`^uR z#uzyD5M)o(%*&PO=|n{>k`8ZWQynKdpC?f4BmBb@$>rIu3XQI`N@P^h$%NBjQG=DM z+rugEoJC-zSk84D3cXG;V7G&C+(iFQ2(nR!4ZHZbG5-fl!PwaP{1o4w(>&<*%&%8K~=N6V91p{ z2C8l0gA4PMvG>bABYNm+L0&BOZ}vH6v3Mc5TfAG(-v&1-Ku1yq9iEyz8Yjtz66}^+ zdsxcx;XC>D+mlEBfkmSK&|*l?GGY1>HsdzIvwH3WnwuyTtByR4_4xmNS||V%7!1Jh zTKnf4=!CnRW7)G@>+9nqU3BqWZp2kID@(j@Ldab`%MmM015bq_rDdK|n1Y82YlgfB zh~QWFoa$wtO5KdoI6yLiZTjk`_rtZV>;mhk0V9D4<5ioV{@1A^^QNY> z8y~)!DtxrZ_wHOQ+Ov)d`F|9T2+8fQlV=x?n~#r2ul{kOa8j7CwaNIBeNB9u1RL*1G=Pcb!rc?!})hRVX18%_Y#!$&WSK9xGcNTS*f;IQcXh zO~a8eYF^buS)gKvn0cr-xrV4_J+4!^GnyL9gWhn8CuX+cZM&z}N_TT;v!QSRS9v_s zr5z~<TiTj=?hEV7DJ&n78LmG?k(lGK@I*LswvZ#9!y>A$Qov()f zV$6|06^!n;vg8r7#c=m$PvkI6p#dN6yxU#rD+2~rZj1hmixQ47SgnVt&bAb@QB`UDnMI6z+tNY@fzf@3IItNS2rayg?Nvfja z59F9PqV?Y(b4h=S6l=Ew;>vD=?=(_V`2<$1td9c@30L#cb4Wva924@&7cDqtB6xw` z#US#;9VGWF^Kv&A6~9yW47_I57ui0RFa0Yt;cw0M-drvA`br-Wk0p0=P5O=;{1_Mu z7d!vt5pI_Fdt94bV*1@b2?@e0!VBJGqM|)OUzWX+Z^! z$Y_0wCw=TIdVl$3<%>mHq$eH@UL=TAMgdny$;o$*2k>7L37fVGyr7?#bGAvjIr$gN z;}Lxn3e7PMjU@KS8i;wmcc>NQHW#VAh=aevytl^Yqz=f+Zj*-$W#uZ(x_&l^>a z8^$?ZExL3p|Da4p^+<`k;%lGlD@&4dXWX%~af2C6YmQ4R+~`gaXumbSI0@#=khQy9 z^(p+t%*Y;yJSKSi4%8(Ff3UdL^Rf4ct=diF9Q;h%%{|qyScb=>6fP2ekO1 zP-+?Bi;f&NOu!eHZ?fbofv%cTSPsHMb^iVha8kw`u@{FNX>X$>UrD%CC+mdy;dK~~P^J;ZtSK5fhT9D2 zi(bBEEe_|GCG1jU&3jEnvOg{16ox&TKYj^iqP&y=_2|k(!iKjzO<0{lG3d4@3R%^B zKtMs<&YG(#HY!{fR8K_674cW=-2&1jXwvfC!9hdjMON>?c8G1Kzwoj z(uaInJNG?hx!1mZ)F=e}Q%!yuN@VovLep!R^*0iX_+a?Y)9q48H}y&C3Gzb;Zh$8V zH?uJe6?4c8LKsNZz;x4NrQO0@yf5e?O|ab+lc_J_?&z-D!HERwxhVAPHX^_U6M8eZ ztBrKE$8$P>Q$CMwzR|UoRpkEVV7%5SGcz~0T{17X$IY7DN?hBAZ0Qq9 zEUzH0ITMT~jUOC8%>JqI<=81j{Vu)ya>rLi1#{>W&JkoSfeho0tW6Uh#M#fM zNEK>41%ll7|wPr3UG?=@@NA^QkVzGIP- zWEm=zKjtsy8%&!Xgs6%}8vs!CfH zQfA=Nnwrm>aez>Usa-&T?{weI(jPJdM$4o9`c)jGO=s&|AZJ&lrDORlmnQ?hK?%d7 zlqo`s7jew1ugBEH^}1O3Y8=aFC>Tu!8=_nV#<;^XQMPhx^>%9}q8O;yWI`87@rV$H zysy2m$m{t*c&xj>pG8$rI!xQe18T|^5uYjc3z^9E+m+aucFmdtgXdp49M!xu%BsY@ z`9%#U8H#x^)qM9VEHKps?|7Q`!r}tl+$!5Tp+SbJEv)Kk>3A*mb`^9qmHv2gWr?+n z**&2Kvy@nb1)r@tW!+$eb|`_I0wDl4*m&kNU%y9D2e7s$sYlz$-^B)S@7?fD^V}v( z@0qi1fV+*$*}5xxx6jVKqqu^}Zdk*5)0xVBH9=`2bN5=hFdVsk^%Y(Lwit4U z3QeMTZL7}pm~3iGUqX5sLK)&F!Xj#-k#RT+Z8QuqZBC`Bs8F49(j)5rA`IWdYhL=t)5^tr z`2Fd}uqU};+E(M9E$xSYqTlN&ngEY`bp8BMZI^ae`;qLT-^p8GI$_|$z-88vVf$x( zP4C%<=jxWqJJRKX5rY8aoaBEu?iVFCYgze{KSrN#(;3dWa~j zx5z!R5voy#s{m{DZ9}))sW-#nja-w>2GL-8<<6zhqu<*;pyA-Z_fuPi(C9dRV!UGS zyF6;g+2}?b1!U5aHH_&0Hb{Jp8736uO;0(nJ1xj)@?s4j^NH4tSkKGNP`u~zxoQl( zt5I)K?;KiZ^Y{qP$cPd#X5;Iq^VXUFPCqqTq2FHT?cs6$H%UKbTG9CO(B^h9&8XY! zIz@W~95OG(>8HIO9jqNFSthC7Y3Me1_MG5t8|00)p-RC~8@$?0UR5^x;6t|lJ-fFv zH+B))BD{MuDxjv1;4r{Jk z&+Y8&2Id?3xocgQvM6+`-MzvsQsT*nb&hR?}c7S2!l59Z1Xzf1oy zwwV}$Uv!gO;6@y?y_ClFQf^MF-_as_?mu}*4P>VV!TMyqkKuqpR+fU*S zkJToe{xB8$iMp$J1f0NW%@D)RA{Y*^ zfL;-UUWum1-xsV^CaCfcfvBtbWMArftT^O!ZJZ>^kX)$JDjAE%TyDSj;g(dhh7UiS zgMY}sMRxf(4=<>Sf@7m^MtW8_iR~OdcAF=flUaT>lNe>#sC~1%eb>i`Pkwl`^S}S* z!5nLa?%f+k_-gN=@1^vly${vrM`tgD^u=CYAEUp7-aaRIoY|V0hAlI`logKXU2o0r zp|lBOrA~P-aT}Lg*;-4GdpMsz6FAIm3kXQr*8bXfm>)Gd+0$I9QGy`+N{9a|oxgp^ zEOo11V0A02%@e;}z_q)Wzk=0{l=U?UCF{u>cG}`svlITM)^^6j(OO>2IQd2v-}E7~ z6NP@(&EZfd$Nu^GSPGv5F_BP*nh7mCKIQAOh8S=1EwaqGPv&%T$rTk6o&vT_-_Z)k z(q%4VQ?_I2+1&UmG>grDSB!1<@7|Y&yag3GPrs|H_OS&!bA0vix_?gZT!;*_0clCUjL-gv0VA;a7%=Q z3G3YP?8D+|*B!$X0z!W5xW@obxvH`k6Sb>xwKn{MMgF(+DO8}rx>=AdH<^bn5m{D; zR_?|#U*JGxLx@F^=a;Ln^6uNE$B)Ua&Y-TVBva1wBucgPJ2Le}eA<-Y7s20fs|6uE z3|>P4^bav1yl*YCcA1ZG@*Wak=F^FcrTqlb2Cm>AxD@6@8=6np_b;S zEUuM5qWp!pkcqnQqJKs>SFr|tDau|N)x*VzdQb{2p>hVY2`WrbGTTCrfp{t1EUM7+ ztB@KvxKMGesT8EM^f@Gcx^=_s%*PD;)ugP_Dn39;uW33v9xS0f(O@*05KFJrFeGPE z@6+r$Fkbw`sTj|d5zDDn&Eer}V`Jl!%SuscNVPZfjZOcm?j z+t{?WVPzce5-%6D2Y$`6+Bd)kQc+iiReh_=zrp&%#Cn1)|1@sxz=xXT%$xwT=O>c+ zM&yj*;SqDz=~wcJRX|3rP?3DqK|SYjm;|2W3{q~h*V8^5`7l-aQB*e09RA^yxf9S2 zOV<#&9wYp1_>>?j9Kj!}_!kR>2OEW2n2-OC^5<%PlWzhnQ)NxGqwmj+ChLw*GOlfB zTpJmdwJLcLLngUOCLJnKH2$oj6b^ej0y6|rLu8^xuzLmsc|cgM@7$GW3((kMgxXJX z`lv^aF@UCx-g{mR)NQT^SD)X8Y0w)0qb);uB93m?e|0g#z+O7Nstp5jy3-+(CXmm| ziqo@a=s(}p|fE-f8XIP5eY0+LnmktxoJ{?4Kyor?qXwd zbvNT9#=D)!ANt#RZN+l(j8I;hII&~@R^I3(upWK#;-j>~WHQW6g9dMWj?ALx>Fanr z;<&%-6)n))MEa1dTSqsHdrrybLU4WhcQ^Ns2^WK$2|rRm=ZnYh&$5*IpI>`dRt8!I zj5gJ#0-gQdVtDd6XiCJU<1!=CY{|(Rocqdb`BIC^sweSPp)R7?Vy{0NMCFIZ;ULtV zLBrYUZb-3}EpF7RGP!JWZle}71(Tc#_ZPCs9&bD- z(Wv*zemlNf0iKEkz90Q0jQc{jsBleY(YCTBPgoi~y~4-Bbi)z;h}(JOCj(op4vK7I zqK=m!4E>y?uxgR?lYlAcYnfWasEJf{u2#jbUStfXtu#7^MQFvm|7>LG?!uF*kupKXJS`LkayI^(H5s7=Y1T)xsyUe-B7^SPQ@c zGnOFOxYj7Sik`BM96f2UGHUJK#|gPG;VP0zt-4G62oGQmEF!K1v^@RCu_?n$lS z-E*A`6*<1xoG$0R1=m=i*M2lc9LyU7k?);cmmJy9}NA;3V>Ys@@oX&vJ-0Q>Ey__=KX3}w-XQ3$gW#qfp zG@5}Y*hi>^-MnPuo6(N@MYd064Kx|U*D6$T`)`&76UwO+=h}K`4d7-zpKv9sSP9P& zezH)##D;2^i+aaoP!8p5TPsT`WL@hh8Y=!u!!1Wmjd{dpLmV!gc6klgW*B81(pDuG zc*)=#x)k_+g>p6o*5zJ*+uog{4aqMK^={-?U)?6I3^hnIxKQLP61 zIN^0ocFr1KstaG4P?1qi0@NCps<3dEna` zOLBb*n8N)?gp6=_kHOqqs|8S&P%p>R{bv(wa=BV&4x-vyWR6}aVUVXVy|3a$ct$y)EyJlRmhWnSA(o@sNIVtdtupU~}j zH(&nZv*Ee)dapdcf>J(5+->plV^|GH+D2LAGt_M@upHFJgxU245VTF+aa%Y@JD8j( zj&#cb7fP7I;gv{5kGE5!?%o#oE{Ip0je`NT^^e+~wjzNcs$vl%<8v>%y# zIfy3E{tWfAtWUJrnsb5H9pA+{K!c$^G1Jt^O}=e(Y>oN?c3Z1Ufocdd;%AXubQ5o> zOP&M!P*mmY$jj-Y0j<2x;%NtMt=3j$x6JgcBP&JWG`mQ5C&^UA)8_5)n{P1gw(p-M z3iYa!A26{48N6hC-cAxtDP&DT2z?G!|M2+ljmfIf%n7_F41{339G)qKn%-7!$bFhi z^ORjl!XghuUyXNbw@Ju5W}hSDtg=YgqOuw2=VY8>6i1g&J&dDucMA|w*=G#Kf1MN= z$DGa$M>93u2&tsY*IY`u=+_~=WOvC@j7(foi!|=gZ+X5e+}*G>Z#b{#gm3Y2^Y!g9;18JMnxy+t84P~^upVwa zV+#2A*9CJPppJINHOO)G*H_-fg45GK>hdESsV*ptqL60WO6QrkC%~$P9;93b{J?mQ z1Vb?o+KUAZuzuHbNbC9Fi+?{~`X5agqCW$6mETjpUcd1g5$*F6if->a#$|E5fak$y zI_|n?!60;ax&#J*LpGWVL~i?E&D!i~7(lE25eN~cE5-r1Vo>e?<7!yB|NLEvLh>+T znBViVUbl6A?0uda95a+07*k`R4Ig|DXIB4(+^m&!gKUeW7nu^7Qlg3Z%FMztV3aWQ zbU{b`1OxI)&sojzw)8C0?{6T9eCz%czfXr3p0m3vk8T>FzWxOAub+A5nzFbVPF9@` zVoYfo%S(_l!?rE6&s(1wh@3-D0r$@g-Hz+r7)$wTFRIHV}aGx%h4;?M{ zGcHAC9O~53=k!mxcPnDOcG3gse;S%#n35m5KG0pbA;@GnFn$ztk1zV#C5ts0*!u38 zO+Lr3t#iH2K3tO9^?1ji&utiy2t_B_yr5~{xUT+mpET+>LITI<&iINS*!tzUA#_7& z?8saF&wd5L2z}>}<{H9KKuO>Su%x^APn4`WycWh$ot+&E@JO?d0u@@w&YJ*m2#i+}7`%9=sgb8V;22 zl{3!G&omC(M(raIml78YGejJRDnKKYM$E%@#>}8`QPhxKP;`qsMgj5y+3V@*HFv3Z zg?G6I@?=|Os}i^q6p}!+&tEH~PZJjCt(*o+Dd zGIyb9aW6EJUKlJIwiLAwy|cLFzNnojDCnmXv{Ik$XSl#&TS~ZSt&Usp@pRrQ6fe;{ z)z_9FwU$04K~pqCv-p-sLAzUW=P@D*tlGwL?E#W=dh3C_z+YQ&CQQDYp0pZ=WkBr)8>rj>2YG< z748!BTx#1`tEU-$Sy6p*J@PXfzdNh0zOv-B&GZ3HJX_h_Yt4RYSV`OjH+=ST#<%5h z^WIRv1J(GlOTLg22Z6X$N%2lKTbDu^>!Uz$Rd*Cy*Zjnd?CK}cJI?E;p(03~Cy;(+J5Rx- zff5N|*iH9!6-@DCbOz}>oFmmiyZG^5gY*HLUPm#G!cY5A+DNi0;!8IMU+3pCId3g> z=DAC1P?>4Q$~a47nQ_L7IZG6l7Z!~SJaOd)Z{8=}KX#fukdJJJDlC|B0-)@!rH%i~ z3#o}N^bihQxb0MNl!GlyJ{(yEQesOZQ5~H~97T{n96gQ!>AfzS(oou;n5FiO%fsy3 z;yt|MxZm5J@1iFL7--u5a2XB-D?84!DBCt$IL6=56zuz0&j?JWf{)mBklj0Vwk zmIRAljrGbPT4PfBUBkgyr~a|l&6NR>>$namhqbBb4UI6=DJ0a_Dg5#g*9QB14|X%l YplNJ6K+TvATu>?Ft0S2xVy^$L4yW&Cpf`LaF^gtaCg@k+@0VM+)3~W?oM#`5V-UEzW>X8 zyJz)Yb@r~RQ|om1Lw8qusmaL!-~h1k4h4YopOy3b|M`FO|9i;EX{i7JaP}~j90m&g zJNWjGGO}_oEeggdVE_SY06;ZOjt?-c0>)wS0F%@n2V`>xQ)ig=2;)~UTl9WMr__EMXd~4&W6Qx5UUR zE#>Uw<_-YR!ZbJn7&>LXw)i`{TEcSaV08dVF!a-Je`WDrF*h+Wu>geZzVWRgLm30V zc7^=D0GLytA_4yMS(un?0nJd6a7@eqS0_R5(6dGX0Mv3oJ#2yh{8k;qkKw`T!NDFx z)m%Veu}GLz&(EZhp}xMpp}sM=GQFU8bU-|&3RV^?XOmCfeSIUB*gvgR%uzxrO;t=) z;55)M;sBiZXx;x?&&0$k$b=M04hbg-yVBY8=9%11ow<$2U(pYkpmu>f- zN;e|;ZO2fn>;T4+71+|Dww7ujl{_OQn(zrp$023*KU{-7GZd7aRE#ttz zfwYy68{*|mLo1$zWMfwwFEN`hRPs$M!3@>)$-V}Yp{z#ymyEON2g7+SHtrrz=loMv zp`{WbIi>ubYB#M7 zcG=_QteBjo=$Ww6T-A@{48Z+(xy~_?f+f~i$R`)Jl%R)Z0-v0uuH92O;>HmR_hasr z8;9P+=lRT-5x!QK50}HzA=f;PFeGo2Z}Z7=c)iNtk8EM5mo~4~QQCnthxO(zu3BRF zc0t3|@%SaM7Vus>-de&Y@L#bZc&1D$%=iMOeN=)da;2Y`Ef17LfvoaqPJ zlP~%QUaV6FMi-qwY7)q*6VO9>*wpu;ia3|cUT~lb1oE%9tMM& z>wO*u({7afy%fXfaZ@N5gYCuhtm835Q!_{oP%PduH~=0idn zLEAs`ljnTI&Gp^&ZtBhHhlht;TuB|7nJmsofs&8i6=67N)p~j?s0iW9sP7}9LL6EA zl=qdDV%W=$Rg|i5Ba>N7epOxms4uno|P-Pxd$u+i$D#L=4E&Ucr^HEW5ntU)uQY+Va5zdQJ_1mIpXeX9> zZE&ZRUJrF-dR{~(Qo!x16V1n^+uwbGFKyX;X-HRSwlk|HMxF~$Ze`cuLq3T?W+N`a zulDX0?_03AyFiUiLsOpL$}ZZMglDSr?n1ak=UvFEcfF5-2gjjXiI zP^+givsQtSZ0`NGt2@>y%d2?TFskM2@nu&6<8tIRWOd*#6k3^;piG6dkNQwsEjwAl zesji_T5bCtGIjH{lt$*VYxsYqhnBp99L%03bMi8u12rYNT7cg3#F|1fErgLueyo(S z!*hVkkJg(AD)gYL&^~-6<-39GgRF1Z&UTytyi-NmEF>~E1z!Br8V*oo8(+@G$}v2& z)r0X{g*U&85k-`jS4zQLn4wC}VBPG=ZGuEss*-8aG{a5`ZAt1oz43u%Bu-!9EXDJ& zu=8IC-0_tD@m&cI_P^X8{r}#z%+1y_a|ZpzLftV0?WK+*LsPoM(7>J1(u_2 zL-~&lLvkJ8g3s1wlR^Os`|GEO$k;Kf(*%pkR|MJ$ng+5QRq-i?9g3{U7!2)*3u;R1qwDqNlCWzEK(b!6O!t&^T8Y@go~ZzR!&fPr4XUJCvPALh9}|MWz~`5 zi+d$YRr{1bb5x@`R$7!+#JdKK{2?XdDiCId@8~f!1R;P_JDC>tz;Pre<6zX1InkimcE)&NK>$5m zeLJLn(2?ewND!Fm`1YPC@;wehMaY>J)xIA5qG^%>OE!=Mfh-9f;QlIeLIhp0Izstt zZ{}_F=Ua6pGePB`)ptQ_Y`4f(< z5lO4_=Pf%|FKZRz?_(zKlaCBtP0K9Zg?Namgg%{Sj;+(ZB{i*n4B(Ufd15^^;V90w z+17Hx^^#ByUCgIu{2sVD$PVA|N;FiA9ZotIWsmaSXoL(McDr=1J0MaR2z4V4ibt-al62&-`!iy- z;*XE00R6ImOq~*TM~CU&W=(noh|S_1(PlcC%q|C{a4KXZNSue}zdnX4gY0qRQF|`V zDfL2pM59J6&bkt^Cvvq9((&DCf2o@6fH)f%)f@10m!u(2$|fCwoYG&EGa`h3Wmi-` zeDQ0nRe!xaig&-}(^YzY5C@9}dh2V7RYAZ0!NQB>M0EE84O6HqH;$3Q zm3Kr*Iaa~fNFadmQL=uJC9zITkkuE3p(iP|-?ICEqE=oq{9bD8_Ih}AI4}$4e!;IS zTr{Ru#1y60NxQtUr{d3}L3_YmO5!R3S;cT=nbGJ-Wj#w;e27pYfifJ#;fT((tZB(B z^Fp##`5}kg#Z*Szq_(qRai&%5anS)$w0*PkaKGXQKU1*xCet&z-a>$0_zO07e&0w5 zq3?dmp&N$A+$r6fNEIUDoz5VHrup->nvwCStKQu;AE9nV(Bc^yP zti1{j_+2WyJTf&i#_*`CQHn%D4Y{*BJo753HWs0JaF*3XIaww&M(skiDJ>SbYro#{ zHt|(vlVX-jH=gj~({z~eDPS}&)c}t^CRqHge0fPel{h#ae@y>MazXbot#Wx8tTcX; zd7hiST9y_V;leK%QoMgcRz{oiQqM>EB~kIkq4|go?K_-#!R0l`E30lW)N-rQs4MxG z=y;;})h^=eV7}ch+`lk*I1#BM(H zFgnc>ceQatd;4?#`8B=m-)oz=?A`ezbkR$B(p~PyL-zE0;TXnoC4Q@o?xcG)QLyjM z_E%~uq4Zz*c2?g|o0oz!0(cS?yVHn7lL{^@liwlH>$OQO2+8U6kr*{E`z{7|wy3u{ zT0p%dVtf8^k5UE z^2FY%R<0}kJ7F#c379y~K>2h~796x7rQeL4@#ej<)TyB02j1ngO0{RH-JaLi*699< zPMYV^OgG@uzMq|&zJA5vX6w_?>r*Gv<@v#ZTWDx;|N3&J=!S`AnZx)-@|vzx@jiLL z+kWLTav9NiAkU1I7cX+c`Rm3!da+VD4DP#i-gAI`cV-z$?1# zHTz{{l`-xufW<*?dp3elj92Hed5PA+Cak6TQi;AYTr9&t3$K$T|ClsiE0RNJKaC85 z&&S-Zd4QqC5_nk1qE5uSIYNYD8v>b0mOxYb&=RIBV!Kt$T+PeqrA%y|_iQuTJzSA9 zzMVP#V_+~6z0%5Q`_hju)T_e)JsW+uaQ$dBZzYGE)PJb&2I>6u_WCY&b~rW>Gk~tq z%j%h%uauIu-?!zb{yIR5oT*ZWY_&dY^b0!e^31Fqpo+Xby*}~xehjl@a*EupT|SZS ztUL!9f)r+L+Dsm%gpDXY0n;%Rh)fW!%#dgY5xYI2$F5x?SPJ`-K#eHfaK@8?P^Y=R zoqz?q$csFZ&Ezz-NCtOggeFGpPtQL1KgRTrmE5tb*)itjem$XyaZ~~s0-g9y`5iBh zGjvdY;^|hxkG?%P-#8y02R>0H##15oWW$9LXRWnpm8iyYG37p^w0xEy*2-!xIlyxU zWd9o8H@2shEM&`lek7J6kH_r?rHW;wA|=OB$wRgVsg3WQTYKA0`UahICu+s>mr)R_g0)1D99BwtDs69syZ%-&uV9S zi6{){b9!_3!lutk93bvH9G4+HQL}o(az?Y3^`f>t$U=D64};g+N?Zkos7rYFtv zo5mL%<&5Gtq|fdxckn&mNg6vtWJUCIAP}ZNFWSS#NQN$0e;EIU|-ov3k$D=#!^V-3c`EO4W%lh>3h;rbPWZ3H|U|(+q!9Npp}VO z_DJAgZJf^6HM#_X}YW zQ3ZCfHbHTswN(FjEN;F4 zh@a@_?jqO+x+7m@16@Jq*htqFO`j)vZ?FV0fKV5rsBqz_ks;jIU)ml zqbORz#P>0?gAWiiSCrC{P8VQ6U6kR!T+Gyx`b}6^*OJOCYwcJ2-Z&L=-t>6T9ZQ(I z)Wi!9$Km^<(D8x;26XMEpH0jdv~to+`j|8hUJ#THXzCoKv;%O63$8Q2d1UyGdYRf; zS?_Ia&FISQE(qnaH+ua!`qDIYu~@1~u}qFrnsicUCe%{xQ1Z$9_d|5%h#$f{E&kiI z6#g^A7m4q*`zN?}aDDUS>TP|NZpxpD)f1&pU$kW6`{_wFTZ8)xL*DFV1YI?AfdmIK z9>Amk0?0>j^e28vx73PzsU~X3zak+d6><~z1V~(Qk`~#5gYVX(CQstpyL7C8KRhiY z-8%HiTF>;u*;*qtW4fs^DjN5|kPT!&|Mzn>hWXtS2{61v_Th<|g08)}8~GuLi8-D> zhKW4b=3btQfz{MCi2aBSk`8CEyY8a0%EX8#T1S!v(k1IW7N9go)>hPwYYdUo#R)>7 zxhh<%cTSI-icytfBufmIF4$%0SOt}rCVpFj579Ce<~oa7UjP@r+;BhD%sz!T-B7;j z1fxWJTb$bvQ|oRMJFS0imAjW4?6NdJm%MQAo4E0dAhwe&-YBAL*G_xMC!dV=q;tRV z4Z)^dwQIR6kDvj+#KvAM z=eOy5^L#wdKehHi)9(PzDtrYK$uhDW zREN+;p#^Gl#p>Q#<+AyeM&t>~OAB8S8X23{r4ef9;>uuV>ygo}?(mT!3y53axZSVw zTXb>p8;WsvBRlz1_15kl*xKl@?|6Z9i(d(Ikd6?APE8C$lA>*Wf`M_Urk3xWDOHSw zG4Zl1pkGGEfLM9~nsFJHm2S1xeA<<?@;b9Hv zhD9rK>^@`c@NJt*$EQB9)b{e9gs(pMV0g%Y4Sae?8Wr};E~>`v;Z>;aTrGl`5K$Dk zvVW~lK$Ds2DX4BGYX!d7&dd&ZX5S6&XNL*zVlkX9zA0R$)g$Q4TydldV!{Mu%au6= zFEM}gQWJ6Nu*4p`F3kuBrh9H5_SwEh}?*?3>eP$n59 z!meJj{&v?5-QI>?7~LQ`s!Nhn0x3@ zSx9q&FdF+QAU?9qwu125j_l%5w?E9* z&Ovfsu@AWaT|L>TlpM4!v(Eou;XX4ebU>bH!kR475dMu9Fqs`Qg9GL#jK?Yc3t2_X zTKJeNAElzC4cOa6cQyOHH-z)v=kvzS9USx|7)}dVhvKK-sS{;M7-IDa4*9+JEZ#}g z#AE+H&=*3(OhGZyUr3X4_A}9ublmHf@%}>TcK4e6@x6Y;STA6INkugyW_ETsWmDW2 zWZ6`THNk!%ER3Py=E?O}(suRs_MY%LCCu2<}m2Xu%_K&AS$8ctDOxf0hl zN;MRpMOOO&t^jZH0kl58eY0%u^Cio0LuJaZOG1_7!qiP}t1EKeeC16`^q|!YD~{xs z)-hKWsxRPK_!C^ZeHtSYL~xm@9*GRP@O#^C*?FqvuRafb&Fnj)apc<85}jA8P80&m zdWn<>7a<wiWW7)Mz=_wWWe0>}fp3<_=7 zY%mxy<|=ZMg*+9>*cy@Rjqu!tL^Se-rm@qpb8)Q1eG>6AsSR6G#}~%~6x#|lvT;8( z7g-y~PP1?yRSjhbFdXLqG|G%E;|7xk7vV;X%c_Nj_Dw{%g|xRrr)-Kky_C~YICPmS zY9W~Ea}ur&3$6R!z{48HdERcJw{x9IUR?Fg|vvocpU?>n*xlpCQ@_BrFvDS|JS}FpkM_KuIJEsFi>i)O zblzNp^76&p9&i%WPEQj;xPJzD0jPr?&Q_@}%JU?_d3kv(Y}6Hx!T#t4+o99RyMI(M zvBXstk3(je21j(}o#VUt>eCnotL#>FaXxT`9kaMZh7Oo>_ctQ;z^hF#hZuXBmvPJ~ zwFh{anr;uoa!`>UzOA$w6IcNHA_w{q( z6k#y}d{^@aOD^cMs1o~ekn%7}^AC!e!bf`90`eCEXQDG(kj-|e3TbTaO6>(`p^Bb#%K%r{;BBubl$I*SNqa?Eh^H}x#H@}Z9#X_1J8e< zs#O5p2 zer1KFnS{v4LXzJ;X*M>Np2TRs=+iU7kDm;>>*|hMvgmj4Ai!ah^ylXIJD=_y`Sz_k zD4%Z5=EqTo_Rf(MEtW2~(`Rn=b2HD}ibnNMa%Bdy#V7-D~XeW{O#M7{JTznsymU8r3s21)Lj zv9>KXoaLnSNl674o6^F*E;XZcK(c2=3GjW2yHH$g`2Jq$OBI+op+*lpI(EcvRXnp< zRj_JH&(|*)L*tckoBKj-NvTQ(3YRgR)d@iImA0Bqlo`rQyabm{q$s8P$&{4Iz86O$ zyK|bsvv|XM=gcb`Pql1R(-}@&)QUfa>xn3zJLKNqJw*M$ODGouXnWz92$E!kf}thh z#s_z{EZ5l&_w~~(Nfn26U$!vA4g75jw!6(ImdwonWLp^$4n2S}BN~%~=mLGNn~AYq z39OGUdv(`{eFr)by=X>xPu{O82iXB3idJLjp$%mnb+UTJs+-4Eb&Z~9EFS6gtq@NC zn}2o3ER)sMFC%~bZ|e%2bL~s_st`{>k0p?54#R2@t+?E+R?MvdRveW9ZYrTX??8UK zL}CmcMEoF;?h29$MmqRA69Myg6e7Hk=F_i}nUrxxa*fFv4g*M}uL(h^IFAi3na?sGNu2{AB;-e&*MJ6Aa= zDgD5EXRImXHX%Yemt;^2RBFCQWFZ>e`>~G)HprtHl+y2b%izvE2%H=_4{9K;`s;7t z@h^RNvuE=o_jUq2Dj~}@{VlftxA<&Ju+uC=pnAn*H9ftZU;%gMS^UZL`OS3mMYVhD z|NY?j%yBt$5&PD5Rm#|nXZ&j1`?Y8GBJts`+uK`zzG39k_{-*x-kEla$=xf&d;cz~ z+W<}ag+G{$%DsumX9>eg<=a)Dnmvnr%G}pcn&)WmNjozgu>9YI06zZgY>PlbLjo&O zN|fJx;`2Zi;#XwMNOa`?^;-dE#`)ZmS1)|Vqf%d2CPBh3w!Xz9x979KKjFPpTouv=T-C&yzP+=D)$#q?FM_{j5AFidxJobESDh;2JBRMXkY!_9YQ;7_ET zpX@%pBbdkUIZxcF<=+RFWt;-GU40t`lqVet!%I%XC zF&CbA%zs@=Z$b`RC-(hW<-exr_A-8;Adqs&J zV>7$zko@o51p!4PnBO!GHUI}j`3}X~Gls_oO_%1k=xXTRJiad($F^5D@V>2W( zTr=OHo+#hwhv>JYs3dO?Gl-Pohq9s)i>w`F4j1GHANm_ZpfIjE+&#)Y*gf%zz_3s1zaI-=eMkTx5ReN%{EqA~q7^AmlAnKeAo(N2b@#^^sc%hR&PmiMQz~ ztQk|)Sda+tLoOP!0ZY{->Yr0lN0p{kg5>`D8 zvqP>@4)LuFVX!G}glUPd3T@rC`ipWGVRDi0{^IqUAsR9Lbw=;3DE^JC%aNXD1BSGj z2eY^5T^ieWKNPjw8-w)giUA%T^9RMkpH*>I2|S%GWj#8ZJacr~8jDQ<^ENR{mP9+2 zb-p!S^K+|ArHX3|c9Ti`cS^%8;%$Gu?JC@!4zUxE6~O=P-(hN0Rmzkg9D4Do#Ot)% zt2;A+5)oz<2rPCa2A2w>#bUTmc9{pn-5G`73x=k~2P+1k?LBcM?xP{aWpQeTBEIK4 z6>#1eh)3oSdqF_aP@=r!nUTkzY@SghKXac^AYQ+nQKJ5b!TA$sFphJKWY^{}3m`62yCUDMP;Qtme12k zWwwfjq#6~^s`)bY_ zgJt_Yh=JVZ%)nH>tm&$)j%ZoxF;k$cUTGnPCn!<{ery}yx-?u!p$du&#UC(T>qF!P qlUsby{TEp9iyXW@7DOu|;jxzE%+8TCK8Up|=ZFJE0?;7vy8j=c#4*4C literal 0 HcmV?d00001 diff --git a/translator/fonts/ostrich-sans.css b/translator/fonts/ostrich-sans.css new file mode 100644 index 00000000..c731e76c --- /dev/null +++ b/translator/fonts/ostrich-sans.css @@ -0,0 +1,12 @@ +@font-face { + font-family: 'Ostrich Sans'; + src: url('ostrich-sans-regular.woff'); +} +@font-face { + font-family: 'Ostrich Sans Black'; + src: url('ostrich-sans-black.woff'); +} +@font-face { + font-family: 'Ostrich Sans Light'; + src: url('ostrich-sans-light.woff'); +} diff --git a/translator/lib/FileSaver.js b/translator/lib/FileSaver.js new file mode 100644 index 00000000..fb67e416 --- /dev/null +++ b/translator/lib/FileSaver.js @@ -0,0 +1,244 @@ +/* FileSaver.js + * A saveAs() FileSaver implementation. + * 2014-12-17 + * + * By Eli Grey, http://eligrey.com + * License: X11/MIT + * See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md + */ + +/*global self */ +/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */ + +/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/master/FileSaver.js */ + +var saveAs = saveAs + // IE 10+ (native saveAs) + || (typeof navigator !== "undefined" && + navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator)) + // Everyone else + || (function(view) { + "use strict"; + // IE <10 is explicitly unsupported + if (typeof navigator !== "undefined" && + /MSIE [1-9]\./.test(navigator.userAgent)) { + return; + } + var + doc = view.document + // only get URL when necessary in case Blob.js hasn't overridden it yet + , get_URL = function() { + return view.URL || view.webkitURL || view; + } + , save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a") + , can_use_save_link = "download" in save_link + , click = function(node) { + var event = doc.createEvent("MouseEvents"); + event.initMouseEvent( + "click", true, false, view, 0, 0, 0, 0, 0 + , false, false, false, false, 0, null + ); + node.dispatchEvent(event); + } + , webkit_req_fs = view.webkitRequestFileSystem + , req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem + , throw_outside = function(ex) { + (view.setImmediate || view.setTimeout)(function() { + throw ex; + }, 0); + } + , force_saveable_type = "application/octet-stream" + , fs_min_size = 0 + // See https://code.google.com/p/chromium/issues/detail?id=375297#c7 and + // https://github.com/eligrey/FileSaver.js/commit/485930a#commitcomment-8768047 + // for the reasoning behind the timeout and revocation flow + , arbitrary_revoke_timeout = 500 // in ms + , revoke = function(file) { + var revoker = function() { + if (typeof file === "string") { // file is an object URL + get_URL().revokeObjectURL(file); + } else { // file is a File + file.remove(); + } + }; + if (view.chrome) { + revoker(); + } else { + setTimeout(revoker, arbitrary_revoke_timeout); + } + } + , dispatch = function(filesaver, event_types, event) { + event_types = [].concat(event_types); + var i = event_types.length; + while (i--) { + var listener = filesaver["on" + event_types[i]]; + if (typeof listener === "function") { + try { + listener.call(filesaver, event || filesaver); + } catch (ex) { + throw_outside(ex); + } + } + } + } + , FileSaver = function(blob, name) { + // First try a.download, then web filesystem, then object URLs + var + filesaver = this + , type = blob.type + , blob_changed = false + , object_url + , target_view + , dispatch_all = function() { + dispatch(filesaver, "writestart progress write writeend".split(" ")); + } + // on any filesys errors revert to saving with object URLs + , fs_error = function() { + // don't create more object URLs than needed + if (blob_changed || !object_url) { + object_url = get_URL().createObjectURL(blob); + } + if (target_view) { + target_view.location.href = object_url; + } else { + var new_tab = view.open(object_url, "_blank"); + if (new_tab == undefined && typeof safari !== "undefined") { + //Apple do not allow window.open, see http://bit.ly/1kZffRI + view.location.href = object_url + } + } + filesaver.readyState = filesaver.DONE; + dispatch_all(); + revoke(object_url); + } + , abortable = function(func) { + return function() { + if (filesaver.readyState !== filesaver.DONE) { + return func.apply(this, arguments); + } + }; + } + , create_if_not_found = {create: true, exclusive: false} + , slice + ; + filesaver.readyState = filesaver.INIT; + if (!name) { + name = "download"; + } + if (can_use_save_link) { + object_url = get_URL().createObjectURL(blob); + save_link.href = object_url; + save_link.download = name; + click(save_link); + filesaver.readyState = filesaver.DONE; + dispatch_all(); + revoke(object_url); + return; + } + // Object and web filesystem URLs have a problem saving in Google Chrome when + // viewed in a tab, so I force save with application/octet-stream + // http://code.google.com/p/chromium/issues/detail?id=91158 + // Update: Google errantly closed 91158, I submitted it again: + // https://code.google.com/p/chromium/issues/detail?id=389642 + if (view.chrome && type && type !== force_saveable_type) { + slice = blob.slice || blob.webkitSlice; + blob = slice.call(blob, 0, blob.size, force_saveable_type); + blob_changed = true; + } + // Since I can't be sure that the guessed media type will trigger a download + // in WebKit, I append .download to the filename. + // https://bugs.webkit.org/show_bug.cgi?id=65440 + if (webkit_req_fs && name !== "download") { + name += ".download"; + } + if (type === force_saveable_type || webkit_req_fs) { + target_view = view; + } + if (!req_fs) { + fs_error(); + return; + } + fs_min_size += blob.size; + req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) { + fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) { + var save = function() { + dir.getFile(name, create_if_not_found, abortable(function(file) { + file.createWriter(abortable(function(writer) { + writer.onwriteend = function(event) { + target_view.location.href = file.toURL(); + filesaver.readyState = filesaver.DONE; + dispatch(filesaver, "writeend", event); + revoke(file); + }; + writer.onerror = function() { + var error = writer.error; + if (error.code !== error.ABORT_ERR) { + fs_error(); + } + }; + "writestart progress write abort".split(" ").forEach(function(event) { + writer["on" + event] = filesaver["on" + event]; + }); + writer.write(blob); + filesaver.abort = function() { + writer.abort(); + filesaver.readyState = filesaver.DONE; + }; + filesaver.readyState = filesaver.WRITING; + }), fs_error); + }), fs_error); + }; + dir.getFile(name, {create: false}, abortable(function(file) { + // delete file if it already exists + file.remove(); + save(); + }), abortable(function(ex) { + if (ex.code === ex.NOT_FOUND_ERR) { + save(); + } else { + fs_error(); + } + })); + }), fs_error); + }), fs_error); + } + , FS_proto = FileSaver.prototype + , saveAs = function(blob, name) { + return new FileSaver(blob, name); + } + ; + FS_proto.abort = function() { + var filesaver = this; + filesaver.readyState = filesaver.DONE; + dispatch(filesaver, "abort"); + }; + FS_proto.readyState = FS_proto.INIT = 0; + FS_proto.WRITING = 1; + FS_proto.DONE = 2; + + FS_proto.error = + FS_proto.onwritestart = + FS_proto.onprogress = + FS_proto.onwrite = + FS_proto.onabort = + FS_proto.onerror = + FS_proto.onwriteend = + null; + + return saveAs; +}( + typeof self !== "undefined" && self + || typeof window !== "undefined" && window + || this.content +)); +// `self` is undefined in Firefox for Android content script context +// while `this` is nsIContentFrameMessageManager +// with an attribute `content` that corresponds to the window + +if (typeof module !== "undefined" && module.exports) { + module.exports = saveAs; +} else if ((typeof define !== "undefined" && define !== null) && (define.amd != null)) { + define([], function() { + return saveAs; + }); +} diff --git a/translator/lib/canvas-toBlob.js b/translator/lib/canvas-toBlob.js new file mode 100644 index 00000000..c07fb7c7 --- /dev/null +++ b/translator/lib/canvas-toBlob.js @@ -0,0 +1,124 @@ +/* canvas-toBlob.js + * A canvas.toBlob() implementation. + * 2013-12-27 + * + * By Eli Grey, http://eligrey.com and Devin Samarin, https://github.com/eboyjr + * License: X11/MIT + * See https://github.com/eligrey/canvas-toBlob.js/blob/master/LICENSE.md + */ + +/*global self */ +/*jslint bitwise: true, regexp: true, confusion: true, es5: true, vars: true, white: true, + plusplus: true */ + +/*! @source http://purl.eligrey.com/github/canvas-toBlob.js/blob/master/canvas-toBlob.js */ + +(function(view) { +"use strict"; +var + Uint8Array = view.Uint8Array + , HTMLCanvasElement = view.HTMLCanvasElement + , canvas_proto = HTMLCanvasElement && HTMLCanvasElement.prototype + , is_base64_regex = /\s*;\s*base64\s*(?:;|$)/i + , to_data_url = "toDataURL" + , base64_ranks + , decode_base64 = function(base64) { + var + len = base64.length + , buffer = new Uint8Array(len / 4 * 3 | 0) + , i = 0 + , outptr = 0 + , last = [0, 0] + , state = 0 + , save = 0 + , rank + , code + , undef + ; + while (len--) { + code = base64.charCodeAt(i++); + rank = base64_ranks[code-43]; + if (rank !== 255 && rank !== undef) { + last[1] = last[0]; + last[0] = code; + save = (save << 6) | rank; + state++; + if (state === 4) { + buffer[outptr++] = save >>> 16; + if (last[1] !== 61 /* padding character */) { + buffer[outptr++] = save >>> 8; + } + if (last[0] !== 61 /* padding character */) { + buffer[outptr++] = save; + } + state = 0; + } + } + } + // 2/3 chance there's going to be some null bytes at the end, but that + // doesn't really matter with most image formats. + // If it somehow matters for you, truncate the buffer up outptr. + return buffer; + } +; +if (Uint8Array) { + base64_ranks = new Uint8Array([ + 62, -1, -1, -1, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, -1 + , -1, -1, 0, -1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 + , 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 + , -1, -1, -1, -1, -1, -1, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35 + , 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51 + ]); +} +if (HTMLCanvasElement && !canvas_proto.toBlob) { + canvas_proto.toBlob = function(callback, type /*, ...args*/) { + if (!type) { + type = "image/png"; + } if (this.mozGetAsFile) { + callback(this.mozGetAsFile("canvas", type)); + return; + } if (this.msToBlob && /^\s*image\/png\s*(?:$|;)/i.test(type)) { + callback(this.msToBlob()); + return; + } + + var + args = Array.prototype.slice.call(arguments, 1) + , dataURI = this[to_data_url].apply(this, args) + , header_end = dataURI.indexOf(",") + , data = dataURI.substring(header_end + 1) + , is_base64 = is_base64_regex.test(dataURI.substring(0, header_end)) + , blob + ; + if (Blob.fake) { + // no reason to decode a data: URI that's just going to become a data URI again + blob = new Blob + if (is_base64) { + blob.encoding = "base64"; + } else { + blob.encoding = "URI"; + } + blob.data = data; + blob.size = data.length; + } else if (Uint8Array) { + if (is_base64) { + blob = new Blob([decode_base64(data)], {type: type}); + } else { + blob = new Blob([decodeURIComponent(data)], {type: type}); + } + } + callback(blob); + }; + + if (canvas_proto.toDataURLHD) { + canvas_proto.toBlobHD = function() { + to_data_url = "toDataURLHD"; + var blob = this.toBlob(); + to_data_url = "toDataURL"; + return blob; + } + } else { + canvas_proto.toBlobHD = canvas_proto.toBlob; + } +} +}(typeof self !== "undefined" && self || typeof window !== "undefined" && window || this.content || this)); diff --git a/translator/translator.html b/translator/translator.html new file mode 100644 index 00000000..78090284 --- /dev/null +++ b/translator/translator.html @@ -0,0 +1,154 @@ + + + + + Image Translator + + + + + + + + +

Image Translator

+ by
Bert Freudenberg +

This page creates translated images used by Parable of the Polygons. + To make your own translation, translate this page’s source code, adjust font sizes and positions, then click the button to download the translated image. + Mouse over to see the original.

+ +

Fonts: Ostrich Sans, + Ostrich Sans Black, + Ostrich Sans Light by the + League of Movable Type.

+ + + + + + + + + + + + + + \ No newline at end of file From f8eb21f3429978d74ef33d442a7b021126309255 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Sat, 18 Apr 2015 10:26:51 -0700 Subject: [PATCH 03/19] nvm czech translation wasn t done --- index.html | 3 +-- play/intro/intro.html | 2 -- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/index.html b/index.html index 941af78e..cb5e98f1 100644 --- a/index.html +++ b/index.html @@ -399,8 +399,7 @@ Italian, Hungarian, Dutch, - Hindi, - Czech + Hindi

diff --git a/play/intro/intro.html b/play/intro/intro.html index 914c5aae..57c86227 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -62,8 +62,6 @@ nederlands | हिन्दी - | - čeština From ba273aaf4eb1c470144f79027f5f6400495b9132 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Mon, 8 Jun 2015 17:21:27 -0700 Subject: [PATCH 04/19] czech translation --- index.html | 3 ++- play/intro/intro.html | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index cb5e98f1..b347df52 100644 --- a/index.html +++ b/index.html @@ -399,7 +399,8 @@ Italian, Hungarian, Dutch, - Hindi + Hindi, + Czech

diff --git a/play/intro/intro.html b/play/intro/intro.html index 57c86227..c087bd21 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -62,6 +62,8 @@ nederlands | हिन्दी + | + čeština From bc80961abc6ecc4f99b434e03641af5aff5ded0a Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Sat, 26 Sep 2015 18:31:52 -0700 Subject: [PATCH 05/19] WE NEEDED THIS. WHY DID NOBODY TELL ME THIS WAS GONE --- play/img/new_board.png | Bin 0 -> 6112 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 play/img/new_board.png diff --git a/play/img/new_board.png b/play/img/new_board.png new file mode 100644 index 0000000000000000000000000000000000000000..49e733c77552cac3db53b023dff52b836f7c3dda GIT binary patch literal 6112 zcma)=cQl;cyY~@cGEqWwLl|8Mkwgn3T9^@?=wXb`s9_>%^j=4FVT@j)6GXJ=L=R*1 z7BvVWA~|=Scm3A;taHvE=Z~3LYu|hJ-q*gq`+I%v9jT@9gc8gGCL$uDR8v*b0e+W( z4;n-Ue3Q;$4vB~ui`0}J>!GvuvY)D(7^U|92|XWpC8J0qN~ytHSf=0Me4rv$W*=lh z9_`gg`VjkW+h9l#7iW=ZPz!>=>!Tbq`FA5G-Gz(I5^DXojbc8bCUB+I_aYU0!zjLd zvA9`e6I69E+v?Iz-Qp2YM%q5QbJ4yz?=jl^d$+354`D-kM?$1_Bhg^*^6Xc)~vMoontMb5D=*- z4b|#}mg-U3HF~HoYvdQ+&LDXr+kWoS(ATA_RZpK16OEjnu~z1#I>wuK#KGrQ^{bQjgrrd?^0l_fQ<{>X_KZ=i-Ye>6aazYKIFC9+ z8i=pc(lv;PY;(i4rqOoNT6q2RRD3}NDjA`q#}?pWb%lt9EC-LrmmWM@I{(@HTnQ=} zrE+NF2tS29;}6L@f7!jcfsAJbk$#JI`OvZGf9XibZ)T?uq{{kw@&eM1=EQT7Z*Kg3 zIOg{u0qBozX!y41;SqI(;Vo*3JaC5k)(YC?VBo=2-Q%Fm!=KBFggvJS5IG64>x1jA z9#&W@Wss@(dt(|{o^oGE?WLcndDV(r%uKXgVxrNmq&vajd^Dqn{I`81k%b+KN@99u z865h}kKa>Sl`5_)HkLAmG?ht1iN-BrmG7~7bcUL;E)$MG1q!IJk9WdI`kvDjnXf0$=Ikv zRWzb85tLNl5u5dD;P}T~$S1riDG-kcw~+Nc7`NC5(h1?&mfPko;wajiTwhyz}#)iDp=O845w0ZVl}sj@MLMGMD3`w1w%k zMvyEy1nt@{4*6+CGV$)b*e^lMRgCNEg}>SQDGhy!8Nj7vk^+6c&vwq=E33{^N=^Qp z*;A_5`e=FIp&2yg8ED?fx~@)!L+Tt#5~Vg_LtwnRjO;JNfDpEiugg?zk-69NaF5T% zdZ`7$8}*(p!DAfu{Dg1jIa=f79wj2|{LN>Srci)vzBd!5O%y{x0;?y}Gqmf{V6GZ} z`>P5xC(VS6ea($-cR*cWnRpm)usg3+6v!l~waS2I$2?!s|1h6(UMSS{{_mD3wK5F0 zkq(GNM=Wxu<85U^t$Cj;u1WmClxQyth*XKtX5NSwd!`qW6k!}hv4PAnS$f$cRbXaU zAM#$g*fwRaz_V`mR9wcyB&r0hl8>Z(??|J$aw@8;o9_%0+GwZkexH0M3+KH{OR+LH znNq&AGzuja0?h% zk*k1Pt;=C>?k;rqMGG*wF^ijQgwp3dPh(yssp~WN$$p%eQwYO^VBh#_qvK5=DFls8 zdiX12lQjwO5qqzQIg{7Z2c9vY{*`tN%?z-KB%>ydlswZ!&BmC}Z<5s%tVaQ5D#wnx zx=qy|;&jC9=dyC^o*bWCmx=#itglvPN=^1RW>J<0<%l@Wp3gEWubEbx%>X-_Ofi{%HhX|#m z*}2Ye-w*3+ezHu)la36-`K!S8q*BM_kNMyNb<$}7<2Hcs|7HhA8pk>0aY*se87sJ> zJVGX8?DpFS4X50NUB=Z1;bNf~oM*^Z^VxxHAm;^m*ze!_v-coM&{UJhZ?7ov3nkNv zu~RvgDmsQ@jmct-X&BJvcXjxA=$5zq=kAY7cz<{2_2_XBCwGmJZxa8y)Z`<-H8)8I zfq19)Ba%S#`zU#@4B!u9W*W%*j!DFzDNniV+Vu)=bR&o^km!dWTNvso@`bDcxD*EUp8 znv{FY>LFc)Lzz<7L;^o=w|-06Jaq753m@YL&qvkE3v2dufHiO|XY!7m~f@8VZMmcO_GjZx&ZyZYm zXq^n1G(^~Li_af>uiWUKUGJ=H*pGC&#yIFk7i+GfCN(mt=F5|8Z>zICdv>JfM~#di^i% zv0}^ko8*arL-Om*Ya+9}8z__$lT8PN*C05;vKWMeIf9HO{x~-dzrLMLLFG98S)E3l z+;+`$s1{lCq0+9N)ml7DApiPQ7~(E3eIBM~D^*|&xMHsa1(ph^$)@AG54zPUqT`Y-ZKPiW^VKI@YMI`? zUAPdgq>8Ii1|csK^oYLb*8=JaBYvAPS~m9t^Vw9v)7b$`&?wqY62kd;m&+e4$c06G zrUy@%LCdE1ceyWinZq_V)crKYW^~=}_S>2Yw~yaRn@hbQg|gQ>dsf&ps|ebgfNQQ~ zX5WC9zkq$N0jWVn@{$`L>J4h&k3tnqOp0V9yAs$w6>tz|R%7V#8^PV+Ti0uz)(Pde zIItdo;SqIY=`pGsC`_Woja#0-44w=^>G0o5bb%qR&n6D5hp=h&v)nlAt?b+SG60ra zJEnY0v(li+??n2P?9iQeB0)_2t#(M~I?F@AWkZ2l6&9o_EF7tY!Ye)$qb~2><%d)| zIGC!tmrtdB1|X`wo~K#sH$Ww#<{}^F7Z~cb0H1h+$N#NvKbO0HF76yZj`b)59H<$@ z1_|Hk-~f852&8wjcDyRa;kLE_0_m^kymLd#v}Oz07w3fN!;F9gc#@Ma%*G-5bBn#7 zf3@0sbc*mWR7M&W_!Dg+U8o<;w?${NvYtFIqcxTg3x`!zNf`sN#<*0ywmvA}a+i#VRU5)Q~1 z+R`SBw*gLuHWj zz&$p_AOX6}JZOQIQ&?1jLN)V$Yb?BQEKN)yEIn4O~F!aCXqquC|%^A}+U2{*$jTaIYFvq5-zD-eOIya<)nOLQPm~*MQ z;P4-dkA7<(rH!py_w1~Bc{$zWTs>Zv!E`>sgpT;JQxm<-(vUD!6rMs<``-bcKr=D_ zpmt@nHS4~B3S-yX0C$~DLLF57|w|`VW^d@?1xzt?WT=LVu2i@wwAA51;MjO3Mm?)~*q!77- z;JEQIzWqjuuz7u%gjl`2 zVmW;AQp4>d$t2}3qHpnhnyv%K&nim_DWeW07i9fPTe2x>fDnUDE{ILNhBW9oU1zr( zl=(v$IB$;Vmb|ydU`JOUSM~MHtG7pBrr}48?G=AA4WUaqH>}Fan9NPP%gCuKK_$_a zq7Cn(@@9>)igftD`37HQH8=d&J;ySlD=>E4W8rWab9nB0bc8G2WW12eShVtd$&4Kw zR3)_V38E}niQX&*2V0Nz)TDvJ509(bKjC}h^&jbW)!NA^k}i*0oxL~x;cM9uF*v7C zHE2DkdFRc_=PfwyXX_=fS?H4`;-7qccR7!4e(j2mX3EG` zM%j{=RDI}NKHfa>fJc%p{5l`)+uH?_MJw@_wb$CF>M+x1uJ4=(E!z268h|vGQZ^Ic zdsFwIAvYZzGYYvvQk5ko?|E1w+0D#>JlFjt?Tqy5UpW}3Q+FiBzVS|2P_Q+z>4^T? z7Q)CBSsNyYWm@-S`GY4ca)DWlwA}W4s%iU1 zaa(rMHF0ox82hA{A)0C0GSHY|IU=Hc*TQJ(1G+_9n4#mT=4~$!mJ@}Y2WiTcF+}Hg zkZ_hS#(PAQ@bgtO1%6tLzLk|78f>lKyuQZ7LmkqT53K$&IXR5_JK`WOH6BO1aIpV6 zGiTZt1&2b6jFYl*ffX4qB*q5%(gfGmrY^i`igU-h=Jp07Wa5tXVAHe-UX8GjTW}t| zn%SQ+bn*m5StKHr_L^ReQP0TY!QtDa;puj)f!Vl?Tq^7z+-`B$JNq|o8+N-1*))UH z$P=!=|Nh>zsc&6NqsaOp_BmK_{F|2_gtkh`DKbyqAva#6;o!l-aCq#MX;uQM#wLa>K`c<-~hFyfR* zHcRNpY;9kJW}WB&>l1eUvxe+~L?50jwFjHO8BFObriDQru0kcp$Ka76mCc#-|K{$q zmXBiZ!P;Kj3mv?hu_|_|722P{)dlOa`8Qt0%MSxr=V-u2iXv@sb<7g~LxA?htf&<`RMjY!@xi|VDU4_T81 zGZdM5#emdw0s;1pHl^x8&$~PFug8HyU*y0dZN4N}la!g3%EgldZXn4B3_)ohuan$j zqR#z!$DO&x?vdoZV89h1y@)XVC&f4}rM@4&OthfKPtEeRfh7KizF+1%0qFa|{oA&6 z>3709`o?wI9M+t<5p!)!?YDpf7A3iT+-b}k%kHD{#BG&2;IFlm_CTq;y^MVf{)6CF zm;MwZLxwfJfYDgD>ByH1MaYXCtpjclRJ@)5ZUW>-nVOJ=hj8xMOOJqB1J0w@Y%xv@ zF6^>mQ%9$8rJ$V>fA)B%^^v9B@`5v^(g5JNKpShVn(0ZURAnXe56F)F7&o|KntgjcXJhpq}nfKar`^(iAPcb zU*kyrP^?G_l@>Av)6KD5t45VCim(8HKAv-hmx9;5t^$Oo5z}!G3M?7qLflE6%qj*f zZ8Kg+pWeXIlm6=Jah|cz3UK>&+BC|@@U3=Aze^}BeToCYB&dMXc>Cgb(F-s11Nx@R zZI~rPpwlO$j`xlfW33Rs!k$~R>zK+N-?Dddix?s1yCLjB7@Vz&Wg3Xw)<(3Z^>2`w`e}?&zH=w zfz8xcM%w*;HI0E`bccf4FmCn11AT|TWmY1d{VQzcv#>%9Ap~OOz0Ywn^~}e`QVKAa zFR~mnAM`dBW~hQxO_JfzkgGW^_V#PF?Ux%8kG@K|$v_O~ zI0M6Sqmyn^@qnJ_SM=)gXGfrb3u`(nyB!@~@Vai`|3>ZqLhFC{{_99~F8-2&Zh-IU onPs!n|Ks^dHr)S&{_}ve5h`BEl$ Date: Tue, 19 Apr 2016 00:11:06 +0530 Subject: [PATCH 06/19] fix issue #19 Add website name --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 732b45ee..ff56cbdb 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![](http://i.imgur.com/NcsRW1q.png) -**[PLAY IT HERE](http://ncase.me/polygons)** +**[PLAY IT HERE (http://ncase.me/polygons)](http://ncase.me/polygons)** --- @@ -15,4 +15,4 @@ We are [Vi Hart](http://vihart.com/) and [Nicky Case](http://ncase.me/). Show us how you're using and remixing Parable of the Polygons! Tweet us at [@vihartvihart](https://twitter.com/vihartvihart) and -[@ncasenmare](https://twitter.com/ncasenmare). \ No newline at end of file +[@ncasenmare](https://twitter.com/ncasenmare). From a1b327492748a331a7a55f340b8d2e00c9c09e01 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Thu, 7 Jul 2016 18:01:48 -0400 Subject: [PATCH 07/19] just for autoplaying i guess --- play/manual/manual2.html | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 play/manual/manual2.html diff --git a/play/manual/manual2.html b/play/manual/manual2.html new file mode 100644 index 00000000..61f0ed57 --- /dev/null +++ b/play/manual/manual2.html @@ -0,0 +1,16 @@ + + + + Manual Simulation + + + + +

+
+ + + + + + \ No newline at end of file From 1356e0b7058bf394f32dad31a9c4dd87e1571faf Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Tue, 23 Aug 2016 17:06:40 -0400 Subject: [PATCH 08/19] russian translation --- index.html | 3 ++- play/intro/intro.html | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/index.html b/index.html index b347df52..419257ef 100644 --- a/index.html +++ b/index.html @@ -400,7 +400,8 @@ Hungarian, Dutch, Hindi, - Czech + Czech, + Russian

diff --git a/play/intro/intro.html b/play/intro/intro.html index c087bd21..683c4049 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -52,9 +52,9 @@ 日本語 | 中文 -
- polski | + polski +
italiano | magyar @@ -64,6 +64,8 @@ हिन्दी | čeština + | + Русский From 46fc7cd96cc4803d680604f88dda6c85da27b813 Mon Sep 17 00:00:00 2001 From: Hasan Arous Date: Wed, 28 Dec 2016 20:40:26 +0200 Subject: [PATCH 09/19] Arabic translation --- index.html | 3 ++- play/intro/intro.html | 2 ++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index 419257ef..e9f5fa26 100644 --- a/index.html +++ b/index.html @@ -401,7 +401,8 @@ Dutch, Hindi, Czech, - Russian + Russian, + Arabic

diff --git a/play/intro/intro.html b/play/intro/intro.html index 683c4049..20686eaf 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -66,6 +66,8 @@ čeština | Русский + | + العربيّة From c2a525613aab00a168c54a136e24ee637919160e Mon Sep 17 00:00:00 2001 From: Mary Gardiner Date: Wed, 19 Apr 2017 18:24:27 +1000 Subject: [PATCH 10/19] Remove Ada Initiative from list of donatees, closed in 2015 --- index.html | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/index.html b/index.html index e9f5fa26..abd217dd 100644 --- a/index.html +++ b/index.html @@ -351,9 +351,6 @@ Code Liberation - free workshops to help women make videogames
- Ada Initiative - - supports women in open source & open culture -
Nicky's Patreon - makes public domain playables (such as this one!) @@ -429,4 +426,4 @@ - \ No newline at end of file + From 49512d327f65188273d2818381b577a445d09778 Mon Sep 17 00:00:00 2001 From: Roger Date: Wed, 31 May 2017 20:30:06 -0400 Subject: [PATCH 11/19] Update and rename UNCOPYRIGHT to LICENSE.txt --- LICENSE.txt | 116 ++++++++++++++++++++++++++++++++++++++++++++++++++++ UNCOPYRIGHT | 5 --- 2 files changed, 116 insertions(+), 5 deletions(-) create mode 100644 LICENSE.txt delete mode 100644 UNCOPYRIGHT diff --git a/LICENSE.txt b/LICENSE.txt new file mode 100644 index 00000000..670154e3 --- /dev/null +++ b/LICENSE.txt @@ -0,0 +1,116 @@ +CC0 1.0 Universal + +Statement of Purpose + +The laws of most jurisdictions throughout the world automatically confer +exclusive Copyright and Related Rights (defined below) upon the creator and +subsequent owner(s) (each and all, an "owner") of an original work of +authorship and/or a database (each, a "Work"). + +Certain owners wish to permanently relinquish those rights to a Work for the +purpose of contributing to a commons of creative, cultural and scientific +works ("Commons") that the public can reliably and without fear of later +claims of infringement build upon, modify, incorporate in other works, reuse +and redistribute as freely as possible in any form whatsoever and for any +purposes, including without limitation commercial purposes. These owners may +contribute to the Commons to promote the ideal of a free culture and the +further production of creative, cultural and scientific works, or to gain +reputation or greater distribution for their Work in part through the use and +efforts of others. + +For these and/or other purposes and motivations, and without any expectation +of additional consideration or compensation, the person associating CC0 with a +Work (the "Affirmer"), to the extent that he or she is an owner of Copyright +and Related Rights in the Work, voluntarily elects to apply CC0 to the Work +and publicly distribute the Work under its terms, with knowledge of his or her +Copyright and Related Rights in the Work and the meaning and intended legal +effect of CC0 on those rights. + +1. Copyright and Related Rights. A Work made available under CC0 may be +protected by copyright and related or neighboring rights ("Copyright and +Related Rights"). Copyright and Related Rights include, but are not limited +to, the following: + + i. the right to reproduce, adapt, distribute, perform, display, communicate, + and translate a Work; + + ii. moral rights retained by the original author(s) and/or performer(s); + + iii. publicity and privacy rights pertaining to a person's image or likeness + depicted in a Work; + + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + + v. rights protecting the extraction, dissemination, use and reuse of data in + a Work; + + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation thereof, + including any amended or successor version of such directive); and + + vii. other similar, equivalent or corresponding rights throughout the world + based on applicable law or treaty, and any national implementations thereof. + +2. Waiver. To the greatest extent permitted by, but not in contravention of, +applicable law, Affirmer hereby overtly, fully, permanently, irrevocably and +unconditionally waives, abandons, and surrenders all of Affirmer's Copyright +and Related Rights and associated claims and causes of action, whether now +known or unknown (including existing as well as future claims and causes of +action), in the Work (i) in all territories worldwide, (ii) for the maximum +duration provided by applicable law or treaty (including future time +extensions), (iii) in any current or future medium and for any number of +copies, and (iv) for any purpose whatsoever, including without limitation +commercial, advertising or promotional purposes (the "Waiver"). Affirmer makes +the Waiver for the benefit of each member of the public at large and to the +detriment of Affirmer's heirs and successors, fully intending that such Waiver +shall not be subject to revocation, rescission, cancellation, termination, or +any other legal or equitable action to disrupt the quiet enjoyment of the Work +by the public as contemplated by Affirmer's express Statement of Purpose. + +3. Public License Fallback. Should any part of the Waiver for any reason be +judged legally invalid or ineffective under applicable law, then the Waiver +shall be preserved to the maximum extent permitted taking into account +Affirmer's express Statement of Purpose. In addition, to the extent the Waiver +is so judged Affirmer hereby grants to each affected person a royalty-free, +non transferable, non sublicensable, non exclusive, irrevocable and +unconditional license to exercise Affirmer's Copyright and Related Rights in +the Work (i) in all territories worldwide, (ii) for the maximum duration +provided by applicable law or treaty (including future time extensions), (iii) +in any current or future medium and for any number of copies, and (iv) for any +purpose whatsoever, including without limitation commercial, advertising or +promotional purposes (the "License"). The License shall be deemed effective as +of the date CC0 was applied by Affirmer to the Work. Should any part of the +License for any reason be judged legally invalid or ineffective under +applicable law, such partial invalidity or ineffectiveness shall not +invalidate the remainder of the License, and in such case Affirmer hereby +affirms that he or she will not (i) exercise any of his or her remaining +Copyright and Related Rights in the Work or (ii) assert any associated claims +and causes of action with respect to the Work, in either case contrary to +Affirmer's express Statement of Purpose. + +4. Limitations and Disclaimers. + + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + + b. Affirmer offers the Work as-is and makes no representations or warranties + of any kind concerning the Work, express, implied, statutory or otherwise, + including without limitation warranties of title, merchantability, fitness + for a particular purpose, non infringement, or the absence of latent or + other defects, accuracy, or the present or absence of errors, whether or not + discoverable, all to the greatest extent permissible under applicable law. + + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without limitation + any person's Copyright and Related Rights in the Work. Further, Affirmer + disclaims responsibility for obtaining any necessary consents, permissions + or other rights required for any use of the Work. + + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to this + CC0 or use of the Work. + +For more information, please see + diff --git a/UNCOPYRIGHT b/UNCOPYRIGHT deleted file mode 100644 index 827bfb5f..00000000 --- a/UNCOPYRIGHT +++ /dev/null @@ -1,5 +0,0 @@ -You can copy, modify, distribute and perform this work, -even for commercial purposes, all without asking permission. - -Creative Commons Zero - Public Domain Dedication: -http://creativecommons.org/publicdomain/zero/1.0/ \ No newline at end of file From bf4e325cacd6fd2c9e8af1a156cc82bcf8e90eb2 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Thu, 21 Sep 2017 23:17:24 -0400 Subject: [PATCH 12/19] Persian translation --- index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index abd217dd..a19496cf 100644 --- a/index.html +++ b/index.html @@ -399,7 +399,8 @@ Hindi, Czech, Russian, - Arabic + Arabic, + Persian

From 5d9447616dfc663c9c5af0fc7beec7f1332f29b9 Mon Sep 17 00:00:00 2001 From: zlira Date: Thu, 28 Sep 2017 13:04:09 +0300 Subject: [PATCH 13/19] Added links to Ukrainian translation --- index.html | 3 ++- play/intro/intro.html | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/index.html b/index.html index a19496cf..b92d8ccd 100644 --- a/index.html +++ b/index.html @@ -400,7 +400,8 @@ Czech, Russian, Arabic, - Persian + Persian, + Ukrainian

diff --git a/play/intro/intro.html b/play/intro/intro.html index 20686eaf..347f25cd 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -68,10 +68,12 @@ Русский | العربيّة + | + Українська - \ No newline at end of file + From 610751400c5cfb14ac65aabf6735fc14b3284c91 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Wed, 12 Sep 2018 13:20:42 -0400 Subject: [PATCH 14/19] traditional chinese --- index.html | 1 + 1 file changed, 1 insertion(+) diff --git a/index.html b/index.html index b92d8ccd..dab8022a 100644 --- a/index.html +++ b/index.html @@ -392,6 +392,7 @@ Portuguese (Brazilian), Japanese, Chinese (Simplified), + Chinese (Traditional), Polish, Italian, Hungarian, From cbc55abd6145e530cb393e5125efea58ea58ec24 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Tue, 3 Mar 2020 18:31:06 -0500 Subject: [PATCH 15/19] Remove link rot --- play/intro/intro.html | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/play/intro/intro.html b/play/intro/intro.html index 347f25cd..1f744bc0 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -53,10 +53,8 @@ | 中文 | - polski -
italiano - | +
magyar | nederlands From bfa936608effb26e53500a3081966102a93cd7f9 Mon Sep 17 00:00:00 2001 From: Moshe Jonathan Gordon Radian Date: Tue, 8 Sep 2020 00:21:32 +0300 Subject: [PATCH 16/19] Added link to Hebrew translation in index.html --- index.html | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/index.html b/index.html index dab8022a..76668145 100644 --- a/index.html +++ b/index.html @@ -402,7 +402,8 @@ Russian, Arabic, Persian, - Ukrainian + Ukrainian, + Hebrew

From fe4e80485533e776116dd07092b5a87394bf1286 Mon Sep 17 00:00:00 2001 From: Moshe Jonathan Gordon Radian Date: Tue, 8 Sep 2020 00:24:29 +0300 Subject: [PATCH 17/19] Added link to the Hebrew translation in intro.html --- play/intro/intro.html | 2 ++ 1 file changed, 2 insertions(+) diff --git a/play/intro/intro.html b/play/intro/intro.html index 1f744bc0..f5bc6999 100644 --- a/play/intro/intro.html +++ b/play/intro/intro.html @@ -68,6 +68,8 @@ العربيّة | Українська + | + עברית From 816e7dd8485729aaf63dfcf4ba27527ffe388785 Mon Sep 17 00:00:00 2001 From: Ivan Markin Date: Sun, 30 Oct 2022 17:35:55 +0100 Subject: [PATCH 18/19] Update the URL for Russian translation Years went on, and I have a new username and new life. Thus, this is to account for that. --- index.html => Ivan Markin | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename index.html => Ivan Markin (99%) diff --git a/index.html b/Ivan Markin similarity index 99% rename from index.html rename to Ivan Markin index 76668145..0b20d876 100644 --- a/index.html +++ b/Ivan Markin @@ -399,7 +399,7 @@ Dutch, Hindi, Czech, - Russian, + Russian, Arabic, Persian, Ukrainian, From 3ec3fd74a52ce24f74790a47f117d1a3abefbbb7 Mon Sep 17 00:00:00 2001 From: Nicky Case Date: Mon, 7 Nov 2022 10:31:23 -0500 Subject: [PATCH 19/19] ugh, fix frontpage issue, and also font weight fix --- css/index.css | 15 +++++++++------ Ivan Markin => index.html | 0 2 files changed, 9 insertions(+), 6 deletions(-) rename Ivan Markin => index.html (100%) diff --git a/css/index.css b/css/index.css index 4e19e97c..cb03da43 100644 --- a/css/index.css +++ b/css/index.css @@ -21,6 +21,9 @@ a{ a:hover{ color: #ddd; } +b, strong{ + font-weight: bold; +} #intro_container, #outro_container{ width:100%; height:550px; @@ -108,11 +111,11 @@ span[cartoon]:hover{ } #cartoon_arrow{ - + display: block; - width: 0; - height: 0; + width: 0; + height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; border-bottom: 20px solid #fff; @@ -123,11 +126,11 @@ span[cartoon]:hover{ } #cartoon_arrow[flipped=true]{ - + display: block; - width: 0; - height: 0; + width: 0; + height: 0; border-left: 10px solid transparent; border-right: 10px solid transparent; border-bottom: 20px solid #fff; diff --git a/Ivan Markin b/index.html similarity index 100% rename from Ivan Markin rename to index.html