nautilus-image-manipulator-1.3/0000775000175000017500000000000012134312450017715 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/docs/0000775000175000017500000000000012134312450020645 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/docs/Makefile0000644000175000017500000001106611732676354022332 0ustar emilienemilien00000000000000# Makefile for Sphinx documentation # # You can set these variables from the command line. SPHINXOPTS = SPHINXBUILD = sphinx-build PAPER = BUILDDIR = _build # Internal variables. PAPEROPT_a4 = -D latex_paper_size=a4 PAPEROPT_letter = -D latex_paper_size=letter ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) . .PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest help: @echo "Please use \`make ' where is one of" @echo " html to make standalone HTML files" @echo " dirhtml to make HTML files named index.html in directories" @echo " singlehtml to make a single large HTML file" @echo " pickle to make pickle files" @echo " json to make JSON files" @echo " htmlhelp to make HTML files and a HTML help project" @echo " qthelp to make HTML files and a qthelp project" @echo " devhelp to make HTML files and a Devhelp project" @echo " epub to make an epub" @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter" @echo " latexpdf to make LaTeX files and run them through pdflatex" @echo " text to make text files" @echo " man to make manual pages" @echo " changes to make an overview of all changed/added/deprecated items" @echo " linkcheck to check all external links for integrity" @echo " doctest to run all doctests embedded in the documentation (if enabled)" clean: -rm -rf $(BUILDDIR)/* html: $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/html." dirhtml: $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml @echo @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml." singlehtml: $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml @echo @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml." pickle: $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle @echo @echo "Build finished; now you can process the pickle files." json: $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json @echo @echo "Build finished; now you can process the JSON files." htmlhelp: $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp @echo @echo "Build finished; now you can run HTML Help Workshop with the" \ ".hhp project file in $(BUILDDIR)/htmlhelp." qthelp: $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp @echo @echo "Build finished; now you can run "qcollectiongenerator" with the" \ ".qhcp project file in $(BUILDDIR)/qthelp, like this:" @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/NautilusImageManipulator.qhcp" @echo "To view the help file:" @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/NautilusImageManipulator.qhc" devhelp: $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp @echo @echo "Build finished." @echo "To view the help file:" @echo "# mkdir -p $$HOME/.local/share/devhelp/NautilusImageManipulator" @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/NautilusImageManipulator" @echo "# devhelp" epub: $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub @echo @echo "Build finished. The epub file is in $(BUILDDIR)/epub." latex: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex." @echo "Run \`make' in that directory to run these through (pdf)latex" \ "(use \`make latexpdf' here to do that automatically)." latexpdf: $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex @echo "Running LaTeX files through pdflatex..." make -C $(BUILDDIR)/latex all-pdf @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex." text: $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text @echo @echo "Build finished. The text files are in $(BUILDDIR)/text." man: $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man @echo @echo "Build finished. The manual pages are in $(BUILDDIR)/man." changes: $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes @echo @echo "The overview file is in $(BUILDDIR)/changes." linkcheck: $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck @echo @echo "Link check complete; look for any errors in the above output " \ "or in $(BUILDDIR)/linkcheck/output.txt." doctest: $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest @echo "Testing of doctests in the sources finished, look at the " \ "results in $(BUILDDIR)/doctest/output.txt." nautilus-image-manipulator-1.3/docs/usage.rst0000644000175000017500000000505011753020112022476 0ustar emilienemilien00000000000000.. _usage: Usage ===== Once Nautilus Image Manipulator is installed on your system, you'll most probably want to use it... Right? Launching Nautilus Image Manipulator ------------------------------------ Open Nautilus (the file manager in Gnome) and browse to a folder containing images. Select one or more, and right-click one. In the menu that appears, you will see a line that says "Resize images...": .. figure:: /images/NautilusImageManipulatorExtension.png :alt: The Nautilus plugin in action :align: center Right-clicking on images gives you the option to "Resize images..." When clicking on that menu option, Nautilus Image Manipulator will open and allow you to resize the selected images, and send them to friends and family if you so wish. This is how it looks like the first time that it's run: .. figure:: /images/InitialWindow.png :alt: Nautilus Image Manipulator as seen on first launch :align: center How Nautilus Image Manipulator looks like the first time it's launched Working with profiles --------------------- Resizing and sending images with Nautilus Image Manipulator is done using profiles. Those represent a set of parameters that will be applied to all the images being worked on. Nautilus Image Manipulator comes with 4 default profiles to get you started: * Send small images to 1fichier.com This profile will create images that are maximum 640 pixels wide and 640 pixels high, and the quality of the images is set to 90%. Those images are then zipped together in a file that will be sent to the file locker website http://www.1fichier.com. * Create small images in the "resized" folder The images produced by this profile will be of the same size (640x640) and quality (90%) as the previous profile, but will be put inside the ``./resized`` folder instead of being sent on the Internet. * Send large images to 1fichier.com This profile will create images that are maximum 1280 pixels wide and 1280 pixels high, and the quality of the images is set to 95%. Those images are then zipped together in a file that will be sent to the file locker website http://www.1fichier.com. * Create large images in the "resized" folder The images produced by this profile will be of the same size (1280x1280) and quality (95%) as the previous profile, but will be put inside the ``./resized`` folder instead of being sent on the Internet. Custom settings --------------- TODO Managing profiles ----------------- Adding a profile ^^^^^^^^^^^^^^^^ TODO Removing a profile ^^^^^^^^^^^^^^^^^^ TODO nautilus-image-manipulator-1.3/docs/README0000644000175000017500000000046311743332704021537 0ustar emilienemilien00000000000000NautilusImageManipulator's documentation is made using Sphinx. Steps to compile the documentation: * Move to the ./docs folder * Execute `make html` Then open the ./docs/_build/html/index.html file in your browser. For more information, refert to Sphinx's documentation: http://sphinx.pocoo.org nautilus-image-manipulator-1.3/docs/source.rst0000644000175000017500000000543511744051456022720 0ustar emilienemilien00000000000000.. _source: Working with the source code ============================ Nautilus Image Manipulator is written in `Python`_ and uses `GTK+ version 3`_. Retrieving the source code -------------------------- The code is hosted on `Launchpad`_ and is versioned using `Bazaar`_. Execute the following command to get your copy of the main branch:: bzr branch lp:nautilus-image-manipulator You can also `browse the code`_ if you'd just like to look at it online. Running the software from source -------------------------------- The steps to install from source are `explained here`_. Modifying the GUI ----------------- The GUI is created using `Glade`_. Open it up by running this command:: ./extra/design.py Updating the translation template --------------------------------- Whenever you have made changes in the GUI or the Python source code to user-facing strings, you should run the following command to update the translation template ``po/nautilus-image-manipulator.pot``:: ./extra/update_i18n.py Updating the translations from Launchpad ---------------------------------------- The translation template ``po/nautilus-image-manipulator.pot`` is automatically read after each commit that is pushed to the main branch, and the strings are made available for `translation on Launchpad`_. After strings have been translated, follow this process to update the translations in your branch: * `Request a download`_ of all translated ``.mo`` files on Launchpad. * You will receive an email from Launchpad containing a link to a tarball containing all the translated files, download it. * Put the downloaded ``launchpad-export.tar.gz`` file in the ``./po`` folder * Run the command ``./extra/update_i18n.py`` to unpack the files and compile them locally. Note that aside from updating the ``.mo`` files that are already present in the branch, this process will also add new files for languages that are not yet versionned. These files are for languages where the number of translated strings are not yet sufficient to justify adding them to a new release. It's unlikely that a new language will be added before it has reached a translation rate of 80%-90%... .. _Python: http://python.org/ .. _GTK+ version 3: http://www.gtk.org/ .. _Launchpad: https://code.launchpad.net/nautilus-image-manipulator .. _Bazaar: http://bazaar.canonical.com/en/ .. _browse the code: http://bazaar.launchpad.net/~emilien-klein/nautilus-image-manipulator/trunk/files .. _explained here: install.html#installing-from-source .. _Glade: http://glade.gnome.org/ .. _translation on Launchpad: https://translations.launchpad.net/nautilus-image-manipulator/trunk/+pots/nautilus-image-manipulator .. _Request a download: https://translations.launchpad.net/nautilus-image-manipulator/trunk/+pots/nautilus-image-manipulator/+export nautilus-image-manipulator-1.3/docs/nautilus-image-manipulator.10000644000175000017500000000351011732675534026223 0ustar emilienemilien00000000000000.TH NAUTILUS-IMAGE-MANIPULATOR "1" "February 1, 2011" .\" Hey, EMACS: -*- nroff -*- .\" Process this file with .\" groff -man -Tascii nautilus-image-manipulator.1 .\" First parameter, NAME, should be all caps .\" Second parameter, SECTION, should be 1-8, maybe w/ subsection .\" other parameters are allowed: see man(7), man(1) .\" .\" Please adjust this date whenever revising the manpage. .\" .\" Some roff macros, for reference: .\" .nh disable hyphenation .\" .hy enable hyphenation .\" .ad l left justify .\" .ad b justify to both left and right margins .\" .nf disable filling .\" .fi enable filling .\" .br insert line break .\" .sp insert n+1 empty lines .\" for manpage-specific macros, see man(7) .SH NAME nautilus-image-manipulator \- resize and send images from Nautilus .SH SYNOPSIS .B nautilus-image-manipulator [\fIoptions\fR] .SH DESCRIPTION .\" TeX users may be more comfortable with the \fB\fP and .\" \fI\fP escape sequences to invode bold face and italics, .\" respectively. \fBnautilus-image-manipulator\fP is a Nautilus extension that lets you resize images and send them to friends and family, right from Nautilus. .PP Just right-click on any photo or group of photos, and an option will appear that launches Nautilus Image Manipulator. .\" Options secction originally created using help2man .SH OPTIONS .TP \fB\-\-version\fR show program's version number and exit .TP \fB\-h\fR, \fB\-\-help\fR show this help message and exit .TP \fB\-v\fR, \fB\-\-verbose\fR show debug messages .TP \fB\-f\fR FILE, \fB\-\-file\fR=\fIFILE\fR a file to be resized. Use multiple arguments to resize multiple files. .SH AUTHOR nautilus-image-manipulator was written by Emilien Klein . .SH "SEE ALSO" .BR nautilus-image-converter (1) nautilus-image-manipulator-1.3/docs/index.rst0000644000175000017500000000203411751160720022510 0ustar emilienemilien00000000000000Nautilus Image Manipulator's documentation ========================================== :Version: |version| :Date: |today| Nautilus Image Manipulator is a `Nautilus`_ extension that lets you resize images and send them to friends and family, right from `GNOME`_'s default file manager. Just right-click on any photo or group of photos, and an option will appear that launches Nautilus Image Manipulator. A set of default settings make it easy to quickly resize pictures. You can also easily create your own profiles for later reuse. This documentation contains information for end users, such as how to install the program and run it, and also information that would be useful for developers interested in expanding NIM's capabilities or packaging it for their preferred Linux distribution. This documentation is a work on progress, so stay tuned! Contents ======== .. toctree:: :maxdepth: 2 End-user documentation tech .. _Nautilus: https://en.wikipedia.org/wiki/Nautilus_%28file_manager%29 .. _GNOME: http://www.gnome.org/ nautilus-image-manipulator-1.3/docs/images/0000775000175000017500000000000012134312450022112 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/docs/images/NautilusImageManipulatorExtension.png0000644000175000017500000013532611752722112031515 0ustar emilienemilien00000000000000PNG  IHDRsRGB pHYs   IDATxydWYk=\g;tf 9$D%p W+("ˠ"Ef~)DbB2;=:NͻZ:ӝ;ٟSVoo5mK !!!!d29 Ghr+'g!!!!Hy6|NB"YuR !hB©3M1~t=73Bn! SL DN83_)b)6cRJH81CU%is AJ L1!Tg~CD!$3"  @gCNO[,*4&$*[,h}D[gD3 >ST y" N 1DŽScEx}VhcB©O~ ou#-{g8cpluo<Ⱦ}8r[sɷ4!>>1/'m)S61Wԏoh!F.=9=TRpu5MH8%I; % @)By[Z-_C/Z#h[ަ}Ʃ2O/@4ROӭI V?ia8p NjR$6;/0{b@е @-I[Zg͖q!% ӌT&g*SVFiSq>)ÿXWT `+OB©OQ<~U;zý)^KJ"RD棅o߼r"4Cu%o%n04W~| "eok/֣}j@v]{74~u{%OՉ:&$[\onH$S+rq-+K'Ў}Ko;Y@}kZ?qReGnr'"p?t%=/]{wOSܝ[֪Bz~7>0?GcG +sɶa "N-W!A/n?˿=}]Z`y+z~u9V{iJ)o~et?ę>EGCrzSQ [DN}ƾCxpߏxs[Sq}_Lo o ҵyDX;r^msA.`#xk Z. F҄ea|P!=֣&]heW(㓋C|;z-g8wn_2ϻlH;x,˵K\]xy;__K"{?n /?p}wd^Mk7o=;p0n|A5MH8luTfMG?AJD ({K?pB! pevjh:zETP e(L(4U}A {v 5`\;vĆYL1@~᝿곊>Ll`zg^hrwk^ڽ[_7( nO6o>|:4o t4 Pd \m\Xӻvhk A;he蓼O*W6o} %KYٓ'#@|û^}!o^"dgĹ v?\;[}GdxSg7\ ΚpE{o^Oy2XpjqǼ QU vOʃ!h;﮾51_|ǼGA>?-gPJ#<}ɍ0ҭe}׾xTjkpvw67[Џ&LEc2J?׎|_6@Uu}#|_}ekꄄSe ǢkqWpⵯ? O3!0"BtȻᆗ=9"d:3 0 1~CgKo|+,ޕYt-p٩& g7>vlCߤ"^\[_xIY(쏟}pa$/Vs⩽=.SDN1s}Lz pH.8/}Sefʣ]N!3ON]Gv%|?{-ǟ)~o +GDi痁0  #" !Q/էM\gAky'@?=Ŝ%"t_|Yvyz A$_\uvvdߘ?ɇ6DŽSe/x( HJ5GUEQNI)_XaRJ^!AI[Qls@uMz~78#}' V?qb*ϐ_/ou4Un}9kG P[,HQ`izw2!hf_^\U'$q|v\}?gy<IH8E:H{muriӵɥYN~$_gU1!TgUgcB©ςOH)p!)^"b2'!jx69B2 $Bp!6@ J )KC@d (s|= /d޲DRNi\VBrV\X 3Rɻz$$$$"6g\g@BB©zǦ'R& $ !!!!DŽDqLHHHH1!!!!DŽDNXr :疖9?eZCCWM4DŽŹZyrAQO4 ?+Kˋ' r扭KˋI@&cӀ:Dș)egLzc]wܱ}bNm}}z(lzzzfzβcS3a&'-4!DŽ];sk}YaDŽR׏FF4*x͛cS*o=R.'1!DŽgi<.򲡑!!VU ƘA"ecNF$)aȈBSJQ/F7ֽ'g5!DŽ3Y 7e+RǾ@p\ԈF@6m R5v |M-P45zaf}u/G|x3 (LU D~&E9_z9\1W(J"EDg&j,QeJ(0b躞aPʤHEaD)LSݶ=gׇ?}رəlz׾cz{f0֐r!Ri~~!3eD~zF_k'6Uiŀ!"U P4kMיTFͶ9K@9Wvc!el)uڞBVKji ?y7u7]ONi_Mukkz {w^*|}8t@" PDŽdW])؎Ӫ2ĕ.o~@uM(ywW_:H)C7 UUT)Pj60{R)L]]}/~U˿=6|5׽s>kHieIUمtXZY۱YAnwرv:i@5Sm'BӴ=w g3J"umj0 Z# bhFD´\ejUW0 NBxn&3)h4[]](Vf8몪3ꄧUex1II0=}4klڛFF WS B@B~EQEqOp^RB.[(U(147^9{__rY]h}s\Gݲmw.[[[zC{^ȔLȕWWށtZkNЬ7X*fЃ/.,}[ƣ(':LT)Q)(d;vn*fth9e$EVyިGm_]XH#cV*&SV(zjo UoT*%èP 뻊9֑ }瘹lqKW 2 Dx;~#?7ω}245``hKQ! #bb󎕥K.ynȥ /-5_򲂔1Aev_yU Ziŕ\.S7iAa'F-Ȥ]]!Vjtll0!ne*L<3 =lt]fsSyʔ(#4FZ\W7oY4leRJHz퍓Sv;NoFRR-EQTGШj-?ibRm= Kk]zz8tC,+]ҫgۮ0UT3y1-YNzJ %DcA#\>ze ?0)IA#m,/~kjiMF>Ci(dZqSgjl&qVT )J!o[:KPϿ}߿ !p~'GSBR$ x#˕a (!A%AfHʨmMB6qZZ)U}uZjI)sF)X0 S4HBRʶlr%Io{{.Ԫ~Pzʆ&v<;υp0n߶5MCm;nhz [ZZm=/믿~CF:>t@Q\{`p~m۹ws۶ 0N>oJk.X;G:0 ##Y H"R$wDDTC'D,B!2 "X)&v6o** ah@ BƄU#qvǡh7|,9!Dpj4=/c+z.kiR D18bUխEUTJ0]!]$j? omUVSW \Y#q7jR@$FQ;_ݲcO6 <7vAAOwi?FU)Wʜ M3gfN8y|xjLǓJ ܐC"* QT`]"I)TruDH) *'dxܐcxژ(SдjD7!Q3]#c]PJ 1x H(a$BE2<j#G']?c*|2ۇzm0t]aTU82<4j:!ukK84:<0؟cpK.}.S(G<1;;VYq}OTm۷A42i݆aV fl6mݵm9+k+xNh;~OgjjvYzyyefjcssKqo61#Ƙa`q\/D H$ Ag_>Q֕ ܸ"@DH6ZI%yRzBxB%F#:\tj2,k` 2=PMW ]MBҏ8 IDAT( !i LJCU Ce]ɘB2l,D(Wj9cAJ?jnW˴,14tDf5]c>3=A;K˥zC HMevlKqUjJ%Uؑ(`\ZUjk5JR*-wqqն]C׭LkkX{s.9]wf>|!j4, sp_QNuzOGTIJFDyBJ!v$ِA<z'fT@ FMh"6ފ#I{dخ7wubbƹPTa(R2V|U@B P 8 AɥPQ!E!:޻W0uܴ4@l3BPu] n[vYoRóss( (ڱss[ Sxͫ^5P^--uMj{V+<[]-A)1Pݷ蚵sJ~>o`vjv݈D(Tk^c6kkwpm9C#x,z{ZFeMAJR@NHe'i\dGO*e|B(„$RCnjj&LϘKsNrBHBgU@]lbY\(\+ckt0dL8N XZZAΝ'4#umn9:Ħv&.-LD']}]QZ 7BA-ݼլ֖o޲x!JWzz{Zw:5;x-; jmǮ+˫~"}|%AgPDIU2L )2x(_~`˯W~}iF& #IFI6j |Ҥm<|!iH)(STQPkm RRETTR)kxn{ڽb4IJRe2iƾFl#γ锪Btil>ˤ-Ut\!4dHgD"N v}T50yێ{w& +MxGκR/d3ޗ߼c{7 B)9!$7{:c)9JH:3 %GT@q|̍ʄS5  !P!@J EkiK5uʙ$DL# 20ٵ\Rj ¬t;ġ/bNxa`kk5!Woe󖉑={Y#x_rQ#l&?22(`F Yk5>u~{K[iw}pHMӶlɔl.qA*߲mRHUUS)% ss}=< CKF)lĖB1h&.YY+oڴ߽m||LM<3ő*J `GI,wTSvFcQ /?ϧW]|>AIKճ"&G@)TEӈA"QUrCcNnj RE )dC]b6qdGri% 0(#CCh(t<)caKdWU03g8NmTw;6YUS$$2FټubueU5LH"T[oIsɣ@J0em>1?7=y'S u˥bQ pei&w>׳K%ku;놙+Tk f2xjfݻz{g*%w"z \+ RT>)LC]7|pP1ɀ}]^}@!_,=)1ibnێnU";p0b!@o 6顐tM*~:9R$vJ#' (H~ =;1! iaZA)mA u.?pǗ>^{,yY Auˎ#r}~rw!@J"&$SAp1+ɤEgd2籤iim tqBibVUreP3ei]=lq.0`Zu ,@i4K+UN0 #&{v t_?}UJCvX[UTJmwfnuP1\_fڢxezͩn6g ]='&?X^*%|S)va zi`Z,t=R Cwyoߵ'a+jWOl;0ҲRBr2 Z;RkYBjѨq.TU= '9>MD  tf RJ~׿oGN/DB8x‡~#q@tt&HPYZAɥ@"GٙHVַnzlGGH$W_?zaKPD1S$R*Դf*? ny<ĂH!cϤmcj9(U y9C@8"/<8B/!diVTS;F{u~d;thnvPxWw ϱ'a7[=]=͖mNN.T^׬v"sKYR)oڴިvV6աa$X`ۮә/E; ]G; %"PʌʯU c)Ig$%@@jWZr@ )Kݍ: eGi';$h{|)OڽQ@IW~!=C9JBЪ͸j4uu|@,I$, XJJ+v4sBptfcS.DgY %9AGIg c %Ap)9Hq|01W;J"0 ם7~$k7 q,$"^_Pk5\>I{QDGM/z[-2?-˴4M.旗ʦLjdlեl.KJTJ˔PF(R" "p\@QHOWQDpy9”ry5Q6n ) =feyyڨJ)N%]3+^py\ i68p!K]vnqoyv]^)( 楗]5<2ێGiΤ@s]Sb1D  @(A)Ē}=+v];}~x%bNm)$H$Q$J!#Ar)#, KDr#޷c pF)E8&&&W8BtV$AF}iAisZ\!rp ۵G~ݎQhyFηmFJYVF  ٍ@002AWk͛~#GfW&6or62<2:dܠŋDp%fV ^Wt3 P:n3AMSg.被_"i۾JY> #Rr󄐌)k0 i+/ێ}2ᡁe 4MQ13V %D̰x D@o?Z'* Y{磓u$A__毸*(iI'yOOOOPVөrTвbi 3,s,ӰR)[9Fd˸WZCE*S0%Jt ٴkV&͔5.BB(*1 US500uәF% j .#ːBrKfDSY+zw.99HHcJA //Y2ճvyԬ*8K2"$2M{^[J10ۛF0ٹ{ K)Ø<őP A\ߗTCdވmlND +gP P@ @)c!H ( \JAN8PJ.0KAP )ED((W%|BF2ՏqӴ |im1"Gdix^^N7ڶ2[-CXݪH.խ*u][M=2:noocZ.턾j +ORz{{/h<.bmZ0Jr SU!d4얭i}K"-r?ޒIz]zЁK˖i**k6[vN Pҕtz[>wv1fYjYq%Ѩr9RQ.iZq}Jt?زmĦRDH CB !H֥0ѹ)"Jd$p!n,8BJ)DRB) Rȸ3-$ *%"J!DIYT2cV /Q8 Bww 17?O)bePk3Szf}u~X442-0)~@ )kttxuBR9ө/j}=Dх2(J1F(sTUU5HʕjMlѺC|pjjرcUȖV˺nZ*)mԪ\ahyQ-"lصV޲}k>W8mۄm&煈kV{"bye*!a;?\)!Pcã,m/lz# AQ .*{-WS^ PA =JRw7[g? @pÓLvysf(@FTl BSi!ǖhKc(cEQ0a0&HQ$"cJ%"@(JYBINҫo@k }M1&4:^4z:Xp$(JchVERYNTLqfFbrzjrVN "ˀATUɉ2 Dy4 J z,0*YiZ2LՒ߫[(AI Gbę~]GƸ8)t֔Xc4Z) !X4C9]vl6!A\nNmHβxp0o{Q>3SJ'Lq~F$+,`IR+j8( St(,.xNMu4Yhi!)B@b4B1m`cJQQBq -*$%^ŠD(jaD3Ƙ)Y&2R1Ј )B 2srv1Bwƌ);6׋eD&h4R:EFAt٨ZFáÆk eӻ]vsv"J,Ru4Q,QDb1k4ZFHojo`UtRV|4e٬;h`(l4ƙ K#Qgd3@(%%cu7648.117[|hI!嶷t&SB$FMgNt6;Ͷͩ`9lVթI={t`0Mq[mv0*JVB$ٜN9ǰ Cs40 8}&FE4M3-3fhi u!t$Y0` EV+HBE2#aEREdYeYaIb(4AL!B&#( cqǖMD[NabKX77tihVCa^Q |P#ex㭉OӨcΡ1 cP0RiLdE! hZb|vpM#I4ݭ{K3٣1COZ7L&#M`0*ˊ`LQUbsw"PkF׍)N'Z3L OvБHDVgꊋz2jQSY]VuojFZ C:`ƍ۲iYVlVKܯ׆#Zi$EQ49S@ qFK3240 C TfXaaYVE3 (aF,0ht( D 9+BQS IDATQEYeQR"I"I ȒȲB,˒B2i`IƲi1B1I!(d9BHMm~1'YL&_psS\(Uԝv^(IIZkt `^X1~_8i:Uqq(( QU8UU4Bh&")&Y(/#z- k*YN%+DQ56.VJJJXX,3\fy;.cn=z|/|rQ3R hw4x=n=Nw<8h ݼ 9NimH$r FӇ! )r4jcX8e9c5ZNũV8V2UU,zuPf0(LlҘj a!ՆEeEeIeQEQ(/( "/ QQDQdEIeeYTdYdɘRA*E00 рh n9'9]{ƍ-DaVg0 ɩ 6n!5;=@BRtLqqV؈i<cF$IiFDEFcFf)N'JYIS6 P8lXkCEMfFn : 4Z t(+qJٰrulNbTf:[uƨTdXm^eUUv,xk*M~׶2[?///+=c,qvupXP/^d5TPFB"Dd#8I9a5ɊpydN^ONJ0P,TlNvfiIfvJ2q4jU(MHMϲ/@ȒYVDAZMxR(Mx%!BLUU&DNQr:55G#aᚚcEQ}%Y;q6nx]|(H &.NMU no1[քpT0YU:A30KGbScB$b}[~ ,{C_z72(DD&,%I,E>"("H8C@ F4!$@eEA)FL2e)$(P FB)@„ݐ9V\u=wVӨ9θPo0쯩KNJeDT~[ф"u`Q4//i3AuZ^ G$Y4̒"ch4J6V׭bJ]ZYܬPa9kXb9I ln׫UQAHE޺m nUtzUNvيȄ yO̥Xƨa &b9>_Fp **ޛ Yr<JG"KJ ƌ= @BZꐖ~<;"DcxIdDagB#17?Hn/1Ct AVԒ$x)B~( s(xx`D ̃E@I%JȀBdJca:ΝK*3}N{}C}iEiA00 veŪ~/+0ѠS0'Ht I@?HVS Gj RP"!iYJJlv;5hr C=:)|cFz<^,=FVY j%H34 iFJHg)pbU@5$'%df}uM@ n(Pl "w*j1ߚFBm *`&N@! H E A@ɊDd}ODK\fzVJImBe0ᰚO#<@(#^1'xJ4 KaY2/+E911K2EdD04qjS%D!t4A~W(<.wkZ^U"$jNNSQT$V4z>Ȋ(aVEL$De >L)DMMBKLtx&9S(F%AQbjb{1` RA)+jQ,EG] l[__h :[bB|4MKM\RNQ x^Y[YH>sz*VD;f^ ȄB䩲D(QkRV0FH8RVrB u-k}ciV=7%1ΐTY[i$̧uB$ le A+pU(| GE3€D)x|ck~1HOM1q6|U:lqFo2GaGшZhԜh4Kh0tc]`hԊ: b̲#JKIQKIMa4Ztj`b6Cjkl.{c3uCcr^ K&wD!AWs`]}XdPv:3rlw[~!j 0iM`L-,1 KIbXAK;E!4lNBc eRvEnC0&eK-i"~bOs׼Cp0(u[-I(IRB~!'&&\nE-qN'. 6B!Y0`*QT A(IE^`S r*$THi4(Y(3ì :}>C5vNVC 7tf99HmojEAZ; v9Ug'=NMLnI5Z i1AB!ABCul Ak֖k3p5i@-'[Bic,+}eثWOc@FMJL`X򀑳0(`k1 G MDl( $$&j9њ2 F-bE`4*h|$6M⣂픙4c pH2řހ#%gr̫3eUd6$y~Zc{8\XRҽsP h ͉7Yf@^>~H[<6"ч4 Q Н`Z♡60$!ôx )kI˱+fK5*5t PbrZq8cΔhX,Kjc9ɠh@\%(z8kBXk5*JEy^x@Q(+B$^Rʘ̩2˜ ˇ`kټmGIΟ{+[erU*ONJ w'$$hhh4`0ETܭ&۰: ygD nF2B!D(éI[hR  G"tv5ƌ {v1M7JzNeYZ6uܜ.# =ZmffV!V4iYWx@(Dt:51)9( epe 4 PiIH gsӞҍ bm%fs;Q@$Y3 !+;no甤I89dˆ бJ H!@aBI@@ôǣBDfS HA-֞΀8֯UQ!`E &t$ Ʋ5/n e3a Y9G3F+ B"BD%$Dh4jR"X7 + diqۚljBPaIcSE׬ْRD5/ hZe,ӘPr:(s$mkW;w"0 s?|l[rgB$(фS>CLԴd  b0Q^PBQ?FK[9~줿x #r"_l2h@˕0Lcdaw~3F[ ah8"Ҵq\\\| @ O)9mtvK(ܪ3RG999i!PJb8pIs>PSOӴ( DySca[B=TO|04nw nѮ(JC ?W+cpP '1Z:-2!O>ٚcC 1fQX:ж(( 4hʟ'N3g9;r_u:61A>98lj 0 #FXdɥ^:i]vFAЁp~gAc!3Ns-;Dw5㈯#j~MX(nyVB8g9Rsz[4ƩSSΞ=OEw?vmiÜ J6?s&w.XY}SظoĞf̋-zQޅ>J u9B[k4[X&izmVҦ kms?/?9P]H6҇1>3/396F#9ڷlt@W W^vTCGN&Gi;ϘtuK7sь+f{YT#@ņ/Yik Lq恇* `'TSʥo{u̙G 8Ix]Fʊ49#꼿zgsQ]A<(/KjM얭cTZwT0ijퟟ^gAF 3VgLCCɓ%IP^{MRqT'!5:s+t_CSCaژ QhJ2+wo dNiO`\M%eK>T&RT\R}g7]r4*NKW[l Pqٝ|mN ^{}CcCCoq%Ekd暴վnUN6\Pzup`oyeeɖť ]iҼko;Ko&'n{E麌86o;1AUl"̝fN9ʀx}W^R#ǖw e]0TRb2+r]wy/?9uqiy$#R M"QFAS&|J܌l ]d'3߿ XTH mI{tI>@[Uam9_9md⚆ɤqeI';>qDC=pF#' A1iKWN+=ND%$踜4.R(uHpx;Klش6}̅^Q.j;f _*WZGiDFY,Nd"bL!,JR;\y{}ǙyW-_lHlTK(:' l#/YvKQAWB(@E"p"2P=}{f ޿8 V3sV姡vL@Bsi:$PQ @dQA@'ߓ͋&@{Hbh )w(96N(n: Gt^5f@yߠ ߮EIc{$l%v5ː|BC [G}4>b0i:-5g;B[SӁ>|GAMwV'qt6;3Vm\:!K}u2fpcx~?6gFyvK@n=!,t1zRoT4D)zM3ֱ BHQ}ZO5m[S_[]x0u].G~bB ݫvi7漌UEy:Jvh3vޢfOWaGxmmDpצY}ci5# <#]`ɆcL3_w<>S@-wͷ_ #I2ι&LF@b"`εRG&ՖLIVv32W2{? 9e nyS[+lS&[ݫ- ׺;:%E״ڪGo nzӆGyɑI[}. پ?gabzNLc쇷>||GrXD-'2|LQP Bd2 n+6ZBmtIi=zMF~b^K&9ox#qUy[CK de?pi&T}˧zJ 4v\bÎȨA͇vmIb61h.G{IhOϾfޥU[O9M|w)7c@ #Ht3.hsp4ukwe6u1qUس{}k[$p0 V'"QGLn/| O-ה[?}eZ|ؿq'~|m$'Yœ3R=Qا/- =IF?a f\z)& ]{R{Ͻ0`+]U_7˚!5=DX6Wa 钻9箋tԉ,o^}M%0㲧^SwWb֔5p]7BWh>w)LRջQ?~ ZP{webp UA 'NOKU7 O IDATlsJ G:wgDl9a1ݰ"cYw8bx0L|6'Ϛ{oD-4M*T~|uu&?mwD?ypșuCtS0DA`u?;{wȈA6/;ڴk>z7|n k98lpw jv_/cVe`;W^7=1&wwk/&3s K +<Kbt^bi#?xޛw#~y,T;Hn[-&,/bŽQ\# Ioe.Uо/5KÎ:!%vIA 93T9 @k'\vj;(w]nO*xAq#y&znyz>f_t{kOcI_l#ٝbSAu ³E{I#6 iUE~i3{^o09h|ƨGEA^@ 1r߿\ʛ_m5h!wu~KyQ{sϟ9V2Sl_ =ϻ{U,<@+}$'qcEQ6sϞ1Qi㩰 i>C 1,8zc@}-r2Szvp}cbOO 1pʬx-;Ʀ'jϮf^!jv+fVP1C 11b!F1_)cF=[]R>jWz#3%2_o!qDúV~Sa(b$C BWYΛ D꾚s{Cڥov\&'F|kJQ*ыB9[^_tcbRГq^ZV/+1*8ut~F;D黍gA黌dڠOϽI3m}Cچ~˿8gM>[?02 W|ȑSH ?cCLLh/;T#/yTy틷_}ɤ#G{;^ =.=rS.*;6t{j^ߕPKyޘf Wi7]w>\ƴ_xl ub^4ᇎ2;nX)m= u{q[[_z0"#?6w}ĵ)!zP]܏,:JljvkYzo{/y!q#8G>8_ w~U+Vf={ /<~Pb_,ӯ@f:D$2Ve|٣lYmj%.=uQV>䍴{>Oz.RtnU&KIojAtxV\=v+e^|?=R=ѨKTO]uDف|kjOj]xu]?~>/ņ'L!À4`1ٷݰj+%לoS+a"5A% ~O]f=:Ԅ@ɅWwQC 4bXw >;}}Q0oNg/:tc+E L!bL +#g4y96Ti \zߜ nXҭ3zw=_{㽧S)*ɝ:[e^r*?}4557VyP}alж/5{(?R-eя۪Բgt W(m|z/UB:2_Cx;׼E` WNF.chT8Ai}U&-`QZuδ/575}JSl;W{5v:tg@o\u✹g]O #35ozIA{՞XwjhSW\96? {jv.ۍQBYϜuqx!QktiQpG奘g-?P) Mj49v{^{Tu3E70Ƭi!#hmϴIױ)ɗ6ypR0jۣKѦPW^56<5{W/jdpӓ7w +M|ɾO\݋O^Nz' o,e{cpʪ3_[xʡkgG㦧tyJpGwucyZ{߱3)r,_FҞ4"0 * szKmpmNPoϘ繥՝˗(`IFgۜexeIFQnR@ M D˅EAO8}4 L:gx~炕Շ9k]x,ϯ\3.j[/He&Gٶݏk%mڀ /.6򃇻pCz$qpCu~c_WMꙂk5ZkZ-\Q8/^Q`_xQ zSEF>~{U-pmwb`3]K-m_qǞA]:. }QmxTBϗTçLS@'D>11ZUxG AyYzT%lbl{jֺàJO%ԚλA_PUkk QϏm#k~оZ :.zkΫU{脃_2f?瑢 ={E_ '6(Y] ]SЗ{R,6FA36Ӕ}"Dz hGCWImNRT\a;Jvefv*m,]t@={jwOJmixT{>1iT7eU"8gpW~Ȑ%NF뫭ZhXƢUr\v'-_[i+&x J ؽ%ehoxZǬH}})9θ`scCOӓ,o KTN7…YH=:}?,Yw@S\G͟{?^xowK?TEzGTQsqSYS!ogζ2HҪ(V6>n6}&Buݖ9[[떽XP]s'&{{Z^PYV}rcʛXg&j7?V6n?6kfMm+VYS 0"&kfO"uUɢ@2uٍZbMQ$Ty,ɪ9!:zkՋbdx[Mj{;:'ȶ%NKv2CYPՑ5Ok쩒hCٓ4|rrȜ5 =Iʦ^5#h ^o˜ظIeCeryqް ؿEC5(j;G D#5響NɌ GX}Rb5#\td*hb.::/Q04?4zvxk~,w՜;m[u;jd$yFͼWg^yasy$ R_Pqݻoz'.];<@9"M5Gk;xfC {Cݺv׫/+x}ZD hIׇhscͦ88[_Jߡu?"eISMvz%kֹ۪\r$z E!@,Ň8"BGX&(1ؽoLjfNu٪4԰<{Ȏ!h!68q||=2X 5-8b `Ν(8PQl|zΰ:-pwNUc ZTʟ4Gf_RhW msz 8i&[ ??+-e5鏯=c_wRu㻃 MC~ pĸ/4 V=s֚N6F'->VHUimq.8)/jWGH1ZK'\@q)c7w~R$G#3W# Z¥g fp"T=m썊+  kʮ5qLĢul(i?OPNHO|\&O+lMꝧ2P>W0(UwŬ{[sԙ 婅o#VkPjq#;vljhؑ񹑽K=C϶Z w]IW?z1?'pGc~ڕPYzXW̫fp1rḡDp@q\_)&ʥMlq^6m"4/}&sBH@'!ɿ??pp[Lڸoa& \w9+_jҺȊCrzDi4Rzmq1ȕĩhO+p!od"5ウ|k,XPwt$ h,K[$g_>}7Sba7/6(ڬX ڷQuڳ/pYwi$TgW^y;shs_j Wsu~\'/# %Us&rRB?Fۑ;Q.s&`!_6TE siy/xFXg؉v;9qVFBas>aX62 C'd4<ǜ4!H,͑(A/k?8VR B(61?!IJ,˲o=b!F rw]L1G,MB 1Cc!bC 1#v cC 11t^RC 4rd9;fpn]ov`ДzbNgQǎ=gcSNW8„xނ)%%geLsfԩi&iĈ x^/g>Spv.Xl!UdzWԗes]ΪN; >g4&uم++@=u CYI= (w9WA75nsIw )![o>dH=+M҃r۫6~qRn1?giûeׁFV?1i$_:JWB~&M>X@(MZ\sw>]ϟ1n[.yg o>WV=F _֞rU"OK*3u13Pڗz:9;.^4w65"|HQwJD]1 nk+kp;/&5eO1,˩Y%ǘw*TU.'6mZyP)v^8R_XPPYOz3vAۊi{t{ lY11.w|e$FI%EZHEr?ٸ; bAņ9D=߿>k6WXX釋Y Sgrw,Jr%oޭ[QY.;2>Y#~͐EIJ+o8TKSud<5{<ʨ\Wxm1[XM#5ZהQPC{#)^NFI܂|3%jķXVzCZPt6vIb5[&i<7 l9r=Iypy^*fV$EKƞCeLSUZg%JݟnLkkj"]$2D"vA!"I$?%zS^둅O OlV*! k Y LbnftuY^w10ų{g7'/5xN=|^-6>Ԭd5thtmy!Wg筸A46j!Wgwڱ25#ǻF8nA~jB.lR_^iB]`K4 IDATmhȢiKtMH-QVoE"jnߙ0Fs&A "QDFƐ<}\ENM:r"K1-h Yc#|2Sr[Oky^~ޛ̮_l f65KI.JuQC`YH$QtvH[b]ʷo-O2`*8](}ZF?d[ ]9 [8rsUTwgn궗ĭm^da2"Lz@D9}˚ӢWX r8Ė{yMx W[o[1E|~Yc"Hڊ%M.7joApOغo(uM[t^Tj;j_#ǦA Jky=tTT_ea\MYw[PAǧ1A'>dEkuQ[<`Z}WL0!ph{ g6h Ao8*r\ -sCF/ܯ("Cm! m|_A G#p@8ޣeǮ|TXD]i˓`7/B۳}WruQ/,vZŁ D~;jDn]]p>pd]Nj UN;DD`{~{_H1 Vw "ꊳfnelIѻ̭+F=lhEpH\|TqQgn4V/,*9G]fH<paԕIQ $SʚyD$B9l̜wV5hZiFwhȑE)=igdDsG{=;%A Ip[V95HUBN߹WxCV!1,r\n|!dHJ1#w ɓyJaQSF렑_= z^1púvҰg22bp@gz||2!5fq:m{\.ӗV$%+pĴn}t<=! 'p@8 G#n[7*4[.EDk9aTǸl@D۠ǟ׷V%smpE$U^ _VLy1K 96\-䫯?\/VΫlW~9|_1xO,RΟ;=T?uZ7%㙜σ=,)} Pxͫ[R o#ҔfO[LU.!ќ#eI$-9uj9L",L{Ca IU p\`nٝv_֩wW5_[մ$C`]_P ".c K^M-KNCg]]fO"R%qzA> pio'$O'L§tHD$7%nJUZeNyz+Qw a4f}v'hCϚl;kÅ/"lɈ䕯mX!O<CC~/\Ө]y]em]aF6MEŻ6D,哼'm5n>VU?rj/&l][cx;7O/N1^)ט<7F8*:'"yW1n=eIJ%3,Y-Uv}89O/uol̴7ߨk̳snZ\AZOpl+F",>urR9Q^vtSd"`.L>]HDW5dcâ25>ؙiQ>3kmQn['<=#(-3~C|䙗oTqw"s慔H9x) o%.JUZyé"_2%Q;XaVFR??;rXak/>4cؿdzϴw)![WTpρ6m+8;N;t am*]d3rhs 5v^sJ]묤rSIsM)V§\ k։ÇxHWg9qd%kǰ̳ϥWȃI$j9#J uT{J{ .[c3Lǻsn)/-7 T^nue,)&+'BT >reFNݫssD"AN"k͙3k+ _: Sl"rw0Σ,uOjDNrF1YzZ* 9*$McVg!J)a"9luTJ"j9 /J|jAu@ تr2K|l}=+G61,0fTw~RA$ s/C bsppZXt>:љ3 2wM]aU0.49YYSqtz(I*fĖ6{gW9#5^w^{8*g"a+ϼdv=6Fq *i9[Ya3|tZ0rV!#baFtT眿OU=j < "L8luJ*%$QHˈX9#TMU?5?eDNH(d 欬\)ed?H G#p@8 G5ca>*|.1`7/B۳}WrpGi^kpxmD~;jDn]]"^ p{6nz$(؆hTN~:ү"vՊ/ԱCct='<,*RmuSSvԪ:}NҾm?. ]+Kߊ)w;=?6f]jw "ꊳ[ʼn\6BzoU;; ?-i,s? Lٗ[~y`?^+#"b~zbf([ҸR"kLg,ݖT|p0w_o,kt<%>^ c+H\|TqQ4uq^e{Zˉ?j{RT-RΟ;=T?uZ7%㙜σ=,)} ,nV/,*.**)7lVX^nP(c3:؊y5B3XGx|Yʑ\iE'ЭɉZp&˪ thIв$ 5^ͷЖgf~ru]]:xF]9O7{sM?'8DbY!M \^C˓ҫI^Q$qWvv[_\Co [ÜwV5hZQ :SЎ dzwU%U&u D$ԝeА}\ugJgG9R(%mh8߶1w޹vrR;r._SavQJ'7G s]-,4iPǩ|M{rJpLupo?7 'ܺ<8`8W "זDEvط)6$^=Tx>L_R+\r i%֩'-?d@8I;|o; >%'0n_jL1rVn}to>=zخ!WXp@8 9p˩UC5w/3"zaѬ0gN@8x5,9 =ۀٓnj ^pzF ~]}UN~V$"b7X*Up/PQb Dxz}cU6f:+ڸpgPi (QF3֜r~R,kޱL3 _fޕ l-!N(m찌j]6z(]d3rhs 5v^sJ]묤rSIZH4H4eK{vDOy:}-V}MBTڂo/ ii8iuW Dݙ~CJfZD9 O*A,¯lAJq٫.r_?Ơӕ4,W]\A-P` #[ GZAH9}g͙DjeNCVsڎw&=y1u.fm>Lٱ'ތzꎮL7DTAÛUrKSr+xCV!1,r\n|!dHJ̹^m%c0rx _ZsUT v}2{'^tmm-.I\kwl9W#X̎ WhLN^fH9cndicX #۩au[cp@8 n{ g6}(rW47dj(<>r r9 m p@8 G#p3)AW xca>? 3, p}cy>/||'TaUU VlqlyFlo.mʄj|`x[NZ]Wa̞EdpSKbOŚZbd><' }7:;`.1"DD|S>񟟮㦄 VJd.h׈sܩ2/5nۏqFT ?x% b Dxz}cU6f:+ڸpQyxw "ѯ8knWgVǬ9}g5*Ox{FmU¢bZnta.<B>wɧ j,Cb$3/XDʹMN&saF!> ЮQ$[7y*):\2L嚽`UfeT.JH-3f/kq)ISMl]<]risQYzyW+4]^V/&u3~vP_7ˉ"[,^p"~ܡSLMOU4Ck<YlFN-{3a֣ގkNU kTn* Q #Y#zi/Ԏ)ݞV'VO]k"s;yrsM)V§4.n)Op1;WShkN7t4Mvv gqf^ r&TUz 6"YxRi,ݐ;u ذLSj$NDB݅_قF<:R㒫W];~A+i7X6#G*uhE>L]S /dkiW-]` eO0rl!ejV^$" c4g"M9id Yi;ߙnBoԉgESv쉺7+M"եtf-ܦtҔ-ʍ!9.7qu2$%\V*rhR1٥6GCJ3GEj<±i\-#ק.?&\U,9]̞=ݨ2?eG[c\G㏔>2=pז}ʚ=zخ! p@8 n{ g6,pT(29inȲ5EQy;*67OijH;5F muO^yhp#G#x?M_z@[ y/,o4NU^nZ+6ɭo/%-4D6z7{/pw~p:VַXmϧ~C#|b8hCϚl;kÅ<4s^`Wqs[|uL_dD׶3=Y@U[?ћe+e >䉧x{hURٟDa uvG/Z!%1ͳv'{ٹnյߔg-y{KO$^Lغ.*5vn䟟_bI;長jDgVxbp7W)2m;"hJ*^;qNj8F6}g5*Ox{̙݉Rs,"4\UIQ1vݟ2L22m-퐥$#5= ρƗ$8zJ\hOIA0t!QV^א%{zR >UV~#FĺM~b07<"hϟUORRsއ̻Vws/ 8?ЩK&h6t<IݛC]jI"c*_SZGA.J }ώpXx99C$q ϔ4ݖŬp ՙIY K\ʿ>ٖwҌh6\mܚ7RB0~ᒱcvZQ 1=OT LM읃`YH$92D$sGDoʫx=R ǭ8", =0?7ƐExɈUcJ H~U QeTgs6} vS`éyrsW2yH A|DоoL;L*K*֥t>98,ϠGix?$8 {Eg܇% *\}}}|};v+2:fHH`@`Gƴu^S7$#G5Ghz='f+ů0n7D[|%jΠپreFNrEgvLȵk >UFU޸.~uI;ED]:[Y8ijvk[K6/2r0qlY "ќeziQ +,eU9"ZqD "r|5@wwq}:w8edu-_:{n/V-2}iERR* #n}tK==ѽCGJUoФўqJǛv/'uFA'>dEkuQ[BNK޴2y:݇#; 9 mvϜsĽ=׋ڰqӧ֢7psj|{@?tcctM]7ZsW4d=#Z6Ƿ6meB5@8M簧?9x6fӮB̵s@z'zkNi!MDĈd@8edº,;\+5[WŐ+voӇwqWNtMƊ|U~f̓weNfFCCVu9aTǸl#릙hER<ԻAyWOԦ7O6s *.Ͼ웽AziF7%:k ;nr}YfO7#_}ʄ-}巚fIXl#?P_]^+ML9p6ZT9DDWxobYhC[ *=̼^2}Wٞ~)≒K1)/SMx1 8|:aG<:2#/~ɳT|ʂ*Hݺtϧܳ#[f8_ְWrB G#p@8 صwiC T[=|6ْe5TyAu:rMw3ry;nLIIX]uX+z}q},=k+V?!9_e-<wn؞Qв_lL3KT~a}ws!zd:|{J8^'Yp({ȠYR<Ŝr⭽5ݹcc,6DSJ]?~>y\s5^ B;1^_Xggͥ\>ӟ9mONyxw "ѯ8kz_?jFD+Th.?gdX)AskoH^|=Qt[e=oA$ ^_%<4s^`Wqs[|uJo)~2-S$|ʳ;YxY($Qbޚ2W=tƽV'WS:bDSH1D WSu|[;Lg2^vC]_oī}NKvhpl_XB+|`'.xǨÚ>D&?Hwբ:ph0ecV] ODD*}aQYuW?Ԋ[T&+ejw^3Gڳ~*h^:seԄhC!0̙݉Rs,"4yܚ{X少tS30U |K;ٴ3\vZiy ?K{-6آىَû=a xL rɸ[>^ж܎5T ML{+9ۓv+8;N;tR3\Q!ݘi}\8룸N66q}Vym±=)YY89=3 -"TcK#Y#zi/Ԏ)ݞV' r5< 1߮s5ݟnLkkjuۺ""Q $S[FJ/\2vUڮ(=?{ڼ!N CH_wR 7ݙ6AԆR+톻 vvR^PPyxc"dD-.z4zѡ\-P+ r6#G*&jE->7'/:ʃ'cM3G~U QW=kh?әؔZ;hc6 3zy"5<י#4b MPɔ{. &:?o*݆EwNL9m~}lj.4O!/SGت'3t9D+$4Ŀ~'1Hp@p^!>*2U77ќpGP~pEN6>y&w` d\yO"`yEFyJU9K|P5*`Z}my7z9z["qGJmqDc/xtd6CjL凮W~-l9kB=_f'_dd[j >UFU޸.ܙɃ v鋵&7-\oʾ&g?A4P` ~[V G#p@8 کvj[iv*Ky~ڱ=w5^ #YwՈ.ݺJpd]NjD'i߶X?hCϚl;kÅ6i""ﮟADt1)nהjv;硙"ʈ3ۺ4$Qby~: kGdٝ[bDԬ,wEyY"(9Dz2DDDs)OJ$ilzfm\-Z ʭrg4>)lU¢2Ggia;w'2g^HIϱW0 y_ZXHд'A2c\iEĮn҆pLɲ>.I+w,e=}ͼ+?`uW01i ؝e':un8W p?tcZX[SSmZ.LsH,2D%._l˻zh6DaZ޶6n)Op1;WShb3(P\}lЎ"dzwU%U&&+XeT9^uI1:{Z9R(%DM"?-bY"pi;ߙnBoԉԮ'OX# 9uI$K͈*[zM)9[i!9.7qu2$%^cVd!>*2U[0@8o>^a={/Qe~ʶW6e s'?0l_fc#'Ϗpbڢ3;N&41i<:ys2!5&n~;vmʈwwq}:w8.{OD\.ӗV$%+0rG4p}}/,Yp@8~Q֚<)rC9`Z p@8 G#@#;LIENDB`nautilus-image-manipulator-1.3/docs/images/InitialWindow.png0000644000175000017500000003464211752724434025426 0ustar emilienemilien00000000000000PNG  IHDRbFe<sBIT|dtEXtSoftwaregnome-screenshot> IDATxwUյT^T@ VA(Xb F1yILE͋<{iO(`oX""R n?㖹-33p):kϾ<*qF<=u e7GZ9{^S0 L:׈܃E/%@{sz@Q`ID=O')~򈹧 =鈽m[DJ"*R"J/!"B)i=nTyF qF)%Xi˄U B00LJR*!amI8t8pk4}6RB$F6cEBRJ"D('3܅6Ha`d[Wkf[0#|4cCTaۖH0iS˗0 wb'&" |>.N_W` q$&nی,s˓'U2.xNt5[BVx75LY(Jv,!.'v\dcB!\.'ՕD,TЇH<wuX5~O1b[Jl)G4JЁiҊM r"|GTp(%&RcbeXGC,)uT @ cx >bb!c|I̛\t$QM<2Fj}pisϽX0D,9aqÙYeUe$"N@%ꁭ}ܷQ2lw%c9Ckf o!|hannS{% .ϮկfO|X^o@չo?:21?]+̻|ˡ6c> ۜG'rC䪛cTT|S0/?sAZ.o~vFMR6BNN޽|!NnMmgͦ4o5 jCJxBt҉pT8'K2w'*J} =ߊiH4 &οyg/˩-|[,x`/픨1C=]jw^Tƕxm2m̻Tѵ7w! 0dk @s嘶-s8}T{MhW;p:r$,FOngCi' 5Q1H&yLt~y5Ċ110)/0 BPTX"5  !D qF~.dYCzn'1+9+K^dL:jl왜9s9+9!wZƉU;_FQ^ӯyNCA/RRf 3 Qa:Hg(C1B> !xzzPvU|sdo!cjzѸw7RYwޅŶm48GpsX~w1/.vˇH~@@ \UuTY{axbKo_=络VqjoavNZ\~xvE+q q F/]l^}``]x -V{bݓw| S7$cRN?! C*fD4zHC쎭ඐ˫]&˻D\kv9ޮ!0m3iI7 0Ξ=mtfbqjM/>GnXLk9|* yI\8/Qg?s7.k,o *ϏOS/?kNJ5X{tL /gSvVz;_8Lsؗn/!p쥜fF3+C>:jwb?cvCtwXa#e!$nʼnb?+9nőJٲyszMpXp[FʹyQF5>79laH;6414l0YQCC}9<{׭ne .&eMuFY%CR]EͰJX],ײrG=ú=1<-[3ɶ5V8+w?S[mNp±7r 'h>>Rr粪L󶁌%wa ūj^CrLB&=]a#Bl!m'p"'9,VMJp9pH;4ݮx>7x@"#YB-3Dm5]\+TFXhgSowJ3mzD |wFQ#hwb7g@JUS"iaFsDifL:3VRs֭ Z}Y*1K߱v\tbf,d>8TiGC/ Kd.R~x'RxoͥOIr!µ#b+=Zk3oxsW쑸뽵Fooc*gﻓů}@{jf_uGn}a~M(O#3M&Kq p4d]*;Ih<|o7Aہ0FN;ϝzbϷd\\ ,T]=ZᡶZ/Fxb)7p0x:*i4-6/wQǼz kj@IYa,*,*?Nm)J_'RꀬP>+]oqo#9cy Fi۶d9zƹJ}Hedײ(rdlc/'±"# dh +>=i6i8ej T ml4xtd4L.{ltc&be5WM%׫&r3VJ۵>c>sF؀|$'b Ŷ;Y}9I :2 #|Kܵx%tX¤/C0Syƞq p,'Ow5M9F ^`shIL=O8gMLxPJ&M yn}+A^a%OzTAy,zr3?NkD%rnxP`,"$sURUX\ˢe;;F.Y0nl#҅8҃ *SvI9TVVLce. c۩{#ͭE%2PV4-4 ۷kۣnnYR_!_D&l!qBShmXO?BS|!SqFx jkk[[[6mSN-u,m찋i ݏ8nh"hN4:K<[ӓ`T(LU|v;+eA@*P^a`bcI)L $h)SK8d=YQq_k居 /2k|&\)%#/[l-K0 Pv!c|8rEcR[Yǿ2*B=l$qlZ'U!1 /SR& j@2^ıdRuګ HXSd"m;32'GrΫ~kj.OCB(MU[oe!?~nl8(R~?4'mh`W㩤mq;ly ߏ?mfzi̪ sYvr'2 D:󮼙+O+Jɛvu;f=QT4RNC1s=+W{^.R,K/9޲WOǹM#QSY qVDTO39zvv8 ])11=Wng1}\-fvD慵Jvl(>C%|ynL*w3M)f 5,bCO`ጼ ?Cж5V9<{n_c1z?1uݫc0Vj/"LAUdًKxq:pd9yq¿qhm//F}e4"-SfK?x'pڧjS8rdh')L+_m/} ɖ.᫧] bnkqXoj U#N!{~ړEǸ21uvgxO rNdy\%c՘j a_{xŜ{y۱\L=CGzʕ\彛{xۡj>{yW/JP?*/控(W S>}L!#EǓes?ZC V .SĎlT~GB!lύ@$=;# *az cŽ ĐW[(IDATY;I{(9#\TTAΘǕ_IX(@04eI -3˒'/᪠ D% LxNڃquDI.‰I0Q^ƈuCtS濏ʃ0qx] ~}[T(rutq;("Q?> iLj󧑝rP;_fkM^vS'I,I &eI꤬ 3Eg4I4jqK/4ضmv;vȌ v_s8|>:]/6~dtΝ?8 Z!%]y2Pqmd훯tf6+p|&gh+ TZ e  ұ'#'صE3R[ESO~&:R=ɯGu:,*~ctfS?a[33(\%W}ն'"iOB>s(݋tlc\{*NfY![Dsao#6D d3ƙ_k4Gܽ$60E>M/B I5 k4vk枃{i8 [a ҅H=)R d\~Ch|F:ө̌g# ]4q^0e84X,.iYF|TɵelIl˻<`3m}e~ԑjEFƎ۴"%a#VJNzFD<8FOa'U`4yĶmc42ycNJd擎`o9W]ބ&ۖn?KFlibgՄFh41LSF i`5f0 1bF= F *k4bcF3h:Fh4k4 cF3uF3uF3&4f{Mh4 cF3F 2zF 2zF 2z Fd^F3F 2_q[k.b1k|q2|x3Q\ZȺiuě6m& ra`RJk֬aӦ͌9Z.i824cNM%#DR Ԁ9Bd}7 ˄ YՒ hY?Vօ0M@5D|B!tmXTi|2-MSr\Jm|>Hueײ.11Tᥔϩ'kO܏Jfso\Qi%B l8c89I52O}v<0n ֣hY?TE@Omx~H/: Pk=*ce]򵁋 {<_ߓv+o ;/XϠ][w*Nbޑ5[{3d͜Iy.7=lzZ})B :bEk_j3`C;κ#b+EZ֯c7ztC4N>/N9G)ٯxc9p'}l{`hBg4|:._ιj̶B=L(6o=lzZ㾴d]xSS"]sHKU]=M3ktFW<2)ç8lu#]Z aTF75i",,6/#w^ǼfR gUfC d 9gzL)M}7 #mezH,zXʻlehD}6s&U֟}E#!kkIwƉH=ȬYG3ҿ?}ie] kDc5e~qH{q{ر}^{.n]$3.s&籖()`֫3 |',}Bv6ʏ o ?/^{ 2!-Df2ϥ5C(gU2F?_%[|?d>{Z3-&?:/0|d[Ok,}~vW_q*-{4в./bęOW۶ 5<2cc:f~e?>w.F_w1S+ ;X,Xm1ܳ8كHǵBPzo{"|P_+?C۟#[NPz2b3,6y-MЈ`#wkٹ' 1Cy{Y|ڡe3>| +%Ut-1/OdY7z}b.!_ 9Leyg1ɓkF^eWP%[ju |vۖ(S#D,=c gr샨0{U&.r@ٸ\Ze#q9cz\D.>0M 9/l4#JȤXKo^#_qn Bw!7ƔJ_DZD/c?\̓ocqel]~t3/kBvsLP8b; vB N)#f4,F⸳Ο3rC^}A.`)0Sڱ~9sZD!r;b<5ik8\mqO7|]5s(u l^K~XΜY-q},ů^s+Nm 2̀*]|r>orqM70\;#8ԣ ˞ۅ{יh Y>S\|>o-_}o}xmltܡدuQ)㫑R>1Nl▅,(M,)QEKqTl;OmHN*[!F"#hpƭ[YT+pgAJAyGxa!ԓ<- A*%ꮣ̟5LfҸ&L2jo2+EՔC 3ލhhDH R!x2~t3Nc'ļ,y]xXkM8 aԝz#̬EI7nfµwxޘ_Iee%d},RT;4/vƎ3tzPjmk(p9_gaj.q'rHsdEY\Ix#xfMX& Qei`G>ȝ=|n+2}ۙuhYb{LrtwdV}pm92̊;lЉ×2dr(H)%F땓27D:3Rk !S^8fgz9mpWc9ʛD~-ќŚ a)rA֯E4}NY9lF{eZJ{ȫp7:r({IGU^l`&=v̜s#k*ii/D#wXzg_-W3Jࢯ~w'LJd»x:NosYg@C֓4;1ٹw^||[1#i'9jvq-x!~h[5S8xXJFw%<0:Aj*OF S21T*TV [moZE}C%x;k7?̱iחXamc<{(x4.%{5yq¿q5('[9ˣpR"KCq:ƑG7NjHY(JO="k뉃S?Ugɯne G3gFZkg0wjXKSG2q54aPb3Ӌ2M!iXh^p>q;;Qף1ˢC>.G8V$D(*1>^W\GmT>9eȧP'{Y^oÝ K*hup௬e"D9max+|"h3] })b<сOܧkv7jc?bA:b_oG t{U}I#J((dy+HG[bGjۓ~xϼOW{07s澓9 a@S{G}O5$R@2վP\Dž70dmh(E5뺂2)?rBiͯ)ʺg323_l3Þ5x[R~\Lr^s_K]bZв3Y` s=]%u,2ApMNsva%$NJ)G=в3Y`@gmROBks\$6B샍GuPEӗ?zc_ʺ|Mv xެj怡TmO!N@ T֣nV0CP=k0nx~Dz4}G)E0`u5h=;}u)+ŴixWx1My3f ӦM+yh={u)l1p`^-l|Q`K;+Z-G/e]]G 86+FBC;1F1EbFd!h4AFbFd!h4AFbFd!h4AFbFd!h4AFbFd!h4AFbFdGh4"tIENDB`nautilus-image-manipulator-1.3/docs/release.rst0000644000175000017500000000371611747570652023047 0ustar emilienemilien00000000000000.. _release: Releasing Nautilus Image Manipulator ==================================== These are the different steps to perform when releasing a new version of Nautilus Image Manipulator: Update the version number ------------------------- Change the version number in 3 places: * ``./setup.py`` as "version" argument of "DistUtilsExtra.auto.setup" * ``./bin/nautilus-image-manipulator`` as argument of "optparse.OptionParser" * ``./docs/conf.py`` as the "version" configuration value Update the CHANGELOG -------------------- Make sure the CHANGELOG file mentions the changes since the last release. Create the release tarball -------------------------- Place yourself in the root of the project and execute:: python setup.py sdist This will create a tarball of the source code ``./dist/nautilus-image-manipulator-.tar.gz`` Publish the new release on Launchpad ------------------------------------ The previously created file should be uploaded to Launchpad as the source package of this new release: * Go to https://launchpad.net/nautilus-image-manipulator/trunk/+addrelease * Click on "Create milestone", enter the version number (for instance "|version|") as the name * Enter today's date in "Date released" * Add that release's text from the ``CHANGELOG`` in the "Changelog" section * Click on "Create Release" * Click on "Add download file" * Enter "Source tarball" in "Description", select the tarball created in the previous step, and select "Code Release Tarball" as "File content type" * Upload the new release! * Go to https://launchpad.net/nautilus-image-manipulator/+announce and make an announcement! Update the Debian package ------------------------- Follow the `Debian New Maintainers' Guide`_, starting with chapter `9. Updating the package`_. .. _Debian New Maintainers' Guide: http://www.debian.org/doc/manuals/maint-guide/index.en.html .. _9. Updating the package: http://www.debian.org/doc/manuals/maint-guide/update.en.html#newupstream nautilus-image-manipulator-1.3/docs/tech.rst0000644000175000017500000000046511744051772022342 0ustar emilienemilien00000000000000.. _tech: Technical documentation ======================= :Version: |version| :Date: |today| The following information is relevant for developers and people interested in packaging Nautilus Image Manipulator. .. toctree:: :numbered: :maxdepth: 2 source Releasing a new version nautilus-image-manipulator-1.3/docs/conf.py0000644000175000017500000002013312134312141022136 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- # # Nautilus Image Manipulator documentation build configuration file, created by # sphinx-quickstart on Thu Mar 22 20:26:36 2012. # # This file is execfile()d with the current directory set to its containing dir. # # Note that not all possible configuration values are present in this # autogenerated file. # # All configuration values have a default; values that are commented out # serve to show the default. import sys, os # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. #sys.path.insert(0, os.path.abspath('.')) # -- General configuration ----------------------------------------------------- # If your documentation needs a minimal Sphinx version, state it here. #needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be extensions # coming with Sphinx (named 'sphinx.ext.*') or your custom ones. extensions = [] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] # The suffix of source filenames. source_suffix = '.rst' # The encoding of source files. #source_encoding = 'utf-8-sig' # The master toctree document. master_doc = 'index' # General information about the project. project = u'Nautilus Image Manipulator' copyright = u'2012-2013, Emilien Klein' # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the # built documents. # # The short X.Y version. version = '1.3' # The full version, including alpha/beta/rc tags. release = version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. #language = None # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: #today = '' # Else, today_fmt is used as the format for a strftime call. #today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. exclude_patterns = ['_build'] # The reST default role (used for this markup: `text`) to use for all documents. #default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. #add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). #add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. #show_authors = False # The name of the Pygments (syntax highlighting) style to use. pygments_style = 'sphinx' # A list of ignored prefixes for module index sorting. #modindex_common_prefix = [] # -- Options for HTML output --------------------------------------------------- # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. html_theme = 'default' # Theme options are theme-specific and customize the look and feel of a theme # further. For a list of options available for each theme, see the # documentation. #html_theme_options = {} # Add any paths that contain custom themes here, relative to this directory. #html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". #html_title = None # A shorter title for the navigation bar. Default is the same as html_title. #html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. #html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. #html_favicon = None # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". html_static_path = ['_static'] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. #html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. #html_use_smartypants = True # Custom sidebar templates, maps document names to template names. #html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. #html_additional_pages = {} # If false, no module index is generated. #html_domain_indices = True # If false, no index is generated. #html_use_index = True # If true, the index is split into individual pages for each letter. #html_split_index = False # If true, links to the reST sources are added to the pages. #html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. #html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. #html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. #html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). #html_file_suffix = None # Output file base name for HTML help builder. htmlhelp_basename = 'NautilusImageManipulatordoc' # -- Options for LaTeX output -------------------------------------------------- # The paper size ('letter' or 'a4'). #latex_paper_size = 'letter' # The font size ('10pt', '11pt' or '12pt'). #latex_font_size = '10pt' # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, author, documentclass [howto/manual]). latex_documents = [ ('index', 'NautilusImageManipulator.tex', u'Nautilus Image Manipulator Documentation', u'Emilien Klein', 'manual'), ] # The name of an image file (relative to this directory) to place at the top of # the title page. #latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. #latex_use_parts = False # If true, show page references after internal links. #latex_show_pagerefs = False # If true, show URL addresses after external links. #latex_show_urls = False # Additional stuff for the LaTeX preamble. #latex_preamble = '' # Documents to append as an appendix to all manuals. #latex_appendices = [] # If false, no module index is generated. #latex_domain_indices = True # -- Options for manual page output -------------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). man_pages = [ ('index', 'nautilusimagemanipulator', u'Nautilus Image Manipulator Documentation', [u'Emilien Klein'], 1) ] # -- Options for Epub output --------------------------------------------------- # Bibliographic Dublin Core info. epub_title = u'Nautilus Image Manipulator' epub_author = u'Emilien Klein' epub_publisher = u'Emilien Klein' epub_copyright = u'2012-2013, Emilien Klein' # The language of the text. It defaults to the language option # or en if the language is not set. #epub_language = '' # The scheme of the identifier. Typical schemes are ISBN or URL. #epub_scheme = '' # The unique identifier of the text. This can be a ISBN number # or the project homepage. #epub_identifier = '' # A unique identification for the text. #epub_uid = '' # HTML files that should be inserted before the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_pre_files = [] # HTML files shat should be inserted after the pages created by sphinx. # The format is a list of tuples containing the path and title. #epub_post_files = [] # A list of files that should not be packed into the epub file. #epub_exclude_files = [] # The depth of the table of contents in toc.ncx. #epub_tocdepth = 3 # Allow duplicate toc entries. #epub_tocdup = True nautilus-image-manipulator-1.3/docs/install.rst0000644000175000017500000000601011751157200023044 0ustar emilienemilien00000000000000.. _install: Installation ============ Nautilus Image Manipulator is written in `Python`_ and uses `GTK+ version 3`_. Prebuilt Packages ----------------- The preferred way to install Nautilus Image Manipulator is to get it from your distribution's software repository. Nautilus Image Manipulator is currently packaged in the following Linux distributions: * `Debian`_: Testing and Unstable * `Ubuntu`_: starting from 11.10 Oneiric Ocelot * `Arch`_ On Debian-based distributions, execute the following command to install Nautilus Image Manipulator:: sudo apt-get install nautilus-image-manipulator Installing From Source ---------------------- Dependencies ^^^^^^^^^^^^ You will need the following software in order to run Nautilus Image Manipulator: * Python 2 (2.6 or later) * GTK+3 * Nautilus * Nautilus-Python (most often packaged as python-nautilus) * Python Imaging Library (python-imaging) * Python binding to exiv2 (python-pyexiv2) (optional) Note: you can use Nautilus Image Manipulator without Nautilus, but without the one feature that makes is interesting, i.e. the Nautilus extension... Retrieving the source code ^^^^^^^^^^^^^^^^^^^^^^^^^^ You can get the source in two ways: * from a `release tarball`_ * from the `Bazaar source code repository`_:: bzr branch lp:nautilus-image-manipulator Install the Nautilus extension ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ In order for Nautilus to display the option to use Nautilus Image Manipulator when right-clicking one or more images, you need to place the Nautilus extension file ``nautilus_image_manipulator/nautilus-image-manipulator-extension.py`` in one of these 2 directories: * ``/usr/share/nautilus-python/extensions`` (for all users of the system) * ``~/.local/share/nautilus-python/extensions/`` (only for your current user) You can do this by creating a symbolic link like this:: ln -s nautilus_image_manipulator/nautilus-image-manipulator-extension.py ~/.local/share/nautilus-python/extensions Don't forget to restart Nautilus for the new extension to be visible. You can do that by restarting your session, or by executing these commands:: killall nautilus; nautilus --no-desktop Running it without the Nautilus extension ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ The script to run is ``./bin/nautilus-image-manipulator``. You will have to pass one or more images files using the ``-f`` parameter. Example:: ./bin/nautilus-image-manipulator -f ~/Images/733.jpg -f ~/Images/hyperion3_cassini_1024.jpg Hint: add the ``-v`` parameter to display debug information. Can be useful when trying to determine what is going on. .. _Python: http://python.org/ .. _GTK+ version 3: http://www.gtk.org/ .. _Debian: http://packages.qa.debian.org/n/nautilus-image-manipulator.html .. _Ubuntu: https://launchpad.net/nautilus-image-manipulator/+packages .. _Arch: http://aur.archlinux.org/packages.php?ID=56144 .. _release tarball: https://launchpad.net/nautilus-image-manipulator/+download .. _Bazaar source code repository: https://code.launchpad.net/nautilus-image-manipulator nautilus-image-manipulator-1.3/docs/user.rst0000644000175000017500000000124411752241216022362 0ustar emilienemilien00000000000000.. _user: Nautilus Image Manipulator's user documentation =============================================== :Version: |version| :Date: |today| Nautilus Image Manipulator is a `Nautilus`_ extension that lets you resize images and send them to friends and family, right from `GNOME`_'s default file manager. Just right-click on any photo or group of photos, and an option will appear that launches Nautilus Image Manipulator. The following pages are relevant for users of Nautilus Image Manipulator. .. toctree:: :numbered: :maxdepth: 2 install usage .. _Nautilus: https://en.wikipedia.org/wiki/Nautilus_%28file_manager%29 .. _GNOME: http://www.gnome.org/ nautilus-image-manipulator-1.3/README0000644000175000017500000000435612122327443020610 0ustar emilienemilien00000000000000Resize and send images from Nautilus nautilus-image-manipulator is a Nautilus extension that lets you resize images and send them to friends and family, right from Nautilus. Just right-click on any photo or group of photos, and an option will appear that launches Nautilus Image Manipulator. A set of default settings make it easy to quickly resize pictures. You can also easily create your own profiles for later reuse. You will need Python's Imaging module and (optionally) pyexiv2. On Debian and derivatives, those packages can be installed with this command: sudo apt-get install python-imaging python-pyexiv2 It was originally highly inspirated by Nautilus Image Converter, but since version 1.0 it has obtained a very different user interface. http://www.bitron.ch/software/nautilus-image-converter.php Copyright: Copyright (C) 2010-2013 Emilien Klein License: GNU General Public License version 3 or any later version. See the COPYING file. Nautilus Image Manipulator contains code from the poster Python module. This module can be found at http://atlee.ca/software/poster/ and is licensed under the MIT license: Copyright (c) 2011 Chris AtLee Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. nautilus-image-manipulator-1.3/bin/0000775000175000017500000000000012134312450020465 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/bin/nautilus-image-manipulator0000755000175000017500000000731312134312122025666 0ustar emilienemilien00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import sys import os from gi.repository import Gtk import gettext from gettext import gettext as _ from gettext import ngettext gettext.textdomain('nautilus-image-manipulator') # Add project root directory (enable symlink, and trunk execution). PROJECT_ROOT_DIRECTORY = os.path.abspath( os.path.dirname(os.path.dirname(os.path.realpath(sys.argv[0])))) if (os.path.exists(os.path.join(PROJECT_ROOT_DIRECTORY, 'nautilus_image_manipulator')) and PROJECT_ROOT_DIRECTORY not in sys.path): sys.path.insert(0, PROJECT_ROOT_DIRECTORY) os.putenv('PYTHONPATH', PROJECT_ROOT_DIRECTORY) # for subprocesses from nautilus_image_manipulator import NautilusImageManipulatorDialog from nautilus_image_manipulator.helpers import get_builder if __name__ == "__main__": # Support for command line options. import logging import optparse parser = optparse.OptionParser(version="%prog 1.3") parser.add_option("-v", "--verbose", action="store_true", dest="verbose", help=_("show debug messages").decode('utf-8')) parser.add_option("-f", "--file", action="append", dest="files", help=_("a file to be resized. Use multiple arguments to resize multiple files.").decode('utf-8'), metavar="FILE") (options, args) = parser.parse_args() # Set the logging level appropriately. logging_level = logging.DEBUG if options.verbose else logging.INFO logging.basicConfig(level=logging_level) # Force the logging level. Used in case logging was already initialized, # for instance when ImageManipulations failed to import GExiv2. logging.root.setLevel(logging_level) logging.log(logging_level, "Logging set to level %s" % logging.getLevelName(logging_level)) images = [] if options.files: # Filter the invalid filenames out for f in options.files: if os.path.exists(f): images.append(f) else: logging.info("File '%s' does not exist" % f) if not images: optionName = ngettext("_Resize image", "_Resize images", 1) # Display an error message since we don't have images to work on label = Gtk.Label(label=_('Nautilus Image Manipulator needs to be provided with a list of images to resize.\nPlease right-click on an image and select the "%(resizeImages)s" option.') % {"resizeImages": optionName.replace("_", "")}) label.set_padding(10, 5) dialog = Gtk.Dialog(_("No images provided"), None, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) dialog.vbox.pack_start(label, True, True, 0) label.show() response = dialog.run() dialog.destroy() else: # Run the application. dialog = NautilusImageManipulatorDialog.NautilusImageManipulatorDialog() dialog.set_files(images) dialog.show() try: Gtk.main() except KeyboardInterrupt: pass nautilus-image-manipulator-1.3/nautilus_image_manipulator/0000775000175000017500000000000012134312450025336 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/nautilus_image_manipulator/ProfileSettings.py0000644000175000017500000004335012122327325031040 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import os import ConfigParser import logging from copy import copy, deepcopy import gettext from gettext import gettext as _ gettext.textdomain('nautilus-image-manipulator') class Config: size = {"small": (640, 640), "large": (1280, 1280)} actualversion = 2 def __init__(self, configFile="~/.config/nautilus-image-manipulator/config"): self.file = os.path.expanduser(configFile) self.profiles = [] if not os.path.isfile(self.file) or not self.read(): # There is no config file, or the config file was not valid oldconfigfile = os.path.expanduser("~/.nautilus-image-manipulator.ini") if os.path.isfile(oldconfigfile): # With the new UI (profiles-based) the old config file is # now useless. os.remove(oldconfigfile) if not os.path.exists(os.path.dirname(self.file)): # Create the folder to contain the new config file os.makedirs(os.path.dirname(self.file)) # Create a default configuration logging.info("Create a default configuration") self.defaultprofiles() self.activeprofile = 0 logging.info("There are %d profiles" % len(self.profiles)) for p in self.profiles: logging.debug("%s\n%s" % ("="*64, p)) def defaultprofiles(self): """Determines the default profiles""" defaultUploadUrl = "1fichier.com" # Make small images and upload them to 1fichier.com self.profiles.append( Profile(name=_("Send %(imageSize)s images to %(uploadUrl)s") % { "imageSize": _("small"), "uploadUrl": defaultUploadUrl}, size="small", quality=90, destination="upload", zipname="%s.zip" % _("resized"), url=defaultUploadUrl) ) # Make small images and do not upload them self.profiles.append( Profile(name=_("Create %(imageSize)s images in the \"%(directoryName)s\" folder") % { "imageSize": _("small"), "directoryName": _("resized")}, size="small", quality=90, destination="folder", foldername=_("resized")) ) # Make large images and upload them to 1fichier.com self.profiles.append( Profile(name=_("Send %(imageSize)s images to %(uploadUrl)s") % { "imageSize": _("large"), "uploadUrl": defaultUploadUrl}, size="large", destination="upload", zipname="%s.zip" % _("resized"), url=defaultUploadUrl) ) # Make large images and do not upload them self.profiles.append( Profile(name=_("Create %(imageSize)s images in the \"%(directoryName)s\" folder") % { "imageSize": _("large"), "directoryName": _("resized")}, size="large", destination="folder", foldername=_("resized")) ) # Default custom profile is basically the same as the first one customprofile = copy(self.profiles[0]) customprofile.name = _("Custom settings") self.profiles.append(customprofile) def addprofile(self, newprofile): """Add a new profile to the list of profiles. If the profile already exists, return the existing one instead. If it really is a new profile, add it at position last-1 (last is always custom settings)""" # Remove the name from the profile, to compare profiles nameless name = newprofile.__dict__.pop("name") # Create a deep copy of the list of profiles, so that deleting the # name to compare profiles doesn't affect the real profiles tempprofiles = deepcopy(self.profiles[:-1]) isNewProfile = True profileNumber = 0 # Check if there is an exact match (ignore name differences) for p in tempprofiles: del p.__dict__["name"] if newprofile == p: isNewProfile = False break profileNumber += 1 if isNewProfile: # Put the name back to the new profile newprofile.name = name # Add the new profile to the profiles list self.profiles.insert(len(self.profiles) - 1, newprofile) # Make sure that there are no conflicting profile names self.handleConflictingNames() logging.debug("%s profile, position %d" % ( "New" if isNewProfile else "Existing", profileNumber)) return profileNumber def handleConflictingNames(self): """Make sure that there are no profiles that have the same name""" # profilesMatrix will contain for each profile whether its default # name needs to be changed profilesMatrix = [] for p in self.profiles[:-1]: profilesMatrix.append({"addQuality": False, "addPixels": False}) tempprofiles = deepcopy(self.profiles[:-1]) i = 0 for p in self.profiles[:-2]: # Check the profiles one by one to see if their default name # would be the same addQuality = False addPixels = False changeNameOfProfiles = [] j = 0 # Don't compare the profile to itself tempprofiles.pop(0) defaultProfileName = p.createname() for t in tempprofiles: # Check the current profile with all the profiles that follow it if defaultProfileName == t.createname(): # They would have received the same default name if t.quality != p.quality: # They have different qualities, add that # information to their name profilesMatrix[i]["addQuality"] = True profilesMatrix[i + j + 1]["addQuality"] = True else: # They have the same quality, so the difference has # to be the size. Add that information (in pixels) # to their name profilesMatrix[i]["addPixels"] = True profilesMatrix[i + j + 1]["addPixels"] = True j += 1 i += 1 # The list of profiles that need their name changed has been created i = 0 logging.debug("Outcome of handleConflictingNames:") for p in profilesMatrix: if p["addQuality"] or p["addPixels"]: # This profile needs its name changed self.profiles[i].createname(True, p["addQuality"], p["addPixels"]) logging.debug("%d: %s => %s" % (i, p, self.profiles[i].name)) i += 1 def deleteprofile(self, id): """Deletes a profile from the list of profiles""" if len(self.profiles) - 1 == id: # It's not possible to delete the last profile (custom settings) logging.debug("Not allowed to remove last profile %d, it's custom settings" % id) return False self.profiles.pop(id) logging.debug("Removed profile %d" % id) return True def read(self): logging.info("Reading configuration from %s" % self.file) c = ConfigParser.ConfigParser() c.read(self.file) sections = c.sections() if len(sections) < 2: logging.error("There are no profiles defined") return False if sections[0] != "General": logging.error("Invalid first configuration section") return False self.activeprofile = 0 a = self.readvalue(c, "General", "active profile") if a: self.activeprofile = int(a.replace("Profile ", "")) # Check if the saved profile's version is different than the current version profileversion = self.readvalue(c, "General", "profile version", "int") if profileversion != self.actualversion: # There will [probably] be some conversion to do to convert the # old settings to the newer. pass for section in sections[1:]: name = self.readvalue(c, section, "name") size = self.readvalue(c, section, "size") width = self.readvalue(c, section, "width", "float") height = self.readvalue(c, section, "height", "float") percent = self.readvalue(c, section, "percent", "float") quality = self.readvalue(c, section, "quality", "float", 95) destination = self.readvalue(c, section, "destination") appendstring = self.readvalue(c, section, "appendstring") foldername = self.readvalue(c, section, "foldername") zipname = self.readvalue(c, section, "zipname") url = self.readvalue(c, section, "url") p = Profile(size, width, height, percent, quality, destination, appendstring, foldername, zipname, url, name) self.profiles.append(p) return True def write(self): logging.info("Saving configuration to %s" % self.file) # Create a new ConfigParser object, to make sure we only have the # latest parameters config = ConfigParser.ConfigParser() config.add_section("General") config.set("General", "profile version", self.actualversion) config.set("General", "active profile", "Profile %i" % self.activeprofile) logging.info("There are %d profiles" % len(self.profiles)) i = 0 for p in self.profiles: section = "Profile %i" % i config.add_section(section) config.set(section, "name", p.name) if p.size: config.set(section, "size", p.size) if p.width and p.height: config.set(section, "width", p.width) config.set(section, "height", p.height) if p.percent: config.set(section, "percent", p.percent) config.set(section, "quality", p.quality) config.set(section, "destination", p.destination) if p.appendstring: config.set(section, "appendstring", p.appendstring) if p.foldername: config.set(section, "foldername", p.foldername) if p.zipname: config.set(section, "zipname", p.zipname) if p.url: config.set(section, "url", p.url) logging.debug("%s\n%s" % ("="*64, p)) i += 1 f = open(self.file, "w") config.write(f) f.close() def readvalue(self, config, section, name, type=None, value=None): try: if type == "int": value = config.getint(section, name) elif type == "float": value = config.getfloat(section, name) elif type == "bool": value = config.getboolean(section, name) else: value = config.get(section, name) except (ConfigParser.NoOptionError, ConfigParser.NoSectionError): pass return value class Profile: def __init__(self, size=None, width=None, height=None, percent=None, quality=95, destination=None, appendstring=None, foldername=None, zipname=None, url=None, name=None): self.size = size if self.size in ("small", "large"): (self.width, self.height) = Config.size[self.size] else: # Check if the custom sizes are the same as small or large for s in ("small", "large"): if (width, height) == Config.size[s]: self.size = s self.width = width self.height = height if self.width and self.height: self.aspectratio = float(self.width) / float(self.height) self.percent = percent self.quality = quality self.destination = destination self.appendstring = appendstring self.foldername = foldername self.zipname = zipname if self.zipname: # Sanitize the name of the zipfile self.zipname = self.zipname.strip() # Strip whitespace # Remove starting non-alphabetic characters i = 0 for c in self.zipname: if c.isalpha(): break i += 1 self.zipname = "%s" % self.zipname[i:] # Make sure the zipfile's name ends in ".zip" if not self.zipname.endswith(".zip"): self.zipname += ".zip" self.url = url self.name = name if name else self.createname() def __str__(self): """Returns a string representation of a Profile Useful for debugging or logging""" p = "" if self.name == _("Custom settings"): p += "%s:\n" % self.name else: p += "Profile \"%s\":\n" % self.name if self.percent: p += "- Resize images by %d%%" % self.percent elif self.width: s = "Width: %dpx Height: %dpx" % (self.width, self.height) if self.size: p += "- %s images (%s)" % (self.size.capitalize(), s) else: p += "- Custom size: %s" % s p += "\n- Quality: %d%%\n" % self.quality if self.destination == 'append': p += "- Append \"%s\" to the file names" % self.appendstring elif self.destination == 'folder': p += "- Place the resized images in the \"%s\" folder" % self.foldername elif self.destination == 'upload': p += "- Zip the resized images in \"%s\"\n" % self.zipname p += "- Upload the resized images to \"%s\"" % self.url return p def __eq__(self, other): return self.__dict__ == other.__dict__ def createname(self, setSelf=False, addQuality=False, addPixels=False): """Create a profile name based on its attributes""" # Determine the images' size if self.size == "small": # Part of new profile name "Create small images[...]" imageSize = _("small") elif self.size == "large": # Part of new profile name "Create large images[...]" imageSize = _("large") elif self.percent: # Part of new profile name "Create 60% resized images[...]" imageSize = _("%d%% resized") % self.percent elif self.width and self.height: areaProfile = int(self.width) * int(self.height) areaSmall = Config.size["small"][0] * Config.size["small"][1] areaLarge = Config.size["large"][0] * Config.size["large"][1] if areaProfile < 0.8 * areaSmall: # Part of new profile name "Create very small images[...]" imageSize = _("very small") elif (areaProfile >= 0.8 * areaSmall) and \ (areaProfile < 1.2 * areaSmall): # Part of new profile name "Create small images[...]" imageSize = _("small") elif (areaProfile >= 1.2 * areaSmall) and \ (areaProfile < 0.8 * areaLarge): # Part of new profile name "Create medium images[...]" imageSize = _("medium") elif (areaProfile >= 0.8 * areaLarge) and \ (areaProfile < 1.2 * areaLarge): # Part of new profile name "Create large images[...]" imageSize = _("large") elif (areaProfile >= 1.2 * areaLarge): # Part of new profile name "Create very large images[...]" imageSize = _("very large") if addPixels: # Add the actual size information in the profile name imageSize += " (%dx%d)" % (self.width, self.height) # Determine the string depending on the destination n = None if self.destination == "upload": n = _("Send %(imageSize)s images to %(uploadUrl)s") % { "imageSize": imageSize, "uploadUrl": self.url} elif self.destination == "folder": n = _("Create %(imageSize)s images in the \"%(directoryName)s\" folder") % { "imageSize": imageSize, "directoryName": self.foldername} elif self.destination == "append": n = _("Create %(imageSize)s images and append \"%(appendString)s\"") % { "imageSize": imageSize, "appendString": self.appendstring} if addQuality: # Add the quality information in the profile name n += " " + _("(%d%% quality)") % self.quality n = n if n else _("Unnamed profile") if setSelf: self.name = n else: return n nautilus-image-manipulator-1.3/nautilus_image_manipulator/__init__.py0000644000175000017500000000000011647350400027440 0ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/nautilus_image_manipulator/ImageManipulations.py0000644000175000017500000002146612122327443031512 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import os from gi.repository import GObject import zipfile import subprocess import Image import logging try: from gi.repository import GExiv2 except ImportError: pass import gettext from gettext import gettext as _ gettext.textdomain('nautilus-image-manipulator') class ImageManipulations(GObject.GObject): def __init__(self, dialog, files, p): super(ImageManipulations, self).__init__() self.resizeDialog = dialog self.origFiles = files self.numFiles = len(self.origFiles) self.profile = p # Clean the subdirectory name input if self.profile.foldername: # Remove eventual slashes at the beginning or end of the subdirectory name cleanfoldername = [] for i in self.profile.foldername.split("/"): if i: cleanfoldername.append(i) self.profile.foldername = "/".join(cleanfoldername) logging.debug('files: %s' % self.origFiles) str = "Resizing parameters:\n" str += '- width: %s\n' % self.profile.width str += '- height: %s\n' % self.profile.height str += '- percent: %s\n' % self.profile.percent str += '- quality: %s\n' % self.profile.quality str += '- destination: %s\n' % self.profile.destination str += '- appendstring: %s\n' % self.profile.appendstring str += '- foldername: %s' % self.profile.foldername str += '- zipname: %s' % self.profile.zipname str += '- url: %s' % self.profile.url logging.debug(str) def resize_images(self): """Loops over all files to resize them.""" if self.profile.percent and self.profile.percent == "100" and self.profile.quality == "100": # If scaling to 100% with a compression of 100%, don't # actually resize files (it would just degrade the quality) # This configuration might be used if the user just wants to # send the zipped files via Internet self.newFiles = self.origFiles else: # Resize and/or compress the images i = float(0) self.newFiles = [] for f in self.origFiles: (skip, cancel, newFileName) = self.resize_one_image(f) if cancel: break if not skip: self.newFiles.append(newFileName) i += 1 percent = i / self.numFiles self.resizeDialog.o("progressbar").set_text("%s %d%%" % (_("Resizing images..."), int(percent * 100))) self.resizeDialog.o("progressbar").set_fraction(percent) # There's more work, return True yield True # Signal we are done resizing self.emit("resizing_done") # No more work, return False yield False def resize_one_image(self, fileName): """Performs the resizing operation on one image. The return value indicates if this resizing operation was successful. """ logging.debug('resizing image: %s' % fileName) skip = False cancel = False (basePath, name) = os.path.split(fileName) if self.profile.destination == 'folder': basePath = "%s/%s" % (basePath, self.profile.foldername) if self.profile.destination == 'upload': # Put the images in a temporary folder named similarly to the # zipfile (without the ".zip" at the end) basePath = "%s/%s" % (basePath, self.profile.zipname[:-4]) logging.debug('basePath: %s' % basePath) logging.debug('name: %s' % name) if self.profile.destination == 'append': # Insert the append string and convert the extension to lower case n = os.path.splitext(name) name = "%s%s%s" % (n[0], self.profile.appendstring, n[1].lower()) # This is the output filename newFileName = "%s/%s.%s" % (basePath, os.path.splitext(name)[0], "jpg") logging.debug('newFileName: %s' % newFileName) # Make sure the directory exists # Note: a new subdirectory will also need to be created if a / was # entered in the appendString try: os.makedirs("/".join(newFileName.split("/")[:-1])) except: pass # Open image with PIL im = Image.open(fileName) # Get original geometry (w, h) = im.size logging.debug('Original image size %sx%s' % (w, h)) if self.profile.percent: # New geometry is a % factor = int(self.profile.percent) / 100.0 width = int(w * factor) height = int(h * factor) else: # New geometry is in pixels: aspect ratio is respected and the # resulting image fits inside the given dimensions. aspectratio = float(w) / float(h) if self.profile.aspectratio < aspectratio: width = self.profile.width height = int(float(self.profile.width) / aspectratio) else: width = int(float(self.profile.height) * aspectratio) height = self.profile.height logging.debug('New image size %sx%s' % (width, height)) # Resize and save image im = im.resize((int(width), int(height))) retry = False try: im.save(newFileName, "JPEG", quality=int(self.profile.quality)) except IOError as (errno, strerror): logging.error("I/O error({0}): {1}".format(errno, strerror)) (skip, cancel, retry) = self.resizeDialog.error_resizing(fileName) if retry: # Retry with the same image (skip, cancel, newFileName) = self.resize_one_image(fileName) if not (skip or retry or cancel): try: # Load EXIF data exif = GExiv2.Metadata(fileName) # Change EXIF image size to the new size exif["Exif.Photo.PixelXDimension"] = str(int(width)) exif["Exif.Photo.PixelYDimension"] = str(int(height)) # Copy the EXIF data to the new image newExif = GExiv2.Metadata(newFileName) for tag in exif.get_exif_tags(): newExif[tag] = exif[tag] newExif.save_file() except NameError: logging.info( "GExiv2 is not available, EXIF data won't be copied over") return (skip, cancel, newFileName) def pack_images(self): """Creates a zip file containing the modified files""" # Generate the name of the zipfile dirname = os.path.dirname(self.origFiles[0]) if not dirname: # Put the zipfile in the user's home folder if no base directory name could be determined. dirname = os.path.expanduser("~") zipname = self.profile.zipname # Create the final zip file name self.zipfile = os.path.join(dirname, zipname) # Zip the files into a PKZIP format .zip file zout = zipfile.ZipFile(self.zipfile, "w") i = float(0) for fname in self.newFiles: fzname = os.path.basename(fname) #TODO: Check what to do with non-ASCII filenames zout.write(fname, fzname, zipfile.ZIP_DEFLATED) i += 1 percent = i / self.numFiles self.resizeDialog.o("progressbar").set_text("%s %d%%" % (_("Packing images..."), int(percent * 100))) self.resizeDialog.o("progressbar").set_fraction(percent) # There's more work, return True yield True zout.close() # Close the zip file # TODO: check with zipfile.is_zipfile(self.zipfile) and ZipFile.testzip() if the generated zipfile is valid # Signal we are done packing self.emit("packing_done", self.zipfile) # No more work, return False yield False GObject.type_register(ImageManipulations) GObject.signal_new("resizing_done", ImageManipulations, GObject.SignalFlags.RUN_FIRST, None, ()) GObject.signal_new("packing_done", ImageManipulations, GObject.SignalFlags.RUN_FIRST, None, (GObject.TYPE_STRING,)) if __name__ == "__main__": pass nautilus-image-manipulator-1.3/nautilus_image_manipulator/NautilusImageManipulatorDialog.py0000644000175000017500000006412512122637645034036 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE from gi.repository import Gtk from gi.repository import Gdk from gi.repository import GObject import os import urllib2 import logging from nautilus_image_manipulator.helpers import get_builder from nautilus_image_manipulator.ImageManipulations import ImageManipulations from ProfileSettings import Profile, Config from upload.BaseUploadSite import UnknownUploadDestinationException from upload.BaseUploadSite import InvalidEndURLsException from upload.BaseUploadSite import FinalURLsNotFoundException import gettext from gettext import gettext as _ gettext.textdomain('nautilus-image-manipulator') class NautilusImageManipulatorDialog(Gtk.Dialog): __gtype_name__ = "NautilusImageManipulatorDialog" # To construct a new instance of this method, the following notable # methods are called in this order: # __new__(cls) # __init__(self) # finish_initializing(self, builder) # __init__(self) # # For this reason, it's recommended you leave __init__ empty and put # your inialization code in finish_intializing def __new__(cls): """Special static method that's automatically called by Python when constructing a new instance of this class. Returns a fully instantiated NautilusImageManipulatorDialog object. """ builder = get_builder('NautilusImageManipulatorDialog') new_object = builder.get_object('nautilus_image_manipulator_dialog') new_object.finish_initializing(builder) return new_object def finish_initializing(self, builder): """Called when we're finished initializing. finish_initalizing should be called after parsing the ui definition and creating a NautilusImageManipulatorDialog object with it in order to finish initializing the start of the new NautilusImageManipulatorDialog instance. Put your initialization code in here and leave __init__ undefined. """ # Get a reference to the builder's get_object and set up the signals. self.o = builder.get_object builder.connect_signals(self) # Populate the list of sites to upload to model = self.o("upload_combo").get_model() self.upload_sites = [model.get_value(model.get_iter(i), 0) for \ i, k in enumerate(model)] # Load the saved configuration self.loadConfig() self.processingCanceled = False # Give the Resize button the focus to respond to Enter self.o("resize_button").grab_focus() def set_files(self, files): self.files = files def resize_button_clicked(self, widget, data=None): """The user has elected to resize the images Called before the dialog returns Gtk.RESONSE_OK from run(). """ idSelectedProfile = self.o("profiles_combo").get_active() # If the custom profile was selected, update it with the currently # selected parameters if idSelectedProfile == (len(self.conf.profiles) - 1): p = self.create_new_profile_from_custom_settings() p.name = _("Custom settings") self.conf.profiles[idSelectedProfile] = p self.p = self.conf.profiles[idSelectedProfile] logging.info("The following profile has been selected:\n%s" % self.p) # Disable the parameter UI elements and display the progress bar self.o("details_box").set_sensitive(False) self.o("resize_button").set_sensitive(False) self.o("deleteprofile_button").set_visible(False) self.o("newprofile_button").set_visible(False) self.o("progressbar").set_text("%s 0%%" % ("Resizing images...")) self.o("progressbar").show() while Gtk.events_pending(): Gtk.main_iteration() # Used to refresh the UI # Resize the images im = ImageManipulations(self, self.files, self.p) im.connect("resizing_done", self.on_resizing_done) task = im.resize_images() GObject.idle_add(task.next) # Remember the settings for next time self.saveConfig() def destination_entry_changed_cb(self, widget, data=None): if widget == self.o("subfolder_entry"): isError = (0 == len(widget.get_text())) errorLabel = self.o("subfolder_entry_error_label") elif widget == self.o("append_entry"): errorLabel = None if 0 == len(widget.get_text()): isError = True self.o("append_entry_empty_error_label").set_visible(True) self.o("append_entry_invalid_error_label").set_visible(False) elif os.path.sep == widget.get_text()[-1]: isError = True self.o("append_entry_invalid_error_label").set_text(_("The string to append cannot end in %s") % os.path.sep) self.o("append_entry_empty_error_label").set_visible(False) self.o("append_entry_invalid_error_label").set_visible(True) else: # TODO: Check that the value is valid to be appended to the filename isError = False self.o("append_entry_empty_error_label").set_visible(False) self.o("append_entry_invalid_error_label").set_visible(False) elif widget == self.o("zipname_entry"): isError = (0 == len(widget.get_text())) errorLabel = self.o("zipname_entry_error_label") # Adapt the visibility of the appropriate error message if errorLabel: errorLabel.set_visible(isError) # Don't allow resizing if text is empty self.o("resize_button").set_sensitive(not isError) def on_resizing_done(self, im): """Triggered when all the images have been resized""" # Only pack and send the images if the process was not canceled and if there is at least one image to pack if self.p.destination == 'upload' and not self.processingCanceled and len(im.newFiles) > 0: # The user wants to upload to a website if len(im.newFiles) > 1: # There are more than one image, zip the files together and upload the zipfile im.connect("packing_done", self.on_packing_done) task = im.pack_images() GObject.idle_add(task.next) else: # There is only one image, send that image alone (don't zip the file) self.upload_file(im, im.newFiles[0]) else: # The user doesn't want to send the images, we're done! self.destroy() def on_packing_done(self, im, zipfile): """Triggered when all the images have been packed together.""" self.upload_file(im, zipfile) def upload_file(self, im, fileToUpload): """Uploads a file to a website.""" # Import the module that takes care of uploading to the selected website import_string = "from upload.z_%s import UploadSite" % \ self.p.url.replace(".", "_").replace("/", "") logging.debug("import_string: %s" % import_string) # Make sure the import does not fail try: exec import_string except ImportError: self.error_on_uploading(_("The selected upload site %(site_name)s is not valid.") % {"site_name": '"%s"' % self.p.url} + "\n\n%(extra_info)s", fileToUpload, True) return u = None try: u = UploadSite() except urllib2.URLError: # Impossible to contact the website (no network, site down, etc.) self.error_on_uploading(_("The upload site %(site_name)s could not be contacted, please check your internet connection.") % {"site_name": '"%s"' % self.p.url} + "\n\n%(extra_info)s", fileToUpload, False) return except UnknownUploadDestinationException: self.error_on_uploading(_("The upload destination for %(site_name)s could not be determined, please report a bug so that this can be fixed.") % {"site_name": '"%s"' % self.p.url} + "\n\n%(extra_info)s", fileToUpload, True) return self.o("progressbar").set_text("%s 0%%" % _("Uploading images...")) self.o("progressbar").set_fraction(0) self.uploadPercent = 0 u.connect("uploading_done", self.on_uploading_done) u.connect("waiting_for_validation", self.waiting_for_validation) try: u.upload(fileToUpload, self.uploading_callback) except InvalidEndURLsException: self.error_on_uploading(_("The page where your file can be downloaded from could not be determined.") + "\n" + _("Please try again, and report a bug if it happens again.") + "\n\n%(extra_info)s", fileToUpload, True) return except FinalURLsNotFoundException: self.error_on_uploading(_("Your images were successfully uploaded to %(site_name)s, but their verification failed.") % {"site_name": '"%s"' % self.p.url} + "\n" + _("Please try again, and report a bug if it happens again.") + "\n\n%(extra_info)s", fileToUpload, True) return def error_on_uploading(self, message, fileToUpload, reportBug): """Displays an error message. Can also display a link to report a bug on Launchpad""" if os.path.splitext(fileToUpload)[1] == ".zip": extra_info = _("Your images have been zipped together into this file:") + "\n" + fileToUpload else: extra_info = _("You can find your image at %(filename)s") % {"filename": fileToUpload} # Hide the unneccessary sections self.o("details_box").hide() self.o("progressbar").hide() self.o("url_box").hide() # Display the error message self.o("error_message_label").set_text(message % {"extra_info": extra_info}) self.o("error_box").show() # Hide the cancel and resize button, and show the close button self.o("cancel_button").hide() self.o("resize_button").hide() self.o("close_button").show() # Display the link to report a bug if reportBug: self.o("error_url_linkbutton").set_label(_("Please file a bug report on Launchpad")) self.o("error_url_linkbutton").set_uri("https://bugs.launchpad.net/nautilus-image-manipulator") self.o("error_url_hbox").show() else: self.o("error_url_hbox").hide() # Give the close button the focus to respond to Enter self.o("close_button").grab_focus() self.resize(1, 1) def uploading_callback(self, param, current, total): """This function gets called when uploading the images. It updates the progress bar according to the progress of the upload.""" percent = float(current) / total percent100 = int(percent * 100) if percent100 > self.uploadPercent: self.o("progressbar").set_text("%s %d%%" % (_("Uploading images..."), percent100)) self.o("progressbar").set_fraction(percent) while Gtk.events_pending(): Gtk.main_iteration() # Used to refresh the UI self.uploadPercent = percent100 def pulse(self): """Sets the progress bar in activity mode, and makes the block move back and forth within the progress bar""" self.o("progressbar").pulse() return self.still_working # True = repeat, False = stop def waiting_for_validation(self, u): """Triggered when the file has been uploaded, but has not yet been verified.""" self.still_working = True self.o("progressbar").set_text(_("Waiting for validation...")) GObject.timeout_add(100, self.pulse) def on_uploading_done(self, u): """Triggered when the file has been uploaded. Displays the url where the images can be downloaded from, or deleted.""" # Stop updating the progress bar self.still_working = False # Put the download url in the clipboard (both the normal "Ctrl-C" and selection clipboards) # Note that the selection clipboard will be empty when the dialog gets closed. # More info: http://standards.freedesktop.org/clipboards-spec/clipboards-latest.txt # and http://readthedocs.org/docs/python-gtk-3-tutorial/en/latest/clipboard.html Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD).set_text(u.downloadPage, -1) Gtk.Clipboard.get(Gdk.SELECTION_PRIMARY).set_text(u.downloadPage, -1) self.o("details_box").hide() self.o("progressbar").hide() # Update the link buttons with the urls self.o("download_linkbutton").set_label(u.downloadPage) self.o("download_linkbutton").set_uri(u.downloadPage) self.o("delete_linkbutton").set_label(u.deletePage) self.o("delete_linkbutton").set_uri(u.deletePage) self.o("url_box").show() # Hide the cancel and resize button, and show the close button self.o("cancel_button").hide() self.o("resize_button").hide() self.o("close_button").show() self.resize(1, 1) #TODO: delete the temporary folder where the images where placed #Question: should the zipfile also be deleted? def cancel_button_clicked(self, widget, data=None): """The user has elected to cancel. Called before the dialog returns Gtk.ResponseType.CANCEL for run() """ self.destroy() def on_destroy(self, widget, data=None): """Called when the NautilusImageManipulatorWindow is closed.""" # Note: The parameters don't get saved when canceling. It is called at the end of self.resize(). Gtk.main_quit() def profiles_combo_changed(self, widget, data=None): """Updates the UI according to which profile gets selected""" idCustomSettings = len(self.conf.profiles) - 1 idSelectedProfile = self.o("profiles_combo").get_active() customSelected = (idCustomSettings == idSelectedProfile) # Only show the advanced parameters when the custom settings is selected self.o("parameters_box").set_visible(customSelected) self.o("deleteprofile_button").set_visible(customSelected == False) self.o("newprofile_button").set_visible(customSelected) if customSelected: self.set_advanced_settings_from_custom_profile() def set_advanced_settings_from_custom_profile(self): """Update the advance settings based on the custom settings profile""" p = self.conf.profiles[-1] # Size settings if p.percent: self.o("percent_radio").set_active(True) self.o("percent_scale").set_value(p.percent) # Set the size combobox by default to small self.o("size_combo").set_active(0) else: self.o("pixels_radio").set_active(True) if p.size: sizeSettings = ("small", "large").index(p.size) else: sizeSettings = 2 self.o("width_spin").set_value(p.width) self.o("height_spin").set_value(p.height) self.o("size_combo").set_active(sizeSettings) self.size_radio_toggled(None) self.o("quality_scale").set_value(p.quality) # Force updating the color and tooltip of the quality scale (if # quality is too low) self.quality_scale_changed(None, None, p.quality) # Destination settings dest_model = self.o("destination_combo").get_model() dest_iter = dest_model.get_iter_first() while dest_iter is not None: dest = dest_model.get(dest_iter, 1)[0] if dest == p.destination: self.o("destination_combo").set_active_iter(dest_iter) break dest_iter = dest_model.iter_next(dest_iter) if p.destination == "append": self.o("append_entry").set_text(p.appendstring) elif p.destination == "folder": self.o("subfolder_entry").set_text(p.foldername) elif p.destination == 'upload': self.o("zipname_entry").set_text(p.zipname) try: i = self.upload_sites.index(p.url) except ValueError: i = 0 self.o("upload_combo").set_active(i) def create_new_profile_from_custom_settings(self): """Returns a new profile instance based on the data in the advanced settings""" # Size settings size = None width = None height = None percent = None if self.o("pixels_radio").get_active(): sizeSettings = self.o("size_combo").get_active() sizeSettings = ("small", "large", "custom")[sizeSettings] if sizeSettings == "custom": width = self.o("width_spin").get_value() height = self.o("height_spin").get_value() else: size = sizeSettings else: percent = self.o("percent_scale").get_value() quality = self.o("quality_scale").get_value() # Destination settings dest_model = self.o("destination_combo").get_model() dest_iter = self.o("destination_combo").get_active_iter() destination = dest_model.get_value(dest_iter, 1) appendstring = None foldername = None zipname = None url = None if destination == "append": appendstring = self.o("append_entry").get_text() elif destination == "folder": foldername = self.o("subfolder_entry").get_text() elif destination == 'upload': zipname = self.o("zipname_entry").get_text() url = self.o("upload_combo").get_active_text() # Create and add that profile to the list of profiles p = Profile(size, width, height, percent, quality, destination, appendstring, foldername, zipname, url) return p def newprofile_button_clicked(self, widget, data=None): """Adds a new profile to the list of available profiles""" p = self.create_new_profile_from_custom_settings() profileNumber = self.conf.addprofile(p) self.populate_profiles_combobox(profileNumber) def deleteprofile_button_clicked(self, widget, data=None): profilesCombo = self.o("profiles_combo") idSelectedProfile = profilesCombo.get_active() # Remove from the list of profiles in self.conf self.conf.deleteprofile(idSelectedProfile) # Remove from the profiles combobox profilesCombo.remove(idSelectedProfile) # Determine which profile to select now if idSelectedProfile > 0 and ( idSelectedProfile == len(self.conf.profiles) - 1): # If the last profile in the list before the custom settings # just got deleted, but there are still other profiles in the # list, select the new last profile. idSelectedProfile -= 1 profilesCombo.set_active(idSelectedProfile) def size_radio_toggled(self, widget, data=None): if not widget: widget = self.o("pixels_radio") if widget == self.o("pixels_radio"): # This if condition prevents the call to be executed twice # (once for each radio button) pixels = widget.get_active() percent = not pixels self.o("size_combo").set_sensitive(pixels) self.update_width_height_box_sensitivity(pixels) self.o("percent_scale").set_sensitive(percent) self.o("percent_label").set_sensitive(percent) def size_combo_changed(self, widget, data=None): # Don't use the text of the combobox, since it will be translated. # Instead, use the selected ID and map it to one of the 3 values. sizeSettings = self.get_size_settings() self.update_width_height_box_sensitivity(True, sizeSettings) if sizeSettings in ("small", "large"): # Update the values to show the predetermined width and height (w, h) = Config.size[sizeSettings] self.o("width_spin").set_value(w) self.o("height_spin").set_value(h) def get_size_settings(self): s = self.o("size_combo").get_active() return ("small", "large", "custom")[s] def update_width_height_box_sensitivity(self, pixels, size=None): sensitive = False if pixels: if not size: size = self.get_size_settings() sensitive = (size == "custom") self.o("width_height_box").set_sensitive(sensitive) def quality_scale_changed(self, widget, data=None, value=0): #TODO: check if possible to make the quality scale red as well if value < 70: labeltext = "%s" # Visible when hovering over the quality scale in the custom # settings when the quality is too low tooltiptext = _("Warning: the lower the quality, the more "\ "deteriorated the images will be") else: labeltext = "%s" # Visible when hovering over the quality scale in the custom # settings when the quality is high enough tooltiptext = _("Determines the quality of the resized images "\ "(the higher the quality, the larger the image size)") self.o("quality_label").set_markup(labeltext % _("Quality:")) self.o("quality_percent_label").set_markup(labeltext % "%") self.o("quality_box").set_tooltip_text(tooltiptext) def destination_combo_changed(self, widget, data=None): dest_model = widget.get_model() dest_iter = widget.get_active_iter() dest = dest_model.get_value(dest_iter, 1) # Make sure the Resize button is clickable self.o("resize_button").set_sensitive(True) if dest == 'folder': if not self.o("subfolder_entry").get_text(): # Default folder name self.o("subfolder_entry").set_text(_("resized")) self.o("subfolder_box").show() self.o("append_box").hide() self.o("upload_box").hide() self.destination_entry_changed_cb(self.o("subfolder_entry")) elif dest == 'append': if not self.o("append_entry").get_text(): # Default value to append to filename self.o("append_entry").set_text("-%s" % _("resized")) self.o("subfolder_box").hide() self.o("append_box").show() self.o("upload_box").hide() self.destination_entry_changed_cb(self.o("append_entry")) elif dest == 'upload': if not self.o("zipname_entry").get_text(): # Default zipfile name self.o("zipname_entry").set_text(_("resized")) if not self.o("upload_combo").get_active_text(): # Default upload site self.o("upload_combo").set_active(0) self.o("subfolder_box").hide() self.o("append_box").hide() self.o("upload_box").show() else: self.o("subfolder_box").hide() self.o("append_box").hide() self.o("upload_box").hide() def error_with_parameters(self, error_message): """Displays an error message if the parameters given to resize the images are not valid.""" label = Gtk.Label(label=error_message) label.set_padding(10, 5) dialog = Gtk.Dialog(_("Invalid parameters"), self, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT)) dialog.vbox.pack_start(label, True, True, 0) label.show() response = dialog.run() dialog.destroy() def error_resizing(self, filename): """Displays an error message if an error got detected while resizing one image.""" label = None (folder, image) = os.path.split(filename) buttons = (_("_Skip"), 0, Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, _("_Retry"), 1) label = Gtk.Label(label=_('The image "%(image)s" could not be resized.\n\nCheck whether you have permission to write to this folder:\n%(folder)s' % {"image": image, "folder": folder})) label.set_padding(10, 5) dialog = Gtk.Dialog(_("Could not resize image"), self, Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT, buttons) dialog.vbox.pack_start(label, True, True, 0) label.show() response = dialog.run() dialog.destroy() # The values to be returned skip = (response == 0) self.processingCanceled = (response == Gtk.ResponseType.CANCEL) retry = (response == 1) return (skip, self.processingCanceled, retry) def populate_profiles_combobox(self, profileNumber=None): """Populate the profiles combobox with the names of the profiles""" profilesCombo = self.o("profiles_combo") # Empty the combobox profilesCombo.remove_all() # Add the names of the profiles for p in self.conf.profiles: profilesCombo.append_text(p.name) # Select the right profile if profileNumber == None: profileNumber = self.conf.activeprofile profilesCombo.set_active(profileNumber) def loadConfig(self): self.conf = Config() self.populate_profiles_combobox() def saveConfig(self): self.conf.activeprofile = self.o("profiles_combo").get_active() # Save the settings to the configuration file self.conf.write() if __name__ == "__main__": pass nautilus-image-manipulator-1.3/nautilus_image_manipulator/nautilus_image_manipulatorconfig.py0000644000175000017500000000441412122327443034525 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE # THIS IS NautilusImageManipulator CONFIGURATION FILE # YOU CAN PUT THERE SOME GLOBAL VALUE # Do not touch unless you know what you're doing. # you're warned :) __all__ = [ 'project_path_not_found', 'get_data_file', 'get_data_path', ] # Where your project will look for your data (for instance, images and ui # files). By default, this is ../data, relative your trunk layout __nautilus_image_manipulator_data_directory__ = '../data/' __license__ = 'GPL-3' import os import gettext from gettext import gettext as _ gettext.textdomain('nautilus-image-manipulator') class project_path_not_found(Exception): """Raised when we can't find the project directory.""" def get_data_file(*path_segments): """Get the full path to a data file. Returns the path to a file underneath the data directory (as defined by `get_data_path`). Equivalent to os.path.join(get_data_path(), *path_segments). """ return os.path.join(get_data_path(), *path_segments) def get_data_path(): """Retrieve nautilus-image-manipulator data path This path is by default /../data/ in trunk and /usr/share/nautilus-image-manipulator in an installed version but this path is specified at installation time. """ # Get pathname absolute or relative. path = os.path.join( os.path.dirname(__file__), __nautilus_image_manipulator_data_directory__) abs_data_path = os.path.abspath(path) if not os.path.exists(abs_data_path): raise project_path_not_found return abs_data_path nautilus-image-manipulator-1.3/nautilus_image_manipulator/helpers.py0000644000175000017500000000320612122327443027356 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE """Helpers for an Ubuntu application.""" __all__ = [ 'make_window', ] import os from gi.repository import Gtk from nautilus_image_manipulator.nautilus_image_manipulatorconfig import get_data_file import gettext from gettext import gettext as _ gettext.textdomain('nautilus-image-manipulator') def get_builder(builder_file_name): """Return a fully-instantiated Gtk.Builder instance from specified ui file :param builder_file_name: The name of the builder file, without extension. Assumed to be in the 'ui' directory under the data path. """ # Look for the ui file that describes the user interface. ui_filename = get_data_file('ui', '%s.ui' % (builder_file_name,)) if not os.path.exists(ui_filename): ui_filename = None builder = Gtk.Builder() builder.set_translation_domain('nautilus-image-manipulator') builder.add_from_file(ui_filename) return builder nautilus-image-manipulator-1.3/nautilus_image_manipulator/nautilus-image-manipulator-extension.py0000644000175000017500000000561612122327443035212 0ustar emilienemilien00000000000000# -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE # Nautilus extension to launch Nautilus Image Manipulator. # # Place a copy of this extension in # /usr/share/nautilus-python/extensions # or # ~/.local/share/nautilus-python/extensions/ # # Some useful resources about Nautilus extensions: # http://projects.gnome.org/nautilus-python/ # http://git.gnome.org/browse/nautilus-python/tree/examples # http://git.gnome.org/browse/nautilus-python/tree/examples?h=nautilus-3.0 # # Note that as of nautilus-python 0.7.0 the path from where the extensions # are loaded has been changed: # http://git.gnome.org/browse/nautilus-python/commit/?id=c97253104e7d6b88803cbef529bd9e298fa8d9e3 # http://git.gnome.org/browse/nautilus-python/commit/?h=nautilus-3.0&id=73d2739c4a91d80710b14ff5f192875a34f10a94 import os import subprocess import urllib import gettext from gettext import gettext as _ from gettext import ngettext gettext.textdomain('nautilus-image-manipulator') from gi.repository import Nautilus, GObject class BackgroundImageExtension(GObject.GObject, Nautilus.MenuProvider): def __init__(self): pass def menu_activate_cb(self, menu, images): args = ["nautilus-image-manipulator"] for ff in images: # Remove "file://" and unquote the filename args.extend(("-f", urllib.unquote(ff.get_uri()[7:]))) subprocess.Popen(args) def get_file_items(self, window, files): images = [] # Extract only the images from the list of selected files for f in files: if f.get_mime_type()[:6] == "image/": images.append(f) # Don't display this option in the menu if there is not a single # image in the selection if not images: return extLabel = ngettext("_Resize image", "_Resize images", len(images)) extTip = ngettext("Resize the selected image", "Resize each selected image", len(images)) item = Nautilus.MenuItem(name='NautilusImageManipulator::resize', label=extLabel, tip=extTip) item.connect('activate', self.menu_activate_cb, images) return item, nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/0000775000175000017500000000000012134312450026622 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/__init__.py0000644000175000017500000000000012121137415030721 0ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/z_1fichier_com.py0000644000175000017500000001071712122317650032065 0ustar emilienemilien00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import os import urllib2 import re import logging from gi.repository import GObject from nautilus_image_manipulator.upload.poster.encode import multipart_encode, MultipartParam from nautilus_image_manipulator.upload.poster.streaminghttp import register_openers import BaseUploadSite class UploadSite(BaseUploadSite.BaseUploadSite): def __init__(self): """Determines the upload url for 1fichier.com. Documentation for 1fichier.com: http://www.1fichier.com/api/web.html Note: it's not up to date...""" super(UploadSite, self).__init__() # The session ID is read from the "files" form on http://www.1fichier.com html = urllib2.urlopen('http://www.1fichier.com').read() try: (sessionId) = re.search('
', html).groups() except AttributeError: # If this exception is raised, fix the previous regex raise BaseUploadSite.UnknownUploadDestinationException() # Build the url to upload to and to retrieve the download and delete links: self.uploadUrl = "http://upload.1fichier.com/upload.cgi?id=%s" % sessionId self.endUploadUrl = "http://upload.1fichier.com/end.pl?xid=%s" % sessionId def upload(self, filename, callback): """Uploads a single file and saves the links to download and delete that file. ``filename`` is the file to upload ``callback`` is the function that updates the progress bar while uploading""" logging.debug('uploading %s to %s' % (filename, self.uploadUrl)) logging.debug('end upload url: %s' % self.endUploadUrl) # Register the streaming http handlers with urllib2 register_openers() # Start the multipart/form-data encoding of the file "filename" # headers contains the necessary Content-Type and Content-Length # datagen is a generator object that yields the encoded parameters image_param = MultipartParam.from_file("file[]", filename) # The filename must not be specially encoded... # This is a workaround, should probably be fixed directly in Poster image_param.filename = os.path.basename(filename) (datagen, headers) = multipart_encode([ image_param, ('domain', '0') ], cb=callback) request = urllib2.Request(self.uploadUrl, datagen, headers) urllib2.urlopen(request) # Retrieve the download page request = urllib2.Request(self.endUploadUrl) request.add_header("EXPORT", 1) # To get simplified values in the format explained below downloaded_page = urllib2.urlopen(request).read() # The return is like this: # filename;size;download identifier;deletion identifier;domain identifier;control hash try: (filename, size, download_id, deletion_id, domain_id, control_hash) = re.search("(.*);(.*);(.*);(.*);(.*);(.*)", downloaded_page).groups() except: # TODO: Better failed upload handling, maybe try again? logging.error('the upload has failed, this is the returned page:\n"%s"\n' % downloaded_page) raise BaseUploadSite.InvalidEndURLsException() self.downloadPage = "http://%s.1fichier.com" % download_id self.deletePage = "http://www.1fichier.com/remove/%s/%s" % (download_id, deletion_id) logging.info('downloadPage: %s' % self.downloadPage) logging.info('deletePage: %s' % self.deletePage) # Signal we are done uploading self.emit("uploading_done") GObject.type_register(UploadSite) GObject.signal_new("uploading_done", UploadSite, GObject.SignalFlags.RUN_FIRST, None, ()) if __name__ == "__main__": pass nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/BaseUploadSite.py0000644000175000017500000000337112122317650032046 0ustar emilienemilien00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE from gi.repository import GObject class UnknownUploadDestinationException(Exception): """Impossible to determine the upload destination for this website, the upload website has most likely changed it's API/website""" pass class InvalidEndURLsException(Exception): """Impossible to determine the URLs where the file will be made available.""" pass class FinalURLsNotFoundException(Exception): """The upload was successful, but the file can't be downloaded. Probably due to verification on the external side not being successful.""" pass class BaseUploadSite(GObject.GObject): def __init__(self): super(BaseUploadSite, self).__init__() def upload(self, filename, callback): """Uploads a single file and saves the links to download and delete that file. ``filename`` is the file to upload ``callback`` is the function that updates the progress bar while uploading""" pass if __name__ == "__main__": pass nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/poster/0000775000175000017500000000000012134312450030136 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/poster/__init__.py0000644000175000017500000000307611670503376032270 0ustar emilienemilien00000000000000# Copyright (c) 2011 Chris AtLee # # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN # THE SOFTWARE. """poster module Support for streaming HTTP uploads, and multipart/form-data encoding ```poster.version``` is a 3-tuple of integers representing the version number. New releases of poster will always have a version number that compares greater than an older version of poster. New in version 0.6.""" #import poster.streaminghttp #import poster.encode import nautilus_image_manipulator.upload.poster.streaminghttp import nautilus_image_manipulator.upload.poster.encode version = (0, 8, 1) # Thanks JP! nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/poster/streaminghttp.py0000644000175000017500000001757711647350402033427 0ustar emilienemilien00000000000000"""Streaming HTTP uploads module. This module extends the standard httplib and urllib2 objects so that iterable objects can be used in the body of HTTP requests. In most cases all one should have to do is call :func:`register_openers()` to register the new streaming http handlers which will take priority over the default handlers, and then you can use iterable objects in the body of HTTP requests. **N.B.** You must specify a Content-Length header if using an iterable object since there is no way to determine in advance the total size that will be yielded, and there is no way to reset an interator. Example usage: >>> from StringIO import StringIO >>> import urllib2, poster.streaminghttp >>> opener = poster.streaminghttp.register_openers() >>> s = "Test file data" >>> f = StringIO(s) >>> req = urllib2.Request("http://localhost:5000", f, ... {'Content-Length': str(len(s))}) """ import httplib, urllib2, socket from httplib import NotConnected __all__ = ['StreamingHTTPConnection', 'StreamingHTTPRedirectHandler', 'StreamingHTTPHandler', 'register_openers'] if hasattr(httplib, 'HTTPS'): __all__.extend(['StreamingHTTPSHandler', 'StreamingHTTPSConnection']) class _StreamingHTTPMixin: """Mixin class for HTTP and HTTPS connections that implements a streaming send method.""" def send(self, value): """Send ``value`` to the server. ``value`` can be a string object, a file-like object that supports a .read() method, or an iterable object that supports a .next() method. """ # Based on python 2.6's httplib.HTTPConnection.send() if self.sock is None: if self.auto_open: self.connect() else: raise NotConnected() # send the data to the server. if we get a broken pipe, then close # the socket. we want to reconnect when somebody tries to send again. # # NOTE: we DO propagate the error, though, because we cannot simply # ignore the error... the caller will know if they can retry. if self.debuglevel > 0: print "send:", repr(value) try: blocksize = 8192 if hasattr(value, 'read') : if hasattr(value, 'seek'): value.seek(0) if self.debuglevel > 0: print "sendIng a read()able" data = value.read(blocksize) while data: self.sock.sendall(data) data = value.read(blocksize) elif hasattr(value, 'next'): if hasattr(value, 'reset'): value.reset() if self.debuglevel > 0: print "sendIng an iterable" for data in value: self.sock.sendall(data) else: self.sock.sendall(value) except socket.error, v: if v[0] == 32: # Broken pipe self.close() raise class StreamingHTTPConnection(_StreamingHTTPMixin, httplib.HTTPConnection): """Subclass of `httplib.HTTPConnection` that overrides the `send()` method to support iterable body objects""" class StreamingHTTPRedirectHandler(urllib2.HTTPRedirectHandler): """Subclass of `urllib2.HTTPRedirectHandler` that overrides the `redirect_request` method to properly handle redirected POST requests This class is required because python 2.5's HTTPRedirectHandler does not remove the Content-Type or Content-Length headers when requesting the new resource, but the body of the original request is not preserved. """ handler_order = urllib2.HTTPRedirectHandler.handler_order - 1 # From python2.6 urllib2's HTTPRedirectHandler def redirect_request(self, req, fp, code, msg, headers, newurl): """Return a Request or None in response to a redirect. This is called by the http_error_30x methods when a redirection response is received. If a redirection should take place, return a new Request to allow http_error_30x to perform the redirect. Otherwise, raise HTTPError if no-one else should try to handle this url. Return None if you can't but another Handler might. """ m = req.get_method() if (code in (301, 302, 303, 307) and m in ("GET", "HEAD") or code in (301, 302, 303) and m == "POST"): # Strictly (according to RFC 2616), 301 or 302 in response # to a POST MUST NOT cause a redirection without confirmation # from the user (of urllib2, in this case). In practice, # essentially all clients do redirect in this case, so we # do the same. # be conciliant with URIs containing a space newurl = newurl.replace(' ', '%20') newheaders = dict((k, v) for k, v in req.headers.items() if k.lower() not in ( "content-length", "content-type") ) return urllib2.Request(newurl, headers=newheaders, origin_req_host=req.get_origin_req_host(), unverifiable=True) else: raise urllib2.HTTPError(req.get_full_url(), code, msg, headers, fp) class StreamingHTTPHandler(urllib2.HTTPHandler): """Subclass of `urllib2.HTTPHandler` that uses StreamingHTTPConnection as its http connection class.""" handler_order = urllib2.HTTPHandler.handler_order - 1 def http_open(self, req): """Open a StreamingHTTPConnection for the given request""" return self.do_open(StreamingHTTPConnection, req) def http_request(self, req): """Handle a HTTP request. Make sure that Content-Length is specified if we're using an interable value""" # Make sure that if we're using an iterable object as the request # body, that we've also specified Content-Length if req.has_data(): data = req.get_data() if hasattr(data, 'read') or hasattr(data, 'next'): if not req.has_header('Content-length'): raise ValueError( "No Content-Length specified for iterable body") return urllib2.HTTPHandler.do_request_(self, req) if hasattr(httplib, 'HTTPS'): class StreamingHTTPSConnection(_StreamingHTTPMixin, httplib.HTTPSConnection): """Subclass of `httplib.HTTSConnection` that overrides the `send()` method to support iterable body objects""" class StreamingHTTPSHandler(urllib2.HTTPSHandler): """Subclass of `urllib2.HTTPSHandler` that uses StreamingHTTPSConnection as its http connection class.""" handler_order = urllib2.HTTPSHandler.handler_order - 1 def https_open(self, req): return self.do_open(StreamingHTTPSConnection, req) def https_request(self, req): # Make sure that if we're using an iterable object as the request # body, that we've also specified Content-Length if req.has_data(): data = req.get_data() if hasattr(data, 'read') or hasattr(data, 'next'): if not req.has_header('Content-length'): raise ValueError( "No Content-Length specified for iterable body") return urllib2.HTTPSHandler.do_request_(self, req) def get_handlers(): handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler] if hasattr(httplib, "HTTPS"): handlers.append(StreamingHTTPSHandler) return handlers def register_openers(): """Register the streaming http handlers in the global urllib2 default opener object. Returns the created OpenerDirector object.""" opener = urllib2.build_opener(*get_handlers()) urllib2.install_opener(opener) return opener nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/poster/encode.py0000644000175000017500000003474711647350402031771 0ustar emilienemilien00000000000000"""multipart/form-data encoding module This module provides functions that faciliate encoding name/value pairs as multipart/form-data suitable for a HTTP POST or PUT request. multipart/form-data is the standard way to upload files over HTTP""" __all__ = ['gen_boundary', 'encode_and_quote', 'MultipartParam', 'encode_string', 'encode_file_header', 'get_body_size', 'get_headers', 'multipart_encode'] try: import uuid def gen_boundary(): """Returns a random string to use as the boundary for a message""" return uuid.uuid4().hex except ImportError: import random, sha def gen_boundary(): """Returns a random string to use as the boundary for a message""" bits = random.getrandbits(160) return sha.new(str(bits)).hexdigest() import urllib, re, os, mimetypes try: from email.header import Header except ImportError: # Python 2.4 from email.Header import Header def encode_and_quote(data): """If ``data`` is unicode, return urllib.quote_plus(data.encode("utf-8")) otherwise return urllib.quote_plus(data)""" if data is None: return None if isinstance(data, unicode): data = data.encode("utf-8") return urllib.quote_plus(data) def _strify(s): """If s is a unicode string, encode it to UTF-8 and return the results, otherwise return str(s), or None if s is None""" if s is None: return None if isinstance(s, unicode): return s.encode("utf-8") return str(s) class MultipartParam(object): """Represents a single parameter in a multipart/form-data request ``name`` is the name of this parameter. If ``value`` is set, it must be a string or unicode object to use as the data for this parameter. If ``filename`` is set, it is what to say that this parameter's filename is. Note that this does not have to be the actual filename any local file. If ``filetype`` is set, it is used as the Content-Type for this parameter. If unset it defaults to "text/plain; charset=utf8" If ``filesize`` is set, it specifies the length of the file ``fileobj`` If ``fileobj`` is set, it must be a file-like object that supports .read(). Both ``value`` and ``fileobj`` must not be set, doing so will raise a ValueError assertion. If ``fileobj`` is set, and ``filesize`` is not specified, then the file's size will be determined first by stat'ing ``fileobj``'s file descriptor, and if that fails, by seeking to the end of the file, recording the current position as the size, and then by seeking back to the beginning of the file. ``cb`` is a callable which will be called from iter_encode with (self, current, total), representing the current parameter, current amount transferred, and the total size. """ def __init__(self, name, value=None, filename=None, filetype=None, filesize=None, fileobj=None, cb=None): self.name = Header(name).encode() self.value = _strify(value) if filename is None: self.filename = None else: if isinstance(filename, unicode): # Encode with XML entities self.filename = filename.encode("ascii", "xmlcharrefreplace") else: self.filename = str(filename) self.filename = self.filename.encode("string_escape").\ replace('"', '\\"') self.filetype = _strify(filetype) self.filesize = filesize self.fileobj = fileobj self.cb = cb if self.value is not None and self.fileobj is not None: raise ValueError("Only one of value or fileobj may be specified") if fileobj is not None and filesize is None: # Try and determine the file size try: self.filesize = os.fstat(fileobj.fileno()).st_size except (OSError, AttributeError): try: fileobj.seek(0, 2) self.filesize = fileobj.tell() fileobj.seek(0) except: raise ValueError("Could not determine filesize") def __cmp__(self, other): attrs = ['name', 'value', 'filename', 'filetype', 'filesize', 'fileobj'] myattrs = [getattr(self, a) for a in attrs] oattrs = [getattr(other, a) for a in attrs] return cmp(myattrs, oattrs) def reset(self): if self.fileobj is not None: self.fileobj.seek(0) elif self.value is None: raise ValueError("Don't know how to reset this parameter") @classmethod def from_file(cls, paramname, filename): """Returns a new MultipartParam object constructed from the local file at ``filename``. ``filesize`` is determined by os.path.getsize(``filename``) ``filetype`` is determined by mimetypes.guess_type(``filename``)[0] ``filename`` is set to os.path.basename(``filename``) """ return cls(paramname, filename=os.path.basename(filename), filetype=mimetypes.guess_type(filename)[0], filesize=os.path.getsize(filename), fileobj=open(filename, "rb")) @classmethod def from_params(cls, params): """Returns a list of MultipartParam objects from a sequence of name, value pairs, MultipartParam instances, or from a mapping of names to values The values may be strings or file objects, or MultipartParam objects. MultipartParam object names must match the given names in the name,value pairs or mapping, if applicable.""" if hasattr(params, 'items'): params = params.items() retval = [] for item in params: if isinstance(item, cls): retval.append(item) continue name, value = item if isinstance(value, cls): assert value.name == name retval.append(value) continue if hasattr(value, 'read'): # Looks like a file object filename = getattr(value, 'name', None) if filename is not None: filetype = mimetypes.guess_type(filename)[0] else: filetype = None retval.append(cls(name=name, filename=filename, filetype=filetype, fileobj=value)) else: retval.append(cls(name, value)) return retval def encode_hdr(self, boundary): """Returns the header of the encoding of this parameter""" boundary = encode_and_quote(boundary) headers = ["--%s" % boundary] if self.filename: disposition = 'form-data; name="%s"; filename="%s"' % (self.name, self.filename) else: disposition = 'form-data; name="%s"' % self.name headers.append("Content-Disposition: %s" % disposition) if self.filetype: filetype = self.filetype else: filetype = "text/plain; charset=utf-8" headers.append("Content-Type: %s" % filetype) headers.append("") headers.append("") return "\r\n".join(headers) def encode(self, boundary): """Returns the string encoding of this parameter""" if self.value is None: value = self.fileobj.read() else: value = self.value if re.search("^--%s$" % re.escape(boundary), value, re.M): raise ValueError("boundary found in encoded string") return "%s%s\r\n" % (self.encode_hdr(boundary), value) def iter_encode(self, boundary, blocksize=4096): """Yields the encoding of this parameter If self.fileobj is set, then blocks of ``blocksize`` bytes are read and yielded.""" total = self.get_size(boundary) current = 0 if self.value is not None: block = self.encode(boundary) current += len(block) yield block if self.cb: self.cb(self, current, total) else: block = self.encode_hdr(boundary) current += len(block) yield block if self.cb: self.cb(self, current, total) last_block = "" encoded_boundary = "--%s" % encode_and_quote(boundary) boundary_exp = re.compile("^%s$" % re.escape(encoded_boundary), re.M) while True: block = self.fileobj.read(blocksize) if not block: current += 2 yield "\r\n" if self.cb: self.cb(self, current, total) break last_block += block if boundary_exp.search(last_block): raise ValueError("boundary found in file data") last_block = last_block[-len(encoded_boundary)-2:] current += len(block) yield block if self.cb: self.cb(self, current, total) def get_size(self, boundary): """Returns the size in bytes that this param will be when encoded with the given boundary.""" if self.filesize is not None: valuesize = self.filesize else: valuesize = len(self.value) return len(self.encode_hdr(boundary)) + 2 + valuesize def encode_string(boundary, name, value): """Returns ``name`` and ``value`` encoded as a multipart/form-data variable. ``boundary`` is the boundary string used throughout a single request to separate variables.""" return MultipartParam(name, value).encode(boundary) def encode_file_header(boundary, paramname, filesize, filename=None, filetype=None): """Returns the leading data for a multipart/form-data field that contains file data. ``boundary`` is the boundary string used throughout a single request to separate variables. ``paramname`` is the name of the variable in this request. ``filesize`` is the size of the file data. ``filename`` if specified is the filename to give to this field. This field is only useful to the server for determining the original filename. ``filetype`` if specified is the MIME type of this file. The actual file data should be sent after this header has been sent. """ return MultipartParam(paramname, filesize=filesize, filename=filename, filetype=filetype).encode_hdr(boundary) def get_body_size(params, boundary): """Returns the number of bytes that the multipart/form-data encoding of ``params`` will be.""" size = sum(p.get_size(boundary) for p in MultipartParam.from_params(params)) return size + len(boundary) + 6 def get_headers(params, boundary): """Returns a dictionary with Content-Type and Content-Length headers for the multipart/form-data encoding of ``params``.""" headers = {} boundary = urllib.quote_plus(boundary) headers['Content-Type'] = "multipart/form-data; boundary=%s" % boundary headers['Content-Length'] = str(get_body_size(params, boundary)) return headers class multipart_yielder: def __init__(self, params, boundary, cb): self.params = params self.boundary = boundary self.cb = cb self.i = 0 self.p = None self.param_iter = None self.current = 0 self.total = get_body_size(params, boundary) def __iter__(self): return self def next(self): """generator function to yield multipart/form-data representation of parameters""" if self.param_iter is not None: try: block = self.param_iter.next() self.current += len(block) if self.cb: self.cb(self.p, self.current, self.total) return block except StopIteration: self.p = None self.param_iter = None if self.i is None: raise StopIteration elif self.i >= len(self.params): self.param_iter = None self.p = None self.i = None block = "--%s--\r\n" % self.boundary self.current += len(block) if self.cb: self.cb(self.p, self.current, self.total) return block self.p = self.params[self.i] self.param_iter = self.p.iter_encode(self.boundary) self.i += 1 return self.next() def reset(self): self.i = 0 self.current = 0 for param in self.params: param.reset() def multipart_encode(params, boundary=None, cb=None): """Encode ``params`` as multipart/form-data. ``params`` should be a sequence of (name, value) pairs or MultipartParam objects, or a mapping of names to values. Values are either strings parameter values, or file-like objects to use as the parameter value. The file-like objects must support .read() and either .fileno() or both .seek() and .tell(). If ``boundary`` is set, then it as used as the MIME boundary. Otherwise a randomly generated boundary will be used. In either case, if the boundary string appears in the parameter values a ValueError will be raised. If ``cb`` is set, it should be a callback which will get called as blocks of data are encoded. It will be called with (param, current, total), indicating the current parameter being encoded, the current amount encoded, and the total amount to encode. Returns a tuple of `datagen`, `headers`, where `datagen` is a generator that will yield blocks of data that make up the encoded parameters, and `headers` is a dictionary with the assoicated Content-Type and Content-Length headers. Examples: >>> datagen, headers = multipart_encode( [("key", "value1"), ("key", "value2")] ) >>> s = "".join(datagen) >>> assert "value2" in s and "value1" in s >>> p = MultipartParam("key", "value2") >>> datagen, headers = multipart_encode( [("key", "value1"), p] ) >>> s = "".join(datagen) >>> assert "value2" in s and "value1" in s >>> datagen, headers = multipart_encode( {"key": "value1"} ) >>> s = "".join(datagen) >>> assert "value2" not in s and "value1" in s """ if boundary is None: boundary = gen_boundary() else: boundary = urllib.quote_plus(boundary) headers = get_headers(params, boundary) params = MultipartParam.from_params(params) return multipart_yielder(params, boundary, cb), headers nautilus-image-manipulator-1.3/nautilus_image_manipulator/upload/z_dl_free_fr.py0000644000175000017500000001335512122317642031626 0ustar emilienemilien00000000000000#!/usr/bin/python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import os import urllib2 import HTMLParser import re import logging from gi.repository import GObject from nautilus_image_manipulator.upload.poster.encode import multipart_encode, MultipartParam from nautilus_image_manipulator.upload.poster.streaminghttp import register_openers import BaseUploadSite class UploadSite(BaseUploadSite.BaseUploadSite): def __init__(self): """Determines the upload url for dl.free.fr No real API documentation available, just using the non-JavaScript upload form at http://dl.free.fr/index_nojs.pl""" super(UploadSite, self).__init__() html = urllib2.urlopen('http://dl.free.fr/index_nojs.pl').read() try: (sessionId) = re.search('', html).groups() except AttributeError: # If this exception is raised, fix the previous regex raise BaseUploadSite.UnknownUploadDestinationException() # Build the url to upload to and to retrieve the download and delete links: self.uploadUrl = "http://dl.free.fr/upload.pl?%s" % sessionId self.endUploadUrl = None def upload(self, filename, callback): """Uploads a single file and saves the links to download and delete that file. ``filename`` is the file to upload ``callback`` is the function that updates the progress bar while uploading""" self.send(filename, callback) self.emit("waiting_for_validation") GObject.timeout_add(3000, self.waitForValidation) def waitForValidation(self): """Repeatedly checks the page where the file will be made available, waiting for when it is validated (checked for viruses). Returns the links to download and delete that file.""" logging.debug('checking if file is ready for download') # Retrieve the download page request = urllib2.Request(self.endUploadUrl) downloaded_page = urllib2.urlopen(request).read() # Search for the refresh function that is only present while the # file is not yet ready for download m = re.search('function refresh\(\) { window.location.reload', downloaded_page) if not m: # The file is ready for download, let's extract the relevant URLs logging.debug('file ready for download') try: (downloadPage, deletePage) = re.search('Le fichier sera accessible \à l\'adresse suivante: # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import os from copy import copy from nautilus_image_manipulator.ProfileSettings import Config, Profile import gettext from gettext import gettext as _ gettext.textdomain('nautilus-image-manipulator') configFile = "/tmp/nim-test.config" class TestConfig(object): def test_config(self): """Test the value of the predefined sizes""" size = Config.size assert (640, 640) == size["small"] assert (1280, 1280) == size["large"] def test_init_default(self): """Test the creation of the default configuration""" # Make sure there is no saved profile in /tmp/nim-test.config if os.path.isfile(configFile): os.remove(configFile) assert False == os.path.isfile(configFile) conf = Config(configFile) # There are 5 default profiles assert 5 == len(conf.profiles) # The current version of the profile assert 2 == conf.actualversion # The 1st default profile p = conf.profiles[0] assert p.name == _("Send %(imageSize)s images to %(uploadUrl)s") % {"imageSize": _("small"), "uploadUrl": "1fichier.com"} assert "small" == p.size assert 90 == p.quality assert "upload" == p.destination assert "%s.zip" % _("resized") == p.zipname assert "1fichier.com" == p.url # The 2nd default profile #TODO # The 3rd default profile #TODO # The 4th default profile #TODO # The default custom profile #TODO def test_addprofile(self): # Make sure there is no saved profile in /tmp/nim-test.config if os.path.isfile(configFile): os.remove(configFile) assert False == os.path.isfile(configFile) conf = Config(configFile) # There are 5 default profiles assert 5 == len(conf.profiles) up = "1fichier.com" # Create a new profile that is a copy of the first default profile. # It should be detected as being the same as the first profile. newProfile = copy(conf.profiles[0]) assert 0 == conf.addprofile(newProfile) # Create a new profile that has the same properties as the first # default profile, except that it's size is defined as custom with # the small values. It should be detected as being the same as the # first profile. newProfile = Profile(name=_("Send %(imageSize)s images to %(uploadUrl)s") % { "imageSize": _("small"), "uploadUrl": up}, width=640, height=640, quality=90, destination="upload", zipname="%s.zip" % _("resized"), url=up) assert 0 == conf.addprofile(newProfile) # Create a new profile that is a copy of the first default profile # but has a different quality. The name of both the first and the # new profile will be changed to contain the quality newProfile = copy(conf.profiles[0]) newProfile.quality = 80 assert conf.profiles[0].name == _("Send %(imageSize)s images to %(uploadUrl)s") % {"imageSize": _("small"), "uploadUrl": up} assert 4 == conf.addprofile(newProfile) pname = _("Send %(imageSize)s images to %(uploadUrl)s") + " " + _("(%d%% quality)") pname = pname.replace("%d%%", "%(quality)d%%") assert conf.profiles[0].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} # Create a new profile that is a copy of the first default profile # but has yet another quality. The name of the first, fifth and the # new profile will be changed to contain the quality newProfile = copy(conf.profiles[0]) newProfile.quality = 70 assert conf.profiles[0].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} assert 5 == conf.addprofile(newProfile) assert conf.profiles[0].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} assert conf.profiles[5].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 70} # Create a new profile that is a copy of the first default profile # that has the same quality but a very large size. The name of the # first, fifth and sixth profiles should still be changed to contain # the quality, but the name of the new profile should be the default newProfile = copy(conf.profiles[0]) newProfile.size = None newProfile.width = 2000 newProfile.height = 2000 newProfile.createname(setSelf=True) assert conf.profiles[0].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} assert conf.profiles[5].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 70} assert 6 == conf.addprofile(newProfile) assert conf.profiles[0].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} assert conf.profiles[5].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 70} assert conf.profiles[6].createname() == conf.profiles[6].name # Create a new profile that is a copy of the first default profile # that has the same quality and a size that's just one pixel less. # The default name should be the same, so both quality and size will # be added to the name of the first and eighth profiles newProfile = copy(conf.profiles[0]) newProfile.size = None newProfile.width = 639 newProfile.height = 640 newProfile.createname(setSelf=True) assert conf.profiles[0].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} assert conf.profiles[5].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 70} assert conf.profiles[6].createname() == conf.profiles[6].name assert 7 == conf.addprofile(newProfile) assert conf.profiles[0].name == pname % {"imageSize": _("small") + " (640x640)", "uploadUrl": up, "quality": 90} assert conf.profiles[4].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 80} assert conf.profiles[5].name == pname % {"imageSize": _("small"), "uploadUrl": up, "quality": 70} assert conf.profiles[6].createname() == conf.profiles[6].name assert conf.profiles[7].name == pname % {"imageSize": _("small") + " (639x640)", "uploadUrl": up, "quality": 90} def test_deleteprofile(self): # Make sure there is no saved profile in /tmp/nim-test.config if os.path.isfile(configFile): os.remove(configFile) assert False == os.path.isfile(configFile) conf = Config(configFile) # There are 5 default profiles assert 5 == len(conf.profiles) # Keep pointers to the third and fourth profiles p2 = conf.profiles[2] p3 = conf.profiles[3] assert True == conf.deleteprofile(2) # There are now 4 profiles assert 4 == len(conf.profiles) # The original third profile is not part of the list anymore assert p2 != conf.profiles[2] # The profile that's now third was originally the fourth assert p3 == conf.profiles[2] # It's not possible to delete the last profile (custom settings) assert False == conf.deleteprofile(3) # There are still 4 profiles assert 4 == len(conf.profiles) def test_defaultfileoperations(self): oldconfigfile = os.path.expanduser("~/.nautilus-image-manipulator.ini") # Make sure the file is not present to start with assert False == os.path.isfile(oldconfigfile) # "Touch" the file, i.e. make an empty file with file(oldconfigfile, 'a'): os.utime(oldconfigfile, None) assert True == os.path.isfile(oldconfigfile) # Use a file in a folder that never exists so that the code for # creating the default profiles is executed, and the new folder is # created dummyconfigfile = "/tmp/nim-test-dummy/file-that-never-exists.config" if os.path.isdir(os.path.dirname(dummyconfigfile)): os.rmdir(os.path.dirname(dummyconfigfile)) assert False == os.path.isdir(os.path.dirname(dummyconfigfile)) conf = Config(dummyconfigfile) # The old config file has been deleted assert False == os.path.isfile(oldconfigfile) # The folder has been created assert True == os.path.isdir(os.path.dirname(dummyconfigfile)) # Leave the system clean by deleting the newly created dummy folder os.rmdir(os.path.dirname(dummyconfigfile)) def test_write(self): # Make sure there is no saved profile in /tmp/nim-test.config if os.path.isfile(configFile): os.remove(configFile) assert False == os.path.isfile(configFile) conf = Config(configFile) # There are 5 default profiles assert 5 == len(conf.profiles) # The config file doesn't exist on disk assert False == os.path.isfile(configFile) # Create a profile with percent and appendstring newProfile = Profile(percent=50, quality=90, destination="append", appendstring=_("resized")) assert 4 == conf.addprofile(newProfile) # Save the file to disk conf.write() # The config file now exists on disk assert True == os.path.isfile(configFile) def test_xxlast_read(self): # Make sure there *is* a saved profile in /tmp/nim-test.config assert True == os.path.isfile(configFile) conf = Config(configFile) # There are 6 profiles in the saved config file assert 6 == len(conf.profiles) assert conf.profiles[0].name == _("Send %(imageSize)s images to %(uploadUrl)s") % {"imageSize": _("small"), "uploadUrl": "1fichier.com"} assert _("Create %(imageSize)s images and append \"%(appendString)s\"") % { "imageSize": _("%d%% resized") % 50, "appendString": _("resized")} == conf.profiles[4].name assert _("Custom settings") == conf.profiles[5].name # Test with an invalid config file assert True == os.path.isfile(configFile) with open(configFile) as f: read_data = f.read() read_data = read_data.replace("[General]", "[Invalid First Section]") with open(configFile, 'w') as f: f.write(read_data) # This will result in the default profiles being loaded conf = Config(configFile) # There are only 5 profiles, i.e. the default profiles assert 5 == len(conf.profiles) # Test with an empty config file # Make sure there is no saved profile in /tmp/nim-test.config if os.path.isfile(configFile): os.remove(configFile) assert False == os.path.isfile(configFile) # "Touch" the file, i.e. make an empty file with file(configFile, 'a'): os.utime(configFile, None) assert True == os.path.isfile(configFile) # This will result in the default profiles being loaded conf = Config(configFile) # There are only 5 profiles, i.e. the default profiles assert 5 == len(conf.profiles) def test_zipfilename(self): """Create different upload profiles and test the zipfile's name""" # Clean zipname newProfile = Profile(percent=50, quality=90, destination="upload", zipname="test.zip") assert "test.zip" == newProfile.zipname # Name without ".zip" newProfile = Profile(percent=50, quality=90, destination="upload", zipname="test") assert "test.zip" == newProfile.zipname # Name without ".zip" (not so nice) newProfile = Profile(percent=50, quality=90, destination="upload", zipname="test.zi") assert "test.zi.zip" == newProfile.zipname # Name without ".zip" (not so nice) newProfile = Profile(percent=50, quality=90, destination="upload", zipname=" test.zip ") assert "test.zip" == newProfile.zipname # Name starting with a non-alphabetic character newProfile = Profile(percent=50, quality=90, destination="upload", zipname="&test.zip") assert "test.zip" == newProfile.zipname # Name starting with a non-alphabetic character newProfile = Profile(percent=50, quality=90, destination="upload", zipname=",test.zip") assert "test.zip" == newProfile.zipname nautilus-image-manipulator-1.3/tests/TestPoster.py0000644000175000017500000000217512122317650023554 0ustar emilienemilien00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE from nautilus_image_manipulator.upload.poster import version as poster_version class TestPoster(object): def test_version(self): # Make sure Poster's version is new enough. Versions before 0.8.0 # contain a bug that make it unusable for our purpose. # See https://bitbucket.org/chrisatlee/poster/changeset/8d102e3679cf assert (0, 8, 0) <= poster_version nautilus-image-manipulator-1.3/tests/TestImageManipulations.py0000644000175000017500000000410412122317650026060 0ustar emilienemilien00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE from nose.tools import raises from gi.repository import GObject from nautilus_image_manipulator.ImageManipulations import ImageManipulations from nautilus_image_manipulator.ProfileSettings import Profile class TestImageManipulations(object): def test_init(self): files = ["/tmp/nim-test-dummy2/nonexisting.jpg"] p = Profile(percent=50, quality=90, destination="folder", foldername="blabla") # Verify that the subdirectory name input is properly cleaned im = ImageManipulations(None, files, p) assert "blabla" == p.foldername p.foldername = "bla/bla" im = ImageManipulations(None, files, p) assert "bla/bla" == p.foldername p.foldername = "/bla/bla/" im = ImageManipulations(None, files, p) assert "bla/bla" == p.foldername @raises(IOError) def test_resize_one_image_nonexisting(self): """Resizing a non existing image throws an exception""" files = ["/tmp/nim-test-dummy2/nonexisting.jpg"] p = Profile(percent=50, quality=90, destination="folder", foldername="blabla") im = ImageManipulations(None, files, p) im.resize_one_image(files[0]) nautilus-image-manipulator-1.3/COPYING0000644000175000017500000010437411647106610020766 0ustar emilienemilien00000000000000 GNU GENERAL PUBLIC LICENSE Version 3, 29 June 2007 Copyright (C) 2007 Free Software Foundation, Inc. Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. Preamble The GNU General Public License is a free, copyleft license for software and other kinds of works. The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. The precise terms and conditions for copying, distribution and modification follow. TERMS AND CONDITIONS 0. Definitions. "This License" refers to version 3 of the GNU General Public License. "Copyright" also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. "The Program" refers to any copyrightable work licensed under this License. Each licensee is addressed as "you". "Licensees" and "recipients" may be individuals or organizations. To "modify" a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a "modified version" of the earlier work or a work "based on" the earlier work. A "covered work" means either the unmodified Program or a work based on the Program. To "propagate" a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. To "convey" a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. An interactive user interface displays "Appropriate Legal Notices" to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. 1. Source Code. The "source code" for a work means the preferred form of the work for making modifications to it. "Object code" means any non-source form of a work. A "Standard Interface" means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. The "System Libraries" of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A "Major Component", in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. The "Corresponding Source" for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. The Corresponding Source for a work in source code form is that same work. 2. Basic Permissions. All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. 3. Protecting Users' Legal Rights From Anti-Circumvention Law. No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. 4. Conveying Verbatim Copies. You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. 5. Conveying Modified Source Versions. You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: a) The work must carry prominent notices stating that you modified it, and giving a relevant date. b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to "keep intact all notices". c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an "aggregate" if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. 6. Conveying Non-Source Forms. You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. A "User Product" is either (1) a "consumer product", which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, "normally used" refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. "Installation Information" for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. 7. Additional Terms. "Additional permissions" are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or d) Limiting the use for publicity purposes of names of licensors or authors of the material; or e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. All other non-permissive additional terms are considered "further restrictions" within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. 8. Termination. You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. 9. Acceptance Not Required for Having Copies. You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. 10. Automatic Licensing of Downstream Recipients. Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. An "entity transaction" is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. 11. Patents. A "contributor" is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's "contributor version". A contributor's "essential patent claims" are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, "control" includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. In the following three paragraphs, a "patent license" is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To "grant" such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. "Knowingly relying" means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. A patent license is "discriminatory" if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. 12. No Surrender of Others' Freedom. If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. 13. Use with the GNU Affero General Public License. Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. 14. Revised Versions of this License. The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. 15. Disclaimer of Warranty. THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 16. Limitation of Liability. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. 17. Interpretation of Sections 15 and 16. If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. END OF TERMS AND CONDITIONS How to Apply These Terms to Your New Programs If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found. Copyright (C) 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 3 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, see . Also add information on how to contact you by electronic and paper mail. If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: Copyright (C) This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an "about box". You should also get your employer (if you work as a programmer) or school, if any, to sign a "copyright disclaimer" for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . nautilus-image-manipulator-1.3/setup.py0000644000175000017500000000647712134312072021443 0ustar emilienemilien00000000000000#!/usr/bin/env python # -*- coding: utf-8 -*- ### BEGIN LICENSE # Copyright (C) 2010-2013 Emilien Klein # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License version 3, as published # by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, but # WITHOUT ANY WARRANTY; without even the implied warranties of # MERCHANTABILITY, SATISFACTORY QUALITY, 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, see . ### END LICENSE import os import sys try: import DistUtilsExtra.auto except ImportError: print >> sys.stderr, 'To build nautilus-image-manipulator you need https://launchpad.net/python-distutils-extra' sys.exit(1) assert DistUtilsExtra.auto.__version__ >= '2.18', 'needs DistUtilsExtra.auto >= 2.18' def update_data_path(prefix, oldvalue=None): try: fin = file('nautilus_image_manipulator/nautilus_image_manipulatorconfig.py', 'r') fout = file(fin.name + '.new', 'w') for line in fin: fields = line.split(' = ') # Separate variable from value if fields[0] == '__nautilus_image_manipulator_data_directory__': # update to prefix, store oldvalue if not oldvalue: oldvalue = fields[1] line = "%s = '%s'\n" % (fields[0], prefix) else: # restore oldvalue line = "%s = %s" % (fields[0], oldvalue) fout.write(line) fout.flush() fout.close() fin.close() os.rename(fout.name, fin.name) except (OSError, IOError), e: print ("ERROR: Can't find nautilus_image_manipulator/nautilus_image_manipulatorconfig.py") sys.exit(1) return oldvalue class InstallAndUpdateDataDirectory(DistUtilsExtra.auto.install_auto): def run(self): previous_value = update_data_path(self.prefix + '/share/nautilus-image-manipulator/') DistUtilsExtra.auto.install_auto.run(self) update_data_path(self.prefix, previous_value) def nautilus_plugin(): files = [] files.append(('share/nautilus-python/extensions', ['nautilus_image_manipulator/nautilus-image-manipulator-extension.py'])) return files DistUtilsExtra.auto.setup( name='nautilus-image-manipulator', version='1.3', license='GPL-3', author='Emilien Klein', author_email='emilien _AT_ klein _DOT_ st', description='Resize and send images from Nautilus', long_description="""This Nautilus extension lets you resize images and send them to friends and family, right from Nautilus. Just right-click on any photo or group of photos, and an option will appear that launches Nautilus Image Manipulator. A set of default settings make it easy to quickly resize pictures. You can also easily create your own profiles for later reuse.""", url='https://launchpad.net/nautilus-image-manipulator', packages=["nautilus_image_manipulator", "nautilus_image_manipulator.upload", "nautilus_image_manipulator.upload.poster"], data_files=nautilus_plugin(), cmdclass={'install': InstallAndUpdateDataDirectory} ) nautilus-image-manipulator-1.3/po/0000775000175000017500000000000012134312450020333 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/po/ast.po0000644000175000017500000003364712121046414021475 0ustar emilienemilien00000000000000# Asturian translation for nautilus-image-manipulator # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-17 23:24+0100\n" "PO-Revision-Date: 2013-02-18 06:51+0000\n" "Last-Translator: Emilien Klein \n" "Language-Team: Asturian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-02-19 20:12+0000\n" "X-Generator: Launchpad (build 16491)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Preferencies personales" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "Escribi'l nome de la carpeta." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "Por favor, escribi un testu p'añader al nome del ficheru." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "La cadena a amestar nun pue acabar en %s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "Escribi'l nome del ficheru zip." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "Les imaxes nun s'unviaron, pero tan comprimíes nesti archivu:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "La imaxe nun s'unvió, pero se redimensionó correutamente.\n" "Puedes alcontrala en %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "El sitiu escoyíu pa la xubida %(site_name)s nun ye válidu." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Por favor, informa en Launchpad del fallu" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "Nun se pudo contautar col sitiu de xubida %(site_name)s ; por favor, " "comprueba la to conexón a Internet." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Xubiendo imaxes..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "Atención: cuanto menor calidá, más estropiaes tarán les imaxes" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Determina la calidá de les imaxes redimensionaes (cuanto mayor calidá, mayor " "tamañu de la imaxe)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Calidá:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "redimensionaes" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Parámetros non válidos" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "_Saltar" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "_Reintentar" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Nun se pudo camudar el tamañu de la imaxe \"%(image)s\".\n" "\n" "Comprueba que tienes permisu pa escribir nesta carpeta:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Nun se pudo redimensionar la imaxe" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "amosar mensaxes de depuración" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "el ficheru a redimensionar. Usa argumentos múltiples pa redimensionar varios " "ficheros." #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Redimensionar la imaxe" msgstr[1] "_Redimensionar imaxes" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator necesita que-y des una llista d'imaxes a " "redimensionar.\n" "Calca col botón drechu nuna imaxe y seleiciona la opción " "\"%(resizeImages)s\"." #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Nun se dieron imaxes" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Redimensionando imaxes..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Empaquetando imaxes..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Unviar %(imageSize)s d'imaxes a %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "pequeñes" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Crear %(imageSize)s d'imaxes na carpeta \"%(directoryName)s\"" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "grandes" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "redimensionaes al %d%%" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "muy pequeñes" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "medianes" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "mui grandes" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Crear imaxes %(imageSize)s y amestar \"%(appendString)s\"" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(calidá %d%%)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Perfil ensin nome" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Guardar nuna carpeta" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Renomar" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Xubir a un sitiu web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Redimensionar imaxes" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Tamañu de la imaxe" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Pequeñu" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Grande" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Personalizáu" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Anchor máximu de les imaxes redimensionaes, en pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Anchor:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Altor máximu de les imaxes redimensionaes, en pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Altor:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Porcentaxe del tamañu de la imaxe orixinal" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Escalar:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Destín" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "Nome de la carpeta na que se guardarán les imaxes redimensionaes" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Nome de la carpeta:" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "Esti valor s'añaderá enantes de la estensión d'imaxe" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "Amestar al nome del ficheru:" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "Les imaxes redimensionaes se comprimirán xuntes nesti ficheru zip" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "Nome del ficheru zip:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "El ficheru zip que contien les imaxes redimensionaes se xubirá a esti sitiu " "web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "Xubir les imaxes redimensionaes a:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "¡Hebo un error!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "¡Imaxes unviadas correutamente!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "Descargar url:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Desaniciar url:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "Desaniciar esti perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "Guardar como perfil nuevu" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "Crear un perfil nuevu con estes preferencies" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "Redimensionar" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Redimensionar la imaxe esbillada" msgstr[1] "Redimensionar cada imaxe esbillada" nautilus-image-manipulator-1.3/po/fr.po0000644000175000017500000003630212122670113021304 0ustar emilienemilien00000000000000# French translation for nautilus-image-manipulator # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-03-21 18:13+0100\n" "PO-Revision-Date: 2013-03-21 20:27+0000\n" "Last-Translator: Emilien Klein \n" "Language-Team: French \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2013-03-21 20:40+0000\n" "X-Generator: Launchpad (build 16532)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:99 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Paramètres personnalisés" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:134 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:30 #, no-c-format, python-format msgid "The string to append cannot end in %s" msgstr "Le texte à ajouter ne peut pas se terminer en %s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:183 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "Le site d'hébergement sélectionné %(site_name)s n'est pas valide." #. Impossible to contact the website (no network, site down, etc.) #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:190 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "Le site d'hébergement %(site_name)s n'a pas pu être contacté, veuillez " "vérifier votre connexion Internet." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:193 #, python-format msgid "" "The upload destination for %(site_name)s could not be determined, please " "report a bug so that this can be fixed." msgstr "" "La destination d'envoi pour %(site_name)s n'a pas pu être déterminée, " "veuillez signaler un bug afin que nous puissions corriger cela." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:196 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:247 msgid "Uploading images..." msgstr "Envoi des images..." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 msgid "" "The page where your file can be downloaded from could not be determined." msgstr "" "La page depuis laquelle votre fichier peut être téléchargé n'a pu être " "déterminée." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 msgid "Please try again, and report a bug if it happens again." msgstr "Veuillez réessayer, et signaler un bug si ça se reproduit." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 #, python-format msgid "" "Your images were successfully uploaded to %(site_name)s, but their " "verification failed." msgstr "" "Vos images ont bien été envoyées vers %(site_name)s, mais leur vérification " "a échoué." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:215 msgid "Your images have been zipped together into this file:" msgstr "Vos images ont été compressées dans ce fichier :" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:217 #, python-format msgid "You can find your image at %(filename)s" msgstr "Vous pouvez trouver votre image dans %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:231 msgid "Please file a bug report on Launchpad" msgstr "Veuillez soumettre un rapport de bogue sur Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:262 msgid "Waiting for validation..." msgstr "En attente de validation..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" "Attention: plus la qualité est faible, plus les images seront détériorées" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:474 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Détermine la qualité des images redimensionnées (plus la qualité est élevé, " "plus la taille des images est grande)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:476 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Qualité :" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:489 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:497 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:505 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "redimensionné" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:521 msgid "Invalid parameters" msgstr "Paramètres invalides" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:535 msgid "_Skip" msgstr "_Ignorer" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:537 msgid "_Retry" msgstr "_Ré-essayer" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:538 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "L'image \"%(image)s\" n'a pas pu être redimensionnée.\n" "\n" "Veuillez vérifier que vous avez le droit d'écrire dans ce dossier :\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:540 msgid "Could not resize image" msgstr "L'image n'a pas pu être redimensionnée" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "afficher les messages de débogage" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "un fichier à redimensionner. Utiliser des arguments multiples pour " "redimensionner de multiples fichiers." #: ../bin/nautilus-image-manipulator.py:68 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Redimensionner l'image" msgstr[1] "_Redimensionner les images" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:70 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator a besoin de recevoir une liste d'images à " "redimensionner.\n" "Veuillez cliquer-droit sur une image et sélectionner l'option " "\"%(resizeImages)s\"." #: ../bin/nautilus-image-manipulator.py:72 msgid "No images provided" msgstr "Aucune image fournie" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Redimensionnement des images..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Empaquetage des images..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Envoyer de %(imageSize)s images à %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "petites" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Créer de %(imageSize)s images dans le dossier \"%(directoryName)s\"" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "grandes" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "redimensionnées à %d%%" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "très petites" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "moyennes" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "très grandes" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Créer des images %(imageSize)s et rajouter \"%(appendString)s\"" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(qualité %d%%)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Profil sans nom" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Enregistrer dans un dossier" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Renommer" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Envoyer vers un site web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Redimensionner les images" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Taille des images" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Petit" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Grand" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Personnalisé" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Largeur maximale des images, en pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Largeur :" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Hauteur maximale des images, en pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Hauteur :" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Pourcentage de la taille originale des images" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Échelle :" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Destination" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" "Nom du dossier dans lequel les images redimensionnées seront enregistrées" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Nom du dossier :" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:24 msgid "Please enter the name of the folder." msgstr "Veuillez entrer le nom du dossier." #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "This value will be appended before the image extension" msgstr "Cette valeur sera rajoutée au nom de fichier avant l'extension" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:27 msgid "Append to filename:" msgstr "Rajouter au nom de fichier :" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "Please enter some text to append to the filename." msgstr "Veuillez entrer le texte à ajouter au nom du fichier." #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "The resized images will be compressed together into this zip file" msgstr "Les images redimensionnées seront compressées dans ce fichier zip" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "Name of the zip file:" msgstr "Nom du fichier zip :" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "Le fichier zip contenant les images redimensionnées sera envoyé vers ce site" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Upload the resized images to:" msgstr "Envoyer les images redimensionnées vers :" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Please enter the name of the zip file." msgstr "Veuillez entrer le nom du fichier zip." #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "An error occurred!" msgstr "Une erreur est survenue !" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Images successfully uploaded!" msgstr "Les images ont été envoyées avec succès !" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Download url:" msgstr "Adresse de téléchargement :" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:41 msgid "Delete url:" msgstr "Adresse de suppression :" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:42 msgid "Delete this profile" msgstr "Supprimer ce profil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:43 msgid "Save as a new profile" msgstr "Créer un nouveau profil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:44 msgid "Create a new profile based on these settings" msgstr "Créer un nouveau profil à partir de ces paramètres" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:45 msgid "Resize" msgstr "Redimensionner" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Redimensionner l'image sélectionnée" msgstr[1] "Redimensionner chaque image sélectionnée" nautilus-image-manipulator-1.3/po/pt_BR.po0000644000175000017500000003427112121046414021706 0ustar emilienemilien00000000000000# Brazilian Portuguese translation for nautilus-image-manipulator # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-17 23:24+0100\n" "PO-Revision-Date: 2013-02-18 06:43+0000\n" "Last-Translator: Emilien Klein \n" "Language-Team: Brazilian Portuguese \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" "X-Launchpad-Export-Date: 2013-02-19 20:12+0000\n" "X-Generator: Launchpad (build 16491)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Configurações personalizadas" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "Por favor, insira o nome da pasta." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "" "Por favor, insira algum texto para adicionar ao final do nome de arquivo." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "A frase a ser adicionada não pode terminar em %s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "Por favor, insira o nome do arquivo zip." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "Suas imagens não foram enviadas, contudo, elas foram compactadas neste " "arquivo:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "Sua imagem não foi enviada, contudo, foi redimensionada com sucesso.\n" "Você pode encontrá-la em %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "O website selecionado para envio %(site_name)s não é válido." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Por favor, abra uma notificação de bug no Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "O website de envio %(site_name)s não pôde ser contactado, por favor, " "verifique a sua conexão de internet." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Fazendo upload das imagens..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" "Atenção: quanto menor a qualidade, mais deterioradas as imagens ficarão" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Determina a qualidade das imagens redimensionadas (quanto maior a qualidade, " "maior o tamanho do arquivo de imagem)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Qualidade:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "redimensionado" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Parâmetros inválidos" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "_Ignorar" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "_Repetir" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "A imagem \"%(image)s\" não pôde ser redimensionada.\n" "\n" "Verifique se você possui permissão de escrita nesta pasta:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Não foi possível redimensionar a imagem" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "exibir mensagens de debug" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "um arquivo para ser redimensionado. Use argumentos múltiplos para " "redimensionar múltiplos arquivos." #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Redimensionar imagem" msgstr[1] "_Redimensionar imagens" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "O \"Manipulador de Imagens do Nautilus\" necessita que uma lista de imagens " "(a serem redimensionadas) seja fornecida.\n" "Por favor, clique com o botão direito do mouse em uma imagem e selecione a " "opção \"%(resizeImages)s\"." #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Nenhuma imagem foi fornecida" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Redimensionando imagens..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Criando pacote com imagens..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Enviar %(imageSize)s imagens para %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "pequenas" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Criar imagens %(imageSize)s na pasta \"%(directoryName)s\"" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "grandes" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "%d%% redimensionadas" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "muito pequenas" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "médias" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "muito grandes" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Criar imagens %(imageSize)s e adicionar \"%(appendString)s\"" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(%d%% de qualidade)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Perfil sem nome" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Salvar em uma pasta" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Renomear" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Enviar para um website" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Redimensionar imagens" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Tamanho da Imagem" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Pequeno" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Grande" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Personalizado" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Largura máxima das imagens redimensionadas, em pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Largura:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Altura máxima das imagens redimensionadas, em pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Altura:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Porcentagem do tamanho original da imagem" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Escala:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Destino" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "Nome da pasta na qual as imagens redimensionadas serão salvas" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Nome da pasta:" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "Este valor será anexado antes da extensão da imagem" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "Adicionar ao nome do arquivo:" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "As imagens redimensionadas serão compactadas em um único arquivo zip" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "Nome do arquivo zip:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "O arquivo zip contendo as imagens redimensionadas será enviado para este " "website" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "Enviar as imagens redimensionadas para:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "Ocorreu um erro!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "As imagens foram enviadas com sucesso!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "Endereço de download:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Apagar url:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "Apagar este perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "Salvar como novo perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "Criar um novo perfil baseado nestas configurações" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "Redimensionar" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Redimensionar a imagem selecionada" msgstr[1] "Redimensionar as imagens selecionadas" nautilus-image-manipulator-1.3/po/el.po0000644000175000017500000003354712121046414021305 0ustar emilienemilien00000000000000# Greek translation for nautilus-image-manipulator # Copyright (c) 2010 Rosetta Contributors and Canonical Ltd 2010 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2010. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-17 23:24+0100\n" "PO-Revision-Date: 2011-02-13 16:27+0000\n" "Last-Translator: Stefanos Kariotidis \n" "Language-Team: Greek \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-02-19 20:12+0000\n" "X-Generator: Launchpad (build 16491)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "Παρακαλώ εισάγετε κείμενο για προσάρτηση στο όνομα του αρχείου." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "Οι εικόνες σας δεν έχουν αποσταλλεί, αλλά έχουν συμπιεσθεί σε αυτό το " "αρχείο:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "Οι εικόνες σας δεν έχουν αποσταλλεί, αλλά έχουν επιτυχώς αλλάξει μέγεθος.\n" "Μπορείτε να τις βρείτε στο %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "" "Ο επιλεγμένος ιστοτόπος για μεταφόρτωση %(site_name)s δεν είναι έγκυρος." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Παρακαλώ αρχειοθετήστε το λάθος στο Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "Ο ιστοτόπος %(site_name)s για την μεταφόρτωση δεν ηταν διαθέσιμος, παρακαλώ " "ελέγξτε την σύνδεση σας στο διαδίκτυο." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Μεταφόρτωση εικόνων..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "με αλλαγή μεγέθους" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Μη έγκυρες παραμέτροι" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "_Παράλειψη" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "Επα_νάληψη" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Δεν μπόρεσε να γίνει αλλαγή μεγέθους της εικόνας \"%(image)s\".\n" "Ελέγξτε αν έχετε άδεια να γράψετε σε αυτόν τον φάκελο:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Δεν μπόρεσε να γίνει αλλαγή μεγέθους της εικόνας" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "δείξε μηνύματα λαθών" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "αρχείο προς αλλαγή μεγέθους. Χρησιμοποιήστε πολλαπλές τιμές για αλλαγή " "μεγέθους σε πολλά αρχεία." #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "" msgstr[1] "" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Ο Nautilus Image Manipulator χρειάζεται μία λίστα με αρχεία εικόνων για τη " "μετατροπή του μεγέθους τους.\n" "Παρακαλώ κάντε δεξί κλικ σε ένα αρχείο εικόνας και επιλέξτε την " "\"%(resizeImages)s\" επιλογή." #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Δέν έχουν επιλεχθεί εικόνες" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Αλλαγή μεγέθους των εικόνων..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Συσκευασία εικόνων..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Αλλαγή μεγέθους εικόνων" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Μέγεθος Εικόνας" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Πλάτος:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Ύψος:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Κλίμακα:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "" "Αυτή η τιμή πρέπει να εισαχθεί πρίν απο την επέκταση του αρχείου εικόνας" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "Έχει προκύψει κάποιο λάθος!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "Οι εικόνες έχουν μεταφορτωθεί με επιτυχία!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "Διεύθυνση Ιστού για Μεταφόρτωση:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Διαγραφή διεύθυνσης ιστοτόπου" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "" msgstr[1] "" nautilus-image-manipulator-1.3/po/nl.po0000644000175000017500000003574712122670112021321 0ustar emilienemilien00000000000000# Dutch translation for nautilus-image-manipulator # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-03-21 18:13+0100\n" "PO-Revision-Date: 2013-03-21 20:35+0000\n" "Last-Translator: Emilien Klein \n" "Language-Team: Dutch \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-03-21 20:40+0000\n" "X-Generator: Launchpad (build 16532)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:99 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Persoonlijke instellingen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:134 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:30 #, no-c-format, python-format msgid "The string to append cannot end in %s" msgstr "" "De tekst dat aan de bestandsnaam toegevoegd wordt kan niet in %s eindigen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:183 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "De geselecteerde upload site %(site_name)s is niet geldig." #. Impossible to contact the website (no network, site down, etc.) #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:190 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "De upload site %(site_name)s kon niet worden gecontacteerd, controleer uw " "internet verbinding." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:193 #, python-format msgid "" "The upload destination for %(site_name)s could not be determined, please " "report a bug so that this can be fixed." msgstr "" "De upload bestemming voor %(site_name)s kon niet worden bepaald, meldt een " "bug aan zodat dit opgelost kan worden." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:196 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:247 msgid "Uploading images..." msgstr "Beelden aan het uploaden..." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 msgid "" "The page where your file can be downloaded from could not be determined." msgstr "" "De pagina waar uw bestand gedownload kan worden kon niet worden vastgesteld." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 msgid "Please try again, and report a bug if it happens again." msgstr "Probeer het opnieuw, en rapporteer een bug als het opnieuw gebeurt." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 #, python-format msgid "" "Your images were successfully uploaded to %(site_name)s, but their " "verification failed." msgstr "" "Uw afbeeldingen zijn succesvol naar %(site_name)s geüpload, maar hun " "verificatie mislukte." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:215 msgid "Your images have been zipped together into this file:" msgstr "Uw beelden zijn in dit bestand gezipt:" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:217 #, python-format msgid "You can find your image at %(filename)s" msgstr "U kunt uw afbeelding in %(filename)s vinden" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:231 msgid "Please file a bug report on Launchpad" msgstr "Gelieve een bug report op Launchpad in te dienen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:262 msgid "Waiting for validation..." msgstr "Wachtend op goedkeuring..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "Let op: hoe lager de kwaliteit, hoe slechter de beelden zullen zijn" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:474 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Bepaalt de kwaliteit van de verkleinde foto's (hoe hoger de kwaliteit, hoe " "groter de beeldgrootte)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:476 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Kwaliteit:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:489 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:497 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:505 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "aangepast" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:521 msgid "Invalid parameters" msgstr "Ongeldige parameters" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:535 msgid "_Skip" msgstr "Over_slaan" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:537 msgid "_Retry" msgstr "Opnieuw p_roberen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:538 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Het beeld \"%(image)s\" kon niet verkleind worden\n" "\n" "Controleer of u de rechten heeft om in deze map te kunnen schrijven:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:540 msgid "Could not resize image" msgstr "Kon het beeld niet verkleinen" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "debug berichten tonen" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "een te verkleinen bestand. Gebruik meerdere argumenten om meerdere bestanden " "te verkleinen." #: ../bin/nautilus-image-manipulator.py:68 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "Beeld ve_rkleinen" msgstr[1] "Beelden ve_rkleinen" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:70 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator dient te worden voorzien van een lijst van aan te " "passen afbeeldingen.\n" "Klik met de rechtermuisknop op een afbeelding en selecteer de " "\"%(resizeImages)s\" optie." #: ../bin/nautilus-image-manipulator.py:72 msgid "No images provided" msgstr "Geen beelden aangeboden" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Beelden aan het verkleinen..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Beelden aan het verpakken..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Stuur %(imageSize)s foto's naar %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "kleine" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Maak %(imageSize)s foto's in de \"%(directoryName)s\" map" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "grote" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "%d%% aangepaste" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "zeer kleine" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "medium" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "zeer grote" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Maak %(imageSize)s foto's en voeg \"%(appendString)s\" toe" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(%d%% kwaliteit)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Naamloos profiel" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "In een map opslaan" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Hernoemen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Upload naar een website" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Beelden verkleinen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Afbeeldingsgrootte" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Klein" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Groot" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Op maat" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Maximale breedte van de aangepaste afbeeldingen, in pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Breedte:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Maximale hoogte van de aangepaste afbeeldingen, in pixels" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Hoogte:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Percentage van het originele beeldformaat" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Schalen:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Bestemming" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "Naam van de map waarin de verkleinde foto's zullen worden opgeslagen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Naam van de map:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:24 msgid "Please enter the name of the folder." msgstr "Vul de naam in van de map." #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "This value will be appended before the image extension" msgstr "Deze waarde zal voor het beeld extensie worden toegevoegd" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:27 msgid "Append to filename:" msgstr "Toevoegen aan bestandsnaam:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "Please enter some text to append to the filename." msgstr "Voer wat tekst in om toe te voegen aan de bestandsnaam." #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "The resized images will be compressed together into this zip file" msgstr "De verkleinde foto's worden samen in dit zip-bestand gecomprimeerd" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "Name of the zip file:" msgstr "Naam van het zip-bestand:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "Het zip-bestand met de verkleinde foto's wordt naar deze website geüpload" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Upload the resized images to:" msgstr "Upload de verkleinde foto's naar:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Please enter the name of the zip file." msgstr "Vul de naam in van het zip-bestand." #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "An error occurred!" msgstr "Er is een fout opgetreden!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Images successfully uploaded!" msgstr "Beelden geüpload!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Download url:" msgstr "Download adres:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:41 msgid "Delete url:" msgstr "Adres om bestand te wissen:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:42 msgid "Delete this profile" msgstr "Verwijder dit profiel" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:43 msgid "Save as a new profile" msgstr "Opslaan als een nieuw profiel" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:44 msgid "Create a new profile based on these settings" msgstr "Maak een nieuw profiel aan op basis van deze instellingen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:45 msgid "Resize" msgstr "Schalen" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "De geselecteerde afbeelding verkleinen" msgstr[1] "Elke geselecteerde afbeelding verkleinen" nautilus-image-manipulator-1.3/po/de.po0000644000175000017500000003445512121046414021274 0ustar emilienemilien00000000000000# German translation for nautilus-image-manipulator # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-17 23:24+0100\n" "PO-Revision-Date: 2013-02-18 06:43+0000\n" "Last-Translator: Daniel Winzen \n" "Language-Team: German \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-02-19 20:12+0000\n" "X-Generator: Launchpad (build 16491)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Benutzerdefinierte Einstellungen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "Bitte den Namen des Ordners eintippen." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "Bitte einen an den Dateinamen anzuhängenden Text eingeben." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "Der anzuhängende Text kann nicht mit %s enden" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "Den Namen der ZIP Datei angeben." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "Die Bilder wurden nicht gesendet, aber in diese komprimierte Datei gepackt:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "Das Bild wurde nicht gesendet, aber wurde erfolgreich verkleinert.\n" "Du kannst die Datei hier finden: %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "Die gewählte Seite zum Hochladen %(site_name)s ist nicht gültig." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Bitte erstelle einen Fehlerbericht auf Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "Die Upload-Seite %(site_name)s konnte nicht erreicht werden, überprüfen Sie " "bitte Ihre Internetverbindung." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Lade Bilder hoch..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" "Warnung: je niedriger die Qualität, desto schlechter wird das Bild sein" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Legt die Qualität des in der Größe geänderten Bildes fest(je höher die " "Qualität, desto größer die Bilddatei)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Qualität:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "Größe neu eingestellt" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Ungültige Parameter" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "Ü_berspringen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "E_rneut versuchen" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Das Bild \"%(image)s\" konnte nicht in der Größe geändert werden.\n" "\n" "Überprüfen Sie, ob Sie die benötigten Rechte haben, in diesen Ordner zu " "schreiben:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Bildgröße konnte nicht geändert werden" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "zeige Debug-Nachrichten" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "eine Datei, die in der Größe geändert werden soll. Benutzen Sie mehrere " "Argumente, um mehrere Dateien in der Größe zu ändern." #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Bildgröße anpassen" msgstr[1] "_Bildergrößen anpassen" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator muss eine Liste an Bildern, die in der Größe " "geändert werden sollen, mitgegeben werden.\n" "Machen Sie bitte einen Rechtsklick auf einem Bild und wählen Sie die " "\"%(resizeImages)s\" Option aus." #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Kein Bild angegeben" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Bildgröße wird geändert..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Bilder werden gepackt..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Sende %(imageSize)s Bilder an %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "kleine" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "%(imageSize)s Bilder im \"%(directoryName)s\" Ordner erstellen" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "große" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "auf %d%%-ige Größe veränderte" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "sehr kleine" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "mittelgroße" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "sehr große" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Erstelle %(imageSize)s Bilder und füge \"%(appendString)s\" hinzu" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(%d%% Qualität)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Namenloses Profil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "In einem Ordner speichern" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Umbenennen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Zu einer Webseite hochladen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Bildgröße ändern" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Bildgröße" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Klein" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Gross" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Benutzerdefiniert" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Maximale Breite der in der Größe geänderten Bilder, in Pixeln" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Breite:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Maximale Höhe der in der Größe geänderten Bilder, in Pixeln" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Höhe:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Prozent der Originalbildgröße" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Skalieren:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Zielpfad" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" "Ordnername, in dem die in der Größe geänderten Bilder gespeichert werden" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Ordnername:" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "Dieser Wert wird vor der Bilderweiterung angehängt" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "An Dateinamen anhängen:" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "" "Die in der Größe geänderten Bilder werden zusammen in einer Zip-Datei " "komprimiert" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "Name der Zip-Datei:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "Die Zip-Datei mit den in der Größe geänderten Bildern wird zu dieser " "Webseite hochgeladen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "Die in der Größe geänderten Bilder hochladen zu:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "Ein Fehler ist unterlaufen!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "Bild erfolgreich hochgeladen!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "Url zum Herunterladen:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Url entfernen:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "Dieses Profil löschen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "Als neues Profil speichern" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "Ein neues Profil anhand der Einstellungen erstellen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "Größe ändern" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Das ausgewählte Bild in der Größe ändern" msgstr[1] "Alle ausgewählten Bilder in der Größe ändern" nautilus-image-manipulator-1.3/po/nautilus-image-manipulator.pot0000664000175000017500000002770012122671513026347 0ustar emilienemilien00000000000000# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # FIRST AUTHOR , YEAR. # #, fuzzy msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-03-21 18:13+0100\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "Language: \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=CHARSET\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:99 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:134 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:30 #, no-c-format, python-format msgid "The string to append cannot end in %s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:183 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "" #. Impossible to contact the website (no network, site down, etc.) #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:190 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:193 #, python-format msgid "" "The upload destination for %(site_name)s could not be determined, please " "report a bug so that this can be fixed." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:196 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:247 msgid "Uploading images..." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 msgid "" "The page where your file can be downloaded from could not be determined." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 msgid "Please try again, and report a bug if it happens again." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 #, python-format msgid "" "Your images were successfully uploaded to %(site_name)s, but their " "verification failed." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:215 msgid "Your images have been zipped together into this file:" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:217 #, python-format msgid "You can find your image at %(filename)s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:231 msgid "Please file a bug report on Launchpad" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:262 msgid "Waiting for validation..." msgstr "" #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:474 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:476 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:489 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:497 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:505 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:521 msgid "Invalid parameters" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:535 msgid "_Skip" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:537 msgid "_Retry" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:538 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:540 msgid "Could not resize image" msgstr "" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "" #: ../bin/nautilus-image-manipulator.py:46 msgid "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" #: ../bin/nautilus-image-manipulator.py:68 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "" msgstr[1] "" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:70 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" #: ../bin/nautilus-image-manipulator.py:72 msgid "No images provided" msgstr "" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "" #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:24 msgid "Please enter the name of the folder." msgstr "" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "This value will be appended before the image extension" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:27 msgid "Append to filename:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "Please enter some text to append to the filename." msgstr "" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "The resized images will be compressed together into this zip file" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "Name of the zip file:" msgstr "" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Upload the resized images to:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Please enter the name of the zip file." msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "An error occurred!" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Images successfully uploaded!" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Download url:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:41 msgid "Delete url:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:42 msgid "Delete this profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:43 msgid "Save as a new profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:44 msgid "Create a new profile based on these settings" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:45 msgid "Resize" msgstr "" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "" msgstr[1] "" nautilus-image-manipulator-1.3/po/ru.po0000644000175000017500000003457212121046064021333 0ustar emilienemilien00000000000000# Russian translation for nautilus-image-manipulator # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-19 21:14+0100\n" "PO-Revision-Date: 2012-10-15 15:19+0000\n" "Last-Translator: Eugene Marshal \n" "Language-Team: Russian \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" "X-Launchpad-Export-Date: 2013-03-16 10:40+0000\n" "X-Generator: Launchpad (build 16532)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Другие параметры" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "Пожалуйста, введите название папки." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "Пожалуйста, введите текст, который будет добавляться к имени файла." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "Пожалуйста, введите название ZIP файла." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "Изображения не были отправлены, но размещены в файл:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "Изображения не были отправлены, но их размер был успешно изменён.\n" "Вы можете найти их в %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "Недопустимый веб-сайт для выгрузки изображений %(site_name)s." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Пожалуйста, отправьте сообщение об ошибке в Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "Веб-сайт для выгрузки изображений %(site_name)s недоступен, убедитесь в " "работоспособности соединения с интернетом." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Передача изображений..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" "Предупреждение: чем ниже качество, тем менее качественнее изображения." #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Определяет качество изображений с изменённым размером (чем выше качество, " "тем больше размер изображения)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Качество:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Неправильные параметры" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "_Пропустить" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "_Повторить" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Размер изображения \"%(image)s\" не может быть изменён.\n" "\n" "Убедитесь в наличии разрешений на запись в эту папку:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Невозможно изменить размер изображения" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "" msgstr[1] "" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Изображения не предоставлены" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Изменение размера изображений..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Сжатие изображений..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Отправить %(imageSize)s изображений в %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Сохранить в папке" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Переименовать" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Выгрузить на веб-сайт" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Изменить размер изображений" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Размер изображения" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Ширина:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Максимальная высота изображений с изменённым размером в пикселях" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Высота:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Количество процентов от исходного размера изображения" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Масштаб:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Назначение" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" "Название папки в которой будут храниться изображения с изменёнными размерами" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Имя папки:" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "Название ZIP файла:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "Выгрузить изображения с изменённым размером в:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "Произошла ошибка!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "Изображения переданы!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Удалить URL:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "Удалить профиль" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "Сохранить как новый профиль" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "Создать новый профиль на основе этих настроек" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "Изменить размер" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "" msgstr[1] "" nautilus-image-manipulator-1.3/po/tr.po0000644000175000017500000003042012122670113021315 0ustar emilienemilien00000000000000# Turkish translation for nautilus-image-manipulator # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-03-21 18:13+0100\n" "PO-Revision-Date: 2013-03-17 19:36+0000\n" "Last-Translator: zeugma \n" "Language-Team: Turkish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" "X-Launchpad-Export-Date: 2013-03-21 20:40+0000\n" "X-Generator: Launchpad (build 16532)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:99 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Özel ayarlar" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:134 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:30 #, no-c-format, python-format msgid "The string to append cannot end in %s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:183 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "" #. Impossible to contact the website (no network, site down, etc.) #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:190 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:193 #, python-format msgid "" "The upload destination for %(site_name)s could not be determined, please " "report a bug so that this can be fixed." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:196 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:247 msgid "Uploading images..." msgstr "Resimler yükleniyor..." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 msgid "" "The page where your file can be downloaded from could not be determined." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 msgid "Please try again, and report a bug if it happens again." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 #, python-format msgid "" "Your images were successfully uploaded to %(site_name)s, but their " "verification failed." msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:215 msgid "Your images have been zipped together into this file:" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:217 #, python-format msgid "You can find your image at %(filename)s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:231 msgid "Please file a bug report on Launchpad" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:262 msgid "Waiting for validation..." msgstr "" #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:474 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:476 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Kalite:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:489 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:497 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:505 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:521 msgid "Invalid parameters" msgstr "Geçersiz parametreler" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:535 msgid "_Skip" msgstr "_Atla" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:537 msgid "_Retry" msgstr "_Yeniden dene" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:538 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:540 msgid "Could not resize image" msgstr "" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" #: ../bin/nautilus-image-manipulator.py:68 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "" msgstr[1] "" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:70 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" #: ../bin/nautilus-image-manipulator.py:72 msgid "No images provided" msgstr "" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "" #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "küçük" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "büyük" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "orta" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Yeniden adlandır" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Resim Boyutu" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Küçük" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Büyük" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Genişlik:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Yükseklik:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Hedef" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Dizin adı:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:24 msgid "Please enter the name of the folder." msgstr "" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "This value will be appended before the image extension" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:27 msgid "Append to filename:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "Please enter some text to append to the filename." msgstr "" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "The resized images will be compressed together into this zip file" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "Name of the zip file:" msgstr "" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Upload the resized images to:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Please enter the name of the zip file." msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "An error occurred!" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Images successfully uploaded!" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Download url:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:41 msgid "Delete url:" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:42 msgid "Delete this profile" msgstr "Bu profili sil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:43 msgid "Save as a new profile" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:44 msgid "Create a new profile based on these settings" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:45 msgid "Resize" msgstr "" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "" msgstr[1] "" nautilus-image-manipulator-1.3/po/es.po0000644000175000017500000003620012122670112021300 0ustar emilienemilien00000000000000# Spanish translation for nautilus-image-manipulator # Copyright (c) 2011 Rosetta Contributors and Canonical Ltd 2011 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2011. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-03-21 18:13+0100\n" "PO-Revision-Date: 2013-03-21 20:30+0000\n" "Last-Translator: Emilien Klein \n" "Language-Team: Spanish \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-03-21 20:40+0000\n" "X-Generator: Launchpad (build 16532)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:99 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Ajustes personalizados" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:134 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:30 #, no-c-format, python-format msgid "The string to append cannot end in %s" msgstr "El valor por añadir no se puede terminar en %s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:183 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "El sitio seleccionado para la subida %(site_name)s no es válido." #. Impossible to contact the website (no network, site down, etc.) #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:190 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "El sitio de subida %(site_name)s no se pudo contactar, por favor, compruebe " "su conexión a Internet." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:193 #, python-format msgid "" "The upload destination for %(site_name)s could not be determined, please " "report a bug so that this can be fixed." msgstr "" "El destino de subida para %(site_name)s no se pudo determinar, por favor " "reporta un bug para que esto se puede solucionar." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:196 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:247 msgid "Uploading images..." msgstr "Enviando imágenes..." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 msgid "" "The page where your file can be downloaded from could not be determined." msgstr "La página donde se puede descargar el archivo no se pudo determinar." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:204 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 msgid "Please try again, and report a bug if it happens again." msgstr "Por favor, inténtelo de nuevo, y reporta un bug si ocurre de nuevo." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:207 #, python-format msgid "" "Your images were successfully uploaded to %(site_name)s, but their " "verification failed." msgstr "" "Sus imágenes se han subido con éxito a %(site_name)s, pero su verificación " "fallo." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:215 msgid "Your images have been zipped together into this file:" msgstr "Sus imágenes han sido comprimidos juntas en este archivo:" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:217 #, python-format msgid "You can find your image at %(filename)s" msgstr "Usted puede encontrar sus imágenes en %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:231 msgid "Please file a bug report on Launchpad" msgstr "Por favor presente un informe de error en Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:262 msgid "Waiting for validation..." msgstr "Esperando validación..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "Advertencia: a menor calidad, más deterioradas las imágenes serán" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:474 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Determina la calidad de las imágenes redimensionadas (cuanto mayor sea la " "calidad, mayor sera el tamaño de las imágenes)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:476 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Calidad:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:489 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:497 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:505 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "cambiado" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:521 msgid "Invalid parameters" msgstr "Parámetros inválidos" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:535 msgid "_Skip" msgstr "_Omitir" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:537 msgid "_Retry" msgstr "_Reintentar" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:538 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "No se ha podido cambiar el tamaño de la imagen \"%(image)s\".\n" "\n" "Compruebe si tiene permiso para escribir en esta carpeta:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:540 msgid "Could not resize image" msgstr "No se pudo redimensionar las imagen" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "mostrar mensajes de depuración" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "un archivo para redimensionar. Usar argumentos múltiples para cambiar el " "tamaño de múltiples archivos." #: ../bin/nautilus-image-manipulator.py:68 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Redimensionar la imagen" msgstr[1] "_Redimensionar imágenes" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:70 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator necesita una lista de imágenes para " "redimensionar.\n" "Haga click derecho sobre una imagen y selecciona la opción " "\"%(resizeImages)s\"." #: ../bin/nautilus-image-manipulator.py:72 msgid "No images provided" msgstr "No se ha proporcionado ninguna imagen" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Redimensionando imagenes..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Empaquetando imágenes..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Enviar imágenes %(imageSize)s a %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "pequeñas" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Crear imágenes %(imageSize)s en la carpeta \"%(directoryName)s\"" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "grandes" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "redimensionadas a %d%%" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "muy pequeñas" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "medianas" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "muy grandes" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Crear imágenes %(imageSize)s y añadir \"%(appendString)s\"" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(calidad %d%%)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Perfil sin nombre" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Guardar en una carpeta" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Renombrar" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Subir a una página web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Redimensionar imágenes" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Tamaño de la imagen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Pequeño" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Grande" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Personalizado" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Ancho máximo de las imágenes redimensionadas, en píxeles" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Anchura:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Altura máxima de las imágenes redimensionadas, en píxeles" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Altura:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Porcentaje del tamaño de la imágenes originales" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Escalar:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Destino" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" "Nombre de la carpeta en la que las imágenes redimensionadas se guardarán" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Nombre de la carpeta:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:24 msgid "Please enter the name of the folder." msgstr "Introduzca el nombre de la carpeta." #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "This value will be appended before the image extension" msgstr "El valor se añadirá antes de la extensión de la imagen" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:27 msgid "Append to filename:" msgstr "Añadir al nombre de archivo:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "Please enter some text to append to the filename." msgstr "Escriba un texto que añadir al nombre del archivo." #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "The resized images will be compressed together into this zip file" msgstr "" "Las imágenes redimensionadas serán comprimidas juntas en este archivo zip" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "Name of the zip file:" msgstr "Nombre del archivo zip:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "El archivo zip que contiene las imágenes redimensionadas será cargado a este " "sitio web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Upload the resized images to:" msgstr "Enviar las imágenes redimensionadas a:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Please enter the name of the zip file." msgstr "Introduzca el nombre del archivo zip." #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "An error occurred!" msgstr "¡Se produjo un error!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Images successfully uploaded!" msgstr "¡Imágenes enviadas con éxito!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Download url:" msgstr "Dirección de descarga:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:41 msgid "Delete url:" msgstr "Dirección para borrar:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:42 msgid "Delete this profile" msgstr "Eliminar este perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:43 msgid "Save as a new profile" msgstr "Guardar como nuevo perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:44 msgid "Create a new profile based on these settings" msgstr "Crear un nuevo perfil con estos parámetros" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:45 msgid "Resize" msgstr "Redimensionar" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Redimensionar la imagen seleccionada" msgstr[1] "Redimensionar cada imagen seleccionada" nautilus-image-manipulator-1.3/po/gl.po0000644000175000017500000003374612121046434021312 0ustar emilienemilien00000000000000# Galician translation for nautilus-image-manipulator # Copyright (c) 2012 Rosetta Contributors and Canonical Ltd 2012 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2012. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-17 23:24+0100\n" "PO-Revision-Date: 2013-02-18 06:52+0000\n" "Last-Translator: Emilien Klein \n" "Language-Team: Galician \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" "X-Launchpad-Export-Date: 2013-02-19 20:12+0000\n" "X-Generator: Launchpad (build 16491)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Axustes personalizados" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "Por favor, introduza o nome do cartafol." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "Por favor, introduza un texto para engadir ao nome do ficheiro." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "O texto para engadir non pode rematar en %s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "Introduza o nome do ficheiro zip." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "As súas imaxes non foron enviadas, pero están comprimidas neste ficheiro:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "A súa imaxe non foi enviada, pero foi redimensionada.\n" "Pode atopala en %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "O sitio selecionado para o envío %(site_name)s non é válido." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Por favor envíe un informe de erro a Launchpad" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "O sitio web de envío %(site_name)s non puido ser contactado, por favor " "comprobe a súa conexión a Internet." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Enviando imaxes..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "" "Aviso: canto máis baixa a calidade, máis deterioradas aparecerán as imaxes" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Determina a calidade das imaxes redimensionadas: a maior calidade, maior " "tamaño (peso) da imaxe" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Calidade:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "redimensionada" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Parámetros non válidos" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "_Omitir" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "Tenta_r de novo" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Non se puido redimensionar a imaxe \"%(image)s\".\n" "\n" "Comprobe se ten permisos para escribir neste cartafol:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Non se puido redimensionar a imaxe" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "mostrar mensaxes de depuración" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "un ficheiro para redimensionar. Use argumentos múltiples para cambiar o " "tamaño de varios ficheiros." #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Redimensionar a imaxe" msgstr[1] "_Redimensionar as imaxes" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator precisa unha lista de imaxes para redimensionar.\n" "Faga click dereito sobre unha imaxe e selecione a opción " "\"%(resizeImages)s\"." #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Non selecionou ningunha imaxe" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Redimensionando imaxes..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Empaquetando imaxes..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Enviar imaxes %(imageSize)s a %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "pequenas" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Crear imaxes %(imageSize)s no cartafol \"%(directoryName)s\"" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "grandes" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "%d%% redimensionadas" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "moi pequenas" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "medianas" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "moi grandes" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Crear imaxes %(imageSize)s e engadir \"%(appendString)s\"" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(%d%% calidade)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Perfil sen nome" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Gardar nun cartafol" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Cambiar o nome" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Enviar a unha web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Redimensionar imaxes" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Tamaño da imaxe" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "Pequeno" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "Grande" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "Personalizado" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Largo máximo das imaxes redimensionadas (en píxeles)" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Largo:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Altura máxima das imaxes redimensionadas (en píxeles)" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Alto:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Porcentaxe do tamaño da imaxe orixinal" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Escalar:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Destino" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "Nome do cartafol no que se gardarán as imaxes redimensionadas" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Nome do cartafol:" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "" "Este texto engadirase antes da extensión da imaxe (evita sobreescribir a " "imaxe orixinal)" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "Engadir ao nome do ficheiro:" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "As imaxes redimensionadas comprimiranse neste ficheiro zip" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "Nome do ficheiro zip:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "O ficheiro zip que contén as imaxes redimensionadas enviarase a esta web" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "Enviar as imaxes redimensionadas a:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "Produciuse un erro!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "Imaxes enviadas con éxito!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "Enderezo de descarga:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Eliminar url:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "Eliminar este perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "Gardar como novo perfil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "Crear un novo perfil baseado nestes axustes" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "Redimensionar" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Redimensionar a imaxe selecionada" msgstr[1] "Redimensionar cada imaxe selecionada" nautilus-image-manipulator-1.3/po/sk.po0000644000175000017500000003463112121046061021313 0ustar emilienemilien00000000000000# Slovak translation for nautilus-image-manipulator # Copyright (c) 2013 Rosetta Contributors and Canonical Ltd 2013 # This file is distributed under the same license as the nautilus-image-manipulator package. # FIRST AUTHOR , 2013. # msgid "" msgstr "" "Project-Id-Version: nautilus-image-manipulator\n" "Report-Msgid-Bugs-To: FULL NAME \n" "POT-Creation-Date: 2013-02-19 21:14+0100\n" "PO-Revision-Date: 2013-01-17 19:05+0000\n" "Last-Translator: Prescott_SK \n" "Language-Team: Slovak \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 1 : (n>=2 && n<=4) ? 2 : 0;\n" "X-Launchpad-Export-Date: 2013-03-16 10:40+0000\n" "X-Generator: Launchpad (build 16532)\n" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:95 #: ../nautilus_image_manipulator/ProfileSettings.py:101 #: ../nautilus_image_manipulator/ProfileSettings.py:333 msgid "Custom settings" msgstr "Vlastné nastavenia" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:104 msgid "Please enter the name of the folder." msgstr "Prosím, zadajte názov priečinka." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:109 msgid "Please enter some text to append to the filename." msgstr "Prosím, zadajte text, ktorý sa má pridať do názvu súboru." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:115 #, python-format msgid "The string to append cannot end in %s" msgstr "Reťazec na pridanie nemôže končiť s %s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:121 msgid "Please enter the name of the zip file." msgstr "Prosím, zadajte názov súboru zip." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:174 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:185 #, python-format msgid "" "Your images have not been sent, but have been zipped together into this " "file:\n" "%(filename)s" msgstr "" "Vaše obrázky neboli odoslané, alebo boli skomprimované spolu do tohoto " "súboru:\n" "%(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:176 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:187 #, python-format msgid "" "Your image has not been sent, but has successfully been resized.\n" "You can find it at %(filename)s" msgstr "" "Váš obrázok nebol odoslaný, alebo bola mu úspešne zmenená veľkosť.\n" "Môžete ho nájsť pod názvom %(filename)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 #, python-format msgid "The selected upload site %(site_name)s is not valid." msgstr "Zvolená odosielacia stránka %(site_name)s nie je platná." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:177 msgid "Please file a bug report on Launchpad" msgstr "Prosím, nahláste chybu na Launchpade" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:188 #, python-format msgid "" "The upload site %(site_name)s could not be contacted, please check your " "internet connection." msgstr "" "Nepodarilo sa skontaktovať odosielaciu stránku %(site_name)s, prosím, " "skontrolujte vaše internetové pripojenie." #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:191 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:240 msgid "Uploading images..." msgstr "Odosielajú sa obrázky..." #. Visible when hovering over the quality scale in the custom #. settings when the quality is too low #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:435 msgid "" "Warning: the lower the quality, the more deteriorated the images will be" msgstr "Upozornenie: čím bude menšia kvalita, tým budú obrázky horšie" #. Visible when hovering over the quality scale in the custom #. settings when the quality is high enough #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:441 msgid "" "Determines the quality of the resized images (the higher the quality, the " "larger the image size)" msgstr "" "Určuje kvalitu obrázkov so zmenou veľkosti (čím bude väčšia kvalita, tým " "bude veľkosť obrázkov väčšia)" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:443 #: ../data/ui/NautilusImageManipulatorDialog.ui.h:18 msgid "Quality:" msgstr "Kvalita:" #. Default folder name #. Default value to append to filename #. Default zipfile name #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:454 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:461 #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:468 #: ../nautilus_image_manipulator/ProfileSettings.py:63 #: ../nautilus_image_manipulator/ProfileSettings.py:71 #: ../nautilus_image_manipulator/ProfileSettings.py:75 #: ../nautilus_image_manipulator/ProfileSettings.py:85 #: ../nautilus_image_manipulator/ProfileSettings.py:93 #: ../nautilus_image_manipulator/ProfileSettings.py:96 msgid "resized" msgstr "zmenená veľkosť" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:484 msgid "Invalid parameters" msgstr "Neplatné parametre" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:498 msgid "_Skip" msgstr "Pre_skočiť" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:500 msgid "_Retry" msgstr "_Skúsiť znovu" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:501 #, python-format msgid "" "The image \"%(image)s\" could not be resized.\n" "\n" "Check whether you have permission to write to this folder:\n" "%(folder)s" msgstr "" "Obrázku \"%(image)s\" sa neodarilo zmeniť veľkosť.\n" "\n" "Skontrolujte, či máte oprávnenia pre zápis do tohoto priečinka:\n" "%(folder)s" #: ../nautilus_image_manipulator/NautilusImageManipulatorDialog.py:503 msgid "Could not resize image" msgstr "Nepodarilo sa zmeniť veľkosť obrázka" #: ../bin/nautilus-image-manipulator.py:45 msgid "show debug messages" msgstr "zobraziť ladiace správy" #: ../bin/nautilus-image-manipulator.py:46 msgid "" "a file to be resized. Use multiple arguments to resize multiple files." msgstr "" "súbor, ktorému sa má zmeniť veľkosť. Použite viacnásobné argumenty na zmenu " "veľkosti viacerých súborov." #: ../bin/nautilus-image-manipulator.py:66 #: ../nautilus_image_manipulator/nautilus-extension.py:71 msgid "_Resize image" msgid_plural "_Resize images" msgstr[0] "_Zmeniť veľkosť obrázka" msgstr[1] "_Zmeniť veľkosť obrázkov" msgstr[2] "_Zmeniť veľkosť obrázkov" #. Display an error message since we don't have images to work on #: ../bin/nautilus-image-manipulator.py:68 #, python-format msgid "" "Nautilus Image Manipulator needs to be provided with a list of images to " "resize.\n" "Please right-click on an image and select the \"%(resizeImages)s\" option." msgstr "" "Nautilus Image Manipulator musí mať poskytnutý zoznam obrázkov, ktorým sa má " "zmeniť veľkosť.\n" "Prosím, kliknite pravým tlačidlom na obrázok a zvoľte voľbu " "„%(resizeImages)s“." #: ../bin/nautilus-image-manipulator.py:70 msgid "No images provided" msgstr "Nie sú poskytnuté žiadne obrázky" #: ../nautilus_image_manipulator/ImageManipulations.py:83 msgid "Resizing images..." msgstr "Mení sa veľkosť obrázkov..." #: ../nautilus_image_manipulator/ImageManipulations.py:199 msgid "Packing images..." msgstr "Balia sa obrázky..." #: ../nautilus_image_manipulator/ProfileSettings.py:57 #: ../nautilus_image_manipulator/ProfileSettings.py:80 #: ../nautilus_image_manipulator/ProfileSettings.py:400 #, python-format msgid "Send %(imageSize)s images to %(uploadUrl)s" msgstr "Odoslať obrázky %(imageSize)s na %(uploadUrl)s" #. Part of new profile name "Create small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:58 #: ../nautilus_image_manipulator/ProfileSettings.py:70 #: ../nautilus_image_manipulator/ProfileSettings.py:363 #: ../nautilus_image_manipulator/ProfileSettings.py:380 msgid "small" msgstr "s malou veľkosťou" #: ../nautilus_image_manipulator/ProfileSettings.py:69 #: ../nautilus_image_manipulator/ProfileSettings.py:91 #: ../nautilus_image_manipulator/ProfileSettings.py:404 #, python-format msgid "Create %(imageSize)s images in the \"%(directoryName)s\" folder" msgstr "Vytvoriť obrázky %(imageSize)s v priečinku „%(directoryName)s“" #. Part of new profile name "Create large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:81 #: ../nautilus_image_manipulator/ProfileSettings.py:92 #: ../nautilus_image_manipulator/ProfileSettings.py:366 #: ../nautilus_image_manipulator/ProfileSettings.py:388 msgid "large" msgstr "s veľkou veľkosťou" #. Part of new profile name "Create 60% resized images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:369 #, python-format msgid "%d%% resized" msgstr "s/so %d%%-nou zmenou veľkosti" #. Part of new profile name "Create very small images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:376 msgid "very small" msgstr "s veľmi malou veľkosťou" #. Part of new profile name "Create medium images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:384 msgid "medium" msgstr "so strednou veľkosťou" #. Part of new profile name "Create very large images[...]" #: ../nautilus_image_manipulator/ProfileSettings.py:391 msgid "very large" msgstr "s veľmi veľkou veľkosťou" #: ../nautilus_image_manipulator/ProfileSettings.py:408 #, python-format msgid "Create %(imageSize)s images and append \"%(appendString)s\"" msgstr "Vytvoriť obrázky %(imageSize)s a pridať \"%(appendString)s\"" #. Add the quality information in the profile name #: ../nautilus_image_manipulator/ProfileSettings.py:413 #, python-format msgid "(%d%% quality)" msgstr "(%d%%-ná kvalita)" #: ../nautilus_image_manipulator/ProfileSettings.py:414 msgid "Unnamed profile" msgstr "Nepomenovaný profil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:1 msgid "Save in a folder" msgstr "Uložiť do priečinka" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:2 msgid "Rename" msgstr "Premenovať" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:3 msgid "Upload to a website" msgstr "Odoslať na webovú stránku" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:4 msgid "Resize images" msgstr "Zmeniť veľkosť obrázkov" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:5 msgid "Image Size" msgstr "Veľkosť obrázku" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:6 msgid "Small" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:7 msgid "Large" msgstr "" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:8 msgid "Custom" msgstr "" #. Visible when hovering over the width settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:10 msgid "Maximum width of the resized images, in pixels" msgstr "Maximálna šírka obrázkov so zmenou veľkosti, v pixeloch" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:11 msgid "Width:" msgstr "Šírka:" #. Visible when hovering over the height settings in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:13 msgid "Maximum height of the resized images, in pixels" msgstr "Maximálna výška obrázkov so zmenou veľkosti, v pixeloch" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:14 msgid "Height:" msgstr "Výška:" #. Visible when hovering over the percent scale in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:16 msgid "Percent of the original image size" msgstr "Percento pôvodnej veľkosti obrázka" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:17 msgid "Scale:" msgstr "Mierka:" #. Use "Title Case" if used in your language #: ../data/ui/NautilusImageManipulatorDialog.ui.h:20 msgid "Destination" msgstr "Cieľ" #. Visible when hovering over the subfolder name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:22 msgid "Name of the folder in which the resized images will be saved" msgstr "" "Názov priečinka, do ktorého budú uložené obrázky so zmenenou veľkosťou" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:23 msgid "Folder name:" msgstr "Názov priečinka:" #. Visible when hovering over the append string entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:25 msgid "This value will be appended before the image extension" msgstr "Táto hodnota bude pridaná pred príponu obrázku" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:26 msgid "Append to filename:" msgstr "Pridať do názvu súboru:" #. Visible when hovering over the zipfile name entry box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:28 msgid "The resized images will be compressed together into this zip file" msgstr "" "Obrázky so zmenenou veľkosťou budú skomprimované spolu do tohoto súboru zip" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:29 msgid "Name of the zip file:" msgstr "Názov súboru zip:" #. Visible when hovering over the upload website combo box in the custom settings #: ../data/ui/NautilusImageManipulatorDialog.ui.h:31 msgid "" "The zip file containing the resized images will be uploaded to this website" msgstr "" "Súbor zip, ktorý obsahuje obrázky so zmenenou veľkosťou bude odoslaný na " "túto webovú stránku" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:32 msgid "Upload the resized images to:" msgstr "Odoslať obrázky so zmenenou veľkosťou na:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:33 msgid "An error occurred!" msgstr "Vyskytla sa chyba!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:34 msgid "Images successfully uploaded!" msgstr "Obrázky boli úspešne odoslané!" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:35 msgid "Download url:" msgstr "Preberacia url:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:36 msgid "Delete url:" msgstr "Odstrániť url:" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:37 msgid "Delete this profile" msgstr "Odstrániť tento profil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:38 msgid "Save as a new profile" msgstr "Uložiť ako nový profil" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:39 msgid "Create a new profile based on these settings" msgstr "Vytvoriť nový profil s týmito nastaveniami" #: ../data/ui/NautilusImageManipulatorDialog.ui.h:40 msgid "Resize" msgstr "Zmeniť veľkosť" #: ../nautilus_image_manipulator/nautilus-extension.py:72 msgid "Resize the selected image" msgid_plural "Resize each selected image" msgstr[0] "Zmeniť veľkosť zvoleného obrázku" msgstr[1] "Zmeniť veľkosť zvolených obrázkov" msgstr[2] "Zmeniť veľkosť zvolených obrázkov" nautilus-image-manipulator-1.3/AUTHORS0000644000175000017500000000010512122327443020764 0ustar emilienemilien00000000000000Copyright (C) 2010-2013 Emilien Klein nautilus-image-manipulator-1.3/CHANGELOG0000644000175000017500000001030212134311574021127 0ustar emilienemilien00000000000000Changelog for nautilus-image-manipulator ================================ 1.3 - 2013-04-19 (r240) * We now have a logo! * Add dl.free.fr as upload destination (LP #1098695) * Filenames containing accents are now properly sent (LP #884275) * Better error handling when the upload site could not be parsed successfully. * Nicer errors when required information is missing (in-UI instead of popup windows) * "Port" to GTK+ 3 (actually, just updated the UI file to be able to open with Glade for GTK+ 3) * Added Slovak translation (thanks Prescott_SK) * Added incomplete Russian translation (thanks Eugene Marshal) * Added incomplete Turkish translation (thanks to zeugma) ================================ 1.2 - 2013-02-18 (r199) * Fix uploading to 1fichier.com (LP #1100027) * Fix issue where width/height manually specified in the profile would result in a crash (LP #1030927) * Use GExiv2 instead of pyexiv2 (LP #1074028) * Added German translation ================================ 1.1 - 2012-04-30 (r187) * Better management of profiles. In particular, make sure that there are no profiles that have the same name. ================================ 1.0 - 2012-04-17 (r165) * Major change: completely redesigned user interface. Now the parameters that determine how the images are to be resized are set via profiles. A set of default profiles is provided, but the user can freely add or remove profiles. The focus of this new UI is a very simplified and streamlined user experience. We try to limit the technical jargon to a minimum ;) (LP #936003) * Prevent Nautilus from freezing when Nautilus Image Manipulator is launched (LP #931762) * Move the config file to ~/.config/nautilus-image-manipulator/config (LP #935738) * Started writing "proper" documentation (LP #962443) see http://nautilus-image-manipulator.readthedocs.org/ * Started writing unit tests with nose (LP #946610) ================================ 0.8 - 2012-02-14 (r139) * Force .jpg extension on resized images filenames (LP #931975) ================================ 0.7 - 2012-02-14 (r132) * N I M now depends on the pil and pyexiv2 packages, and not anymore on ImageMagick: - Use the Python Imaging Library (PIL) instead of ImageMagick to resize the images (merge branch from lp:~razerraz) - Update the image metadata (Exif) after resizing the images (merge branch from lp:~razerraz) * Take care of preserving aspect ratio (changeable via ui) (thanks again lp:~razerraz) * Handle an exception when reading preferences when the preferences file does not exist * Automate the updating of new translations ================================ 0.6 - 2012-01-31 (r122) * Add custom compression level (merge branch from lp:~razerraz) * Take care of eventual exceptions if a value is not set when loading configuration from the ini file * Added Brazilian Portuguese translation (Thanks Renan) ================================ 0.5 - 2011-11-22 (r113) * Make sure that only valid filenames are passed (LP #711508 and LP#711509) * Better handling of zipfile creation * Do not allow appendString to end in "/", because the image would be called ".EXT", which is a hidden file in it's own folder * Various lower-level enhancements - Gracefully handle when ImageMagick is not installed (LP #877738) - Display an error message is DistUtilsExtra is not installed when updating the translations ================================ 0.4 - 2011-10-22 (r100) * No new functionality. Code changes to: - Port to GTK+ 3 - Port from PyGTK to the GObject Introspection mechanism - Change location of the Nautilus extension to adapt to new nautilus-python - Improve logging a bit: more debug messages, no more `print` ================================ 0.3 - 2011-05-17 (r91) * New translations: - Asturian - Dutch - Greek - Spanish * Updated French translation * Update Poster to 0.8.1 and removed own customization (original bug fixed) * New scripts for internal project management (to get out of Quickly) ================================ 0.2 - 2011-02-08 (r80) * Initial release nautilus-image-manipulator-1.3/PKG-INFO0000664000175000017500000000160012134312450021007 0ustar emilienemilien00000000000000Metadata-Version: 1.1 Name: nautilus-image-manipulator Version: 1.3 Summary: Resize and send images from Nautilus Home-page: https://launchpad.net/nautilus-image-manipulator Author: Emilien Klein Author-email: emilien _AT_ klein _DOT_ st License: GPL-3 Description: This Nautilus extension lets you resize images and send them to friends and family, right from Nautilus. Just right-click on any photo or group of photos, and an option will appear that launches Nautilus Image Manipulator. A set of default settings make it easy to quickly resize pictures. You can also easily create your own profiles for later reuse. Platform: UNKNOWN Requires: DistUtilsExtra.auto Requires: Image Requires: gi.repository.GExiv2 Requires: gi.repository.GObject Requires: gi.repository.Gdk Requires: gi.repository.Gtk Provides: nautilus_image_manipulator nautilus-image-manipulator-1.3/MANIFEST.in0000644000175000017500000000042211743333612021457 0ustar emilienemilien00000000000000include AUTHORS include CHANGELOG include COPYING include README include README.PACKAGING include data/ui/* include po/* include MANIFEST.in include bin/* recursive-include docs * include tests/* prune docs/_build global-exclude *.pyc global-exclude *.~1~ *.~2~ *.~3~ *.~4~ nautilus-image-manipulator-1.3/data/0000775000175000017500000000000012134312450020626 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/data/ui/0000775000175000017500000000000012134312450021243 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/data/ui/nautilus_image_manipulator_dialog.xml0000644000175000017500000000066712121107271030733 0ustar emilienemilien00000000000000 nautilus-image-manipulator-1.3/data/ui/NautilusImageManipulatorDialog.ui0000644000175000017500000017111512122637604027721 0ustar emilienemilien00000000000000 Save in a folder folder Rename append Upload to a website upload 16 9999 400 1 10 True False 6 Resize images False center ../logo/nim-logo-large.png normal True False 4 4 vertical 6 True False vertical True False 1 True True 0 False 5 10 vertical 6 True False 6 vertical 6 True False start Image Size False True 0 True False 12 vertical 6 True False 6 False True True False False False 0.5 True False True 0 True False 0 Small Large Custom True True 1 False True 0 True False False True False True False 0 True False Maximum width of the resized images, in pixels Width: False False 1 True True True Maximum width of the resized images, in pixels 5 15 4 4 True 0.030000003054738045 False False width_adjust False True 2 True False Maximum height of the resized images, in pixels Height: False False 4 True True True Maximum height of the resized images, in pixels 5 4 4 True 0.030000003054738045 False False height_adjust False True 5 False True 1 True False Percent of the original image size 1 Scale: False True True False True False False 0 True pixels_radio False False 0 True True scale_adjust 0 0 right True True 1 True False % False False 2 True True 2 True False 6 True False True Quality: False False 0 True True True quality_adjust 0 0 right True True 1 True False % False False 2 True True 3 True True 1 True True 0 True False 6 vertical 6 True False 0 Destination False False 0 True False 12 vertical 6 True False 1 destination_list 0 True True 0 False vertical True False Name of the folder in which the resized images will be saved end 6 True False Folder name: False True 0 True True 20 True False False False True 1 False True 0 False 1 Please enter the name of the folder. False True 1 True True 1 False vertical True False This value will be appended before the image extension end 6 True False Append to filename: False True 0 True True True 20 True False False False True 1 False True 0 False 1 Please enter some text to append to the filename. False True 1 False 1 The string to append cannot end in %s False True 2 True True 2 False vertical True False True The resized images will be compressed together into this zip file end 6 True False Name of the zip file: False True 0 True True 20 True False False False True 1 True True 0 True False The zip file containing the resized images will be uploaded to this website end 6 True False Upload the resized images to: False True 0 True False 1 0 1fichier.com dl.free.fr False False 1 True True 1 False 1 Please enter the name of the zip file. False True 2 False True 3 True True 1 True True 1 False True 1 False True 0 False 6 6 10 True False False 1 False 5 10 vertical 12 True False 0 An error occurred! False False 0 True False 12 True False False False 0 True False 0 Error message True True 1 True True 1 False 12 True False False False 0 delete False True True True False none True True 1 True True 2 False False 2 False 5 10 vertical 12 True False 0 Images successfully uploaded! False False 0 True False 12 True False False False 0 True False 2 2 12 True False Download url: True False Delete url: 1 2 download False True True True True False none 1 2 delete False True True True True False none 1 2 1 2 True True 1 True True 1 False False 3 True False 10 end Delete this profile False True True True False False True end 0 Save as a new profile False True True True True Create a new profile based on these settings Create a new profile based on these settings False False True 1 gtk-cancel False True True True False True False True 2 gtk-close False True True False True False True 3 Resize False True True True True True False False False 4 False False end 5 deleteprofile_button newprofile_button cancel_button close_button resize_button 10 100 95 1 10 5 100 50 5 10 1 9999 640 1 10 nautilus-image-manipulator-1.3/data/logo/0000775000175000017500000000000012134312450021566 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/data/logo/README0000664000175000017500000000054412111516770022457 0ustar emilienemilien00000000000000Nautilus Image Manipulator's logo was created by modifying and mixing together 2 images from the Open Clip Art Library: http://openclipart.org/detail/17373/photos-by-ytknick http://openclipart.org/detail/26221/lightning-icon-by-anonymous The source images can be found in the `source` folder, along with the project file used to generate the final logo. nautilus-image-manipulator-1.3/data/logo/nim-logo-small.png0000664000175000017500000000737312111522124025131 0ustar emilienemilien00000000000000PNG  IHDR00WsRGBbKGD pHYs B(xIDATh{p\}?{jWZm1868`!l›P)ICBHJhyZa 4Nhv ` 1c_dKvWZqĀcIgo̹wfw9|*HϭQz0Qen-<\BXcecg#yH`z) @78tG AO UF Vĩ͖ P2H E)t 8 7_W90پ͜piJ* ₸{@`@PhѰW/媅K#|\0F۟gұq!1A*+ g T@aXoؑJboʿ,-C}p34MPr_CD{.P™zʏXޛ1uTQKT@|%>XWy_]-^6ˆ^jf4ΛD;N1F$DPm0S|P44Յ סn$>{()ỳ0)nMy+0kW> .#Rl`0H$eyU %vP@zFS&/oGOR[F(rUtG٬[]e3[ >msJX+LlOOjG.GB ="{Gj K|o^Nx][7e>BbB@{Tv(jK-"--u?XIsr}q!(*Y*e6\o/Dd͘)bH[[!5C8ȕW^I&!͐FxMfL {Q,Gqd". q~ȺꪫcmzyH JuQzNtz>.9™g+SQ˞=IJb9\Si |Yt"}~k޼{-r{Ddn}W{HRb1E]Ÿ^Z$ frR%b/ݢqki -bx)"T"|vnhwC/<%3fLc%044~饗nYzE/~ j,0?Umzikr982)2)Rf\Lfj6ۈmy;ezXWъq#}j>1(zwfógի_>BHR2klJA5þՎV"LْPP}p]4gRȎ2&( R_[!ސS _rŏPPk,F4ŨbZ 55d~71e6;N R+w  Z]t\.91^qT FQ^ jj!vrFf;_ vYEZ5ruٽU6p3xz2}Y6z5"X=찻GYSǪA.n$yn^ǥ_7׭=ks 7EQatE1h*95a3 pE] +]eV쬧3D >yՊJg o{,`G @P=bPW20ĩOq5)FQ(>]Ͱx. ģA %˲17N!7,fQ˲ہPvhhq㤋}AFq ⸃$WHZ`\ox4'BcqmA]RPjQTi}F׽;ٱcJQC uxr(ͮC*{ZAqFĎ` NW߷y0  ~H "tUKT=7Y:ў,_]Ç( m =/*/QV2::]4^w6f6hi_\G,N<^-p6)_E ~v;ubfvRELF娅UR/4 xBpWM ,mgRE\3x U5;Тsq^{urMח NW]l̓W9i Ve =j vq7Xw.xse&hŭb:[lZ3g]z@booIe њ,QHM[l y 4c _]u[Y|I44p]X **7o^1߳~|{/Ҕwv {BA@^]|3hAuHC4w M|n:EY5lx,@eZΜ0ff6}Yrz PnM @ˁ8PGo\:h:עپ?h̪H%yo_rDBlߏ'OC\p]VŢٴivtt(p'85-tۢ&-im? ޾9y|/ÀP(o}K_y[Xط|>Gl^A[5tw?.)45`nv@p&dFRL7nR~}%u^K.I3p,peY7c4O9,^~M24_!?u'r%  S_\~S(M6+iIENDB`nautilus-image-manipulator-1.3/data/logo/source/0000775000175000017500000000000012134312450023066 5ustar emilienemilien00000000000000nautilus-image-manipulator-1.3/data/logo/source/nim-logo.xcf0000664000175000017500000065174012111522030025316 0ustar emilienemilien00000000000000gimp xcf fileBBgimp-image-grid(style solid) (fgcolor (color-rgba 0.000000 0.000000 0.000000 1.000000)) (bgcolor (color-rgba 1.000000 1.000000 1.000000 1.000000)) (xspacing 10.000000) (yspacing 10.000000) (spacing-unit inches) (xoffset 0.000000) (yoffset 0.000000) (offset-unit inches) b,Lightning.svg     =]bbbiy S *)$@P Z5ZZZj[xk,~pz"ĕэ.>N0pu9K1SSSSS^aaab bb*b:bJbZbjbzbbbr7 / 0 / *) ' &%& & %  i         r6.0 / *(&&%&%$񅄉*쏭􄆗󅄉􃋬󅄎򄈤새 ~ k : 3 2 1 0 /  -  ,  + * ( '& %#" !    ! "u 9pxeRB313/ J /d -s , 4+W*!)>'a&%0# L"k / C^4[ !?"_#|%6& L(e)#*?+ e,80( ,/ 76*" 7/' 􇈎 !獋}ƿ~ĸ~~ ÿ½  = 6 '       ) 0 8'  7𫡔vfWI<60(/veTE@8- ' DZeNA:1(  ڽrdZQH>3(  ı~rcR@. 'ü~bF)(ϸvYB2)5? 99 1*!+374.#( 0 . - + + ) ' & %$N  880 )!􇈇񆇆ﶱſǿ ƿ¼ ο,˵y*(ʶ(«&ʹ%ů$ $̳"ƤwY(  : 2 '   %  0 -  , + ( ' & &% # <% 8θzlaWMA3"0´}lX@')¸bA! !˻raK=+$ ɿpcRF<6/%  &ĽqaRGB7+ .ϽzbQG>3<}<;i:=8s!6M 694n"3?1t/D .}.r$ WW( ~DPk ?t}8;6}8:5?L;e:'8 =?;<=8876724 .-, . . - + * %$& ! 7                    ?;<=8765723.n-,.-~,*􄇭)$j#% `!!u          x톇놆<;: 8 8 7 6 43 1 0 /  .  ,+* ) ' & % #"      ! " #$ % '( * ++  -  /  0  1 2 44 5<8;^:)8J7i7#514I2e1,0 G /l . -9 +^*%(?'^&y$,# A!`!% Gs9 \ #z!;"U!v%"&;'f()C+ k, *. G/ b0"2*3 C5i6-7N8w90;<      چ򅀏􄃛ݍ܆򅃈ۆ惁ۆۆ~ۅۃڣ $ % '( ) ),  -  . 0  1 2 45 6 89 : ; <  - D/ i02;3V4"s677Q8n:;;   !!"#$$$%&&'()**+*)))'&%%$$#P #&"p G ́Q> q 7n;veBu ?x 7w3Z 2! p# D% Փ&a% !!"#$%%&&''))**++)(ʮ('ȵ&%ɸ%ŭ%ν%̮d$ĢwG"ɶg*!xP!ʴi; !¨yX&ϹlDȲ|\+yD ȶm ªzZ ̺n; ǭ{Xνm: ȯVоu>ʲf5vS#ʷj=ĭyY ̽o?Ȳ\ĥx?˸hũyL  ˹i/ êzR! ͸m; # ǭ{\$%ξqM&ȶb3%?< : :8 8 6 4 42 1 /  , +  ** ( '% $ " !      ! # $ &' )*  + -  .  /  1 3>;:ӊW9pUY7ՓcWXX6}\UXZX4֜lWUYYXX3뽅`UXYYXYX2ܣpWVZZYYXYX0҆`UXZZYYXXWW.iWWZZYYXXWVW-۝VWY[YXYXXWVWV,|QY[ZYXYYXWWVVUV+ޜfSZ[ZZYZYXXWVVUVX)|]WY[ZYYZXXWVXW(jZXY[ZYYXWXXWVWZU?&ς`XY[[ZYYXYXXWVWZM/ %rXWZ[ZZYYXXWVZWA #ϖfRX[[ZYXXWWVYO4"ZQZ[[ZYYXXWWVWXVF' !՟lUU[Z[[ZYXYXXWVXXP; ^WY[ZZ[ZYYXWXWH, jXY[ZZ[[ZYYZYXXWWXV?փ\XZZYZ[[ZYXYXWWS- jWZZ[ZYYXYXWWXK ؑ]W[[ZZ[[ZYXYXXWXXS<  v[XZ[ZZ[ZYYXWWYWJ( ۖiYY[[ZZ[[ZYYXWX[S: aYZ\[ZZ[[ZYZYXXWZYG)ޣoZY[\\ZZ[[ZYYX[U;ƍ`U[\[ZZYZ[[YYXYZM-wXV\[[ZYZVB!"V ,gAӂR`}5K߄#_ ! 9# ~ $ N&~'2)+k,8-k.</r1G2ܑ$4g6/4r516p<" ˹e- ĩ{N͹j6 ƫ{Y"ͼoEȲ}a+vP ȶl2«{] ͹rA˫|`qB˴]( uE ɴf2! xU#̶kA$ŭ{[(&˼sC 'dzh)zS+˶n9,ŨzW-θk9 .ǩ{T /n<1^%2tL4h66xW7n<5~\:u;<!        ! # $ % '( *+  , .  / 1 2 45 68 9;< ~,oUVXTNG?8/*%!*يaSUWVUTTVTTRNJFC?(vZSUVUUTTSUUTSVTC'٘hTSUVUUTSRRTTSRWO6%[RUVVUVUUTSSTXF($lRRWWVUTSTTUS;"Ό[NUVVUVUUTSSTSUSK0 !rPQWWVUTUTSTTSSTTPA& ۜ\OUWWVUUTSTUSL7PRVWWVUTTSRSSTSF( cPUVWWVUUTTSRSSUQ:ĂXSUVWWVUUTTSUVI) jTWVVWVUUTSWU; ̅^TTVWWVUTUVUTTSSYL*  sXTTVWWVUUTTSTUW> ԖdSTVVWWVVUUTTSTUO1김YRVVWUTUTTUSC% ؟lSSWWVVWWUUTUN7ǃ\QVWWVVWWVUUTUSF- dUUWWVWVUUTUVP=הQVWWXWVVWWVUVUTUTUL0tJXWWVWVUTUTSSRSE  ט`NXWWVVUVWVUUTUTQ7 |XRWWVVWVUUTVTH% ۖhXUWXWVVWWVUUTUXO7}_WWXXWVVWWVUTWWF' mXVWWVWVUT[S7ɍ`TWXWWVWVUVUYK+wUSXXWVWU@!ՙdRTXXWVUVWWVUUVUM7#~XSXXWWVUVWWVUUWSE*$fTVXYXWWVWVUVVO:&}YWYXXWVWVUUVJ* 'bWXYXXYXWWVVWVUWT@(WXYYXYXWWVVWO0)YXWVWVUXTC+YXXWWXWVVWVVUYM3,XWUVWVVYWB" -XWVUVWVWYP6/XVWXYF( 0XWVVWWYS=2XWVVWXXM24WVXVE#5VWQ97VWVJ'8WT<9N( :< 3$` <<9898777<: <<q9897t77Ɔ7Ɔ<9 ?<C;Y9~8.7Q7+8#>a; 54283T3 1 , +*)('( ' " $ #       ! # #$' ( ) +, - .0 113- & ! [`h%Ee"R Fr$ /Mg )-Ji+=d2 &Gs9 (5<5n4G2-2"21,+*(z('fz('"$͉ #   x  !"y$%&'**+,./0,󅛴%녂~~ }}쇊释 퇊 ʊӒuu| S/26DP\gpy}}񀆏\$5EQ[enu|򄂀+BUbmty~ %;%4Ke4 *+^]\\[[Z[Z\\L*,]\\[Z[[Z[^X=.\[\[ZZ\_M,/\[[ZZ[\@1\ZZYYZ[\T63[ZZY[\XK+4[Z[\T> 6[Z\ZL17[\XA8]S1:F;<9~^?" 8²hK,1į{dK3) ȹxfP:%"ɸobQ?+˹{hXL>/ϼxbNC9-!  &{T! /ˇ? -\ -n$ +()? '`<z;:9<z;98> K;h908 J?8868324 3 1 0 . * ('((&% $                       ?8758324210.)('󅄎('%$#􂈢񄀐셄酇Ç񅃈񃈣 䅃{񄉢̈񃅞󅄋߆߆>;: 97 7 5 42 1  0  /  . , + ) ( ' %$ " !     ! ! "# % (( ) , -  .  / 0 1 23 5 (4DUcoy}{zyyxyxwwvuvuttusrpnn (4?LXckrw{}~~}|yyxyxwwvututtstssr &2=JU`gmsvxyzzxxwvuututtutsrsrrq "*6BMYclsw{||zwuttutsrqqrrq!  +5?JT^hpvxzzxwtsrrqrqq) *qO|󅄋(c?tX󄆤Nu򅂋񅂘Б񃆧χ䅃φφΆΆΆ͗        ˹οŬɴ˽Ƿ ʾ|d ïm> ! # $& & (* + - .  /  0 2 3 55 8 89 ;; : 7 5 4 4 2 0 /  psy/rpoppqu{.qpomllmnj.qrrqppoonlj/rqpopomls1rqpopomm|3rqqomp4nprplr6AKTVk7I8P9{:< =;מ9tN2345667889:;;<<<=<::87531/V-b+ڐ+)a'm&܆$5 #Z ϊC J l ґ$ݫ>_m.rӇ1ߞJ  c! ֒#߫d%h&Ԉ %'&G,m-~/0 0T2ϋ,4۠Q5g4y9 ;q><3455778899;;===<;:Ů:˵8Ÿ53Ư3˵/н.Ƭn,ǶvW-*˽|i3(ðrK'Ʒx]&ʾ|d3%«j:$ȱsF"ϵ}R Ģ}i/ İmH# ƴwW'˹|d9¬nLǶtZ!ʻ~a1ìr:ȶzP˼}dh< ƮoG ʶuS' л`4 !ūqL#ǶvZ5%ɻ|e6&oG%ɳwW&zd',ði8-tB /|Q0e, 2mI4sT+5z_67m@9w];;}?< : 97 4 3 2 / .  .  ,  * ' ' $ # !        " $ & ') +  ,  .  / 1 3 4 68 : <><:ʼn]8أcHC6wFBFI4ȎN>FHII2כb=EGHIHG2iJAGHHIHGF0uPFFHHIIHGH.ۅVJHHGHIIHGHG-ب_KIHHIHGFF+xOEHIHHIIHGGF*Ȉ^HBHJHHIIHGGFED'מjJFEJIHHIIHGFFEF%{PBGIIHIHGFFEGGB$ŒYCEJIIHIHGHGFFGE:'"ݙeHDJJIIJHHIHGHGFF@- kKEIJJIHGGHIHGGFGGB:πKFIIJJIHHIHGGFGF<*؝VFJKJIJIHHIHGGFFGA.kFILKJIJIIHHIIHGFFHD3yTFJKJJIHIHGFFIH8 Å]LHIKJJIJIHHIIHGHII>$gPHIKLKJJIJIHHIIHHIJE- xQHJKLLKJJIHIHKE7 ďaAHKLLKJJIJJHIHJH:( עjL@KKLKIIJIIHIHA.zNEGLKKLKJIJJIHHIJHC8 ̋UEIKKLKJJIHHJIF<) ֟`GILKJKLLKJIJIHHIIKA0 mKHKLLKKLLKJIIHIJ3 uQJKLLKLKJIJIHIHC ՃXJKLLKLKJJIHGIJC/ ߤdOJMLKLKKLLKJIJIIHIKG4{UJKLLKLKKLLKJIJIIHHKH9 쾋aLILLKLKJJIIKJ='ϘjOHJNMLLJKLKJJIJKMB- tTJJMMLKJJKLKJJKLI7 "ɓQKKNNMMLLKLKJKLH>+$l>LONMLMLKKLJKKJB1&BONNMLMLKKLKJIJG9 '      a  B" q$ֈ9%M$ĉ)ڜ*+^-m+ڊ 0 2=4t5. 6= 8r!:7z }̽­dzʻìǹ ɽvY «t3 ȱxT͹{^""ħf< $ñrH%̶{[)'˼fH)ïsR+Ƿx]2-~i9/rI0{V2{h!4g= 5uC6{Z8}g=:N    ! # % ' ( *,  -  /1 2 4 5 8 9 ; &~, $܍E"X x,٘@] z2_@/.*$ ƀCDDFGHGEB=70*$  ϏT@EEDDEEDCCDCCEDA?;94$ ݛgHCDDEDCCBCCABB@E@- sRDCDEDDEEDCBBA@AABD3  ҉YFBCDDEDCBBAD@<"ܟkGACEEDDEDDCBABD<,~M=DFEEDDEDDCCBABBC@2  ǎ\?@FFEECCDEEDDCCBBCA7' ٤gE=EFFEEDCDEEDCCBCA:,uJADGFFEDDEEDCCBCD>2҄NCEFFEDEDCCBB9$ ԠVBFGFFGFEFEDDEEDCCD?*kBCGGFEEDEDDEDCBCCD.pRDEGGFEEDEDDEDCBCC< ЍWIEFGGFFEEDEDCCEC<) !٠hKDGGFGFEEDCDEEDBEE=,#{SDDGGFEDCDEDDCHB2 $FBGHGGFFGFFDEF8$&FHHFGFFGFFEDDEEGEA-(IHGFFEEFEDDEEFA3#*GFEDEDEFC:&,FGFFED@/-GFEEDDCDEB4/GFFEEDCCFE; 0GFEEDEG?)2FEEGB13EDDFH5 5EF>%7F@094! ;} <88:9545 1 2 1 1 5 < <w879854512115; <p:&9?8i8+6 R5y4:2\118AVt4$5IYl;&465 1/ 0/-,(' % $ $ # $ #              Y     !! !!# $%$$%'#    $O}  "M| !+48P~ 2APp !5Qg|'M4650/0/-s,''%$$# $ #     G l    x  z7񉈇񇇆 鄃 ܃˅셇 腄񎉇yz 煃 *BSbpy~넂  (AVgt򅄃 +CYiu "*;GQanw}  *6ANZbhp󄁏&)l<; 9 87 6 54 2 1 0  .  -  , * )' & % $ "!           !" $ %( ) +,  ,  - 0  1 33 5 58 5 - '     #  * 2 9 8 654 7n6&5E4p241W0%{ .? -Y ,r*,)H(p&:% b$#:![ &z>Z&{8X! "A# g#'#G'`(+~*E+ [, ~+ 6,[0)1M3s4-6L7k83:Q;~<56Icx0*C[v*Wy& 7cpmjhhjlu$Hknnmlmllkkjiikpw,Vopmmnmllkjhgffeefjosw;`ppmnnmlkjkkjiigecbcehlu}Hhqommnnlkjijiijhgfeedcbdhlm{          {ܝ, ]nۥHk~`-! ±|e_TE5æ    򆅄ބބݭǰкī˵ϽĨֶͭpAśtQǭX1βk9ԼsV%Ǭy_8ϸ{eB սb3̪뇀xoe]QA52,$ӹ xofXEß ٷȼǾĽ     89 ; ;< : 9 7 7 5 4 11  ,  +  + ( % $ $ "!   ! &  % + 1:<;~9Œ`T8pVRT6y\SRUT4ȓeQRSTT3֤uUMUTSST0٫zWKPVUUTUTT/rZVVSOMLNNOQ/ҾqgaZWTS/ѻ8D ޑ 3 N z) ; gЄ" ݪHj ʀ ) {׈$@[z'ۗMc} ߟ&J p%ӊ ':(.)Ѓ,ݝH -f,|)-ۛ.3Y5Ѐ7ޕ+867V8>[HB<0# 6-' $-0 2- &$+ . *(%# ƴ􇆄vM ж}Y ǡf*Ʊm@ʶxS˼}_7 mF ųtZ' ˼zb8 ®kCǴzG̽}gīkAdzqGɸwT"һ^0 Ȫm@ʷsP)ͽy`4ïjA ɷtR";zc' ȭ~j;%̻nG'ѿK(ƨh)ͲmE,ѺtS&-z^6 /hA1sQ3{`/5mC7tN8~[:i-8>0&# 6xnht,&󇆇鹵ÿ  ¾ (˷ ' "Ͽ ȵ ɾ,  + *( & # #       ! # $ %' ) +  ,  .  0 2 4 57 8 :<~9 0 ) !     (  *  ( & "   8ŁTIK6ِ\LLNO5dPNONMN3vTNNPONON1ˋ]OMOONMMN0ܝlOKMPONNMMNM.|WIKPPNMNL,őaJKNPPNML+ӠnNHOPPONMLLKL)yRHMOOPPOONMLLK&ZKLOOPONOONNMLLKL$ۨTONPQPOOPONNMLKE$vEQPPONOPONNONMMLKMI8"WIQOPOOPPONMMLMMLKLN># !ΎbONPOOPONMMLLKKLNF*kUONPPOPONMMNI4zZOOPPOPOONNMRJ< ŊcOMPQQPOOPPONNMOP?(ѡlPKPQQPOOPONOH0{VIOQQPONOPPOONNOJ:" Ɏ\LKRQQPOPONMNNLA+ ףgLOPQPQQPPONOPONMNNME4 vOLRRQPQQPOOPPONNPOJ:"VMQRRQRQPQPOOPPONONB& cORSSRQRQPPOPONOJ-^VSSRQPOPOPQM; |SRSSRQRQQPOPONRN@$ ǎcPOSRRQPOONOPPORSD+ ԞpVNQTRRSRQQPOONOPPQSJ2 }[OOSTSRRQPOOPRQN: ŏ_PORTTSRRQRPQPOOQSM?*٢kNQQSTTSRRQQRQPPORQF1|PLSTSSRQPL; ȋ\GRTSSTSRQRRQPPOPOPND) !ݚcPMTSSTSRRQPPOPPOJ2#mTRRTSSTTSRQRQPPQPRL<$XSTTSTSRQPQQPPRQB' %STTSRSTSSRRQPRUE,'UTSRSTSRRQRQQTO1(TSTSTSRSSRRQSSP? *STRQRRQRTPE,,STSRRQQSG2.STSRRQRTM;! 0STSRRTSROC,1QONLMONG63naYTRM:6ϼY' .ұgD% ' ¢^>*  ʰuYD7' ̸n\K8*  ʻo[G8," (ɾ}hTB6-)0s_N;6ζg<<===:@7֪g,5J& 3֑a. }======= }=======nOMNMMLKLKJJIJIA( (NMMLMLKKLLKKE0+NMNMMLKJKLLKKOG7+MLKJKLLKMN9"-MLLKLMD%/LKLKKLKMNG21KNMI8 3KLNJ>)4KNMC/6LMG9 8KA& :4 =="===7=  ;88776764 /.\/+*- , +) %$# !         ;87676763/I./+*,+􅇤*󅋭($## c ?< : 9 8 7 7 6 432 1 /  . - ,  + * )'   >";3: G9`8!857M6[4g3!}210B/ Q . b - , +=)Y(s'&)$<# M"a "|2K`)''M&h%$%#2"H              ӯh 㿚2 ֐f  ` ʖ/ ՛]  T+   ɑ- ͞q/ 躁C ӣ~& ؽ[  СN ڽ I# ;% ) ȏJ))]񄅜')c&7l$Eu#S{"_!%mj}΍핿g텂󅁍~퇔􅄋󇃂󂄠 󃆫 鄈   􅃈􂊱򅁓܆܇܆̆򄅗å´ӱŨȵϹ񇉇Ű퇈weϻ|o\7 DZweQ}pL5Ŵxh4вzjO ơpR0 ʹ|a, ηyiMŦmT; θ{bD# znVCʶsdD/{mT( γscD ğ~fM&#вyX!%ϹwhC)iK&)3 2  0 / .  -  , +)( ' % $ #" !      "! $ & '( ) * + - . .  /  1 333  0  .  . +  *  *  (  & &   !      ! $ '  )  , / 1 4 7 9< -[uxsqonnllkihijjhhgfeddcb_o=V]_dilnpqppomljiijihhgfgffefebd{ (3>HSZ`bgiijkklkkjihhggfefdah #.:DLT]cegjjihigfeed`k  *18BKRW^cegihhgee^m %3=CKSZ\^bdf`q *7FOPi.: Z z4 G Y  e"t#"$4%P& o'(+*?+ N, a. z/ )0.1=3U4{5,6G7^8s9;<;ʤ8ڻoU5ϥ]JLO2ݿnTGLQRQ/ΪnRRHORQQPO-Ա\GQPQQPQPP+nTKQTRQQPQPPO(ۢl_TPRTSRRQRQQPOO&ձ]YTRRSTSRRQRRQQPOOP$뷑w]VQQSSTTSRRQQPPOP"ץhYSPQTTSRQPPQPOOPOԿw]QPQSTSSTTRQQPOOPOPRĨjVKQTSTTSSTSSRRQPQOONNPQRRHںkYSKRUUTSRRSTSSRRQPOOQPNB6#Ʀ\OSRUVUUTSSTSRQPQPOPQQOG9㭁e6šuZBD4ЪeO:BFF0›mQE>BHFGF.ͫWACEEHGFF,ἉlF;CHIIHGGFGF(֠dUFBFGHIIHGHGFFE&׸RFIFHHGHIIHGHGFFEE&kJCHIIHHIHGGFEFGFEFE"ܙo^IGIIHIHGGFEDD ط`SLIGIJIHHIHGGFEEDEDD漘uZMGIJIKJJIHHIIHGGFFEDEDDEGHҥfQHDHLJKJJIIHHIIHGFFEFE8)uSJGEILLJJKJIJIHHIIHGGFHD?1"ʩiDDIJKKJIHIHGGIF@7*—hUDBKLKKLLKJJIHGGHIHGGHIGHD>1 ͭ{QGHELLKLKJIIHIHGHIIHGGEA9. ߯fGELLKLLKKLLKJIJIHHIHGHGD>/% эmVFIMNMLLMLLKKLKJKJIIHIHF9# ׵wSQLLNNMMLMLJJKLKJJIHJIFA/  ޳eKOPNNMLKJKKLLKKJIJIHHIKM?4! ɒt[NMMNNMNMLMLLKKLLKJIJJIIKL6&ر}gUNLMOPNMMLMLLKKLLKJIJLKGB,۸s]MKMNOPPNMMLKLKKJJIJNJA5% eVIHOOPNMLKLKKLLKJKLLMG9+OKJOQPOOPONNMLKLLKLNLJA2$OQQPOOPONMNNMMLLKLNNJE:,POPONNMLKLMLIB2!"ONOPPONNONMMLLMKLJE>,%OPONMLMMLKKJ>6(OPPONNMLKLLJ4&*PONNMLMMLJC) +PONNMORLB4 -PONNMOTF6&1NPRNO@* 3RNE7"6;/: }    ފ  ⿈  ̄H 6 p) ǝ\1 vB ̧t  سH ̘A ! ٸ|) 丂K+ ، -ڻJ1걃%3~< 4ڰe) 7U%:2 ¶ Ȼ µǻ}xtO űwcHſlF&ϾvU  ɴve9 jS1̾w_># ƵylW< Ⱦ~r^E&"xkP"%~raA)yaD(+}qI-sb(1z]E3oB 4s\57cH-:       #% (  *  , / 2 4 7 : ~0׷~O.ŗ_7 *׹r3 (вi %黏e66;81+!"ڞhQ:8@@??@BCBAA<5.&  ߻{LC?<@@?>>=<=>?@>=:50`FA??@A@@?>>=>=<<==<:;<zZF?>>@AA@??>=>=<<==<;<<=<0ŋbPB?=?@AA@@>??>>=;<==<<;>=<7*ɥzZG:>>??@AA@?>?>>=<=<6/! شiP?6>B@A@?AA?>>=<=><=<0'ȤxTD<:?CAA@AA?>=>>=<=?><7-! Ӳf@<@@ACBBAA@@A@??>=?>92)  ďiT8:BCCBCBAA@@A@??>?>>=>:7.  زrKD:>EDCCBCBAA@@AA@?>>=>?=97%  㶓X=@CCEDCCBA@A@@AA@?>>50 ыnN<@DEEDCBCCBBAABA@@A@??>?>>?=1!ܭmTJACCDDEDCBCBBA@?@A@??@?>:) ܹ`LHCDEDCDEDCCDCBCBAA@?@AA@?@D@81 tXIDCDEDECDEEDCCBCBBA@@AAD?0% OFBCEFEDDEDCBCBAA@ABB@9'BCFFEEDDEEDCCBBCAABA@AEA;1!FEDECBABAABD=6+!FEDEDDCBAABC@@81$ #FEDEDDEEDDCCBCBA=5+&EFEDDEEDCCBCBB@:. )EDEDCCBD@?7$ ,EDCDEDCCEF@<0.DCDEDCCGA0% 0EDEFDD<" 2GHC>0 5>4% 8:~@:(!8>7/#8! 9       ˍ  صk 㼅-LH  < 鸎) ͋V' m4 ϑc)  هD  ('* . 249;ӯӼë׶ȫҹ~}脅ɪyjIϸ}q_8y⹡xcF.өmB%΋Լv^򃅣㻤zaJҧlJ- ~w]9 }􃖬lM4tF#O~w ' n' p*p.138;&  $   %   & (  *  +  ,  . / 0  3  3 4 68 & p. F \r! ٺ(Ƨ|YX7ӬhQTZ[Qp^TX[[Ziҩla]YZ\\[[ZZ۬gY]]\\[Z[ZZ[[ -xf[[]\\[Z[ZZ[[Z Dӧlb\[Z\\[Z[ZY Xwe\[]\^]\\[ZYZ[ZYY rݙ{nf^WZ^_]]^\\ZYY[[ZYY#彇T2@WXZ^__]]\Z[Y3Χs= @]_^^_^]]\\]\[\[ZZ[[Z\] EÆC$Le_^^__^]]\[\\[Z[ZSK[Хj *Tf^__^]]\\[Z[ZVOD*n uC5[f^^__^]]\\[Z[ZZ[SG9  ւ@B]a^^_^]]\]]\\[Z[ZZ[Z]Q:'r ݱR$L]_^^__^]]^]]\\[Z[\ZWH&m 9.S^_^^__^]^^]]\[[^_WL;  /ׂQ/3W`^]^__^]]\\[]]_aR:( \m37[`_^^_^^]]\\__[[C+ 鼅Q- =]a^^__^]]^`aVO9#Gq;  E`b^^__]^a^QA. )Mbc^^`a`]XJ8$* 1Tcb]^_`b^[PA0, ;[a`__a\XH5# -G^`__^ZWB".Q`_^_^WK80%V`_``O9% 2 2Zbb\@%2A]\O1 2"FI?'4.+792 Y' +s@.á\:1ݭy>4ǥd7ګ@:BywR/+wg, ܶu^WVTYZZXXWXWVVWVUUTSSXWQJ5$ɡiRQYZYYXWVUUVWWVVUTUTUWTJ@- l_ORY\[ZYYXXWVUVWWVTTUTUTNE8!VY[[ZYXXWXXWWVWVUTUVURJA.[ZZ[[ZYYXXWVWVUVWUQF7" !Z[ZYXXYXWXWVVWWVUTQ;%#Z[[ZYYXYXWWVWYWQI/ &[ZYZYXXWWVW\VH7 'ZYXYXXWWXWVXXZT;'*YXYXXWY[XRL. ,YXWZ]WI<#/YXYY[ZO>.2[\XUH6#4TO>/83#; >ccccrr99 SVG rendu     c|c,,,dddddeeNe^enkotMx}>]imܱ%V  *g!'6'F'f))))* ,L,\,l,|,,,,,"Qdv- --";-*;Lf *;L]n "!!!!!!òfL;*qǴ~kYF2 '^3K382&2%283K3^ -:GUbop `o}   |j W Dz ";-*;Lf *;L]n "!!!!!!òfL;*qǴ~kYF2 '^3K382&2%283K3^  (/6>p5>EMU]emmmml lkl ldll k|[k kjSk kWKkkj jDCj j";-*;Lf *;L]n "!!!!!!òfL;*qǴ~kYF2 '^3K382&2%283K3^)5AMYep Weq~   | j W| Dn r*=Pbu"3M^o +3 +3 3*;Lf#*;L]n *D]n *;L]n&L]nònU'̲n]L;*òn]L;* òn]D*#ên]L;*m-:-%3BQ_m|  .ELS[fmml  (3>ELS[bimmlkEP[bimmlkmll!kl'kjl&kjkjikjikjj ij'ihjic[[Z*;Lf#*;L]n *D]n *;L]n&L]nònU'̲n]L;*òn]L;* òn]D*#ên]L;*m)5-".Qdw!%8J]o/yò,͹o]J7%vcP>+òn]L;"òn]L;*,;*m -:G[o|#-:IWet  4GUbo| -:GUi|'GUbo|k '$ l, -:/#)6*;Lf'*;L]n*D]n,>Qdw!%8J]o/yò,͹o]J7%vcP>+òn]L;"òn]L;*,;*m  (3>ELS[bi#  )08AIQYaimml (/6>ELS[bjmml  (/:ELS[bimmlk(/6>ELWbimmlkmlkl&kjl&kj kjikjikjij'ihj&ih ihgiihgihgh'gfZ&YX*;Lf'*;L]n*D]n,>Qdw!%8J]o/yò,͹o]J7%vcP>+òn]L;"òn]L;*,;*m)5ASep|#(5BO\iw /AMYep|)5AM_p|$AMYep|%!*0*"00 $' l)#+>Pc*"ELWbimml $/6>ELS[bimm l  (/6>IS[bimml  (/6>ELS[fmml kmlkl&k l&k j$kjkj ikjij&i j&i h%ihih g ihgh%g h&g f%gfgf e gfef$e4X W| 0B+*;L]n*D]n*;L]n*;L]n,y0Ͻq^L9'"ñyeR@- ̲n]L;*òn]L;*(n]D*m)5AM_p|' )5AMYep|);MYep| )5AMYew#$5AMYep|% %& 0. ,0(# 19-,0 ($ 1+."EP[bimmll (/6>ELS[bjmmlYS[bimmlk!Flk)3lk1!lk&kj8kj@ kjiGjiNjiVj'ih]ihe ihgihhg xhgeh'gfRgf"?gfe)-gfe1fe8f&ed?edFedMed cTWVPr)<Q<c<v<<<<<<<; ;;2;E;X;j;};};==$=7=J=\=o========<<+<><Q<c<v<<<<<<<; ;;2;E;X;j;};};==$=7=J=\=o========<<+<><Q<c<v<<<<<<<; ;;2;E;X;j;};};---,,",4,G,Z,m,,,,,,,,++)+;+N+a+t++++++++ **0*,//// ]. / U1n24]67U9:Q<1l ^  ,O ?@ R3 e$x    uc P =s *e!V 4H F: Y- l    n \ Iz 6l #^(P ;B M4 `'s    z g T Bs / eW  /J B< T. g! z    s ` My ;l (^ #Q 6C!I6![(!n!!!1;jj i3i i ,+i i?#ii hRh hehhgx g gg gcggf f[f fuTffecLe ePDe e==ee d*5d d!-ddc4&c cFc cYccblb bbbaa a[a aTaa`nL` `\E``_I=_ _66_ _#0__^((^ ^;!^^]M] ]`] ]s ]]\\ \Z\\[S[ [zL[ [gF[[ZT>Z ZB8ZZY/ 1Y Y*Y Y /$YYX BX X TXXW gW W z W W WWV SVV LVVU sEUU `?UU M9UUT ;2TT (+TTS#%SS 6SS!ISSR![RR!n RR!QQ!PQQ!LQQP1b U  ,H?: R. e! x    uc Pu =h *[ !N 4A F5Y( l     n \{Im 6a #U (H ;; M/ `#s   z g Ts Bg/ Z N  /B B6 T) g z    s `x Ml ;` (T#H 6<!I0![$!n! !! 3 2 2 2 2 2 2 2 o2 \2 J2 72 $2 2 1 1 1 1 1 1 1 {1 h1 U1 C1 01 1 1 0 0 0 0 0 0 0 t0 a0 N0 <0 )0 0 / / / / / / / / m/ Z/ G/ 4/ "/ / .......y.f. k2 k2 k2 k2j2 j2 j2 j2 j2j2 j2 j2 j2 i2 i2 i2 i2 i2i8UU i i ih h h h hg g g g g g g g gf f fe e f f f f f f e e e e e e e e e d d d d d d d d d c i:2 i:2ih:2 h:2hg92 g92 g92gf82 f82fe82 e82 e82ed72 d72dc72 c72 c72cb62 b68UUba6 a6 a6a`5 `5`_5 _5 _5_^4 ^4^]3 ]3 ]3]\3 \3\[2 [2 [2[Z2 Z2 ZY1 Y1 Y1 YX1 X1 X0 W0 W0 WV0 V0 V0 U/ U/ UT. T. T. S. S. S- R- R- Q- Q- Q- P, a2a2 a2 a2 a2 `2 `2 `2 `2`2 `2 `2 `2 _2 _2 _2_2 _2 _8UU _ _ ^ ^ ^] ] ] ]] ] ] \ \ \ \\ \ \ \- - [> > [> > [> > [> >[> > [> > [> > [> > Z= = Z= = Z= =Z= = Z= = Z= = Z= = Z= = Y= = Y= = Y= =X= = X= = X< < X< <X< < X< <?U@?@?e??U@?@?@@?U@?@?->@=<?U@?@?e??U@?@?@@?U@?@?->@=<=<?U@?@?e??U@?@?@@?U@?@?->@=<"; ]H; $%&'(H)+H,/ / @/ 1 0 1 3 2 4 3 5 545@57879998:::::::::::::::::9;;:<<;=<H?U@7777777777-eP-m-m-m-m-m-m-m-l-l-l-l-l-l-k-k-k-k-k-k-j-j-j-j-j-j?U@7777777777-r-------------------------?U@7777777777--$->1->1->1->1->1->1->1->1-=0-=0-=0-=0-=0-=0-=0-=0-=0-=0-=0-=0-=0-<0-<0-<0-<0U!;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;U!;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;U!;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;!!l!Y!Fr!3e !W!*K"=="P0"b#"u" """x"e"Ry"?l", _"Q"1E#D8#W+#i#|####q#^~#Kr#8e#%X#%K#8?$K2$^%$p$ $$$|$i$Ww$Dk$1^$R$ ,E%?9%R,%e %w%%%%u%b}%Pq%=e%*X% L%3?&F3&Y'!EPP!l?PP!Y8OO!F2OO!3-OON !&NN!*!NN"=MM"PMM"bMM"u LL"LL"IKK"DKK"x>KK"e8JJ"R3JJ"?-II", 'II""II"1HH#DHH#WGG#i GG#|GG#FF#CFF#=EE#q7EE#^2EE#K-DD#8(DD#%"CC#%CC#8CC$KBB$^BB$p AA$AA$@AA$;@@$|6@@$i2??$W,??$D(??$1#>>$>>$ ,>==%?==%R==%e <<%w<<%<;;%9;;%5;;%u0::%b+::%P':99%="99%*99% 88%388&F8877&Y 77!!l}!Yq!Fe!3Y!!M!*B"=6"P*"b"u""""x"eu"Rj"?_!, S"G"1<#D1#W%#i#|#"##qz#^o#Kc#8X#%M#%A#87$K,$^ $p$ $$$|~$is$Wh$D]$1R$G$ ,<%?1%R&%e%w$%%%uw%bl%Pa%=W%*L% A%36&F,&Y!S.@.-...-------q-_-L-9-&--,,,,,,,},j,X,E,2,, ,+++++++v+c+Q+>++++********o*\*I*7*$**))))) c c c c b b b b b b b b a a a a a a a a a a ` ` ` ` ` ` ` ` _ _ _ _ _ _   _   _   _   _  ^   ^   ^ ~ ~ ^ ~ ~] ~ ~ ] ~ ~ ] ~ ~ ] } } ] } } ] } } ] } } ] } } ] } } \ | | \ | | \ | | \ | | \ | |\ | | \ { { \ { { \ { {[ { { [ { { P, POO, O, O, N+ N+ NM+ M+ M+ L* L* LK) K) K) KJJ) J) JI( I( I( IH( H( HG' G' G' GF' F' FE& E& E& ED& D& DC% C% C% CB$ B$ BA$ A$ A$ A@# @# @?# ?# ?# ?>" >" >=" =" =" =#+##""""""""o"\"I"6"$""!!!!!!!{!h!U!B!/!! !       t aijw^M<Nijo^M3  p p  p p  o o  o o  o o  o o  o o  o o  o o  n n  n n  n n  n n  n n  n n  m m  m m  m m  m m  m m l l 2 2         33 **********$òK]D*                      I I         33 **********$òK]D* 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1           33 **********$òK]D* ~H:9H6H3 2 0 .-)H'$"H!"#'(+--. 1ջ4+ {pon@m?l?2?3@@@?I?3@@21??3@  @         D !H";$&'@'H(*H+-. H/ 1 2H46H8;:pon@m?l?2?3@@@?I?3@@21??3@pon@m?l?2?3@@@?I?3@@21??3@-pY-pY-oX-oX-oX-oX-oX-oX-oX-nW-nW-nW-nW-nW-nW-mV-mV-mV-mV-mV-lV-2(7777777773F----------~-~-~-~-}-}-}-}-}-|-|-|-I:7777777773F-2(-2(-2(-2(-2(-2(-2(-2(-2(-2(-2(-2(-2(-1'-1'-1'-1'-1'-1'-1'-1'-7777777773Fb;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;2ƲvbN;'f f f @? @? @? @? @? @? @? @? @? @? @? @? b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;; b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;; b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;b;; ccccrr99Copie de SVG rendu     --SSS...///#/3/C/S/c/s0'<======Jj?%5uC(u 2333343:2EQQQQQQQRS$S4SDSTSdStSSSS <*<i<<Y;:N:9F9949r9!8o8$8^76J66;5 O=%E9 ܣY7A O=%E9 ܣY7BBCC)} .AABC(+G<@AAB'h*?@@AA($T8??@A&[%=??@'f2=>>?@&H+ :==>?&} 0<<==>%@3;;<<=% -;;<=? <:< }</;k;:[:9X99E9818{8(7o6"5^5_4P$4s4=24 47:4 40C4l4 W3X!4e4N'/u .B+M. y-87D- ym-'K8-e d,^.+b _+^*,Q"S*s "y*;5H*  q)0?=)} l)+G7(hd($T1&[ X'f&z'H+N%}v%@3H$p554w4.3l3"2X21I 1 1D 0 /3 / u /$ .f . .X - ,P ,,?++%*r*))m)#(W('F' ';&&6% w%+$d$#Q##M""=!  . s " cWJ4~.y*b  R!!E""0?ML  6t ŷY&-l'O@·e. '`^wmj¼t0 Qc5 7yŪq;N( kK?Kn)~K²SE/]?U]' "s#`k33V8 ,ow@i 5tľCJ- C|^ IW:&W tT#ae1-j kH 6wi,|?-\@ K$q gF>Q4cԉ7 g )z1 FC- to% |\ 5_ Q=$ R qQ?ݗD4 ҉< dHM}.'x sl'Y;WG'oan !1RQ5g> ;ۘFd +{  IԉC+s2WwY 3o d:$ ( #umO @_K32- ?|X+ ;_EKUovQ%Iv HtIT=ZH vl@k "Rg<2 c<&x_0a )}VzX, + r22xP#W 5n `qJ" )6l@M>bf} !@EMSmr G9UHqi !L2i='w_ *{  V(r1-xU 4o  [# )7}K @_bx <BKUjp C9ZGpe #M 0?(bffgghijkjcK* 6t  FeffghijkmeP1-l'O!YeefghihdfijjkleT7'`^ >beefgh_;:[hijjkg\@QcTddefgIB]hijjkm^? N(7accdefg\( "Fahijjk^G)nPbbccdedC (LdijjklkbN.E//_abbcdeW!-QdiijkjfU3Naabcdc< 4WghiijjklkX;3+\``abcdT   "E_g-+UZZ[\]Q   (JCXYZZ[\Z8 gF>&SYYZ[\L cԉ7  ?XXYZ[W2 )z1 FPWWXXYZI to%:WWXYZT, 5_ QNVVWXYC R 4SUUVVWXQ&?ݗDHTUUVW> ҉< .QTTUUVWO"M}. ASSTUVT8 sl'(NRSSTUVJ WG'oa >QRRSSTUS3 !1R$OQQRSTF g> ;ۘF ;PQQRSP- +{  IԉHOPPQRSA s2W4MOOPPQRM( 3o dDNNOOPQ= (#u/LMNNOPQJ# @_kJ2@LMMNNOPO8 [}>;(KLLMMNOFKU$þs4 I?KKLLMMN3 fþi*THKKLMNDZH.\#IJKKLMK. " u·VIJJKL? c<7µEIJKI) )} zÿ~?HIIJKJ< r2Gr3GHHIIJE$ 5n ¼i,GGHHI6 )M\GGHB>b¸FFGH3 !\EFFG@MS$EFE. eEF< UH/DDEC* ! nCD9 i=7C@$ *{ {BC4 r1AB>  4o A1 )N@A< @_@@?- V?8KU >) `>5ZG,;$ # o0?F{E 6t yQ"-l'O:[) '`^lc`j,Qc0|2og6N( `D9vuDn%sDLE/T9NU$ h Xa.3N3 (el:|_ 0jCC) >woTCW4"O gLXe,x)` `@1li(o:u-S9 E~ ~f gF>H/cԉ7 w\ )z1 F;) to% oR 5_ Q6|! R dH?ݗD.u ҉< Y@M}. "l sl'O5WG'oa|b !1RG0g> ;ۘFuY +{  Iԉ;&s2WiO 3o d3y (#u `E @_!2(p <7';T=KU 1>=<4$Ih  <>><3 T6ZH5>>=:0 ^ "$==>>=9-, c<5==>=8*V )}&<==><7'}& r29==><5#L 5n += =>=;2 t )9= =>=;0D>b-==>=9m !:<<==><MS 0;<<=>d ;<<=>2 UH2<<=>\ !";< <=,i=5< <=R *{ &<< =w"r16;<< =J 4o (;;<=q )8;;<=A @_ ,:;;<=h 9;;<=9KU /; ;<=b 9; ;<2ZG 2;;ļt: OѓL¿A=۩^ŲM!<i!])5vt7n- )bʋF ħm9RۗJ T~HKZ#!^±P; i+,nV  /o{7  4sľc+  ZԎ< Bľl7RבLHû}DC٦d"XN+z #`]- ,p ,kĹl4$X 7w¼s8H?IBMűQ#6wTa' ,g8 "`j- Wy1 +lr=o# 5sN_ APSH^, ܔEUĽl5ӊ:$`y>{,+kfm( 6x&m` =/RO ;ژETIԊ9 #cVz1 +leo$ 6ve8$v^A~_3 2SI{X* ?ݔEWuQ$Hӊ;$`sHWz,*jlAfl( 5xg;'p` >~_1.RzX,  =ژExP$ J҈9 rIU{1 nB`n$ f8%v_  _4 1}R|W) >ޖEvQ$Fъ: rGYz- f2j$ 0x9.͍I, EݛK+<\$+ .kn0 *\7 +TړD F۞Z$J+ 5vm'khP1%tv/ klfU8%`ʅ>klh[@ OѓLjkjbF$ =۩^ijkmbK+<i!ijkldQ35vt7hiijkfX< )bʋF bhhiijkl]< RۗJ -Qcghhiijkj^E(KZ#2UfghhiijklkbM,; i+:WeghhiijkjeS/ /o{7 =]ghhijkliU7 ZԎ<#F_ghhijkliW< RבL 'Jbgghhijklh\E% C٦d" .PdghhijkjfL++z 3TdgghhijkleP4,p 9YeghhijklgY;$X?[egghijklh^@H!D`fgghijkl`H(B )JafgghhijkmbL-6w-PbgghijkdQ5 ,g8 3Udfgghijkj[:Wy1 9WdfgghijkjZ>! o#=\fgghijkj^H+ _"E]ffgghijkjdO,S %IaffgghijkhS4ܔE -NcfgghijkliW;ӊ:2Sbfgghijkh[B"{,8Ydfgghijkljdfm(?Zdffghijk&m` C`effghijk/R )J_effgghij ;ژE,OaeffghiIԊ9 4TcffghiVz1 8Wceeffghi!eo$>[deffghQ$v^"D\deffgI2S &I`eefg|=?ݔE .Madeeffÿs5 Hӊ;2Sbdeefg*Wz,7Wdde¹]#fl(?Yc·T'p` C´G.R ~? =ژEr3  J҈9 i+U{1 ]!`n$ ¶P%v_  J1}R|;>ޖEt5 Fъ: e*Yz- f2j$ 0x9.͍I, EݛK+<\$+ .kn0 *\7 +TړD F۞Z$zH5vm'Q# %tv/ ]- %`ʅ>i5 OѓLs;=۩^{F<i!T&5vt7d) )bʋF d3RۗJ MsBKZ#VI; i+(dN /o{7 /iZ'  ZԎ< =wb2RבLBq>C٦d"P}G+z  XU) ,p (bb/$X 2mh3H9twBBF~}J6wMX# ,g8 Wa) Wy1 'bh7o# 0hvG_ ;vISB~V' ܔEMb0 ӊ: Wn9{,'afm( 1m&m` 7s/RG~ ;ژELIԊ9  YVz1 'a eo$1k-$v^ :t=8*2SB}>=7'?ݔEO>=<4#Hӊ;!V>><3 Wz,&_=>>=:0 fl( 0l==>>=9-'p` 7r==>=8*.R==><6' =ژE=>=<5# J҈9  =>;2 U{1  =>=;0 `n$ =>=9- %v_  =>=8*1}R=>=7&>ޖE<=>=<4#Fъ: <=>;2 Yz- !ء[$e%p3)ƃ@)АJ ,N /\"1o0 3ƀ74ԅ?8՜S9ީ_%:< =n%;s68̍F7ԙP4`2i, 0{<.֑D ,UޓE*GݢX"*8|i,* *m~.+"d΃<  TВOH?ݧ^õT$  1xj, ĵa.+e~:l1 !W̑Kx<FܣSŬJ Ac& X"5or3 ½b# !bǁ< j7]؋= ľyDH֙MF;ޥ]%U#  .unĽa, )n$o8%` ~; M?Mij{CRS$%H"bĵ^$n ,k["U6wè7\A}bI®EP%Yt$_N=4-k! =n%;s68̍F7ԙP4`2i, 0{<.֑D ,UޓE*GݢX"*8|i,* *m~.+"d΃<  TВOJ' ?ݧ^ldL. 1xj, kldS6+e~:klg[<!W̑Kjk^C! FܣSijjklm_G( Ac& ijkjbO15or3 hiijkjgV7!bǁ< hijkjX: ]؋= ghijkli\C& H֙MghijkljaH' ;ޥ]%fghijkjeP/ .uneffghijklhT5)n$efghijkfW=%` ^deefghijkliaE M?(I_deefghijklbD%+N`deefghijkaL.%H 3RbdeefghijkldS4n 8Vbdeefghijkf2"U>[cdeefghijk\\"C[cdeefghijD b &H_ddeefghij_%P% .M_ddefghigJt1Racddefgha*=47VbddefgO =n%;s68̍F7ԙP4`2i, 0{<.֑D ,UޓE*GݢX"*8|i,* *m~.+"d΃<  TВOzA?ݧ^~L! 1xj, X)+e~:b- !W̑Kn7FܣSuC Ac& P5or3 Z !bǁ< a2]؋= o>H֙Mw@;ޥ]%N  .unX' )n$d3 %` s6 M?E~p=J}L %HYU!n 'aS"U0k2\ :uqbA}>P%P{t!VG=4(` =t. :ʅ<8ΑM6ީa5a& 1x: 0 ˉC. טG+ Z )k- '~5%Ԃ="ғM ܪ`#l$y4ɊE!֚S#[ &k. ({: )Ґ? ,ژK /ߤb)1s+2y24͊F8לR8ޯc :=~=<< =g";t58LJC7ږA55a5!6j6&7z7478C89T::Z:;k;0<<><=?=-<j<!;Y;;O:%88H#yw#'K="emS"Z2} "WaH!h(w"M$YA!v$l!C.P6! zd"2@C0!qpY "R:&"hlQ""T1|!"] aG"e*q"I, U>"x "j#67J6"x`#3=C,#t rX #+I;'#gfM#!Y0v U$ME? o"Xp E+Ft<L>lg Aч; /"W ߘG 2ܞZ$gs q*+" x3  qb͆" 5- Xp @( KbI! <WZG~ "&H b=q +}'? w2i{ 4m!1 (Tq@b+  Ca LR   ;UXH  A 2Jg: e r +| Iq )= r3&fp `~ 5o  Mpp 4 (.kooQo @_Too (  1koo ] bKUYoo R ! $yg#'K5t"e^G"Z*}l"WT?!h"{g"M$M8!vu]!C.D{/! hV"2@9v)!q_L "R1n "h \E""T*|j"] R="e#r`"I,I{4"x lZ#67>v."eR #3=8p&#t aJ #+I2{k!#gVB#!Y(rd U$@{;? oJk}_ E+;`xw3L4[tV Aч; 'W ߘG 2ܞZ$gs q*+" x3  qb͆" 5- Xp @( KbI! <WZG~ "&H b=q +}'? w2i{ 4m!1 (Tq@b+  Ca LR   ;UXH   2Jg:- r +| !3 )= r3.3 `~ 5o "22 4 (022Qo @_%22 (  022 ] bKU '22 R ! 122=" #4#q$ $^%%Z%&I&'7' ~(*(o)!)a) *V*+A,,5- - 2- q. %. ]/ / M0 0 E1 1>1 ~2-2i33c44T45@5627z7+8l8$8a89N: :<;;:;;<=>/ d=%r\ *~Q) s2.y 5m\  )2y=b`  =|MSg C~UHl J|~~g=$r~~+{  R~~q1+r}}~5p  W}}~ )5x}}~ @`]||}~ 9w||}~ JUd||}~ Ay{||}~[Ei{{|}~#I{{|}~c=$l{{|}~+~Myzz{{|}~ v3+qzz{|}~4lV{zz{|}~)/ryyzz{|}~aZzyyz{|}~9vyyz{|}~Sayxyyz{|}~>wxxyz{|}~Ifxxyz{|}~Fwxxyz{|}~<"lwwxyz{|}~{ Nxwwxyz{|}2(mwwxyz{|}p  Qvvwxyz{|}(2rvvwxyz{|}`Yvvwxyz{| 5quvvwxyz{|U^uuvwxyz{|@suuvwxyz{|duuvwxyz{|Dttuvwxyz{"gttuvwxyz{ Jsttuvwxyz{(lssttuvwxyz{ Qsstuvwxyz.ksstuvwxyzVsrsstuvwxyz7prrstuvwxyz[rrstuvwxy:prrstuvwxy`qqrstuvwxypqqrstuvwxyqrstuvwxypqqrstuvwxpqrstuvwxpqrstuvwxoppqrstuvwxoopqrstuvwopqrstuvwopqrstuvwopqrstuvw2 d=5! *~ t s2C 5m )H=b  XMS#`UH+  kg=5+{ vq1>5p |)M@` RJU ^[E*# ic=4+~ n v3>4l|)DaRS"ZI( e<2{  q29p v(I` MU['c2 k:uB|P Uy) d=2::; =:/ el'<=>=:-&s`<<=>=8*/Q< <=>=6& =ڙ< <=>=5# K< <=>=;2 U<=>;0 c;<<=>=9-&u;<=>=8+1|;;<=>=6&<;;<=><4$G;;<=>=;3 ; ;<=>=:/  ;<=>=:- ;<=>=8*;<=>=<7';;<=><5":;;<=>=;2 ::;<=>;::;<=>=::;<=>:;<=> :;<=>: :;<= :;< =:;< =9::;< =9:;<=9:;<=9:;<=9:;<= 9:;<=9 9:;< 9:;<9:; <9:; <89:;<89:;<89:;<89:;<89:;< 89:; 89:;89:;89: ;89: ;7889: ;789:;789:;789:;789:; 789:;7 789:789 :789 :67789 :6789:6789:6789:6789: 6789:6 6789 6789678 9 5v]1?@" } Le.D FQ-m ҆8 !ao!W {0 ,j<W# l#4v|f _ @yBJ'RvݕE?/ъ: q Y{.29cl'G#s_XG0R <ۛE. Mӆ9 $U{/ "m@hl# e9&t_ ~_3 1QzW* ;ܔFvQ%IҊ9 sHZz. kBcm'h9 q^}_11R{X,<ۚEwO# Kӈ:  qIT|/ m?il% e:'s^_1 0QzX*  <۔FvP%JҌ9 rG[x. kBcm&g9$t^}_21㣅{X, <wP# JqJTm?he:'q`1 .zX*  =vQ% rFk4X=ga<#aq {11Y  x+;Q   q%IG kRA egz8'|]n2=Xbddefge11?!B\cddefR }  'H]ccddeb5.D F*L`ccddeSm ҆8 2Qacdda:!W {0 7TacdWW# l#=Za@ f _ !>"J'RvݕE?/ъ: q Y{.29cl'G#s_XG0R <ۛE. Mӆ9 $*U{/ "["hl# S&t_ ´I1Q}=;ܔFþt6 IҊ9 f+Zz. ¹^"cm'R q^G1R~? <ۚEq3  Kӈ:  üi+T|/ Z"il% S's^µG0Q}< <۔Fs5JҌ9 f,[x. ¹^"cm&R$t^H1㣽~@ <q2  Jüj,T[#hS'q·E.ÿ~= =s5 e+KXøW$aV#qF1>;t 5If+R^!gɵP'|n2 /jT1? :r } D}[.D FI(m ҆8 Wd !W {0 (`6W# l#/jpf _  9m;J'R vݕE?/ъ: q Y{.29cl'G#s_XG0R <ۛE. Mӆ9 $ U{/ "0 hl# =9-&t_ >=8*1Q>=7';ܔF><4$IҊ9 =>><3 Zz. =>=:/ cm'=>=:. q^=><8*1R=><7'<ۚE =><4# Kӈ:  =>=;2 T|/ =>=;0 il% =>=9-'s^<==>=9*0Q<=><6' <۔F<=>=<4#JҌ9 <=><3 [x. <=>=:0 cm&<<=>:-$t^< <=>=8)1< <=>=7&<< <=><5# J<=>;2! T;<<=>=;0 h;<=>=9-'q;;<=>=9*.;;<=><6' =;;<=>=<4# ;;<=>=;2 ; ;<=>=:/X; ;<=>:;;<=>=. a;;<=>=9#:;;<=<+q::;< =61::;< =;'::;< =5;::;<=;$  :;<=<2I :;<=: :;<0 R::; <9::; <;- g99:; <7'|99:;<;*n2=A;;N::_9'8t8/9} 9-8 8D76X66^55n4+44D 5ڇ78̓*9j!:^<  @=R;ۗC:҇:7|/6m&4B3X34zU45H56=6727n 8(9b9!:S:;I;<<< } @=R;ۗC:҇:7|/6m&4B3X34zU45H56=6727n 8(9b9!:S:;I;<<< } @=R;ۗC:҇:7|/6m&4B3X34zU45H56=6727n 8(9b9!:S:;I;<<< }<N ;C9؋47v+5o3^1O/ B . و8 ,́)*k"(_&Q%;#t#7$~ $)%j%!&_&'N'(D))6*z*-+n+!,_, - O- . C. / 70 0:H9978i9=9?< '? BVZG^nn 6x !@nn0mIc=ammnn U *} GlmmnQ? u2%hmmnCF 5m,]jmm ( D`lmm%A 'Iakmm$t"+Nfm$Ka2T#U"V F*" ٍ< 'h΂.%+p("qd 6V?MY"e* u6 B !K!"V""#g#&$.#,u! 5  BKZ#g!+s# 7%@'O(Z*"f ,,t . 5 0 C1K4X5$g7*s8 7: ><O= BVZG& 6x !]0mIc=. U *} gQ? u25CF 5mA ( /c$A9k$t"@r$KaK{#U#"V F*" ٍ< 'h΂.%+p("qd 6V?MY"e* u6 B !K!"V""#g#&$.#,u! 5  BKZ#g!+s# 7%@'O(Z*"f ,,t . 5 0 C1K4X5$g7*s8 7: ><O= BVZG *22 6x !1120mIc=+112 U *} 011Q? u2.11CF 5m*/11 (+011%A!,011$t"#-0$Ka%#U "V F*" ٍ< 'h΂.%+p("qd 6V?MY"e* u6 B !K!"V""#g#&$.#,u! 5  BKZ#g!+s# 7%@'O(Z*"f ,,t . 5 0 C1K4X5$g7*s8 7: ><O=@;l:]8L5<2 .v1(i/ $V- D* ?(3r''='(J()T*!*c**+o, 3, - >. . H. / W/ !0 b1 +1 r222}3>34?4.3X1!d/ ,t- 5+ ?*K(W&%f$)r" 5!@LX e ,s" 5$@%L'W)$e+)s noopqrstuvnopqrstuvnopqrstuvnopqrstuvnopqrstuvmmnnopqrstumn opqrstumnopqrstumn opqrstugmmnopqrst8Xilmmn opqrst>\kmmnopqrst !D_kmmn opqrst &Jcmmn opqrs-Oelmmn opqrs2Shmmnopqrs8Ximmn opqrsG>\jlmmnopqrsޑ9 E`lmmnopqr}1  'Ibkmmnopqrw#+Nfmmnopqr`3TgmmnopqrU8WimmnopqG>\kmmnopq ؏<  !C_kmmn opq , &Icmmn opq n'-Odlmmnope1Shmmn opU9Yimmn opG=\klmmnopڍ:  !E`lmmno1  'Ibkmmnou$,Ofmmnoa3TgmmnoV7XimmnoH>\jmmn ؏;  !D_kmmn"р, %Jcmmn#n&-Ndlmmn&f1Shmm'T9Ximm)G>[jmm+ي9  !D`lmm,1  'Ibl.r",O/b1V4H6׏: 8т.8o';f<?=;Y8"g7,u5 63R )[1c8kAtIy"SG *Zޑ9 /d}1 9kw#@r`KzU"RG )[ ؏< 1b ,8l n'AseIyU#SG *Zڍ:  0e1 9ku$AsaJzV#RH )\ ؏; 1c"р,7l"n&As&fIy'T#T)G )Z+ي9  1d-1 9k.r"@t/b1V4H6׏: 8т.8o';f<?=;Y8"g7,u5 63 2345 2345234 512234 51234 5123451234512345 12345.1 12345'/1 1234 )01123 4*01123 4!,1 123 4#-011234%/011234 '/11234G )/011234ޑ9+011234}1  ,01123w#"-01123`%.1 12 3U '/1 12 3G )0112 3 ؏< +01123 ,!,1 123 n'#-01123e%.01123U (/1123G )01 12ڍ: +011 21 !,011 2u$#.1 1 2a%.0112V '/0112H )0112 ؏; *01 12"р,!,0112"n&#-011&f%.11'T '/11)G )/11+ي9 +011,1  ,0.r"$/b1V4H6׏: 8т.8o';f<?=;Y8"g7,u5 63wxyz{|}~vwxyz{|}~vwxyz{|}~vwxyz{|}~vwxyz{|}~uvvwxyz{|}uvwxyz{|}uvwxyz{|}uvwxyz{|}uuvwxyz{|tuvwxyz{|tuvwxyz{|tuvwxyz{|tuvwxyz{|ssttuvwxyz{stuvwxyz{stuvwxyz{stuvwxyz{rsstuvwxyzrstuvwxyzrstuvwxyzrstuvwxyzqrrstuvwxyqrstuvwxyqrstuvwxyqrstuvwxyqrstuvwxyppqrstuvwxpqrstuvwxpqrstuvwxpqrstuvwxoopqrstuvwopqrstuvwopqrstuvwopqrstuvwoopqrstuvnopqrstuvn opqrstuvnopqrstuvnopqrstuvmmnnopqrstumnopqrstumnopqrstumn opqrstufmmn opqrst2Tglmmnopqrst7Xjmmnopqrst?\jmmn opqrst !C`klmmnopqrs &Jclmmnopqrs,Ndlmmnopqrs2ShmmnopqrsS9XhmmnopqrsH>\jmmnopqrڊ: !E_lmmnopqr΀0  'Iblmmn opqrp!,Ofmmn opqra3Sgmmnopq V8Xjmmn opq G?\kmmn opq ׏9  !C_lmmnopq ~. &Kclmmnopq',Nelmmn ope2TimmnopJz"R *\1c8mAsJzS#SH )[ڊ:  0d΀0 9kp!@saJz V!Q G *\ ׏9 1b~.9mq'AseJ{678 95678 9567895678956789 56789 5678 56785678567 845567 84567 8456784567845678 45678 456784 4567456 734456 73456 7345673456734567 34567 345673 3456345 6345 62345 623456234562345623456 234562 23452345234 512234 51234 5123451234512345 12345.1 12345%.011234 '/01123 4 )01123 4*01 123 4!,011234#-011234%.1 1234S '/011234H )0011234ڊ: *01123΀0  ,01123p!#.1 12 3a %.0112 3 V '/112 3 G )01123 ׏9 *01123~.!,01123q'#-01123e&/1 12y2.q W )~~s+;a~~ O  ~~ n#HV}~~~H}~jXG}~{>}~ca=}~y9%|}~ \u2|}~t01o|}~U )|}~s):b{||}~ }N !{|}~k#HS{|}~{D{|}~fTIz{{|}~y?z{|}~~`f<z{|}~u4'{ z{|}~}Zo2 yzz{|}~}s0.q yzz{|}{R  ( yz{|}m'<a yz{|}zK  yz{|}|i"GU xyz{|xC xyz{|{dXF xyz{|t;xyz{\_=wxxyz{s6%wxyz{yVw1wxyz{n-0o wxyzyP ~(wxyzyl';cvwxyzvI !vwxyg!HTvwxyxtAvwxyxaWIuvvwxs=uvwxw[e;uvwxo1'| uvwvTo3tuuvwn.0r tuvwtM  (tuvwg%<atuvtG  sttuvuc FUsttuvq?stu^WGstuo7stutX_>rstum3#rstsRu1rstsh*1n rstrL |)qrrsf&<cqrsoD  qrsr`HSqrn>qrq[UIpqrl8 pqVf9 H.q } )>;aq  3HVg ,XGY"a=R%u2E1oy);:bo!2HSb(TI[ f<J'{ o2 E.q u ( 9<a l   1GU `  (XF U!_=N%|w1B0o s~(9;cj!0HT^&WIW e;H'| yo3B0r o (5<ag   .FU] &WGP~_>I#uu1=1n m|)6<cb  ,HSY%UIQ }f9 9:;<;6.q 99:;<:' )99:;4;a9 9:;9# 9 9: ;:1HV9 9: ;8 9:;:/ XG89:;789:;:, a=89:;:7%89:9)u289:41o 89 :9&) 89:93:b89:8"!89:90HS89:7789. TI789678 98* f<78 94'{ 7898(o2 78983.q 7897$ ( 7891<a 787!  677 87.GU 67 85 6787, XF 67846787) _= 67873% 67&w1 6710o 6 75#~(6 760;c5675 !5676.HT5676456+ WI563 5 65( e; 5 61'| 565%o356510r 45564" (456.<a454   4 54,FU4 52 454) WG 451 454' _>451#4$u13 43.1n 3 42!|)343-<c342  343* HS 342 3( UI 30 32% f9 ?=<- 6 .?1K2X4!e6 ,s8 39@:L< B1K/ Z. $f, *s* 7(?'N%W""g!-u5BK \!$f#+t% 6'A(O*W ,!g .-t 041A4J5\7$e8+v: 6< A=B1K/ Z. $f, *s* 7(?'N%W""g!-u5BK \!$f#+t% 6'A(O*W ,!g .-t 041A4J5\7$e8+v: 6< A=B1K/ Z. $f, *s* 7(?'N%W""g!-u5BK \!$f#+t% 6'A(O*W ,!g .-t 041A4J5\7$e8+v: 6< A=;Y:#e8)t6 74?3K1X/ !f- -t+ 3*@(K%Z$#e"(t! 6?MX "f" -s$ 3%@'J)Y+$f -*t . 61>2M4X6!g8 ,r9 3:A<T8XhlmmnopH >\kmmno܌; !D_kmmnó0 'Iblmmnoq#,Oemmno`2SflmmnoV7XjmmnG?\jmmn"א:  !C_lmmn$|. 'Jbmmn&q&,Oelmm(b2Uhmm)T8Xhlmm+G >\lmm,ڊ<  "E_k.́/ 'I0r$1a4V6F8ؓ; 9|/:q<?<:N8X7"i5 -t351B/ K. [, $c*,v( 6& ?%M#X!#j-s6B M ["#d$,vF& 7 ( @ <)N |,W/.#io1,r*47b6B9NI: CT$SH  )[܌;  1d́09kq#@t`JzV"RG *\"א: 0b#|.9l&q&Ar(bJ{)T#S+G  (Z,ڊ<  2e.́/9k0r$1a4V6F8ؓ; 9|/:q<?<:N8X7"i5 -t351B/ K. [, $c*,v( 6& ?%M#X!#j-s6B M ["#d$,vF& 7 ( @ <)N |,W/.#io1,r*47b6B9NI: CT '/0112H  )01 1 2܌; +011 2́0 ,01 12q##-112`%.0112V '/112G )/112"א: +00112#|.!,011&q&#-011(b&/11)T '/011+G  )011,ڊ< *0.́/!0r$1a4V6F8ؓ; 9|/:q<?<:N8X7"i5 -t351B/ K. [, $c*,v( 6& ?%M#X!#j-s6B M ["#d$,vF& 7 ( @ <)N |,W/.#io1,r*47b6B9NI: C ;K:Y8$f6+t4 63=1L/ W- "g, ,s) 3(A%K$Y"#e +u 6>L Wpqh/(} !oppqpOo3"opqpg+1q "opnI  (#opa$;a#opmC !$noo`IT$noj=%nonXVG%ni4&mnnmSc>&mng1#'mnlMt1'mc'1n(mkG }))clml_#<c),Pfj?*2FHT, 3SI33e:,&'| -am3.T1p .N'/a/ 0 U0 1 G12=2~3/3o4*5c56T67H78;8| 93:p :&;`; <U<=E(} !so3"?1q "i (#4;a#a  !$,IT$X %#VG%L&yc>&G#'pt1'81n(h}))4<c)At\ *Jf(HT,3SI33e:,&'| -am3.T1p .N'/a/ 0 U0 1 G12=2~3/3o4*5c56T67H78;8| 93:p :&;`; <U<=2 3.(} !232#o3"232-1q "231  (#23+;a#21 !$21* IT$2/%21' VG%1221/&121%c>&12.#'10"t1'1+1n(10 })),010+<c)$./* HT,3SI33e:,&'| -am3.T1p .N'/a/ 0 U0 1 G12=2~3/3o4*5c56T67H78;8| 93:p :&;`; <U<=&7&{ &'%j%#$`##O""B!!5 z-p ]QC 6 | (!i!#"a"#N#$B$ %4%{&,'l'(]()Q)*D+ +6,| ,)- k- #. b. / N/ 0 C0 1 62{2,3k34\45Q56"#g$ ,t& 4'@*J+Z -#d /*v 1 63?4M5X7#g9 ,t6;  ?B7758y 8)9l9#:_:;P;<C<  ccccrr99nautilus-image-manipulator-1.3/data/logo/source/Lightning.svg0000664000175000017500000002231512111517240025534 0ustar emilienemilien00000000000000 icon weather lightning Benji Park Benji Park Benji Park image/svg+xml en nautilus-image-manipulator-1.3/data/logo/source/Anonymous_Lightning_Icon.svg0000664000175000017500000002147012111516277030566 0ustar emilienemilien00000000000000 Lightning Icon icon weather lightning Benji Park Benji Park Benji Park image/svg+xml en nautilus-image-manipulator-1.3/data/logo/source/ytknick_Photos.svg0000664000175000017500000000336512111516306026627 0ustar emilienemilien00000000000000 ]> nautilus-image-manipulator-1.3/data/logo/nim-logo-large.png0000664000175000017500000022344212111522055025113 0ustar emilienemilien00000000000000PNG  IHDR sRGBbKGD pHYs B(x IDATxw\u;b't "I EiZT$˖5[7#m9<-Y5,[Ƕ"%J")F :uy[݅ꛪ:oVn[w}6hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh\} 444P67+>ϊ&J @~x `ǠI0`Q L !ĢK|\&J D~\#n$7,2`0 !1.FXX 8cdϺ&J EA<@ 6d9 !Gb"0#&t!$Oc#dM/UGyܕ X 8\Anhڑtk&R&KWzHB"xXxD1c/ޏDPH-rQ~@pA0d|DrcHH3 La"GڸW&J ` #H>`i@S)JF?yGú#>Y#2bҾk"D2ISSǑDYה]FTP0HuEX_DvGLO 9ŠI+ \%Kj S77G܅ H*ljX$'lA$6O`| % ]94b\"lpR)cEy1 O)<~ɛU.G>#}sYc y-P|qճR'WD%ƨtCBHyYܮOWTKG\cF^9mpoN~kUӋԃ008"`Ak++RCCcIq_ 7m! [2X;rҐ>aP\= QBSK" Rq'ojpH"NJbF; v$:1 Cm5Qjhhh,I~5X&Bb^r@rطdRj+!r"DH*pz!K'bW$@<g$=tCX$]GT܎^ qH&S 2L͝¾lÈ&J ْ䟳@4߀:7}SYmL?9& "I2 PS e$ZDxtTJe|Ts-uew=JO>P=!@2ׅ`A!fDh)~$}u 3o]Φ K)PA2aDI~tS/Da9~)42Y %ϖ7EDgQ$)kz)RDڴ<0%<;MdIM3pw!u{{kf2)#QjXWIUbNȱEv.Y*RabtǨHA+0LC7hEq}HOi_G'L)C4־ $9^#7Wo(r"G9(" !D!VϱrWM. R{@?0=~4RCCcFxjx# [ԁ&7- U0N2er jKГܤ@#D6EJr\=s#x\ߧ`jĕzRCCbȿo 8a2,r82QjM:ĸ2`^2]oؕLUyaRsa,+x _yZn9<piXS܈wijIV ;xF5[N)x!j-\ dd2PYG\v%A/` 5 p]\{g~xasҧA2QMM`kW]N(tUCC#)>{G#G*}2lFOv~' =cp IbS3_{0j&J Dn$d7O>xli ! dړܝkHMuOB$Ĩ8W"^,װP,1Jrdt+MJEJJx 9zKPD@z@9C|&J Ł46+{x#gvBCU}ےړú5\v=OI-ǩ֤;kHYס+$j<`#Z-GZEI*v{#:Ł/L%ʰx6 vD6xhFyMsXP[«rS/ o )#\yp6gpn ͣU:'IGvDduB 9*N"`zGtTd@upϷ7_Qe>QFIy1<{ t'Q(54h& K[V_w!.z WkĘũFbmL(X$QqGrJN R SLzچxgxFP QxۆbxCe}9pJ@6؊Bٕrriػ~qo X-{r;sxb*PƐTXx5A ؤ]?f>+'kԺE˝$LUatn[eD,z_g<@Ar {YgJ/II:kX.9󜼲"esNX?~73dR$)wC s&?%qrbJH2IdOf[x*\0)`b؝%,#SWx?'GoP2, "bDe^A% (5eJD}>>q72+oP+3[6lɈB!M(̰ȰUa%)Q"2VѮ >M^us6y+/? fs!?*e1 [Qus2Xih;Mxkk<?4VWc`aޑCV SI /JIٮ0%&%iZIw1.JEV2(N (ϵrēϷlUM.[tBE0P&J(d5;MzK)wfx`+FPOQ;}srbK"DŒcj0 e&;.kܒ)ϧ3c| '9%UE$Iʐ=p :>/((ԄPq/@E *zgg㒼G ƑiK)Q3 \CEZs@tY'c^ MH'gרY_Ssh\+sk΍ $[FFy[kg!5_U[( ͧ :Ev- #(^ $0b\51m/w_=_:k/F*nd ٬"/#ǘ&ʅCPJ&=mTsSu`f{{4m9-ic\@̕j SI+1 HP95+_*2%)6 +ETgZ >ʓM8 ZemJ1\D 1xkTdX>to|&` *ܝِV O="nVorK c5"'+*IZùH1]i-OL#y޿ -pS{2X;M+gB!gܟ9)ELîŃ$Ud1LG'9Ë9šzFL21gTpmX1`9e&آWVʁ! kow )g4YYdﲓ`>2JY}DS3PqN:!3%aR h`UkHsמġ/胧'3!g΋ŘA}\񟽅> (s>%)O+eýUkwn2p7 2+A a[}E '?Gx*4/)Pߑ!?n)n2~yts;Sej1쌕*ɢy@cz$`ظJmQdޒ|}{]6>&KS$m?UJ43hx2!NGh_AIb'IP ;Fݎb #pYw̤d'w6OgLRi"|<}5QfQʨG1YڬC#S"1k0ve1pR׶Ū$1"L4@#':R'Iwh0:,'(q/}|i0,R8j"LuEQ^444!jc7*m vܐƼ]5X&"(/8eX  ȁ0A%.È2K$]q0>9$/7aw_|~Ueg !Ъ6p'Jg8$3!X~=Wu1޵*-Lu{{ƴ緃DD̹,Qt1 F%FAEJYJ)@{&F T:kӏ_Fy(uAa5,ՌoQaICcfijjblܸ 6zƍYzZy*sx+P!xk ̽9]Yzcw$s$c:|*YvfFLr2OSƸb"|Y)-FOtr_\P+!P)IzQ ;b/{AUY#pnLcbݜE*P`B*"#GH"PI=& |]INIDn"zm5hh:yx Gdw3u;P-:D1'r4664(_&蓗W/k9@o}kkwgci$'(R AzC̢kZ_@%gXQWG[!ie]sO_O=':GfdBiy)BP.e.ѡW kJ?knnm.HE ǿN@]º-,קR$1j(wlR{8*Py1#sBA%mn ,●_>EyVdiه 疢DLWV"1D8p{g*f t"" &ĵ*%05șSu'Ih3a  ڃ:8Ͼ>"@t\N*֥?j\7+ Zbԥ 7UA,^hģh+8׌QUDS @%\]n*r(JQ ]&!`]|ͪ:H\-(.#ېB$hLJHqtt-IaHvCFTz{{璘os{o w3Z]鴤1_ޜAVʔ ƖmANa6tӎ/j? }QdF@Ct۪cKNI߉Nד<;ɔNWB <\% 4C.&tQfmR[['?iz444²@立7WUy/o !9?о%C<+ܳ'Q]aJ2!FO# syLJ>{Q #2!x.Ng\/g<i9EQR,&LH{SIo[g|>ĄfeB@{{{E k.Flm6,[N`bޑ]:j2*`+J>«^ދ> .rt%J%(s1QSSeq+J\Ϲ%fݛCwo暐M5)cOo,5$$fXEIQQJ8$+L’JA^*L3?{C_~zdTglݺQ>],➑(lrO@JIGGGE+ yx6V*ߋ84y 4֞,֭YdV ʘ$!M\Vb&f`h * &P‘%;zHĘi!.ee=c3_zatLȔ -, ϣV oR~KܼyE+eY&RvE':bm-|d|kCHV`mbޞŹAWLx&X6ֲ-*Tf*8fQ:Ib"IKb; fMߔ/+qmү}Ҥ)WA Ab؀"/1Zh\,YH '=*Fs_nܓ\w 2P$F%$ILH>I$,$%0)n"=/xh}Ok0i\HsMrjɥ)R=}uU`+PWg`ݖeު) IIRRK0Xi~$D%D"g] }yTVs(O .MjΠ"$'3Ȃ&EBI(-ҥKŢ~FFF/,HO*UZuꨯcUUy>JQWӹo BR;IKiȞ.SsX3W /^RT:x̄Вvľ.l IiRQ7RqNWVmwj H9^KTnlTkng *˗/}v -adRiVWQQ͚Ȱf9VNx 1IY2 j:s #(1Y-e0l]vMr!82iLdKqmڃBIXA.az;7ݯB0 k[f<02i]DԤEVWOO^Y p܅5f"j";%m"M伒d1jKZiudy04Alj^ʋ$a t&*r]A*& j)eΧ \DeØ;L]uW;ϡEE#[ۘi<#aׯ89nrWޟ+_uBTK%MGX_#2gEj}]gcZxxhJfçqNZIlđB^e*R9*oLIG tĿġSYaLApɖ^Z}Ԙ', (A_WQTR_E]^=O%s~W-EExmpj|O1 9պ=yWPÔ;g4@Uƺ$UDCxTZC" Zw^dqp貕y{-,zX#{GGDTKV-,)Rp"CE.QQ y޲g.YiM^ڜ྄o>Tե:NKYSuamY w_|ȸd gZ@+r WdJ" c\r1ZMD" -z8X0LInqp/{<{~%"IKנT5&!b Ӂ\D *PD@l*i2sS',1KJ1i>ĦoZ *1`yCzʫu>[B_ZJ!9ȘuH6ΰjRp1. PSv0>soӼI"FZg+#"ly%T^u 9|ݶm[rIȴ6[xdBJbQyBt3e6OE= ̽9=9d@r^vݜh" *ܗ /ɜeTi"b:a>31QjwIS ;p 9N0rg~|h}\DȈ[OP&ZE.E4A'|<\WbBجοHKϽU[2q6Y<]g텩$7I[SB Mosޕd FqT*2h'ʍ쿽/t`a\:}*Nj=t˅(t`SA˜I5-NF?kkd]TAlcy-ۜV:`$j2d8nSFwU9 f?%HC>&/d,9=˓?.E9IcrM'%#(UL-4}QM"-~@crf&xطfXd4t.:| SMF$l~F\ÂbV<wO҉v]u,A$wT+0尣CZQ&K>WWdU k.UϳH]vo "9y̕PMͨ$W +Rz͖QQ}3gz貓ػ|PB0#BYEf䔴#nf# eɌ1WdVux=\>x}~tDK(tce(+UCʛ/QicmU?IU&ܿ?V+,Κ497H( )$)!I"H2Pk(^WTRSNڈ6 m!&,|,X ]8gO!P)_-X7 `U v4Q΄( s72Glfg0oT|o.%,/sCs#*Lߎ dYڝڙū1R.\z8q٬3 +LZ$2[5Y(S"m+Xc#W9/'xqYJgj›n_n^啫HO871aߜD`Aj#TYʌd-Vф02t噁P$ސ}&[qCT> &*_ҷ_O>!yrZ>ܼTe>dDByv766C#6ԧq}޷>nmXH֎,x)yUdhbJGY}N 0‹"$LR/vQ%A[֤ozg8x+/rpQXQ$vʧ$u%F¯&J:$!k(BZj, o s!Ze1wuى"IYu**0҈E&"6SD|H )IzÑTI h3b$ܧՕ}c=q}1ΔOkLDdH'ʧSJK(oNGGG1M\.lyʡהV<ޱOlT;s8Ȍ@8#)NDTmudVG+~r+ >KE`i: _<9SZ`%C(螑˂(lذaNr0:g•=}ko[|})e3-/ye#oҮ 2B& !:$e'0'фdq![bt&\dr`O? G$XsIݲPa\vDY9#!sdM3bƮ{{`]m\%(ܝ/dVkl1E$2 aJ"6EMdXP̀Xi9y&F55``%j's<\bz,[WQzY>D(m*O㲺 xۭ$ݬT崟wt61_ޜAega"(Du9DW$Cγ8"g#P3UC/_pz,?̀M?d,. 2eZQ0 Ff\c~~ L٠:-uGwC $cBU5qh(ɨRAH 1h#:}1/.Ra r_NK*a`r4PYP0ڂNB)ʂcb:TeMh+_ ޳65(KrX;xF"˸iZ T3Qad=] :L (xʧWf?8VN~%A.yS=AtqbfmC'h\hГi1Lg,jYZ%SXe^$UDQKr+Dz;Ƒxl KRRN/yh76bԝUdgs_=˧ٴ#m4[`ʧrQQ #4&兆AΫ>w~pÛWef J,jK>jMa6.̝gtHOnu>|Z۠ #$ezW)509&5m([$D&Ɍ ;2s8!W"\R&`'ܧU:N©.pbj(_AfyztD9/D *(u1lq+{M6+07^ԥ D5*ZEV=#:N$iBpsC)䤤/c'&\N qT*#0 p1xJ*V ܂*x6@DŽ+/Å.0鿁 dPYw䰷ey &{3̏& {΁=4R+>G}t9`z"4 ?  < ?-cScD9E3zAʼn.xBp Ud1u gB ^vsq5AD%*PAI SaCnFn!]pVԿuoJg99*$44=YTRaUAπA5x+pf>IkS3;kjʖT3_O5ILʓ- 9ɄI;D-3?}XUcN F)Y#tqy/; ǏڊeYskOF}}18ϣa54QIm(JsƩV~Q<ĕ'/~.<V@ُlNcަB^8I28etOPmȲuH$I5D(0sA[P6 L9ZG5\J= Tmg4kny9z(W^P(̵ե@eʶ?8<(_QVb^NQGAWMiyMiȰ#$bij1+ Hurl[ňUǏQ/aG'en\^V߉Z؅L6n޽{y饗x嗹r CCCW e\pp!M+(o(kWIF)c]p;9J0FuC5oR$_ŮCBDL IDAT%y/H1&I0NDFf}H x-fp, SY0&7nHss3~;.]ԩS+·,&F%<*-щ?ZQ&d9 2l&$<k!#N2) o#X:aA@q&%0(B2SIUFr5u|.W b$ۇ¥>ֹ4/yG-?jB1$Ͳn:֭[Ǯ]{8v'N{=P(tmRr&g>G.0,dVOa.'¬Ke} XNT^TDi6}Nj1I_x#F V@4GLx,|9x0|evͮ]شid2S @J 3J!l؏q^}U.\Ф*Cn6?ry!!+M"z4\QV:I-Jg.85xj0~u[¾AJMƨ32Z'ER5ccFqٜ* rؑ:(yd$u]x߿]vMfqu]4wf۶mac׮]mo?tvvGXV5ğ|eޣ&JP =- E¯DY(e??X2Իwï^ú~``ao *X*B%mfRWzLyɰ u*0TŽs\G+N[kIu`!EPfhc&C)u\ 8߿Z:F.^@}x2|.P(p)Ξ=ˑ#Gسg<cdV>n}/o}[y'x9p.]bttt&Ԣ~nCAT]bD9'RJinn]6Qst\ʹA nmqUwvdV #JaА)c_R% #kTk0:ME2Nv[iY$L577ĆUU^gWH۶ͅ ٳ:u{數 oSOUi^^~e{1z)N<'wAc~ITϘuVQ &!dDFw!M[? U4]ܗڕEf1,!QIڌ3^ D E8iaeA*_up=wpg #Vj'Ū3UlZ-Z=9sޱ> Nxq^}UΝ;ǃ>}{^~'V*b͚5y|CG.dbbb>OD9JyPZ[$LDj59n)JQV eEw{֌\ʕcIdTYG9?H,% sF$#!㲉aYm0HJe8Asu#757s*/>Ũ5c6;O>$w|;TA ۷uVwCr cS >Y|xչE`]s:&,F\?>z'lYp^|?V%uG{}dgDŅ%TڮKV #g ?. !uBt 'X+[9z;#j;MDJuJibuu4DH7CHXx.ytuu~{ַݻwSUUJB,[l8x;8x 9rW\-gYzN>a~edЃvYTD(m %mx_p c]7LBs.~;sxu nx+KTU0R8rם$1b[W,Ӛ ށigh^ m;9ֱt*yPf(;R[nz5]}̎;x[;\>hTXv˖-l޼￟G#pΞ=i06` 6T!`k)ʹ "c4WULxrYɪy#]]Q}93*Yg2I`36'ENQ٧ H=ԾN(@`z=Ok#3Kzt Rm v#خ]$ *pg׭eTerlj=vp]>ʱ\he ΅)&>|'No~x=vm444JB~46mbÆ oԩS<|ض=iT3M^ s\ }\IXW r{`c]yY/7g.?Ӹl2S[$G"1!f5-Ĉ<`ptLqcܺfͷaZRFdQ uEL)UMM-hnɠm> ؾ~b뽼zWq\^~ټ7t'/w9qHd=7JkeU((QVK-ԋ11`<=1}gZ(E}QĽ*23"U*Rd1P(2322"<~{._|6mbΝرEż <,_~w^N޽;Wn~'FtuO@k5^r2( PKx4mmڶv2,VGn4T%R-`OM*;)B{<1vJ lB1m}z\}>a(W+ i`f,lG2R0 PJ0nsf E0 ߑ[U8~jud SEl_ZŶ}-ʰm#rq~ꫯn:Gu.r3eΝ+ٳgٵkƍVtͤ({z`2dǁz|bc=ZDnZ.;r B\a}0=!Y Th)eK2-bXa0g,F>-Pks,M`;f 4#2#9yO' VF8П1?w]4ɶY3kzrNKװs1Ϝ9åKٶmo?l,7np͛~ƫʼy%1kjjxg Gᣏ>MA wyjo0'ڿض__{nܸQ93yiK]8v~R_5k֔}ÇٻwoDb&;ytFsfػwrZѥL7iglTPN C|UXϕǯe䝠&Ay+Zl~ڌAX4š+I6벢8\!90;wWi+M]HaQN=cU{o,X3vJ6o1MzFK)d2\~pYb$QijjbݺuܹUVQ[[K*"N?(`ѵϺ*s1KNU]N\QNfܹenyOOtR2w,"H[)gIT9+ӕy+> -((aU~ lAFY׵a^:'VAhAJ@mwƇoӼx[<ˬ[9"_YAX6_ZG9LNcڒm<3g-wu;}?R|l۶_M6\iӦ/si 8˗T` M6b廒eOOO P K$W"͒nke@DYo]^B|Mxw)>-Sݦ+zM Er%FUdg|Pl5QEM57ˁ Ap_; )l[4d;.}-;ˋܼ410Fwpu`=²nϸҒ% 0AS9 זWNr״ *S)E?'NڵW^y~;vPWWa*3 1sLx {9~_g?qI2IoS)A: 2wyQ8n+E¶vxPpȤ@F 2<+)HV5(]V?WF"0˧/aɴEh 'oép&=龒?7n֭[|駼k9gDɰlcc#[laݺu׿?f׮]?20Phs@(;OЫNQ#R2-fSK +BUQAY/pM@6@TG< *RjQck]AF*s"`+DNwp8ERȀX cC6 ) 0mgZV1DJzMcRp`TX)ˈ,evsiY8틟\%N9ÙN^vRJ̎;Xz5h7'o`b /^[ošCӧ'' |ܬ"r*ʜcsDHÐ%=GrƍM9|m't$ufEM1C H :Yg kG¸*" ٔH!@z``wR->j ʘ rID~^u>AW̃!Zs%҅B4a :AZx;ev$Q&a$ÖqlUGi$kM#L' kO#4 Uluc-5l_gmjqw:ΰ͖ȑ#={_W&H4 SOcΝ;g}??[ɷbyVSXQjP1-\_X b(EԱIfs4fiN3m8Mc:Cm.Kx:'@ R)pPB*&1qCI?*ZLM¾Bu?l"Dd$"cf'`P<5I*!((Q"P%F@* q2(J(B(B0REpT lD֙F09MتN*c/^oAm$s7vJv}ϱ[9q 7zn *T*Źspyx7Y~=3f(ze(O=f"駟V kSe)wB}Lsya:hM$ IIXJBRulE2.>XV5D&ƃSHA_+e ƄfSgj] ݙąg!t{?yKr!@XN0( cb75@ej IDAT㪬CE} xSdH},f*BHŖqIFU-q8+ky}ُ8yon\%˲,ݻGkk+G%DQ\pN$6ֹ\PqDw" Bחul'^$ 49 r&Bd40s6 !I0-l:4azS4]kXWD-Yq;*"l­,]T|dSuW'&*&kBan9@O)HpSV&ʄKl4áBL!\ \,9RҒSnbEc!*=ů](B 9 M-RVz2ɬ$KysE=-oZKOڡ?{YJICC˖-#SmmmM*WE:X\P*@ z(sCl0z-ڮg`FftڐΔ4Bӡ^84BZӡΔ$_N1D3n1(OgaPq1uTRM*b0ݮySpA.~NJ`$ՁzO~cPB 1r(y`jP MrE5nr(.s)("ϑFMօxnN7S˽ z3 AӕTzi_D߄p5c8v2xrBw9T&AۋRd+bP^~ =/:Ҿe6=-|7Hok0G *!:N*%I3#!YaʹC51S!qA^P踇栃ϐ.{P1@&Hm\eRx~IAAwJrBAra^N 51 tWWYWZ*V^ ̭QCX uQ_[9}߰ 3m%W syz\?L.ߩz>0PNJBm`Pq|{l)H[Ã6]TE;تpk!e2섹M-I4flfmf!n$l(BBR6NNcY51(*$ +*I@&@ d\hF =(ƄfATuΠrj~¼җ"FG &(ꮇRK>-qaKn?GBQN`D' מΥA c^22Ĩ;jϜ1 Wrb秔A*gp'&$ j(bޔԚRwlLӦє$ I!1M B^d(5Q"B2a k݄:thb$VWz܏z9p \،qCZ:s%VGi!] E~&~v] M0{a; ؽt$V1TAAÒ%K&EQYC8e`>(ڿOq z}ECQa=*<_FQUdd>i4RakLI4$ͦMSH1h8ztCB(;ID*葘o]4pC:j ۄ`lr :d$V- ҵd*}5 DxtOR#,v](R&Yڿ%oBR89²[WT Ed zTr;i2Dz*(|SۑqCbD[TdVYD[*A͉(鿄E`xl__ە|rz2,(IӁ!+89h JI~l&1%BXY I<9)h&S|/,k>^ѱaeU݄. ư!%affi1?fLrh% 3.M*,pfGW{xns#tx|KGcr7v,EMR\z :7/ѽ'ISRIRvd81a.I"a3 HGwCz&՛#3ȦDJH(cnPD ICx %R``)@FC*mU IBHCZCdԻ I DqgA5XK#؋Lvdr@kʨIq`'ӀI2["Dk҉?ĝSwa%P7gHt4$Rܽ{ݻw38X06VO(sCJ,񼟖[jAݒpx|֋(Id$v\pji[QH9fRe)A)C%]RF+ k)ÎApӀPJ0$Ih:D ŢpbiDr-p+s¨ϛTx2M xMu Sh/Ai!-Ā( ]3q7~=s1ǎd$T$=*Z5~ )0& aRH `9h.# ;8V%]T$G`f>Ę'j v4iSa %.,s$ i9e/ c : *CIUXz㽪 z7CD}΀ͫLE} 7/_ pM>S2Ljr[Hu<P>D@!4 G! ! $%s ;']p:m^:q@:#BDF!<WcTjE|3+!^ 1-d{%JPI(*C{vseA4HגٴhȜfmiPy26 ѕ&s #E"vʕ+ǭ;áC8sL%{hANSYQJ#˕.,USmC`D/H62:6\VsZ*Uh j戚,>^Pci1XB*姉~6E]yLͦ^\>Evgjw(Zk{9'^rwE7tUmr!v3=|myzs3g;w,tN*|Wm0^=q LtG&n^<d&*m><&Eae$]ȶͤiBҐ#E)D!VQ!)$ͦX_3?b@qbSQZ^rTޓ>,R GSU/B n{d~]֮wx5=Ûؾ=;G Blٲ7b7d6Nɓضt<ڲΪʼ0(+ RCVoc>9L}+L11Ԏ2CC6![q5QǑ:lFRUB`iX5$BW(CM"}`H`*QSBʫ&TIK0oe |!-h sJB5j"+8{:;5̞={vz{{O{n%w^z07э WeU[m=9J4dPSgPS&9 fmnXsilIrkDu0th8f(Vy/džXFOzbZZV[4+UHr!;,DKx?߲u݀Ks,ofì5\}Y^|EضiK)x"`;O8I̜9sR@9xh}0!0C3ξ@$";'fFfa4'QR-g'Jarb`JͷÇ*݊WMrvZ/0h-9DUdd(g )ۂd9Jʌ󦮩a֭dYn߾M4% Dm? ЙW'fe\*JUmHXmR$,:sTV: ! v]lDV7ȭ[EߟI R ZQU)y1ng}Qp6]ٕ5K.eѢE&a`&W\O>S||V('ӝg3FIWLS-!a䀜aŞAk#GI $K3#f̐B' K;YJ <܃9M.u]A!a,[FLtkO?_}U ϵ LӁJ($=ғU׈:6:ZYIcv |V 5QJ)et]ǵ*K޿4 8=^ܣۆ?; ۡwiCJɹsطo=3f@m pJ&G'T a;؄}j3Clnoei/IVT",w3K+W-^ RV-j0kzf5 g0ߟ}Cn^^JKK _5*=K.ɓ|}E]rrՓÂ6FR4FtYc*t ,'5֊B׫dIeXF٫*TR'c!:r.::UJ :L>]Algr oR'Oʕ+\rW^yWD֎t~󧈢"!uU.VGa4d3bmw'3ikA aeQB HR SZR>'Y] r-Ud>Aj:2*랧n"6κ`.^H?RN0صkW&]s8L$drenə ^1ghu=Ʋ^ZE6N$K.KRTp|EZy>Bt- wpmYEG7nNcR8%Kpy8˗IRRJdAKBUOvcĝg`S`ϋqX8ϖ{G7aǙ^ZEEPg(g,R :|:^巽'JEs+ Rtm%҉b1r J)LdΜ9̞=UVqQ9͛7~y4 F@uz4@v̥\"*W%9jl=]lkKc/".37<"ǂc9%rmTO$%#m9D>= )FZovOhRNG !B,\3ga=ʱcǸw^Ӊ4nux4@K2H$ʆ5JD*3JIS.ÖV6v8U "6j0uR(S`=I!;9D"ѵnG\nSna\X,6Gx+Wh"6nÇ9~880^Fntinn. k"*)E- B] T L {qK+Rkz;QſE[eITq0#lȖW:z> Wnvٳgٺu+۷ogѢEDQ.ͤ6 6l… <<]]]tdXCEWSuN9aPVA;Pk@Sm沬dcW~a.*$=ÙfZT@b YǵD W ٬79_Ⱦo‡(M&޽{|G={m۶K/1w܂,QJal۶k׮g+ `~6Wt#ʥH6%JH$3 |Ǽ6ux; &JneTFCTJxZFU@ XIm3vũS,` `hovvrr6=y j˲Gw<3]LN_s:gIn} {nj㊕_vW&GzBtaaw=%׍28oԒ 1k"9/+C};wc/^LSSXln:-[իW'$ l/ñ[S 2(I|$Nb= "tC &4ue,]Z4*54u dzB~Ku-nAGgƱlW\In5 S;5C1/F,ɝܺ0@g3o8p[D cG,cʕܹ>={p rdہuO:|@pZmQ > #,gSg$Oȭb- QSB2JNxc5RJRPߙ$ IKDh0,}P1^ufLrJsͬ[D0LJqmؔG ϯiV+\?ϝoRJZZZ'X?T) pdӣ]oi"oߛ7oww߿{,_PRf|M}YG}đ#G&3_С'd`@Ⱥ RDc~/TaNz}ݬmƎ ]8Bnul1sKY%W bP %8D#7bAtۈKi@zz I|k$1Mbun C^WUPBLXmj[8dSl6˙3goٽ{7/xw;w.ax3 1g~_Ǐ?YG-21z ~u0C3_ǚso͌0FԱY_/ &e K7T<®Ju :h":,= YUES!IlKRo͏cΑ(6)a "OYtx:.~7D֧$raΜ9þ}o~ë̙3 ٰ^\d ,O>a׮] I\'UW=-|@ zRc)̣5֎tR՚0QY!}UQCX24, rK["y/ ?WwU3Xے[ RQ1\Fcnb~P kCMPSj!淢,~p`7 8=R)>?Ύ; ~ IDATLBYf .dǎ|'|\re2d%%]h;![R2A9d M"&? o޽Ad 12zsTd9%T&ˁq{lDі~ח5ᘪ㸨MD!ldK@=DD,ј,T:0(01ɬ Ys_v^:o#m_~3}]lB"(f2cݺu|G|ܺuk23dRg 'q*|lAЀae)kTsS5jwm;1: &q9a01R%"K9Q׾. c*IS9{:T޶s  yUKP3}Wڣhp̠nZڦ01#Ę9gy-s,|޶ ڵg߾}?cڵ/H$xYn|˚Zt)f'蒒9' C8va0 ʮiReHZ9vjmLkY#dGj#U)ZlAYK=VJAXXw #h։:$U瞌KM㲑 -LBDdym10aY80+61gy[9e'.lood z#Td{2@?^y/P^zԵ*<US>n6twTzR۠"(֢_8o\BM2Q5YD%N?e9%"M'vE别y!erȮ笪=1*fVv<oGRITPS&& TdIXUA(_5\9ŃڱǕ2i`eMe(BA`-[Bb(w@Zr)ϒ}U}Jy8I˴ck۹2U(oe G粪a()B)cL6iLt Q(bP;-B!L$fbQٱ _!A6ψ.=^KO?#Go>~_K/kDXv-˗/^~)׮]#4E'E`ڸT#J딓!M%< TK~XR+Fgz J{ ($4Acx2C4q=60)=VM@`+M㔪#]tȜt1D+HaX2D]SxmP(\T(;Vp{S XPCÌ9,ȥxãF~q!^{5~߲i&jkk}f4-xȾk2d~Z+A'm7e!s7O]ܻ֡נD hlٮ?$k0 1a$ XVtSL˙Qd5t,Fk^lL٦f|M: (nE L! .FdKK)La̱4 Y,zG¼w짟~ɓ'y饗yFQ֭[ǢEx |2Lf"WBMuE 0h=š+ sSCҁ^~l*2*h`ei(raIQf7>5m(^ @9Y(mYDM}{h (Ge_2fP8vȗRjԁ)RcE:!]_7]{+ ?B'-J_i)<Zyv%sn'q#@GG>?9.[n%Hf'Inڵkٱcv?͛!{'L5J6v zQI}]lj9ju֢0٧*$Eӱ!T%`Dy ⚗3h_ֶ"#q7*#sj9Nw8J(%5F#_%^!Gjͺ&0 1V,A\>GACyuLFy8mmm?_~%o&gƺu㾦.dW^y׳sNobvצĜ$(!;Uq<;Ӭ rʲ{:I[]IPa>%&l4UqX9<§[%īf*QA)ckApgf!ZAg$mlN-ǜZ8uqs8T^ Ē!a#f`xexK8 +@UR ? CvcsV$Yoʉ>m1/_f޽WcҥYCv̘1ÿNi<٠T D"A4-[8RcP?/tد-V>hy>08GX HI Vi-TeaGWq/@ǛhX#N׈OHRGih@Rj"T5p̠UX 0}~/x2-M<,Ɋ]mܹs\v={_',\S]ڶ9rHH5Lle>,PNimm-( ^|-;ͺ.d@al<BD~?: 2%DV®ֈi Nϝ&.:U(äԘWAfM6I6E֘{Dz(@_ Sr)I,[!k\W:N9tgϞ|Gܽ{A)94yؠlnn. BO)n3i`U/Vf7^ Qr(45@u%BxTd>FHKDKN[ 8:T. DN9N=d 0 աd$C2}T!XI4m;cjtb0El;gĴ0C8oFY ^Z{Ȇa.\Xy9JX_~%_uFwڦlPv &T*E6%e1d&LsHɢT?vt/Lj4d%u% &*=)hQB,`zZcRaMt>;}^h^-[ƛoIww+|9rHJ C&96y;. >{zDidUn-}=)1!dᲘWhVԤ֖tiҙ@E> 5,ʚ0L53kv4d[`o>f|^{mڵ'OFe_2Ky t&ڣr!Y[Xq7p(OR^Nj $`ĸ b$\m"spU"*hW+*UPY-|dtpNa &Y)qvJ? xlGxR%˗r<4%p ?.<:c[6s`Sl2L/qFL?B!5(p^^%׎x۽{$ē>RrdX18:Kf @(Mzɨw2]AޯrRC0+h}xP- g4V:Ptcei^:"R"mI,n1cZdd KTt!kp+)d5l>~vQ‘5?</t(sN.\匲Q Ѻ@yW(@yWjw٘Y.@ b͋uՆ.QY65CWnj#Dfl\HID[}l׫V}F+{6)i!eͻF40!M .ȶL&ʒƄ 0 WR"~8 T=~<[j Sx9_~իW7I4@-Tl.1J%Fq.mV@󋣤 67 X xz-D-ajuGwtiF-7+Q[VZq6Z8o(#]c"hhHK"tA:''TN"s/%E}ާ^O?+B*jzҥK[Q${1s{VzBGBp}:Z 0|RYͥ,AySkLz+: ?H2,٘H) 22QQU=do1TA10c72Z8# ҹ[_c*` pl{t[dFGi* CJ.' ~ s*j0,+0h&<ǗIJA!; )]zSe" xHY[z.RIUIv|P]>D"(ӑ ȴɴH54l&w 0ޠ!5pBo`mW63{yfj.~S 60̼S@YeA@9~w{VVsnʚ 6mÓY%CTDɃgG1;i 9h7 Ġ9aG,_m\bҵc V 2v.f^76 cL2dkT[ۭ@|[/dqb_?75a̝;7xy5R: Msms`*r``)e]]]\xџQN6g[ s<:˼bmQμc.}4Zʩ|Ty^bGn2"Vj-ORY(ֺ:F7UO@֦6^r!_Th!L2b˕mJqdy"ԩ&0֮Qp2`Mc IDATNkglc 5f3TNf0&ĜCֶ%WqPO~x Wo>\.3#g~,Y2>\mu<>Kw-&ǫuI4\̉b%tؚp߆P8a8]vW۵d*}\5KTLU-,513|Rn㘑ƊiHR|Y(WkDQb- Zg&z*F'dKc.%% xh<+s(`")ux7hmmmb{:u**,N]aF"v iA \$j[v cUң)M=nKnc 8D$y q $o@ɉC[pJa yS@coh4cM'z\iޝ$(E^.!+B2@ov9f ܾ2̾LӒf|r2 ֭s5>߻w/}|!Tw܇v%Q (fA%!&NGҭ&%K #2mNNg=&Z`%|3 27A&XY39I6eڜznbl߾xM~|Q6y[}/rmrFw/<|#,,e PY.ա+)j1 tÇ 2$ØKUA)p{h 0߬)u9ßJ73+ev. KuG I,֝$#Ԉ5@-QÔxLCv 瘼dFc_SՓ;![n^ H4}KصkWT:a>e"f䌉mXpG4YYfpK#$o5^:6r}82+TV&ax%ȪaLdC|4$fÉAbHİ nT(Q$Z8be mWGc̶.S:m3vȠe vc@”2L+ f ϹNC6ZQ9k's_w+|'ݻˊwW7}ș{Rs])yrr)V q*k Ȅk-^xHA2n9+c񵔋ޫ#aS9K5Rn4 I1ca_sf#lln,.hL *tU팓nL\YN `1%$3@7"Y̐}ϗkLiKvo?|3=sg?#L6|ٳDYZlM~v?Nz r `)6 nxxvFe3gǦҏ ,X`"vna aKAd히l]`M@)i ::Мꠥs/Fo ĔjɺFBsmrrf)%&Ht2m12qRxe$:t5f SR}-,}SMs,Z^{c8p@6)Qo9qOHb1L?!+PK\Md- / O/$A҉Es~Z%-.AHuL80  ?F0A Z4j9K㒑P9_ $ZL`v}[p1a+'tm1muR@d'lx !fkFs.X YBmSO=Mlĉ޽(Kj|愷( J!ܺu+@z͇ zՓcmi܉G.0A/.Tm(!I6$`+Wke%J|{\5,e9PpL#eخ0fc)qDꈠ0J[Iǫk0of'TR2C5>JR[7K͵+V7d~!GD69M0=n PSοS@ *'(9J.*cnר<9` Aj eg IzZI tّ>-We7m ok\05Y3EIA؆~S _IMs#(H iuFDJocبc-)qŅR═8!k0C[3`vJLD+'F8@CR?yǛؤm /'v?.'Ns5>S͌rCJ S'ox9^m$Fij A* /h i%²0'S/C^8IwӌU)J D%"iYR M!.Heuqڻu_L:,T/D}}_z%oݍKے\::¹$/2ׯo\mfT*EYnrNSQN  L)P !lĐ6coVCWӱ;5%<Õ}#SFᗼvh/t#7Z%aqM-l#*hW*0TlP:K>+rNQt,êaՅeavjr^K2TIetZd$ҺÑ$a̺3$ 0}-|2%с Ǿ#7МѾyf^~elPJ)y&.\|;&g@92 '˳O:H\. cqƲ8vZ&eiv=31J)HÎC"P:N~*+b+G+)e阗r4xukmC,.heFxJ~m  HlKJ\XNlx cvӐ94cv^{5V\t~g}MoW&PqQ\C /L:\\pez뭨VuGss; w;O*cI ]e w\OLuʏ8mڸxix.r$?0 vI|ؤk}/J6r@l)MtJoVb/g%3AIoLʄH[{$:]q-1b ]W5$Y?;C6 ҇a1L?*;!9S_ pH6k,x -Z,DU*|'ٳ̀gAazҫD2jiD;8pwb`E\X sQ >ZeHeZnҥWLL3   e f5\  |QrJqˊEva!2LQg9IHecddc$:.ZjEx?anu 0$C60aIxr3L'G­EN4 ?g!5&Ϝ9ûX*׈^A@96vy@[,;1\]i8Nnm~AKIbSeIj +h"0Y p 9Đx[EZ@vP%e3LU)Ybt(a8َ8ɴN,y'|cti)%^;bB]J$T{ٳyY`GC6hF _nQcqr:|r^y:;;wQؤDYս[#9sfxFYs cD̄e#_نVjSmk c*Ր2P 801PeTaaIJHa Fq@r7PJTha@đT0`)]ڇW=v&ȴT΄$fT1̉/Z?1%AmɵSf\@4^xq4Mse~!\Fw(1J<4tb) ] =p5U?,34tL$ZMEI!:4 p=ƝblVZjƥ^FE . JnF=a9*_GǑQLȬGfkܴ'Euzv ~f'%%RJ #'Zխ]۷&ٵkNG& ProSTBOPШU'GNhOOW)3a.QzDБpk9 l&UNϝRM,5e mB?SB L7RGG%_e2)2N Y]9y}"2#NUAoS|$q  Dž0~;?F{}7`Hf߃0g]ZZZxW\,bϞ=|$Cʯw(g̘ہK: 2.rHrd')EW 7F4F;je?> .)k;^7&I1!("fĆy+!(}L?;nᘢV{h Đs\3iu:j/Ry23"K眔FlWCEcNd&K뵿FL_)Eoa3j 3DOpէKI[qHsl2믳zj={O)#Y;f.X`j,)N5lInQX3 R1w$ I*L%H))&Arqg+{ DFf8*VeItr9,@:oylrޢl23LUSw,D5ϐG#b}뙍faǕWa㍒VlªU8z(̙3و ý &# dbM%iVe5waU/D8v0k~TyzMC6Lh۸/fhz6 ._My>C4D/^9'j1c] J;@N,ZqzYܥIJ:9UcuRŘ7o/֭c8pk׮yf1gr.e:"K5&gu n_e_+ic%]m6HYb/9sfr|=L8 7vt S鍢)xq%Y:bT$0Vűjʐ@d iO@CʛUi_ zͱVWn )V!=@ZbF\'.^~I)I&,]yi&Ǖ+W\Yat́AzY:4K2{2)CA'  ~xy(a/7` Wqz Qa$ ^}Ul&:{pfӌ21z| q B&tVʫ9 a*Z'cz2D OTcUUVVJituu_/رO?Wƙl oV1I76~YhW+ ;qȸ lR 8ײ+Ǒ.t]'`U`}m"`Μ9,^x|شi{巿-~) 2$WJnUvjYι)b11U:cLL0% !4zmm\>>#MI"ॗ^bݺuMm8p~֍;și;'TmZ$(/ka\UtA u5_H si ;ޑwBP)"25_6m i ֚@L ň5˳ih-'fq5۶OU'i&m!mD"AGGK.eΜ9u2i̙3gLb{yٷogIIds׾ͱlsjmf]w0plp b%dw)g~&Q#$7hrGW^!6eOOD>F%L(GPUI#ne,!k)}զ+xq2qд(*fǫU#=Cwi>/Y v#piBbR1l&qH4(IOÜoF.SA1FuXic̟?EJYk;w./yٱc&ϻfQr%"dʱ0^uXcsʉ|oʕ+]>X1=Z 0N1ʪV!w̟wի3oytj^xckNyc2% O^!XD&ďM8_#P-b'hÎ\1H4fJj3--H+kV݀y۶,Νimm% wy% VZŊ+xgywرcOv͐ #&VfyNȒi0;!6fK 7Y)-srf''x^zʕ+ܹ+WD]pU] ┓; ˎ;裏x{ICCܺTdჭ,άR.#SC6BU a=d=RiS2dӇh[g͚Y`TZ]~ʹU('=Ldxx׆|=6z ZV=<5(W5Ks,ҏ0I?H ǥ?AL5i&U톁Sc;Wfp5 2\K#2 pKĩ.l^̲]fҥ̜9T*!BO?͆ xyٽ{7 ?C=er}e6mh{QxBwAHta3`0Ǵ fȪ9 FM]\`۶m&ٳQ `7%Vu ҄0@&u3RlJwКtyc-UV vM]ߵP)|@uj煍KG(Ulo" ΊIPmQneQJT"L%U˲bdYΝ˂ hkk4@Vy6ȍ~#vɗ_~ɭ[3dM#\?=ʲ,~)bq0=ʐиدd-غ_Q8{hלy3o޼"}tPuLQVrSnc~| w> ;)46jҏdydz9YװuUԅjlo(bqiLquLf0Mʮ'^B,¬*H`ljmmnf͚E2ZAWWo&[lO?7 gxx;I=eϱlc; ״ޝ@׵;0CzfX٦sN˱|8 `'QQ4p)rH]N;K%kv6 .YC1̀"~Qi㿎='b^;}kX9$Rc d2iczwjY]ioog,\ %L%`\_W<ڵk̭ūxx[_c٦v.o!MdC4:RII-vkGxx)> /c5RJ>CFGGEMPqӁra6 r1Kc?+R뢀[W7mF?_Vöz"S8JK\'eRށo# I,t tRiVk#@L&dɒ%tuu5yo~#JaVZs=;î]t钫%^sy=G:4z#Gz_+qJYlG w0CyȺ/١$!;E(Ke3nx\2xĩ?P.XMe֭g?#L6X\t;wrZ$kVfS<ܹ3g2kF+Ji=\e4z,gjOQ^NjV I<~qɨ>$ҐްnUXd\Cf4.gQ&`JEQQʺbK6׳ 1AV1҅aR.5g@^$ V^ygywٱc'Ot8lran^seu +tK,ԕQ50T &ÏTSY976g̘YdISO\?fϞ=0_ui8j<$K,bf­`WA(VlY MԱ;4V EC&EC2>@* `~nN:a,>:h85r;Y5R@* 4˵*,SQ[%+ И)nա'O,~h1HdQ4;GkR]lSѫkqr1 .J|ZL֕`C-,%Ri$ӟ;}r= r"DzM,ZS͐ ݚmW#f\xBfYř \+5K_3g6Q}9} Mal('J!mln[0rP =Pc E0 `j!V0㬋G\TUZG*; Zq1Pqia JZ*|ufB #FEoVȺ«FWlvXJ2qlSQSP@ԇi(Y~tb,IJOXʗ7k/^߱evŮ]o=d%پEa#[mj-gxIIM Ӷg a5d'I^}Ul${ GY L3@yg2_Q?YoiPeyHe)ހ*<7~lPS~tJyn1 L;3)6ZeNNjȄ@Lz+'!d0_5ʺM@L oTOZR BV$T^)OAD#+? dfi<կxxصkN-,.Jy+[2wC֍]M=ثD28#}͉Q=/2---Ml֭[K7XlV5 !aGUJʊ;r:5X|'IGu=[M:ע^+>e2 YcR)6nȚ5k,}]\j'mvX>^%K &! gP[zldQ73uep![ө!5lu>]_?j׀x/iUh"r}:He֬YÏcz->SOYi +Vlhg4a˴4%:&;::ؾ};Vjba?O>RL 2 ]Pqw?~cǎ,P N2(v9UnXfªYۢatsz񕔽%]Q nZs:=S rf,2E1dA`PQᗨTu@Uj@dDUhYfkevͮ]8pCCCe zK\=xȮi+{'c=rl#.kإ R\/H*/];իW%_0ʻQFQNVIm_αc8weJWV`  ӕ$s~RtZŊ62SHXwsN#)d Sdڤ k|_؝dCk x-x2pJ,~t=MӘ?>Oď~#>#~rQoGznlgZg$~`zzbϸ[ս,Z)0 >S*akiؚʻQeΜ9É'qRM{%*Ѵi("hkeH1s\ī>@k.SYš+7/ /W |NF3>F ~_q ԄJ4&bĄAQɪ3IA*^ L7"  y?+)9urX[ \Yt0gytkY5ˇkIl@g am۶WrivEoo$3lr( ĉ9s!^zb`aڐ+èRLt#$gHB$aIR"A]/rkК-7%HHiTV%0V&zZJdN4 آ{MVc<+KDEdFZĒ1T$թqZ(t@f"Sr#ٸq#+VgΝ|RكCϳ6mjg Ɍ[RfrUR2 Yhq0}UΝۙ;wn, |72W% 0Vnʺu<ׯ_wMpoс~ne6m{aX7ݻ\ݖ(+0xi5mw'40JamvD  b#طPjG{VUVnY PXH:(TeFFFe/}Sw#KL?%%3JL2y4{$"3イ>RoMvI3[:6 ZA # :C8G ~` zAEɷ|̞=}k\m۶uVN:Cjl23N`¤hslDJRsp؂%K++L4iyǎ;.0GMFT9B9>w,++љ9Yb1bUUc}RG&"L^Y:W1"Yf| @bI3{ [5.wUy~R$3Ibѯ*WE Qƶކm|DK'9a_÷-J+I })u'<ַxٹs'[nڳ>6dxv(3ry"t.5 HUi830&,//gӦM,YdL4i&d׮]D"E]\V˔kYf;5 q}2 B< 0ebHV$H<B*՚rpQQD5 #D7Z SB211-8U?pH#HW% LxIJW'  )++RBa[)BJKKG'JH (疤Q@4Í@A5B@YyQRvQeh.$"f?u RFtλV| W Gҥ/1%1Xl䳕A!>@ @ dDPSi0iƈO?Oݻ=-l8CvJL+7B񩐕8W˲BrJ|MJJJF 455e˖b,`&P^{hzmn$ӧOgٲe#Ot\GbleSx,Dv/mRp#)9DMIzNpԄ=̴4{lK`t'aB& L|NɲF){Rf d#ʔؤ4D"A<g```$0aw}Ȳ`ɬ_z;wm69B8vL3.=FK!ʻtOP\f2aS{ڱ닩ٳgIib1>C:Tl4لj(SE;H ڎ[$ ;'H>.7&yk]cXrξ|7xTB~WGL->Ą\IDZtۇ8fO,8{_gd.9IJ NuƔ~%Yʷx„ L82*++|ME>3go~UV;pDl<1UP19p-#RJz[c\9O"jUVꫯX԰yf:;;&wwP5J׳}jvA辰snwH,x(eb$[H[m>C<' $of+@ %,71"DŽk#Ҷ} 2\:)+xx` 2X-|JLLTe,̞ !FQA ɓ'S^^NiiH;-,ZϳeoߞC]Q/2o-C!)IljQ?{u&?;Vlu ^jt3M 'g~}>X$9/i!P^Q,RLsk5V%74kZ{76mrNP;COGV11*'ޛvhrD ̈1[ 3O=7w)LCVVVRYY9R{;`.] ꫯyf~_! C~U҉LC+”:i8v5xWXbŘch6UUUرYIMj#J, ߃am@X@HO@\( Iu b1) |nH7XTOtc'gfry I N7V8zuH'>en/o駟f֬Y#3TWKGvHJ(SN8R***F^Cg\)//}Wή]p-I#POyK'qx3;ml$;g~mN:wH;wr̙b)\DUjYByG e^ _[s+& EAi~ J.5YPd;"ȸc>>sĐ aK1V~q0 pNF%=êRE8u>,˖-cZ6EttP< 1a*++)++SmGiXYe˖z%`OKCy񐽯 mٴ^d?9B!6nlرcl߾bbUsVGwPqog?BYO9I{ArZ]~ɜ;94o,H(6+ !"Jy Z*ꤽGVvl smJzD8uuuu8q+WtRQ3 3#D(2Z #&L`ҤI#& `ԩ<3ٳwyÇ{{8G*45]4&$?cklwŬ_ &{zzxwxb1ѤD[w8H,݉BYqg`4Şb_ZBraY*DV>1֑"ywI H &*z9}_M: U*a0=Q8_Ry5 E&0~)W\aҥo&/2;wd˖-\tSgt6;`9#7%CIj(੧bӦM9lٲbކ pRGZ(`<6b6L2>̙ |(6#b9}t1O15"Q@7n> uHռ(3rXk"lĠEW`)ck4Nw {>.j~`%P8,ZEkk+TUUOrJ͛Gii)eee&MĴiw8QZZO<ŋy饗غu+۷or}&3uNL cS&MbӦM,\pMz2d޽|FP&-';Y(}P+K w: eEIJ&E)1߄/)D@s|_=&m-a і@[ӆO q哫l;W|+=:[_K0hooٳZ5k0k,f͚.ʹbŊ1---^k3K9O|xlO?믿>&-m۶R.K#`/c4Z(G(| xcsL]-ҙ0cUQVtETȽk( QU*qDęzFmH,"I9s[K[m/1$M8iz8,w.Hab1.^Hss3/^d<*d5I!:*9hCj9-7L(oG&ړnӹ Ox4D \e5P_bB4S]rZ0L""}Ie'gS7.(C^8w>$Iҍ!%Dmi` ;w~z^xf̘ӯ9fÆ <3{l޼Gzz&6/K/HNE.]b֭Z%~Mjsmc7~o%lzfV˜Z\$0g%b8Bu\~/ؾ;")!hOÖٰ >-mnrD 'Zh>JJHHǚ#{6D,p/gvɉ'Xb6mbʕs=ch̙37 /ݻO~ɓ'Fmcڴi|+_ac0vѣZբ_I (o7=).ԑN<$h{H2Wk^w|7D^㶠pnS=a5![uXyB K& qh3UG|D(c:d ^;Mq>EF< La/yw8z(Wfƍ,[)S|&*o@ 2|{96o̎;vM%- ^{58<[n-zdp>'\@ 卋(o'|~ֳj]2\HZw#y hb$1%!< \3SDt2%)C/@Js`(- TWwqeeZ_DѾ;XV*Y,BU^I)G?f͚5]%KPYYc=Yf [l!i&&M4& رsk.pU-74Re|rxyrٔe!INVN;sPZT{,0IQ,C @Ae#g%CNj"7Y;Ghls|;Nдγt%}#;ʺo{2 ݃"(Bb;wK.~֭[ڵkY`[Yb+V`ҥ^wy]v|^zj̍SNk.OW "J%PprxsL˩dl}<4t啚&sݶ- ˤ@#Gb6"f#ȱRbig|^fJ,S&Xǥ5REsu׈_@Lo1_[P{j/Rzu(1 uT渴$ N8+Wطo6l_"sΥT_<իWtR^}U~Œ%KWBeekFwҥKžq hBy+Ss&?{RU:g=ҺG|q G`0/^De1dFE3epz*&ƀ ^):,Xܢ0Jku5=ANj%JRO̔\)32@*{eVyC_6kwx?p}qY>6m/1;/(uI"1+k5Q|bFI4qLVG eZD\9ʉm\\v[%{q2;JYHȬۢyܷ+; x8syg:ukQF1sL/S^^NIIɘǴm6ꊺz_f8i>+zb֬Y466޼M@*FG0A aM) 5l.U#H "{WN͎@-DT"zL|-qU)U9gra[6 &:BGxo!܎3$>i?? q۬eu M(mZ>yKXJAJ#u 7@=?LKz o] |aљTÑ Is͍aK{O8=cx #,P$D2ZMp} &ЌZ:*<LY4Çon:y&N^e.7lٲ梮 vZ$PJ/뺈D"b1ȸbvx[( J}!!1\Ls r«$_orEnqXәatbVIG|yrNf[.wQu7տPO\J[1Fɪ{llg8?5:Bn;k:'X &0-%iryؿ?o&: .\GyF޽kU׈ܭb"Q^O~4 g+|tOD9ė0H^4S\$S”`01:jHZ8:ղy=̅Uw6F"w!ŕ[B)PzGQU67I<곫Aan@U>Zwu$ѣGxH5k;wAmm-۶mhC \@ N(1V$SIYbJ0g&MRs( 򃜅=BhSr4 fabT 6$xԴM Cʙ`Mqb5iV$7D{7ۏ3 DYqԔqe@ IDATAOUU{aÆ ̜9S K4s> HhPo㦸7`RZID^8P$^vM ǜ<(4kQ`g4)G fc1ԜGmD= -#vBM5[=D6$!~GD23Lm sP[]]!K)%]]]ܹ'Os[osqjUUU}b(sc:BY,㖧oĕmpGp0X1WʎnQ.BёGe,DgCKL.u '[NF و$F1 R1I KX\\UuGrtUwuE/ܨCFvq9y]l A2^qXm{5kذaO<'Og` sNΜ9SUV糥Bُ(e QcO~16[9ObIvO9XDm;:2O\THYم9P8C&F5c9IHA/wsT+u?8N]c?Q'rQ9%2}z2$Z k p7(%`=j̺:x>cTTTqmۜ8qw}X(i:Mj,^MqɝG N Ghr`{sBNJ!^XH$YH#Lf\Zڈ qǨb.''bI7QU~gȑfM sJ cJ(?$P>M"IWV DQΝ;Ǖ+W8po&k׮e…wlOO۷oX#gO uG҆p 'vl5%~H k_|z5,MZ|DR:vr6Ơru$!j+T6-Rb6Ñݽ4Wwq~|D#ZU\8:[ҥ̧B)qs|.\ tu7El,\|n:^yΝKIIZ0mѣ޽;(.NԯP~ƅҌAyqo+ɹW9?䎁r\6 ]!KHHDFԪg)[Tyz;2i34EiN~o/" I:djȶ%#1=kK:7GK+d_0N?p{rvͦMx饗>lݺZRq4Z([Fp?AN˴,$=Y=PV@1,!']^!hRNSV@OĉpWqq9.l >-Mnp5psC<KB$ b D;⼄huICGDR01loJ`t*ݚ2ئM{ƽ5|xq~HGK!;y,~ӟr^x/O2y|&nZU87)6-ykGJhWUݽhI53إj!RD,海|b&> -$1zs]ۜ%b P9>cēC ˖dYj=&D#CF%[gٺ:9믿ڵkyG̮_ɾ}8tUǪ5FUP^/6HL18P>z=E2HM0g><">Q!WaպQﲣVeF_@1sR?7/B}c/tRe.쬦53G:#ϭGOdvN335ªljx;ϋ`?9X 3N-%UUU׳~֮]kRrelBggg1OM\u4r/t3+;#rIĿ"h dC Z{&)Wn2+ gDD%FjˆIpFM)sӫ9LVw2AaCcb!n,9(w~Җr:z,(Ly>{sѤ8ϟg۶mwI#㥅r#q?1Bzzz<3.塻-ςY),%1?,z3OFI[鋯^Vsq{Wh6oږjzi.:wT2-噫&_߹Fy=T~E`&㔎bǎJþ:/ubyT3b繅e$2@S3-b},e R|>̙Ú5kXnO<wum#msApĉb:8(Ǎ6tt0Rn,$ 0rd!xdb ԒjDF5v=jpqs] )pG:^6#O D<بJlgIaZEmm-իY~=K,!--e֭TWWSq"r?& x~.| vLp!)Ai+ yü߯ٲv<[0m( 9ҷiL*1,әT9a[21rKmci_˅+4TlV crPf}בHa$#zxۑmDUȾ%!{JGVi^]YҌy ]>I<TL6Ͷ._4Yd!D%%"Ơ7'1:jU [2-C :ie /tghN0r `af7a?i^tQNflx@,ѣ\|}x>B]m6닍h="o?2̙gMҚ#4DbQ{B]e^ȑ-Z>2Sr`Ǚ1T*)O9uHlp8Mq+a $\o̎inDApJ {Q^YQ?󜛭릿{rY[oŋ/Ȍ3|7\0SI&<5FQTPB9CYOgsS!@x|>IHY`t,no5\JLl̮MoL] ҉WKS3=(g?U|%`MoV`vww{qIVZņ X|9SN0gʹ4 e M9܊ǀ׳9__}>aD/ŜODm[["#&u$ԎhײI+=?h]CkQTrIJ|1^bpӒYپ8rdvt"VG$c."!{ eV!{xiȧ~:Cb\ZJ԰m6:::yDg] RAlzMw"laAV>],gHFZiΔkF94z5mǨr f,Xg?uW?8(fIK3w^d]Fv"NTժz;O0H{Ȯ1iRUUECC7_gѢE^`qvʼn'1U(5wy)JzD^*/ >V*2N>zE@3,ynrk""._MhL 6bHȚ9ni8Fwu7ϴq\{kim"9D2k+8X<4@kUV5ٔ/3ڴ)//'dƍY9s NJ)9vˡCRsQޔrF!= ~{lX &¨I\$ ȹ~C{u$ )ɐl|riI=zЫ1&~4qzw&q&.nn+yVS|&mH>bMQAC5AceG}ٳg7n^`ƌEyȆavsIP-3[HfrXAM?\-)e.{$/ aN8k$S5eX-=Fh= ZP=Dv.\'ghMG45n*`f1ҪXj3r͵\SF kiӦrJ/sq=F;gϞ-F(XM$gA!YE3\-#C$S+)XH  YwTFV gϣm(b RprhU5\S:rMȐvDqe-8^\,n! S=dyf?իYn˖-cʔ)۹tR1"iMjM3h|vih= lO4ܛ!<ʂ#kat=cG䈲KXDctpK*jIS\B7 |{1R;|8EUjn ATKgJCvA,Xիٰa=؈6wpB1JQl\+__=fd[ŶuShY*nͺm 1-I%dkUs5n1O21H~6ro>cAF/K5@krfc :Z'&@Ϳ ^Ga>8U& r bݺuk,Xr֭[+v\By˅Rs?{ ~I514^y25O,R3$)s [5;k9f"jcDl+ UJoU0N2xgڨu]iU@ _zn)\EeVԙpN>fa"Ly !w\L׏9˗ٳg֭c̘1}gb;-wgsR%ǧ?cMr"`!H[ZBrN #^ H\OM4% &CREy]sl }TtSDÄgk'mGOY!7*W#hUE%KjTl`<_஻bŊ<8p>ءRsAZU  "9Տ)U2*ÈC1*W;,|&".U-= gMa~yΒ.>ނܳF4sN1u>G {qhnK| ٧P/3=r6>b1ѢᯢsHsKS_ xdg# D]QJv]H̜Ò$':`#@ g{1/tr&w_˴c+.k(r\(2D!mg ܅R0uDÇWZO&71%G`m5=*[D4^'%v1y|vU aIDk*Ii0+`ut ĉv 0b5gF'd*H "&16 SjRPjՖXEt(No-4wSj͗ Wc[:{'-Tjԉ[IҩUQձQ&NIG7ƵH !x0HRdJ }I&~ 'c߲IXxt*u?9Kݹv:QL%h}^C̎ )@$3&WDrVѩUfHy^c@U˖ X(HjnxD) &oJȇ]f`.y|L )ưZguY.$ 4%GI~'R4`_|r*\7c;iU\"\m댹 SdORN8*Q}o)c]q;%@HazNRa >iᑆ|:1[$38b9@UPm1tFY]pThB%"IIDAT e6G$žG mc ڪ0ftkמ "q]Fζ~ދ#^Fֿ^6qF]JV2d\FJT6Hg4+ϙׁ , ["MӖ %Ubq^d}7x̲D'ZwGy9bO,FB6Bi8" jT:5*֡h4;X(CTh{΀#8Gh4+E:⨣GFh2PFh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4Fh4S5e0IENDB`