#!/usr/bin/env python #---------------------------------------------------------------------------- # Name: wpclipper.py # Purpose: clipart Viewer/editor for WPCllipart collection # view, convert, filter, rotate, etc... # capable of clipboard use on any GTK-enabled linux machine # to subsequently paste into AbiWord, Gimp and other editors. # # Author: Paul Sherman # http://www.absolutelinux.com # # last update: 09/15/2010 # version: 9.0 (linux) # Copyright: (c) 2005-2010 Paul Sherman # License: GNU GPL3 #---------------------------------------------------------------------------- # Python imports import os, sys, string, re, math, imghdr, webbrowser, gc, ConfigParser # PIL (Python imaging library) imports import Image, ImageOps, ImageFile, ImageFilter, ImageChops, ImageDraw, ImageEnhance import PngImagePlugin, JpegImagePlugin, BmpImagePlugin, GifImagePlugin, TiffImagePlugin # language imports #import codecs, gettext # gtk, pyGTK imports import pygtk import gobject if gobject.pygtk_version < (2,9,96): print >>sys.stderr, "pyGTK version 2.10 or greater is required for this application" raise SystemExit import gtk try: import pango except: print >> sys.stderr, "Cannot load Pango" raise SystemExit # # platform-specifig imports if sys.platform == "linux2": import commands if sys.platform == "win32": from win32com.shell import shell, shellcon import pythoncom # Global constants below, including images used by GUI # # path to folder above viewer # used as default open path if none in configuration file startpath = os.path.dirname(os.path.realpath(sys.argv[0])) startpath = startpath.rsplit(os.sep, 1)[0] config = ConfigParser.ConfigParser() base_config = "[default]" # get the path/name to the configuration file if sys.platform == "win32": df = shell.SHGetDesktopFolder() pidl = df.ParseDisplayName(0, None, "::{450d8fba-ad25-11d0-98a8-0800361b1103}")[1] homedir = shell.SHGetPathFromIDList(pidl) cfile = os.path.join(homedir, "wpclipart.ini") else: homedir = os.getenv("HOME") cfile = os.path.join(homedir, ".wpclipart") # tmpPath is file to hold edited images while app is in use tmpPath = os.path.join(homedir, ".tmp.png") if not os.path.exists(cfile): base_config = base_config + "\nstartpath = " + startpath fout = open(cfile, "w") fout.write(base_config) fout.close() # default path is where the viewer/editor will first try to find clipart if len(sys.argv) > 1: passed = sys.argv[1] if os.access(passed,os.R_OK) and os.path.isdir(passed): default_path = passed else: config.read(cfile) default_path = config.get("default", "startpath") else: config.read(cfile) default_path = config.get("default", "startpath") if not (os.access(default_path,os.R_OK) and os.path.isdir(default_path)): default_path = startpath ############################################################################ ############################################################################ ############################################################################ ############################################################################ enable_list = ["Rotate","Filter","Adjust","Image","Save Image","Edit w/GIMP","Edit w/XV","Edit w/ImageMagick"] # icons for the application interface ################################################# IMAGE_EDIT = [ "16 16 8 1", " c None", ". c #000000", "+ c #FFFF00", "@ c #FF00FF", "# c #00FF00", "$ c #808080", "% c #FF0000", "& c #0000FF", " ... ", " .+++.. ", " .++++++. ", " .+++@@@++. .", ".++++@@@.+.. ..", ".++##$..+++. .. ", ".+###$++++++.. ", ".+$$$++++.$..+. ", ".++++++++....++.", " .+%%%.+++..+++.", " .+%%%.++++++++.", " .+..+&&&&&+++.", " .+++&&&&+++. ", " ...+++++.. ", " $.. ..... ", " $$.. "] XV = [ "16 16 24 1", " c #091623", ". c #20364E", "+ c #B2C0DC", "@ c #24272B", "# c #0E0F11", "$ c #000000", "% c #0A0B0C", "& c #B1BFDA", "* c #B1BFDB", "= c #141518", "- c #32363F", "; c #383D46", "> c #020203", ", c #111215", "' c #030303", ") c #181A1E", "! c #010101", "~ c #AAB7D3", "{ c #08090A", "] c #010202", "^ c #050606", "/ c #ACBAD5", "( c #040505", "_ c #07080A", " .............. ", ".++++++++++++++.", ".++++++++++++++.", ".+@+++++#++++++.", ".++$+++%&+++++*.", ".++$+++=+-+++;+.", ".+++$+$++>+++,+.", ".++++$+++'+++)+.", ".+++$+$+++$+!~+.", ".++$+++{++]+^/+.", ".++$+++]+++$+++.", ".+$+++++(++_+++.", ".++++++++++++++.", ".++++++++++++++.", ".++++++++++++++.", " .............. "] MAGIC = [ "16 16 37 1", " c None", ". c #FF9500", "+ c #FF9808", "@ c #4C4465", "# c #FA9304", "$ c #FF9800", "% c #FFFF1A", "& c #FFC600", "* c #FFFF17", "= c #F99203", "- c #FFC800", "; c #00391B", "> c #FFFF5D", ", c #FFFF8C", "' c #FFFFB6", ") c #CEEDC0", "! c #9CDA80", "~ c #9BD980", "{ c #95D180", "] c #8DC880", "^ c #85BF80", "/ c #FFFFCC", "( c #FCFC38", "_ c #39B500", ": c #2EA800", "< c #1F9600", "[ c #0F8400", "} c #037500", "| c #33AE00", "1 c #259D00", "2 c #148A00", "3 c #077900", "4 c #007200", "5 c #FB9302", "6 c #FFC700", "7 c #FF9700", "8 c #FF9706", " ", " ", " ", " .+ ", " .@.#@#$ ", "%&.%*=-%.;;;;;;;", ".>,'',>.;)!~{]^;", " .&//&.(;!_:<[};", ".>,'',>.;!|1234;", "%&.%*56%.;;;;;;;", " .@.7@5. ", " .8 ", " ", " ", " ", " "] HTML_ICON = [ "16 16 124 2", " c None", ". c #A6630C", "+ c #804800", "@ c #FEFDFC", "# c #EED9BE", "$ c #EDD8BD", "% c #F0DDC4", "& c #F2E1CA", "* c #CD9A59", "= c #CF9E5F", "- c #D09F60", "; c #F0DFC8", "> c #90A1B8", ", c #5F80AD", "' c #4F77AD", ") c #4C75AC", "! c #5078AE", "~ c #57769F", "{ c #DDB683", "] c #5B7FB1", "^ c #7595C1", "/ c #B0C4DC", "( c #D2DEEC", "_ c #DBE3F3", ": c #C9D8EB", "< c #A5BDD9", "[ c #7092C0", "} c #4B74AB", "| c #BF8539", "1 c #5179AF", "2 c #A4BAD8", "3 c #D7DFE9", "4 c #C5D3E1", "5 c #B3BAC1", "6 c #B3C6DB", "7 c #AECFF0", "8 c #B4C5D6", "9 c #CEDBE8", "0 c #96B1D2", "a c #6184B3", "b c #A3B9D7", "c c #D6DCE4", "d c #C8CDD0", "e c #D5E9FF", "f c #CFE8FF", "g c #C4DFFA", "h c #B2C3D4", "i c #B8C0CC", "j c #D4D9DC", "k c #DDE5ED", "l c #899BB5", "m c #7396C1", "n c #E6EEF6", "o c #DDDEDF", "p c #C0D0DE", "q c #D7ECFF", "r c #D7EBFF", "s c #C9E4FF", "t c #BDCAD7", "u c #D0D3D6", "v c #EEEEF0", "w c #BECCDF", "x c #6D8FB9", "y c #A9BFDB", "z c #D9DEDF", "A c #BDD8F3", "B c #D5EAFF", "C c #CBE5FF", "D c #C0C9D0", "E c #B5C2CF", "F c #98B0CC", "G c #ADB9C7", "H c #537BB1", "I c #C9D7E9", "J c #9DBAD7", "K c #BBDDFF", "L c #D3E9FF", "M c #C0D5EC", "N c #F7F7F7", "O c #F8F8F8", "P c #AEBED3", "Q c #4D75AB", "R c #CFDDEF", "S c #9AC5F2", "T c #A8D1FA", "U c #B7DBFF", "V c #C7E3FF", "W c #C1E0FF", "X c #C1CBD3", "Y c #BDCBDE", "Z c #507AAE", "` c #C0D3E8", " . c #ADBDCD", ".. c #C0C9D2", "+. c #A3C7EF", "@. c #A4CDF6", "#. c #A0CAF4", "$. c #9CB6D4", "%. c #F2F4F4", "&. c #EAECEE", "*. c #B7C5D8", "=. c #A35E05", "-. c #5779AB", ";. c #9EB7D6", ">. c #D4DCE2", ",. c #D8DBDE", "'. c #91B7E1", "). c #89B8E9", "!. c #80B0E6", "~. c #73A2D3", "{. c #7CA3CE", "]. c #EFEFEF", "^. c #AFBDD0", "/. c #5375AD", "(. c #6B91BF", "_. c #A5BBD8", ":. c #C0CEE0", "<. c #E6E8EA", "[. c #71A2D9", "}. c #6DA2DD", "|. c #619BD7", "1. c #5891D2", "2. c #DADADA", "3. c #A7B5C8", ". + + + + + + + + + + + + ", "+ @ @ @ @ @ @ @ @ @ @ @ @ + ", "+ @ # $ $ $ $ $ # # % & @ + ", "+ @ $ * = = = = = = - & @ + ", "+ @ $ $ $ # # # % % ; & @ + ", "+ @ $ = = = = = > , ' ) ! ~ ", "+ @ $ $ # # { ] ^ / ( _ : < [ } ", "+ @ $ = = | 1 2 3 4 5 6 7 8 9 0 ", "+ @ # # % a b c d e f g h i j k ", "+ @ # = l m n o p q r s t u v w ", "+ @ # % x y z A B B B C D E F G ", "+ @ % = H I J K L L L M N O N P ", "+ @ % % Q R S T U V W X O O O Y ", "+ @ @ @ Z ` ...+.@.#.$.%.&.O *.", "=.+ + + -.;.>.O ,.'.).!.~.{.].^.", " /.(._.:.:.<.[.}.|.1.2.3."] VIEW_FULL = [ "16 16 138 2", " c None", ". c #BE7B5E", "+ c #B06442", "@ c #FDFBF9", "# c #A76446", "$ c #BBBAB9", "% c #ABA29E", "& c #ABA19D", "* c #D6C7BF", "= c #F0DDD4", "- c #F1DFD7", "; c #F2E1DA", "> c #F4E5DE", ", c #6A6563", "' c #666666", ") c #837873", "! c #CBA593", "~ c #DAAE9A", "{ c #8B8B8A", "] c #888381", "^ c #6E6D6D", "/ c #C5B9B3", "( c #F3E4DD", "_ c #D3A996", ": c #A08A80", "< c #6D6A69", "[ c #AE9386", "} c #D3D1D0", "| c #A29994", "1 c #CABCB6", "2 c #E0D2CB", "3 c #807D7B", "4 c #BDB1AC", "5 c #5C534F", "6 c #414141", "7 c #353535", "8 c #313131", "9 c #3B3B3B", "0 c #5E5956", "a c #A88C80", "b c #EADCD6", "c c #898483", "d c #D9CCC7", "e c #4B4B4B", "f c #262C33", "g c #5E7996", "h c #A7C7E7", "i c #1A73CC", "j c #1D5D9D", "k c #1F3952", "l c #787573", "m c #EADCD5", "n c #EBDDD6", "o c #928D8B", "p c #4A4A4A", "q c #4D4D4D", "r c #80B1E2", "s c #BAD9FB", "t c #FFFFFF", "u c #599CDF", "v c #429DF8", "w c #248AF0", "x c #3174BA", "y c #645C58", "z c #D3AA98", "A c #D4AB99", "B c #ADA5A2", "C c #464646", "D c #EBEBEB", "E c #9AC3F0", "F c #E4F0FD", "G c #BFCBD8", "H c #7F7F7F", "I c #536F8B", "J c #45A1FD", "K c #328EED", "L c #CEDBE8", "M c #696665", "N c #EBDED8", "O c #DACFCA", "P c #CECCCB", "Q c #BABABA", "R c #F8F8F8", "S c #96C3EF", "T c #4FA4FD", "U c #586B7F", "V c #3F3F3F", "W c #333333", "X c #63B0FD", "Y c #3692F1", "Z c #C4DEF7", "` c #E2E2E2", " . c #D7D6D4", ".. c #7A7A7A", "+. c #EDEDED", "@. c #DDEAF7", "#. c #3B94F2", "$. c #6491BE", "%. c #464F58", "&. c #5FAFFE", "*. c #3792F2", "=. c #E9EFF5", "-. c #EEEEEE", ";. c #DCDCDC", ">. c #434343", ",. c #837F7D", "'. c #ECECEC", "). c #86BAF0", "!. c #59A7FB", "~. c #69A7E4", "{. c #6DB5FE", "]. c #3F9EFE", "^. c #62A7EF", "/. c #F1F1F1", "(. c #E6E6E6", "_. c #BCBCBC", ":. c #3D3D3D", "<. c #B3B2B1", "[. c #8B6E61", "}. c #C4C4C4", "|. c #96C4F4", "1. c #4599F2", "2. c #3893F2", "3. c #69ACF2", "4. c #EBF1F8", "5. c #E9E9E9", "6. c #E3E3E3", "7. c #DDDDDD", "8. c #6B6B6B", "9. c #7F5947", "0. c #BB7657", "a. c #959595", "b. c #C3C3C3", "c. c #F7F7F7", "d. c #F5F5F5", "e. c #EAEAEA", "f. c #ACACAC", "g. c #707070", " . + + + + + + + + + + + + ", " + @ @ @ @ @ @ @ @ @ @ @ @ + ", " # $ % & * = = = - - ; > @ + ", " , ' ' ' ' ) ! ~ ~ ~ ~ > @ + ", " ' ' { & & ] ' ^ / ; ; ( > @ + ", "' ' # @ = ~ ~ _ : < [ ~ ~ > @ + ", " + } | | 1 - ; 2 3 4 ( > @ + ", " 5 6 7 8 9 0 a ( b c d > @ + ", " e f g h i j k 7 l m n o n @ + ", "p q r s t u v w x 7 y z A B @ + ", "C D E F G H I J K L e M N O P + ", "Q R S T U V W X Y Z ` e M N .+ ", "..+.@.#.$.W %.&.*.=.-.;.>.,.@ + ", " ..'.).!.~.{.].^./.'.(._.:.<.+ ", " [.}.|.1.2.3.4.-.5.6.7.8.9.0.", " a.b.c.d.-.e.;.f.g. "] HOME = [ "16 16 82 1", " c None", ". c #A40000", "+ c #EF2929", "@ c #7B4C4A", "# c #885A58", "$ c #995D5B", "% c #848582", "& c #9B9B9A", "* c #C08A8A", "= c #9D7573", "- c #8F908D", "; c #B8B9B8", "> c #C2C2C1", ", c #BABAB9", "' c #C4A1A1", ") c #A38D8B", "! c #9FA09E", "~ c #BFBFBE", "{ c #DEDEDD", "] c #DDDDDD", "^ c #D7D7D7", "/ c #C9B5B5", "( c #A79F9D", "_ c #A3A3A2", ": c #DADADA", "< c #EAEAEA", "[ c #E9E9E9", "} c #E7E7E7", "| c #DCD0D0", "1 c #B3B3B1", "2 c #A2A3A1", "3 c #D8D8D8", "4 c #E6E6E6", "5 c #E4E4E4", "6 c #E3E3E3", "7 c #E7E4E4", "8 c #E2E3E2", "9 c #555753", "0 c #77787A", "a c #76797D", "b c #757575", "c c #757676", "d c #F5F5F5", "e c #F1F1F1", "f c #7E807B", "g c #7F817C", "h c #80827D", "i c #76797C", "j c #7999C3", "k c #7798C2", "l c #75787C", "m c #F4F4F4", "n c #F0F0F0", "o c #848681", "p c #75787B", "q c #5F86B7", "r c #4A76AE", "s c #72757A", "t c #F3F3F3", "u c #EFEFEF", "v c #868883", "w c #8A8865", "x c #717881", "y c #3465A4", "z c #6E7681", "A c #878984", "B c #88897E", "C c #B1B3B6", "D c #B8BCC1", "E c #BABBBC", "F c #B9BDC1", "G c #A4A4A4", "H c #F2F2F2", "I c #EEEEEE", "J c #888A85", "K c #A2A2A2", "L c #A3A3A3", "M c #656763", "N c #979994", "O c #989996", "P c #999A96", "Q c #FBFBFB", " ..+ ", " .++. ", " .+@#+. ", " .+$%&*+. ", " .+=-;>,'+. ", " .+)!~{{]^/+. ", " .+(_:<<<[[}|+. ", ".+1234}}}45567+.", " +89999}0abacd+ ", " 9e9fgh}ijbklm9 ", " 9n9ooo}pqbrst9 ", " 9u9vvw}xybyzt9 ", " 9u9AAB}CDEFGH9 ", " 9I9JJJ}KLLLLH9 ", " 9dMNOPHdddddQ9 ", " 99999999999999 "] GIMP = [ "16 16 181 2", " c None", ". c #C84F00", "+ c #D35C00", "@ c #D56101", "# c #D26001", "$ c #D15F01", "% c #D05E01", "& c #CF5D01", "* c #CE5D01", "= c #CC5C01", "- c #CE5C01", "; c #CC5300", "> c #DB6A02", ", c #FDCC70", "' c #FDE3B0", ") c #FDE1AA", "! c #FDE1A9", "~ c #FCE0A9", "{ c #FDE0A9", "] c #FEE4B0", "^ c #FEBF50", "/ c #C35100", "( c #E99528", "_ c #FEFEE3", ": c #FEFEE7", "< c #FEFEE8", "[ c #FEFEE9", "} c #FEFEEE", "| c #B9AF86", "1 c #B85500", "2 c #F39E33", "3 c #CCA460", "4 c #E9CC86", "5 c #EEDA96", "6 c #D5B776", "7 c #BE9F65", "8 c #C3A973", "9 c #DCCA8D", "0 c #FEE177", "a c #FDD663", "b c #988451", "c c #291D0B", "d c #9E4C04", "e c #131313", "f c #181C1F", "g c #421600", "h c #F89F26", "i c #BD9041", "j c #B08949", "k c #B08B49", "l c #B39B69", "m c #9F8950", "n c #836A2D", "o c #705422", "p c #935C02", "q c #814E00", "r c #442A09", "s c #432C04", "t c #A75000", "u c #707070", "v c #9EA0A3", "w c #1D130C", "x c #BC861E", "y c #FCF7D1", "z c #D7D8D5", "A c #E3E2D3", "B c #FBFDFE", "C c #C5C6BE", "D c #9E9355", "E c #897635", "F c #675122", "G c #5F461B", "H c #533914", "I c #5C3D01", "J c #BE5D00", "K c #363636", "L c #5A5A5A", "M c #040609", "N c #483B15", "O c #F2F1E9", "P c #83868F", "Q c #F6F7FD", "R c #959597", "S c #57585D", "T c #96895F", "U c #856E2E", "V c #786028", "W c #6C4F1C", "X c #422B0D", "Y c #865E00", "Z c #CE6800", "` c #010101", " . c #060606", ".. c #000000", "+. c #130E05", "@. c #A08F67", "#. c #8B8366", "$. c #CAC4B0", "%. c #8E8F92", "&. c #676560", "*. c #86733E", "=. c #765D25", "-. c #6C521F", ";. c #5C3F15", ">. c #432B05", ",. c #C89000", "'. c #D06C00", "). c #010000", "!. c #2F240E", "~. c #785E23", "{. c #7D6628", "]. c #836E34", "^. c #98875D", "/. c #86733F", "(. c #6F5720", "_. c #5C4722", ":. c #694D20", "<. c #3E270B", "[. c #775500", "}. c #F6B700", "|. c #CF6D00", "1. c #2C1301", "2. c #5F360C", "3. c #5C4219", "4. c #6A5020", "5. c #6D551F", "6. c #69501C", "7. c #644C1D", "8. c #5B4623", "9. c #695330", "0. c #4A3013", "a. c #523901", "b. c #D09C00", "c. c #FEC800", "d. c #CC6C00", "e. c #C37200", "f. c #745404", "g. c #4A310E", "h. c #432D15", "i. c #4A3419", "j. c #513B21", "k. c #584126", "l. c #4E3714", "m. c #5E4300", "n. c #BF9300", "o. c #FBC300", "p. c #FECE00", "q. c #CA6D00", "r. c #F19E00", "s. c #F9D100", "t. c #C29900", "u. c #987500", "v. c #7F5F02", "w. c #735502", "x. c #836500", "y. c #A07D00", "z. c #D8AF00", "A. c #FCCB00", "B. c #FED100", "C. c #FED600", "D. c #CC6F00", "E. c #D37200", "F. c #FED000", "G. c #FED300", "H. c #F9C400", "I. c #F3BF00", "J. c #F8C400", "K. c #FEC900", "L. c #FECC00", "M. c #FDBF00", "N. c #AC4C00", "O. c #702900", "P. c #AB5100", "Q. c #A85400", "R. c #A95500", "S. c #A75300", "T. c #A65100", "U. c #A25000", "V. c #A14E00", "W. c #9A4200", "X. c #391200", " ", " . + @ # # $ % & * = - ; ", " > , ' ) ! ! ! ~ { ) ] ^ / ", " ( _ : _ < : < : < [ } | 1 ", " 2 3 4 5 6 7 8 9 0 a b c d ", "e f g h i j k l m n o p q r s t ", "u v w x y z A B C D E F G H I J ", "K L M N O P Q R S T U V W X Y Z ", "` ...+.@.#.$.%.&.*.=.-.;.>.,.'.", " ..).!.~.{.].^./.(._.:.<.[.}.|.", " 1.2.3.4.5.6.7.8.9.0.a.b.c.d.", " e.f.g.h.i.j.k.l.m.n.o.p.q.", " r.s.t.u.v.w.x.y.z.A.B.C.D.", " E.F.G.p.H.I.J.K.L.L.p.M.N.", " O.P.Q.Q.R.Q.S.T.U.V.U.W.X.", " "] splash_icon = [ "240 240 32 1", " c #0A1572", ". c #241D66", "+ c #8C1753", "@ c #32356E", "# c #3E3098", "$ c #3B3C3E", "% c #363885", "& c #93235A", "* c #99366A", "= c #535696", "- c #5C5C5B", "; c #58647A", "> c #1F74C4", ", c #AC5D86", "' c #B06340", ") c #6C6EA7", "! c #797778", "~ c #479FF5", "{ c #8F91BA", "] c #969698", "^ c #C08AA3", "/ c #ABABAE", "( c #AFB2CE", "_ c #CEACB5", ": c #BBBABC", "< c #CAC9CB", "[ c #C8CCDE", "} c #DBD9DE", "| c #E6D9D3", "1 c #DBDDDA", "2 c #E7E7EA", "3 c #FDFFFC", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", "))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))", ")))))11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111)))))", ")))))}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}1)))))", ")))))1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111})))))", ")))))}}}33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333211)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))}}133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))11}33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))}}}33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'''''''''''''33333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))1}}33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'333333333333'3333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'://||||||||3'3333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))1}}33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333----!!_____|3'3333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))1113333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333-!!//!--:||||3'3333333333333333333333333333333333333333333333333333333333333333111)))))", ")))))1}}333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333--'2|___]-]__|3'3333333%33333333333333333333333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333'|]]:|||!:|23'333333%%33333333333333333333333333333333333333333333333333333333111)))))", ")))))1}}33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333-$$$$-]||]||3'33333%%%33333333333333333333333333333333333333333333333333333333111)))))", ")))))1113333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333-$;[>=$$!||]|3'3333%%@%%%%%%%%%%%%%%%%%%%%3333333333333333333333333333333333333111)))))", ")))))1}}333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333--{[3~~~>$-__/3'33333%%%333333333333333333%3333333333333333333333333333333333333111)))))", ")))))111333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333$2(2[!;~~[--|<<'333333%%333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333:3(~;$$~~[1$-||'3333333%333333333333333333%3333333333333333333333333333333333333111)))))", ")))))111333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333!22~{$-~~222$!3'33333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333!2(~~~~~222:$/'33333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333!:(~~~3221}--'33333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}33333333333333333333333333333333333333333333333333333333333333333/:333333333333333333333333333333333333333333333333333333333333333333333333333333333]<3322}/!33333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1113333333333333333333333333333333333333333333333333333333333333333:$!33333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}3333333333333333333333333333333333333333333333333333333333333332$!]22223333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))111333333333333333333333333333333333333333333333333333333333333333]!/]<:123333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}333333333333333333333333333333333333333333333333333333333333333-<]/:/:23333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333<-1!]]]:23333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}33333333333333333333333333333333333333333333333333333333333333]]1!]]]:}3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))11133333333333333333333333333333333333333333333333333333333333333-:}-]!]/}23333}2333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}33333333333333333333333333333333333333333333333333333333333333$}}-/!]/}3333:$<333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1113333333333333333333333333333333333333333333333333333333333333}-21-/!]:}233]-$}222333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1}}3333333333333333333333333333333333333333333333333333333333333]!1}-]!!/}22!!}$1<1}233333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333%3333333333333333333333333333333333333111)))))", ")))))1113333333333333333333333333333333233333333233333333333333333333!/}}-]!]:1}-!2!! c #A165A6", ", c #BF1CCC", "' c #9C8399", ") c #D0A9D7", "...........++++.", ".+.+.+.@#@....+.", ".+.+.+.$%$....+.", ".+.+.+.$&@.%%.+.", ".+++++.@&$%%#.+.", "......**=#*=-.+.", "+.....@*%*=#..+.", "+.....$%%&&.....", "+.;>@.+,=&*.....", "+.+#',,,&.......", "+.>@@,>,$...+++.", "+.*++&++>@..+.+.", "+..@$@>#@+*.+++.", "+.....)>*+$.+...", "+......->&*.+...", "++++++.........."] cav32_xpm = [ "32 32 17 1", " c None", ". c #9D446E", "+ c #A772A0", "@ c #FFFFFF", "# c #9D9E9D", "$ c #BBB9BB", "% c #DBDFDC", "& c #424442", "* c #7A7E7A", "= c #616460", "- c #000000", "; c #212121", "> c #9A0BA5", ", c #B902CA", "' c #852D8C", ") c #A330AD", "! c #E60DFA", ".++++++++++++++++++++++++++++++.", "+@@@@@@@@@@@@@@@##@@@@@@@@@@@@@+", "+@@@@@@@@@$@@@@%&*$@@@@@@@@@@@@+", "+@@@@@%@@$&@@@@=%=#%@@@@@@@@@@@+", "+@@@@%-$@%&@@@@=%=*%@@@@@@@@@@@+", "+@&%@%&&@%;@@@$$$=#%@@@@@@@@@@@+", "+@#&@@&*#@-@@@=%#=#@@@@#*@@@@@@+", "+@@&$@&@&@;@@@&@*=#@@@*=*$%@@@@+", "+@@$;@&@#*;%@@*@*=#@@&$***%@@@@+", "+@@@=#&@@&;%@%*@*=#$&%%==#@@@@@+", "+@@@%;;@@$-%@$#@===&%@===%@@@@@+", "+@@@@*-%@@@@@#$@===%@#==#@@@@@@+", "+@@@@@$@@@@@@*%@=*%@#==#%@@@@@@+", "+@@@@@@@@@@@@=%@=%@$&&*%@@@@@@@+", "+@@@@@@@@@@@@=$%=@$==*$@@@@@@@@+", "+@@@@@@@@@@@@*===$&&=$@@@@@@@@@+", "+@@@@$+$@@@@@>,'&=&*$@@@@@@@@@@+", "+@@@+,)+'%@%),!,==*$@@@@@%##@@@+", "+@@@,+*=#'),!,!+&*$@@@%*;;;-#@@+", "+@@@,$=#$#,!,,!+=$@@@@#&-%@-=@@+", "+@@@>##%@$,,#)!+=%@@@@@#-$@-#@@+", "+@@@$'#%@+,**>!)#%@@@@@$-#*;@@@+", "+@@@%+,+),+=#,,,'$@@@@@%--=%@@@+", "+@@@@%#++#**#,#=#>+%@@@@-*@@@@@+", "+@@@@@$#**#$#)==##>$%@@@-=@@@@@+", "+@@@@@@%%%%@$)*#@%)+#%@%;-;$@@@+", "+@@@@@@@@@@@@>#$@@,+*%@=*$@@@@@+", "+@@@@@@@@@@@@$>+%#,#*%@@@@@@@@@+", "+@@@@@@@@@@@@%#)>)+=*%@@@@@@@@@+", "+@@@@@@@@@@@@@%#*#**$@@@@@@@@@@+", "+@@@@@@@@@@@@@@%$$$%@@@@@@@@@@@+", ".++++++++++++++++++++++++++++++."] ################################# bg_xpm = [ "1 450 52 1", " c #D7D7D7", ". c #D8D8D8", "+ c #D9D9D9", "@ c #DADADA", "# c #DBDBDB", "$ c #DCDCDC", "% c #DDDDDD", "& c #DEDDDE", "* c #DEDEDE", "= c #DFDFDF", "- c #DFE0DF", "; c #E0E0E0", "> c #E1E1E1", ", c #E1E1E2", "' c #E2E2E2", ") c #E3E3E3", "! c #E4E4E4", "~ c #E5E5E5", "{ c #E6E5E5", "] c #E6E6E6", "^ c #E7E7E7", "/ c #E8E8E8", "( c #E9E9E9", "_ c #EAEAEA", ": c #EBEBEB", "< c #ECECEC", "[ c #EDEDED", "} c #EEEEEE", "| c #EFEEEF", "1 c #EFEFEF", "2 c #F0F0F0", "3 c #F1F0F0", "4 c #F1F1F1", "5 c #F2F2F2", "6 c #F2F3F2", "7 c #F3F3F3", "8 c #F4F4F4", "9 c #F5F4F4", "0 c #F5F5F5", "a c #F6F6F6", "b c #F6F7F6", "c c #F7F7F7", "d c #F8F8F8", "e c #F9F9F9", "f c #F9F8F8", "g c #F6F6F7", "h c #F4F5F4", "i c #F3F2F2", "j c #E9EAE9", "k c #E3E3E4", "l c #E1E2E1", "m c #E0DFDF", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", ".", ".", "+", "@", "@", "#", "$", "$", "%", "&", "*", "=", "-", ";", ">", ",", "'", ")", ")", "!", "~", "{", "]", "^", "^", "/", "(", "(", "_", ":", ":", "<", "[", "[", "}", "|", "1", "2", "3", "4", "5", "6", "7", "8", "9", "0", "a", "b", "c", "d", "d", "e", "f", "d", "c", "g", "a", "0", "h", "8", "7", "i", "5", "4", "3", "2", "1", "1", "}", "[", "[", "<", ":", ":", "_", "j", "(", "/", "^", "^", "]", "~", "~", "!", "k", ")", "'", "l", ">", ";", "m", "=", "*", "*", "%", "$", "$", "#", "@", "@", "+", ".", ".", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", ".", ".", "+", "@", "@", "#", "$", "$", "%", "*", "*", "=", "m", ";", ">", "l", "'", ")", "k", "!", "~", "~", "]", "^", "^", "/", "(", "j", "_", ":", ":", "<", "[", "[", "}", "1", "1", "2", "3", "4", "5", "i", "7", "8", "h", "0", "a", "g", "c", "d", "f", "e", "d", "d", "c", "b", "a", "0", "9", "8", "7", "6", "5", "4", "3", "2", "1", "|", "}", "[", "[", "<", ":", ":", "_", "(", "(", "/", "^", "^", "]", "{", "~", "!", ")", ")", "'", ",", ">", ";", "-", "=", "*", "&", "%"] file_screen = [ "348 288 13 1", " c None", ". c #FEFFFC", "+ c #0C0E0A", "@ c #CACCC9", "# c #989A94", "$ c #6C552E", "% c #666664", "& c #D0CB95", "* c #2D679B", "= c #FAFCF9", "- c #939592", "; c #0E100D", "> c #4C4D4B", "............................................................................................................................................................................................................................................................................................................................................................", ".................................................................................+.........................+................................................................................................................................................................................................................................................", "..+++++..........+..........................+............................+.......+.........................+..............+......+..........................................................................................................................................................................................................................", "..+..............+..........................+............................+.................................+..............+......+..........................................................................................................................................................................................................................", "..+......++++...++++....+++...+.++..........+.......+++....+++....+++...++++....++.....+++...++++..........++++...+...+..++++...++++....+++...++++..........................................................................................................................................................................................................", "..++++...+...+...+.....+...+..++..+.........+......+...+..+...+......+...+.......+....+...+..+...+.........+...+..+...+...+......+.....+...+..+...+......................................................................................................................++........+............................................+...........................", "..+......+...+...+.....+++++..+.............+......+...+..+.......++++...+.......+....+...+..+...+.........+...+..+...+...+......+.....+...+..+...+.......................................................................................................+++++...........+........+.......................++++...........+.....+...........................", "..+......+...+...+.....+......+.............+......+...+..+......+...+...+.......+....+...+..+...+.........+...+..+...+...+......+.....+...+..+...+.......................................................................................................+...............+........+.......................+...+..........+.....+...........................", "..+......+...+...+.....+...+..+.............+......+...+..+...+..+...+...+.......+....+...+..+...+.........+...+..+...+...+......+.....+...+..+...+.......................................................................................................+.......+++.....+.....++++...+++...+.++..........+...+...+++...++++...++++........................", "..+++++..+...+....+++...+++...+.............+++++...+++....+++....++++....+++...+++....+++...+...+.........++++....++++....+++....+++...+++...+...+.......................................................................................................++++...+...+....+....+...+..+...+..++..+.........+...+......+...+.....+...+.......................", "..........................................................................................................................................................................................................................................................+......+...+....+....+...+..+++++..+.............++++....++++...+.....+...+.......................", "..........................................................................................................................................................................................................................................................+......+...+....+....+...+..+......+.............+......+...+...+.....+...+.......................", "..........................................................................................................................................................................................................................................................+......+...+....+....+...+..+...+..+.............+......+...+...+.....+...+.......................", "..........................................................................................................................................................................................................................................................+.......+++.....++....++++...+++...+.............+.......++++....+++..+...+.......................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", ".............................................................................................................................................................................................................................................+.....+........................................................................................................", "........................................+.....+..............................................................................................................................................................................................+....+.........................................................................................................", ".........................................+....+..............................................................................................................................................................................................+...+..........................................................................................................", "..........................................+...+..............................................................................................................................................................................................+..+...........................................................................................................", "...........................................+..+..............................................................................................................................................................................................+.+............................................................................................................", "............................................+.+..............................................................................................................................................................................................++.............................................................................................................", ".............................................++..............................................................................................................................................................................................+++++++........................................................................................................", "........................................+++++++.............................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "...............................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@$++%%%%%%$%%%#&@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%..........@.@%#@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%..@@@@@@@@@..@#@@@@@#+.............@@@@@@&#%%%%%%%%#@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%..........@++++%@@@@#+.............@@@@@@%#&&&&$%%%+#@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%.@@@@@@@@@@@%$&$#@@@#+.............@@@@@@%&#$$$%##++#@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%..........@#$&$$#@@@#+.............@@@@@@+%%+%##&$++#@@@@@#+.@@@@@@@@@+@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++@@++@@@@@@@@@@@@@@@@@@@@@@@@@@%%@@@@@@@@@@@+++@@@@@@@@%+++%@@@@@@.......................................................+....................", "...............................................+@@@@#%..@@@@@@@@#$&$+$@@@@#+.............@@@@@@%%#@#&&$+%+#@@@@@#+.@@@@@@@@@+@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@++@@%%@@@@@@@@@@@@@@@@@@@@@@@@@@++@@@@@@@@@@%+++@@@@@@@%++%++%@@@@@.......................................................+....................", "...............................................+@@@@#%.@@@@@@@@#$&$$$%@@@@#+.............@@@@@@+#@@#%#@@%%#@@@@@#+.@@@@@@@@@+%++@@@%+++@@@@+++%@+@@%+@+@@@+@@+%++@@@@@@@@@@#+#+@@@%+%@++#@++@++%+++@@@@%+++%@++@@++@@++%+++@@@&++++#@@++%+%@+++++@@@@@@@#+%++@@@@@@@++#@#++@@@@@.......................................................+....................", "...............................................+@@@@#%........#$&$+%+%@@@@#+.............@@@@@@%@#@@@...#%#@@@@@#+.@@@@@@@@@+#@%+@@@@@#+@@+%@@@@+@+%@@+@@@+@@+#@%+@@@@@@@@@#+#+@@@#++@++%#+$@+++%+++@@+++%%%@++@@++@@+++%+++@@#%%%++@@+++%#@%++%%@@@@@@@++@++@@@@@@@++@@@++@@@@@.......................................................+....................", "...............................................+@@@@#%.@@@@@@#$&$$%#+%@@@@#+.............@@@@@@%@#@@%##@&+#@@@@@#+.@@@@@@@@@+@@@+@@#++$+@@+@@@@@++#@@@+@@@+@@+@@@+@@@@@@@@@#+#+@@@@++#+++%+#@++#@#++@@++#@@@@++@@++@@++#@#++@@&+++++@@++#@@@@++@@@@+++@%+##++#@@@@@@++@@@++@@@@@.......................................................+....................", "...............................................+@@@@#%..&@@@@+&$+%#@$%@@@@#+.............@@@@@@%@&@@%%#@&+#@@@@@#+.@@@@@@@@@+@@@+@@+@@@+@@+@@@@@+%+@@@+@@@+@@+@@@+@@@@@@@@@#+#+@@@@++++%+++@@++#@#++@@++#@@@@++@@++@@++#@#++@@++%#++@@++@@@@@++@@@@###@%++++++#@@@@@++#@#++@@@@@.......................................................+....................", "...............................................+@@@@#%.@@@@@%$$+%#@@$%@@@@#+.............@@@@@@%@&@#%%#@#%#@@@@@#+.@@@@@@@@@+#@%+@@+@@%+@@+%@@@@+@%+@@+@@%+@@+#@%+@@@@@@@@@#+#+@@@@%++%#+++@@+++%+++@@+++%%%@++@@++@@+++%+++@@++%%++@@++@@@@@++%#@@@@@@####++%@@++@@%++%++%@@@@@.......................................................+....................", "...............................................+@@@@#%.@@@@@++%#@@@@$%@@@@#+.............@@@@@@%#..@####%%#@@@@@#+.@@@@@@@@@+%++@@@%++%+@@@+++%@+@@%+@%++%+@@+%++@@@@@@@@@@#+#+@@@@#++#@++%@@++%+++@@@@%+++%@++@@++@@++%+++@@@&++%++@@++@@@@@%+++@@@@@@@@@@++@@@++@@@%+++%@@@@@@.......................................................+....................", "...............................................+@@@@#%.@@@@@@@@@@@@@$%@@@@#+.............@@@@@@%##&.@@#%#%#@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@++@@@@@@@@@@@@@@@@@@@@@@++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%.....&@@@@@@@@$%@@@@#+.............@@@@@@%%#%##%%##+#@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@++@@@@@@@@@@@@@@@@@@@@@@++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%.&&&&&@@@@@@@@$%@@@@#+.............@@@@@@#%$$+++$$$%#@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@#%@@@@@@@@@@@@@#+%@@@@#+.............@@@@@@@@@@&&&&&&@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@&++++++++++++++++#@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@###############@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+@@@@@@@@@@@@@@@@@@@@@@@@@@#+.............@@@@@@@@@@@@@@@@@@@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+###########################+.............########################+.#########################################################+#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@.......................................................+....................", "...............................................+++++++++++++++++++++++++++++............+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++#.........................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+.......................................................................................................................................................................................................................................................................................+....................", "...............................................+##################################################################################################@@@@@################################################################################################################################################################...#############+....................", "...............................................++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++.@@@@@#++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++....#............+....................", "...............................................+...............................................................................................+@.@@@@@#+...........................................................................................................................................................+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@#@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@#%#@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@#%%%#@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@#%%%%%#@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@.......@+....................", "...............................................+.@@@++++@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+%@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@+@@%+@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@++@@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@%+++++++%@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@+@@@+@+@@%+++@@@@+++%@@++$+@@@%+++%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+%+@@+@@%+++@@@+%++#%++#@@@++$+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++++@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@+@@%+@+@@@@@#+@@+%@@@@+#@@#+@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+@+&@+@@@@@#+@@+#@#+#@#+@@+#@@#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++++@@@@@@@@@#+@....#.###########+....................", "...............................................+.@@@++++@@+@@#++$+@@+@@@@@+++++$@@++%#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+@#+@+@@#++$+@@+@@@+@@@+@@+++++$@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+++@@@@@@@@@@#+@....#+++++++++++++....................", "...............................................+.@@@+@@@@@+@@+@@@+@@+@@@@@+@@@@@@@@&&++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+@@+#+@@+@@@+@@+@@@+@@@+@@+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@+@@@@@@@@@@@#+@....#............+....................", "...............................................+.@@@+@@@@@+@@+@@%+@@+%@@@@+%@@@@@@@@@#+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+@@#++@@+@@%+@@+@@@+@@@+@@+%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@+@@@@@+@@%++%+@@@+++%@@+++$%@@++++#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@+@@@++@@%++%+@@+@@@+@@@+@@@+++$%@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@++++++@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+.##############################################################################################+@.@@@@@#+.@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@#+@....#.@@@@@@@@@@@+....................", "...............................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@.@@@@@#+.##########################################################################################################################################################+@....#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++@....#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.**.*.*.*.*.*.*.*.*.*.*.*.*.*@....#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+.**********************************************************************************************************************************************************.@....#.@@@@@@@@@@@+....................", "...............................................+...#+++++++++@..................................................................................@.@@@@@#+************************************************************************************************************************************************************@....#.@@@@@@@@@@@+....................", "...............................................+...+........@+#.................................................................................@.@@@@@#+.**********************************************************************************************************************************************************.@....#.@@@@@@@@@@@+....................", "...............................................+...+.......@.#+@................................................................................@.@@@@@#+************************************************************************************************************************************************************@....#.@@@@@@@@@@@+....................", "...............................................+...+.......#%%++......@+....@+.....................@+....@+.....................................@.@@@@@#+.****++++**************************************************************************************************************************************************.@....#.@@@@@@@@@@@+....................", "...............................................+...+........#+++......@+....@+.....................@+....@+.....................................@.@@@@@#+****+.@@#+**************************************************************************************************************************************************@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+......@+....@+..#+++#...%++%..@+#++@+....@+...%++%..@+#++@#++@...%++%...........@.@@@@@#+.**+.&&&#%+++++**********.@****************************@****************************.****.**@*********@****************************************************.@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+......@+....@+..+@..@..%%..+%.@+%..@+....@+..%%..+#.@+%.%+%.%+..%%..+%..........@.@@@@@#+***+&&&&&####&#+*********@.*********************************************************.****.************.*****************************************************@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+......@+....@+..+#.....+@..@+.@+...@+++++++..+@..@+.@+..@+..@+..+@..@+..........@.@@@@@#+.**+.&%++++++++++*******@#@****.@..#@..#***@..@***.@.@*.***@..@*@...#**.@..#********.****.**.**@...@*@...**@..@***.@.@*@***.*******************************.@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+......@+....@+..@+++@.@++++++.@+...@+....@+.@+...@+.@+..@+..@+.@++++++..........@.@@@@@#+***+@&$.&@&&&&&&#+******.*#.***.#*#.#*#.**@#***@**.****.**.********#@**.#**.********......**.**.******.***.***@@**.****.***@********************************@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+.......+@...@+.....#+..+......@+...@+....@+..+@..@+.@+..@+..@+..+...............@.@@@@@#+.**+@%#&&&&&&&&#&+*****@@**.#**.***.***.**......**.****.**.*****#....**.***.********.****.**.**.@*#***.***.***#.**.****@@*.#*******************************.@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+.......%%..@+#.@@..#+..%%...@.@+...@+....@+..+%..+%.@+..@+..@+..%%...@..........@.@@@@@#+***+#$.@&&&&&&&#+******.....@**.***.***.**.*******.****.**.*****.#*#.**.***.********.****.**.***#*@@**.***.***#.**.*****.#.*********************************@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+........%+++%..@++++@...%+++#.@+...@+....@+...%++%..@+..@+..@+...%+++#..........@.@@@@@#+.**+&#&&&&&&&&&&+*****#.****.**.***.***.**@@***#**.****.**.*****.**@.**.***.********.****.**.*****#.**.***.***@@**.*****@.*********************************.@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+................................................................................@.@@@@@#+***+#.&&&&&&&&#+******@*****@**.***.***.***@...***.****.***@..@*@..@.**.***.********.****.**.**....#**@..**@..@***.*****#.**********************************@....#.@@@@@@@@@@@+....................", "...............................................+...+..........@+................................................................................@.@@@@@#+.**+%&@&&&&&&#%+********************************************************************************************************@@*********************************.@.@@@#.@@@@@@@@@@@+....................", "...............................................+...+@@@@@@@@@@#+................................................................................@.@@@@@#+****+++++++++++********************************************************************************************************..***********************************@.@@@#.@@@@@@@@@@@+....................", "...............................................+...#+++++++++++#................................................................................@.@@@@@#+.****************************************************************************.....@************************************************************************.@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+************************************************************************************************************************************************************@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+.**********************************************************************************************************************************************************.@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+************************************************************************************************************************************************************@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*.*..*.*.*.*.*.*.*.*.*.*.*.*.*.@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....##%%%%%%%%#.................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%#&&&&$%%%+@................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%&#$$$%##++#................................................................................@.@@@@@#+....#++++#..................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....+%%+%##&$++#.......++++%+..+..............@++++#................#...........................@.@@@@@#+...#+.@@#+#.................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%%#@#&&$+%+#.......+.......+..............+@...@................+...........................@.@@@@@#+...+.&&&#%+++++#....................@+...................@+.................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....+#@@#%#@@%%#.......+....+..+...%+++.......+......#%...+..#+++#.++++..%+++...+%++@%++@.......@.@@@@@#+...+&&&&&####&#+.........................................@+.................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%@#@@@...#%#.......++++@+..+..+@..#+......%++%@...+..#%..+......+...+@..#+..+@.#+@.#+.......@.@@@@@#+...+.&%++++++++++#.....#+++@.@+%++@.@+.@+%++@%++#..#+++@.@+..%+++#..........................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%@#@@%##@&+#.......+....+..+..++++++........#%+%..%#.+@..++#@...+...++++++..+..@+..@+.......@.@@@@@#+...+@&$.&@&&&&&&#+........#+.@+#.#+.@+.@+#.#+#.#+.....#+.@+.@+..............................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%@&@@%%#@&+#.......+....+..+..+...............@+..@+@+....@#+%..+...+.......+...+...+.......@.@@@@@#+...+@%#&&&&&&&&#&+.....#++++.@+..@+.@+.@+..@+..@+..#++++.@+..++#@...........................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%@&@#%%#@#%#.......+....+..+..+%...@......@...#+...++#......@+..+...+%...@..+...+...+.......@.@@@@@#+...+#$.@&&&&&&&#+#.....+@.@+.@+..@+.@+.@+..@+..@+..+@.@+.@+...@#+%..........................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%#..@####%%#.......+....+..+...%+++#......+++++@...@+....++++@..%++..%+++#..+...+...+.......@.@@@@@#+...+&#&&&&&&&&&&+.....@+@.%+.@+..@+.@+.@+..@+..@+.@+@.%+.@+..@..@+..........................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%##&.@@#%#%#.......................................%%.......................................@.@@@@@#+...+#.&&&&&&&&#+#......%++%+.@+..@+.@+.@+..@+..@+..%++%+.@+.@++++#..........................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....%%#%##%%##+#......................................++........................................@.@@@@@#+...+%&@&&&&&&#%+............................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+....@%%%%%%%%%%#................................................................................@.@@@@@#+...#+++++++++++#............................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+......@@@@@@@@@.................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+.##############################################################################################.@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+================================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+================================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+================================================================================================@.@@@@@#+....@++++@..................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+===-;;;;;;;;;-==================================================================================@.@@@@@#+...@+.@@#+@.................................................................................................................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+===;========-;-=================================================================================@.@@@@@#+...+.&&&#%+++++@..........................................+...................................+.............................................................@.@@@#.@@@@@@@@@@@+....................", "...............................................+===;=======-=-;-================================================================================@.@@@@@#+...+&&&&&####&#+..........................................+.................................................................................................@.@@@#.###########+....................", "...............................................+===;=======-->>;================================================================================@.@@@@@#+...+.&%++++++++++@.....#+++@..+%+#.+%++@%++@...%+++...@++%+........#+++#...%+++...+%+##%...+..+...+++%..%+++...#+++#........................................@.@@@#+++++++++++++....................", "...............................................+===;========->;;=============================;==>=====================-=========>;=======>;;-===@.@@@@@#+...+@&$.&@&&&&&&#+........#+..+#...+@.#+@.#+..+@..#+..+@.%+........+......+@..#+..+#...+..#+..+..+#....+@..#+..+............................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;=============================;========================;========->;======>-==>-==@.@@@@@#+...+@%#&&&&&&&&#&+.....#++++..+....+..@+..@+..++++++..+..@+........++#@...++++++..+....+#.+#..+..+.....++++++..++#@.........................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;======->==;-=->=;->>====>;>-=;==;==;->>===->;>===;->->;>>======>=;======;===->==@.@@@@@#+...+#$.@&&&&&&&#+@.....+@.@+..+....+...+...+..+.......+..@+.........@#+%..+.......+....#+.+...+..+.....+........@#+%........................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;=======;=->>=>-=;-=->==>-====;==;==;-=->=====->==;-===;=======>-=;======;====;==@.@@@@@#+...+&#&&&&&&&&&&+......+..%+..+....+...+...+..+%...@..+@.%+...........@+..+%...@..+.....+%%...+..+#....+%...@.....@+........................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;=======;=>-;=;==;===;==;=====;==;==;===;==->;;;==;====;======->==;======;====;==@.@@@@@#+...+#.&&&&&&&&#+@......%++#+..+....+...+...+...%+++#..@++%+........++++@...%+++#..+.....%+@...+...+++%..%+++#..++++@........................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;=======>-;=>->==;===;==;=====;==;==;===;==;===;==;====;==->>->;;;;;=====;===->==@.@@@@@#+...+%&@&&&&&&#%+............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;=======-;>=-;-==;-=->==>-====;==;==;-=->==;==>;==;====;==========;======>-==>-==@.@@@@@#+...@+++++++++++@............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;========;-==;-==;->>====>;>-=;==;==;->>===-;>-;==;====>;>========;===>===>;;-===@.@@@@@#+............................................................+++++%..........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;================;==================;============================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;==========-;================;==================;============================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===;-----------;================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+===-;;;;;;;;;;;-================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+================================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+================================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+================================================================================================@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+....#++++#..................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...#+.@@#+#.................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&&&#%+++++#...................%........................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&&&&&####&#+..................@+........................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&%++++++++++#.....#+++@.@+%+%++++......................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+@&$.&@&&&&&&#+........#+.@+#..@+........................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+@%#&&&&&&&&#&+.....#++++.@+...@+........................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#$.@&&&&&&&#+#.....+@.@+.@+...@+........................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&#&&&&&&&&&&+.....@+@.%+.@+...@+........................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#.&&&&&&&&#+#......%++%+.@+....%++......................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+%&@&&&&&&#%+............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...#+++++++++++#............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+....@++++@..................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...@+.@@#+@.................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&&&#%+++++@.......+......+................+............................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&&&&&####&#+.......+......+................+............................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&%++++++++++@.....+%++...+..#+++@..+%++@..+..%%.#+++#..................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+@&$.&@&&&&&&#+.....+@.%%..+.....#+..+@.#+..+.+%..+......................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+@%#&&&&&&&&#&+.....+..@+..+..#++++..+..@+..++#...++#@...................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#$.@&&&&&&&#+@.....+..@+..+..+@.@+..+...+..+%+....@#+%..................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&#&&&&&&&&&&+......+@.%%..+..+..%+..+...+..+.%+.....@+..................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#.&&&&&&&&#+@......+%++...+..%++#+..+...+..+..#+@++++@..................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+%&@&&&&&&#%+............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...@+++++++++++@............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+....#++++#..................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+...#+.@@#+#.................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+...+.&&&#%+++++#......@+............@+.@+.....@+.@+.........................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&&&&&####&#+......@+...............@+.....@+............................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&%++++++++++#....@+%++@.@+..@+.@+.@+..@++%+.@+.@+%++@..@++%+..%+++#....................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+...+@&$.&@&&&&&&#+....@+#.%+.@+..@+.@+.@+..+#.%+.@+.@+#.#+..+#.%+.@+........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+...+@%#&&&&&&&&#&+....@+..@+.@+..@+.@+.@+.@+..@+.@+.@+..@+.@+..@+..++#@.....................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+...+#$.@&&&&&&&#+#....@+..@+.@+..@+.@+.@+.@+..@+.@+.@+..@+.@+..@+...@#+%....................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&#&&&&&&&&&&+.....@+#.%+..+@.%+.@+.@+..+#.%+.@+.@+..@+..+#.%+..@..@+....................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#.&&&&&&&&#+#.....@+%++@..#++%+.@+.@+..@++%+.@+.@+..@+..@++%+.@++++#....................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+...+%&@&&&&&&#%+...............................................%+...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+...#+++++++++++#............................................#+++@...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@..@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@.@+@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@++@#+....@++++@..................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...@+.@@#+@.................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&&&#%+++++@............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&&&&&####&#+............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+.&%++++++++++@......+++%.#+++@..+%++@%++@...%+++...+%+#.#+++@...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+@&$.&@&&&&&&#+.....+#.......#+..+@.#+@.#+..+@..#+..+#......#+...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+@%#&&&&&&&&#&+.....+.....#++++..+..@+..@+..++++++..+....#++++...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#$.@&&&&&&&#+@.....+.....+@.@+..+...+...+..+.......+....+@.@+...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+&#&&&&&&&&&&+......+#....+..%+..+...+...+..+%...@..+....+..%+...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+#.&&&&&&&&#+@.......+++%.%++#+..+...+...+...%+++#..+....%++#+...........................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...+%&@&&&&&&#%+............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+...@+++++++++++@............................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+................................................................................................@.@@@@@#+............................................................................................................................................................@.@@@#@@@@@@@@@@@@+....................", "...............................................+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++....................", "....................................+++++++.................................................................................................................................................................................................................................................................................................................", ".........................................++.................................................................................................................................................................................................................................................................................................................", "........................................+.+.................................................................................................................................................................................................................................................................................................................", ".......................................+..+.................................................................................................................................................................................................................................................................................................................", "......................................+...+..........................................................................................................................................................................................+++++++................................................................................................................", ".....................................+....+..........................................................................................................................................................................................++.....................................................................................................................", "....................................+.....+..........................................................................................................................................................................................+.+....................................................................................................................", ".....................................................................................................................................................................................................................................+..+...................................................................................................................", ".....................................................................................................................................................................................................................................+...+..................................................................................................................", ".....................................................................................................................................................................................................................................+....+.................................................................................................................", ".....................................................................................................................................................................................................................................+.....+................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "..............+......................................................................++........+............................................................................................................................................................................................................................................................", "........+++...+.....................+....................+............+++++...........+........+..........................................................................................................................................................+.........................................................+...........+.....++....................", ".......+...+..+.....................+....................+............+...............+........+.................................................................................................................................................+++......+..........................+..............................+..+++++....+......+....................", ".......+......++++....+++...+.++...++++....+++...+...+..++++..........+.......+++.....+.....++++...+++...+.++....+++.............................................................................................................................+..+................................+.............................+...+...............+....................", "........+++...+...+..+...+..++..+...+.....+...+..+...+...+............++++...+...+....+....+...+..+...+..++..+..+...+............................................................................................................................+...+...++....+.++....+++....+++...++++....+++...+.++...+...+.....+...+.......++......+.....+++....+++.....", "...........+..+...+..+...+..+.......+.....+......+...+...+............+......+...+....+....+...+..+++++..+.......+++.............................................................................................................................+...+....+....++..+..+...+..+...+...+.....+...+..++..+..+...+....+....++++.....+......+....+...+..+...+....", "...........+..+...+..+...+..+.......+.....+......+...+...+............+......+...+....+....+...+..+......+..........+............................................................................................................................+...+....+....+......+++++..+.......+.....+...+..+......+...+....+....+........+......+....+++++...+++.....", ".......+...+..+...+..+...+..+.......+.....+...+..+...+...+............+......+...+....+....+...+..+...+..+......+...+............................................................................................................................+...+....+....+......+......+.......+.....+...+..+......+...+...+.....+........+......+....+..........+....", "........+++...+...+...+++...+........+++...+++....++++....+++.........+.......+++.....++....++++...+++...+.......+++.............................................................................................................................+..+.....+....+......+...+..+...+...+.....+...+..+......+...+...+.....+........+......+....+...+..+...+....", ".................................................................................................................................................................................................................................................+++.....+++...+.......+++....+++.....+++...+++...+.......++++..+......+.......+++.....++....+++....+++.....", ".............................................................................................................................................................................................................................................................................................................+..+...........................................", ".............................................................................................................................................................................................................................................................................................................+..............................................", "..........................................................................................................................................................................................................................................................................................................+++...............................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................", "............................................................................................................................................................................................................................................................................................................................................................"] ######################################################################### if sys.platform == "linux2": ui_string = """ \ \ \ \ \ """ if sys.platform == "win32": ui_string = """ \ \ \ \ \ """ class Window(gtk.Window): def __init__(self): gtk.Window.__init__(self) self.set_position(gtk.WIN_POS_CENTER) self.set_title('wpClipper - 9.0') self.connect('delete-event', self.delete_event_cb) self.set_geometry_hints(self, 640, 460, 1200, 460) self.set_default_size( 700, 460) font_desc = pango.FontDescription('Verdana,sans-serif 10') # set up the UI graphics ################################## # background picture ###################################### pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(bg_xpm) pixmap, mask = pixbuf.render_pixmap_and_mask() del pixbuf self.set_app_paintable(True) self.realize() self.window.set_back_pixmap(pixmap, False) del pixmap # application icon ######################################## if sys.platform == "win32": m_ico = gtk.gdk.pixbuf_new_from_xpm_data(cav32_xpm) else: m_ico = gtk.gdk.pixbuf_new_from_xpm_data(cav16_xpm) self.set_icon(m_ico) del m_ico # default image ########################################### splash_img = gtk.gdk.pixbuf_new_from_xpm_data(splash_icon) self.default_img = gtk.Image() self.default_img.set_from_pixbuf(splash_img) # set up the tmp file used for editing splash_img.save(tmpPath, "png") del splash_img # custom icons for the menus ############################## factory = gtk.IconFactory() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(HTML_ICON) gtk.stock_add([("HTML_ICON", "HTML_ICON", 0, 0, "")]) factory.add("HTML_ICON", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(VIEW_FULL) gtk.stock_add([("VIEW_FULL", "VIEW_FULL", 0, 0, "")]) factory.add("VIEW_FULL", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(HOME) gtk.stock_add([("HOME", "HOME", 0, 0, "")]) factory.add("HOME", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(GIMP) gtk.stock_add([("GIMP", "GIMP", 0, 0, "")]) factory.add("GIMP", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(MAGIC) gtk.stock_add([("MAGIC", "MAGIC", 0, 0, "")]) factory.add("MAGIC", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(XV) gtk.stock_add([("XV", "XV", 0, 0, "")]) factory.add("XV", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() pixbuf = gtk.gdk.pixbuf_new_from_xpm_data(IMAGE_EDIT) gtk.stock_add([("IMAGE_EDIT", "IMAGE_EDIT", 0, 0, "")]) factory.add("IMAGE_EDIT", gtk.IconSet(pixbuf = pixbuf)) factory.add_default() del pixbuf gc.collect # make and set flags for possible graphics editors self.cur_path = "" self.has_gimp = False self.has_xv = False self.has_magick = False if sys.platform == "linux2": if len(commands.getoutput('type -path gimp-remote')): self.has_gimp = True if len(commands.getoutput('type -path xv')): self.has_xv = True if len(commands.getoutput('type -path display')): self.has_magick = True self.clipbd = gtk.Clipboard() #### set up tooltips and boxing in the GUI ################ self.tips = gtk.Tooltip() vbox = gtk.VBox() self.add(vbox) self.create_ui() vbox.pack_start(self.ui.get_widget('/Menubar'), expand=False) # file selector #################################################### bigBox = gtk.HBox(False,8) contBox = gtk.VBox(False,8) cframe = gtk.Frame() cframe.set_shadow_type(gtk.SHADOW_ETCHED_OUT) cframe.set_size_request(360, 360) self.chooser = gtk.FileChooserWidget(action=gtk.FILE_CHOOSER_ACTION_OPEN) self.chooser.set_select_multiple(False) self.chooser.connect("file-activated", self.set_display) self.chooser.connect("selection-changed", self.chooser_selected) filter = gtk.FileFilter() filter.add_mime_type("image/png") filter.add_mime_type("image/jpeg") filter.add_mime_type("image/gif") filter.add_mime_type("image/bmp") filter.add_mime_type("image/tiff") self.chooser.add_filter(filter) cframe.add(self.chooser) contBox.pack_start(cframe, True, True, 12) btn_box = gtk.HBox(False, 8) btn_close = gtk.Button(stock = gtk.STOCK_QUIT) btn_close.connect("clicked", self.delete_event_cb) self.btn_copy = gtk.Button("Copy to Clipboard") self.btn_copy.set_tooltip_text("Copies the current (full-sized) image to the clipboard,\nfor use in AbiWord, the GIMP, OpenOffice and others...") self.btn_copy.connect("clicked", self.copy_to_clip) self.btn_copy.set_sensitive(False) btn_box.pack_start(btn_close, False, False, 0) btn_box.pack_start(self.btn_copy, False, False, 0) contBox.pack_start(btn_box, False, False, 8) ## Right-hand box ########################################################################## rbox = gtk.VBox(False, 8) lbl_header = gtk.Label("\nPublic Domain Word Processor Clipart \nwww.wpclipart.com ") lbl_header.modify_font(font_desc) lbl_header.set_size_request(260,-1) lbl_header.set_justify(gtk.JUSTIFY_CENTER) rbox.pack_start(lbl_header, False, False, 0) eb = gtk.EventBox() eb.set_visible_window(False) eb.connect("button_press_event", self.set_display) self.sfixed = gtk.Fixed() self.sfixed.put(self.default_img, 6, 28) eb.set_tooltip_text("Click image to see full-size") eb.add(self.sfixed) rbox.pack_start(eb, False, False, 1) self.lbl_picture = gtk.Label("Clicking an image in the file list will\ngenerate and display a thumbnail above.") self.lbl_picture.modify_font(font_desc) self.lbl_picture.set_size_request(260,-1) self.lbl_picture.set_justify(gtk.JUSTIFY_CENTER) self.lbl_picture.set_line_wrap(False) rbox.pack_start(self.lbl_picture, True, True, 0) bigBox.pack_start(contBox, True, True, 8) bigBox.pack_start(rbox, False, False, 8) vbox.pack_start(bigBox, True, True, 0) ######## Adjustment to the file chooser ######################################################################### ######################################### so we can leave it on all the time without taking up all the space ##### # hides ADD abd REMOVE BUTTONS self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[0].get_children()[1].hide() # hides file filter button (box it is in) self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[1].hide() # takes out the "modified" column in file list col1 = self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[0].get_children()[0].get_children()[0].get_column(1) col2 = self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[0].get_children()[0].get_children()[0].get_column(2) self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[0].get_children()[0].get_children()[0].remove_column(col1) self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[0].get_children()[0].get_children()[0].remove_column(col2) # set width of shortcut panel (Places) self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[0].get_children()[0].set_size_request(124,-1) # set width of the file list (Name) self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[0].set_size_request(210,-1) # set the start path, found when app is initialized self.chooser.set_current_folder(default_path) # and finally we set up the status bar to display actual image sizes ################## self.status = gtk.Statusbar() vbox.pack_end(self.status, expand=False) self.status.set_has_resize_grip(False) self.statusID = self.status.get_context_id("status_text") self.status.push(self.statusID, " Full width and height of the image thumbnail are displayed here.") self.show_all() ################################################################################################################## ##################################### ROUTINES ################################################################### ################################################################################################################## def create_ui(self): self.ag = gtk.ActionGroup('WindowActions') if sys.platform == "win32": actions = [ ('FileMenu', None, '_File'), ('Save Image', gtk.STOCK_SAVE_AS, 'Save Image'), ('As PNG', None, 'As a PNG', None, 'PNG Image', self.sav_png), ('As JPG', None, 'As a JPG', None, 'PNG Image', self.sav_jpg), ('WPClipart Online', "HTML_ICON", 'WPClipart Online','', 'Open a file', self.viewOnline), ('Quit', gtk.STOCK_QUIT, '_Quit', 'Q', 'Quit application', self.delete_event_cb), ('Rotate', None, 'Rotate'), ('Mirror (horizontal)', None, 'Mirror', '', 'Mirror', self.edit_image), ('Flip (vertical)', None, 'Flip (vertical)', '', 'Flip (vertical)', self.edit_image), ('Tilt Left', None, 'Tilt Left', '', 'Tilt Left', self.edit_image), ('Tilt Right', None, 'Tilt Right', '', 'Tilt Right', self.edit_image), ("90\302\260 Counter-Clockwise ", None, "90\302\260 Counter-Clockwise ", '', "90\302\260 Counter-Clockwise ", self.edit_image), ("90\302\260 Clockwise", None, "90\302\260 Clockwise", '', "90\302\260 Clockwise", self.edit_image), ('Filter', None, 'Filter'), ('Invert', None, 'Invert', None, 'Invert', self.edit_image), ('Emboss', None, 'Emboss', None, 'Emboss', self.edit_image), ('Contour', None, 'Contour', None, 'Contour', self.edit_image), ('Find Edges', None, 'Find Edges', None, 'Find Edges', self.edit_image), ('Find Edges 2', None, 'Find Edges 2', None, 'Find Edges 2', self.edit_image), ('Edge Enhance', None, 'Edge Enhance', None, 'Edge Enhance', self.edit_image), ('Detail', None, 'Detail', None, 'Detail', self.edit_image), ('Sharpen', None, 'Sharpen', None, 'Sharpen', self.edit_image), ('Smooth', None, 'Smooth', None, 'Smooth', self.edit_image), ('Blur', None, 'Blur', None, 'Blur', self.edit_image), ('Greyscale', None, 'Greyscale', None, 'Greyscale', self.edit_image), ('Adjust', None, 'Adjust'), ('+Color', None, '+Color', None, '+Color', self.edit_image), ('-Color', None, '-Color', None, '-Color', self.edit_image), ('+Brightness', None, '+Brightness', None, '+Brightness', self.edit_image), ('-Brightness', None, '-Brightness', None, '-Brightness', self.edit_image), ('+Contrast', None, '+Contrast', None, '+Contrast', self.edit_image), ('-Contrast', None, '-Contrast', None, '-Contrast', self.edit_image), ('+Sharpness', None, '+Sharpness', None, '+Sharpness', self.edit_image), ('-Sharpness', None, '-Sharpness', None, '-Sharpness', self.edit_image), ('Image', None, '_Image'), ('Show Full Size', "VIEW_FULL", 'Show Full Size', None, 'Show Full Size', self.set_display), ('Restore Original', None, 'Restore Original', None, 'Restore Original', self.restore), ('HelpMenu', None, '_Help'), ('About', gtk.STOCK_DIALOG_INFO, 'About', None, 'About application', self.help_about_cb), ('Help Pages', gtk.STOCK_HELP, 'Help Pages', None, 'SVG-page help', help_window), ('Set Startup Folder', "HOME", 'Set Path to Images','', 'Set Path to Images', self.set_path), ] if sys.platform == "linux2": actions = [ ('FileMenu', None, '_File'), ('Save Image', gtk.STOCK_SAVE_AS, 'Save Image'), ('As PNG', None, 'As a PNG', None, 'PNG Image', self.sav_png), ('As JPG', None, 'As a JPG', None, 'PNG Image', self.sav_jpg), ('Edit w/GIMP', "GIMP", 'Edit w/GIMP', None, 'Edit w/GIMP', self.open_with), ('Edit w/XV', "XV", 'Edit w/XV', None, 'Edit w/GIMP', self.open_with), ('Edit w/ImageMagick', "MAGIC", 'Edit w/ImageMagick', None, 'Edit w/ImageMagick', self.open_with), ('WPClipart Online', "HTML_ICON", 'WPClipart Online', '', 'Open a file', self.viewOnline), ('Set Startup Folder', "HOME", 'Set Startup Path','', 'Set Path to Images', self.set_path), ('Quit', gtk.STOCK_QUIT, '_Quit', 'Q', 'Quit application', self.delete_event_cb), ('Rotate', None, 'Rotate'), ('Mirror (horizontal)', None, 'Mirror', '', 'Mirror', self.edit_image), ('Flip (vertical)', None, 'Flip (vertical)', '', 'Flip (vertical)', self.edit_image), ('Tilt Left', None, 'Tilt Left', '', 'Tilt Left', self.edit_image), ('Tilt Right', None, 'Tilt Right', '', 'Tilt Right', self.edit_image), ("90\302\260 Counter-Clockwise ", None, "90\302\260 Counter-Clockwise ", '', "90\302\260 Counter-Clockwise ", self.edit_image), ("90\302\260 Clockwise", None, "90\302\260 Clockwise", '', "90\302\260 Clockwise", self.edit_image), ('Filter', None, 'Filter'), ('Invert', None, 'Invert', None, 'Invert', self.edit_image), ('Emboss', None, 'Emboss', None, 'Emboss', self.edit_image), ('Contour', None, 'Contour', None, 'Contour', self.edit_image), ('Find Edges', None, 'Find Edges', None, 'Find Edges', self.edit_image), ('Find Edges 2', None, 'Find Edges 2', None, 'Find Edges 2', self.edit_image), ('Edge Enhance', None, 'Edge Enhance', None, 'Edge Enhance', self.edit_image), ('Detail', None, 'Detail', None, 'Detail', self.edit_image), ('Sharpen', None, 'Sharpen', None, 'Sharpen', self.edit_image), ('Smooth', None, 'Smooth', None, 'Smooth', self.edit_image), ('Blur', None, 'Blur', None, 'Blur', self.edit_image), ('Greyscale', None, 'Greyscale', None, 'Greyscale', self.edit_image), ('Adjust', None, 'Adjust'), ('+Color', None, '+Color', None, '+Color', self.edit_image), ('-Color', None, '-Color', None, '-Color', self.edit_image), ('+Brightness', None, '+Brightness', None, '+Brightness', self.edit_image), ('-Brightness', None, '-Brightness', None, '-Brightness', self.edit_image), ('+Contrast', None, '+Contrast', None, '+Contrast', self.edit_image), ('-Contrast', None, '-Contrast', None, '-Contrast', self.edit_image), ('+Sharpness', None, '+Sharpness', None, '+Sharpness', self.edit_image), ('-Sharpness', None, '-Sharpness', None, '-Sharpness', self.edit_image), ('Image', None, '_Image'), ('Show Full Size', "VIEW_FULL", 'Show Full Size', None, 'Show Full Sizer', self.set_display), ('Restore Original', gtk.STOCK_UNDO, 'Restore Original', None, 'Restore Original', self.restore), ('HelpMenu', None, '_Help'), ('About', gtk.STOCK_DIALOG_INFO, 'About', None, 'About application', self.help_about_cb), ('Help Pages', gtk.STOCK_HELP, 'Help Pages', None, 'SVG-page help', help_window), ] self.ag.add_actions(actions) self.ui = gtk.UIManager() self.ui.insert_action_group(self.ag, 0) self.ui.add_ui_from_string(ui_string) self.add_accel_group(self.ui.get_accel_group()) # with menu complete, now we deactivate until an image is loaded self.menu_update(False) def getWH(self, imW, imH): if imW > 240 or imH > 240: if imW > imH: scale = 240 / float(imW) else: scale = 240 / float(imH) m = int(imW * scale), int(imH * scale), scale else: if imW > imH: scale = 240 / float(imW) else: scale = 240 / float(imH) m = imW, imH, scale return m def setImage(self, pth): try: pixbuf = gtk.gdk.pixbuf_new_from_file (pth) (w,h) = (pixbuf.get_width(),pixbuf.get_height()) if w == 0: self.file_error() return False s = self.getWH(w,h) self.default_img.set_from_pixbuf(pixbuf.scale_simple(s[0],s[1],gtk.gdk.INTERP_BILINEAR)) del pixbuf gc.collect() if s[0] < 240: nx = int(((240-s[0]) / 2) + 6) else: nx = 6 if s[1] < 240: ny = int(((240-s[1]) / 2) + 28) else: ny = 28 self.sfixed.move(self.default_img, nx, ny) self.status.push(self.statusID, " ACTUAL image dimensions are: " + str(w) + " x " + str(h)) except: self.file_error() return False return True def chooser_selected(self, widget): # upper section just does file tests, prevents updates when # not appropriate and parses filename self.files = self.chooser.get_filenames() if len(self.files) == 0: return "" pth = self.chooser.get_filename() if not os.path.isfile(pth): return "" # disable file selector while it is working..... so we disable JUST the file section of the filechooser control fn_control = self.chooser.get_children()[0].get_children()[0].get_children()[2].get_children()[1].get_children()[0] fn_control.set_sensitive(False) # there is a legitimate file, so get ready.... ########## fname = os.path.basename(pth) self.cur_path = "" self.menu_update(False) self.btn_copy.set_sensitive(False) self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) self.menu_update(False) while gtk.events_pending(): gtk.main_iteration() try: self.setImage(pth) # keep track of original image path (for possible "restore") self.curpath = pth # put original image in temp file for possible editing # make sure it is in RGB format (not indexed or with an alpha channel) im = Image.open(pth) if im.mode != "RGBA": im = im.convert("RGB") self.ag.get_action("Invert").set_sensitive(True) self.ag.get_action("Tilt Left").set_sensitive(True) self.ag.get_action("Tilt Right").set_sensitive(True) self.ag.get_action("Find Edges 2").set_sensitive(True) self.ag.get_action("Greyscale").set_sensitive(True) else: self.ag.get_action("Invert").set_sensitive(False) self.ag.get_action("Tilt Left").set_sensitive(False) self.ag.get_action("Tilt Right").set_sensitive(False) self.ag.get_action("Find Edges 2").set_sensitive(False) self.ag.get_action("Greyscale").set_sensitive(False) im.save(tmpPath) del im self.setImage(tmpPath) #txt = fname.replace("_"," ") txt = fname if len(txt) > 40: txt = txt[0:40] + '\n' + txt[40:] self.lbl_picture.set_text(txt + " ") except: pass self.btn_copy.set_sensitive(True) self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) self.menu_update(True) fn_control.set_sensitive(True) def viewOnline(self, evt, lastdir=""): if sys.platform == "linux2": if len(commands.getoutput('type -path firefox.sh')): command = "%s %s" % ("firefox.sh", "http://www.wpclipart.com/") os.system(command) return elif len(commands.getoutput('type -path firefox')): command = "%s %s" % ("firefox", "http://www.wpclipart.com/") os.system(command) return else: webbrowser.open("http://www.wpclipart.com/") else: webbrowser.open("http://www.wpclipart.com/") def menu_update(self, active): for li in enable_list: try: ret = self.ag.get_action(li) ret.set_sensitive(active) if active: if (li == "Edit w/GIMP") and (not self.has_gimp): ret.set_sensitive(False) if (li == "Edit w/XV") and (not self.has_xv): ret.set_sensitive(False) if (li == "Edit w/ImageMagick") and (not self.has_magick): ret.set_sensitive(False) except: pass def copy_to_clip(self, evt): fname = os.path.basename(self.curpath) try: pixbuf = gtk.gdk.pixbuf_new_from_file(tmpPath) self.clipbd.set_image(pixbuf) self.clipboard_success(fname) except: self.clipboard_error(fname) try: del pixbuf gc.collect() except: pass def set_path(self, evt): startpath = "" chooser = gtk.FileChooserDialog(title="Select Start Directory",action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) chooser.set_select_multiple(False) response = chooser.run() if response == gtk.RESPONSE_OK: startpath = chooser.get_filename() chooser.destroy() if startpath == "": return default_path = startpath try: config.set("default", "startpath", default_path) t1 = open(cfile, "w") config.write(t1) t1.close() except: pass ##################################### SAVING ############################################################### ############################################################################################################ # these seemingly useless helper functions prevent initial loading of menu from running save dialog def sav_png(self, evt): self.do_save("png") def sav_jpg(self, evt): self.do_save("jpg") def do_save(self, ft): fn = self.save_dialog(ft) if self.savedlg: self.savedlg.destroy() if not fn: return try: if ft == "jpg": ft = "jpeg" if ft == "jpeg" or ft == "png": pixbuf = gtk.gdk.pixbuf_new_from_file (tmpPath) pixbuf.save(fn, ft) else: self.file_save_err return self.file_saved(None, fn) except: self.file_save_err def save_dialog(self, ftype): sStr = 'Save as %s' % ftype newName = 'new.%s' % ftype self.savedlg = gtk.FileChooserDialog(sStr, self, gtk.FILE_CHOOSER_ACTION_SAVE, (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_SAVE, gtk.RESPONSE_OK)) self.savedlg.set_default_response(gtk.RESPONSE_OK) self.savedlg.set_current_folder(homedir) self.savedlg.set_current_name(newName) self.savedlg.set_do_overwrite_confirmation(True) filter = gtk.FileFilter() filter.set_name(ftype) if ftype == "png": filter.add_mime_type("image/png") elif ftype == "jpg": filter.add_mime_type("image/jpeg") self.savedlg.add_filter(filter) response = self.savedlg.run() if response == gtk.RESPONSE_OK: filename = self.savedlg.get_filename() ext = "." + ftype if os.path.splitext(filename)[1] != ext: filename += ext return filename else: self.savedlg.destroy() return None ###################################################################################################### ########################### IMAGE EDITING SECTION ################################################### ###################################################################################################### def open_with(self, widget): func = widget.get_name() prog = "" if func == "Edit w/GIMP": prog = "gimp-remote" elif func == "Edit w/XV": prog = "xv" elif func == "Edit w/ImageMagick": prog = "display" else: return if sys.platform == "linux2": cmd = commands.getoutput('type -path %s' % prog) _args = [cmd, tmpPath] os.spawnv(os.P_NOWAIT, cmd, _args) def restore(self, widget): self.btn_copy.set_sensitive(False) self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) self.menu_update(False) try: im = Image.open(self.curpath) if im.mode != "RGBA": im = im.convert("RGB") im.save(tmpPath) del im gc.collect() self.setImage(tmpPath) print "Done processing" except: pass self.btn_copy.set_sensitive(True) self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) self.menu_update(True) def getRotImg(self, im): W = im.size[0] H = im.size[1] angle = 45 radians = (2*3.1416*angle)/360 cosine = math.cos(radians) sine = math.sin(radians) Point1x = - H * sine Point1y = H * cosine Point2x = W * cosine - H * sine Point2y = H * cosine + W * sine Point3x = W * cosine Point3y = W * sine minx = min(0,min(Point1x,min(Point2x,Point3x))) miny = min(0,min(Point1y,min(Point2y,Point3y))) maxx = max(Point1x,max(Point2x,Point3x)) maxy = max(Point1y,max(Point2y,Point3y)) dw = int(math.ceil(maxx-minx)) dh = int(math.ceil(maxy-miny)) left = (dw - W) / 2 top = (dw - H) / 2 box = (left, top, W + left, H + top) if im.mode == "RGBA": im2 = Image.new("RGBA", (dw, dh), (255,255,255)) else: im2 = Image.new("RGB", (dw, dh), (255,255,255)) im2.paste(im,box) return im2 def edit_image(self, widget): self.btn_copy.set_sensitive(False) self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH)) self.menu_update(False) while gtk.events_pending(): gtk.main_iteration() try: im = Image.open(tmpPath) except: self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) self.menu_update(True) return func = widget.get_name() if func == "Mirror (horizontal)": im2 = ImageOps.mirror(im) elif func == "Flip (vertical)": im2 = ImageOps.flip(im) elif func == "Tilt Left": im2 = self.getRotImg(im) im2 = ImageOps.invert(im2) im2 = im2.rotate(45) im2 = ImageOps.invert(im2) elif func == "Tilt Right": im2 = self.getRotImg(im) im2 = ImageOps.invert(im2) im2 = im2.rotate(-45) im2 = ImageOps.invert(im2) elif func == "90\302\260 Counter-Clockwise ": im2 = im.rotate(90) elif func == "90\302\260 Clockwise": im2 = im.rotate(-90) elif func == "Invert": im2 = ImageOps.invert(im) elif func == "Emboss": im2 = im.filter(ImageFilter.EMBOSS) elif func == "Contour": im2 = im.filter(ImageFilter.CONTOUR) elif func == "Find Edges": im2 = im.filter(ImageFilter.FIND_EDGES) elif func == "Find Edges 2": im2 = im.filter(ImageFilter.FIND_EDGES) im2 = ImageOps.invert(im2) elif func == "Edge Enhance": im2 = im.filter(ImageFilter.EDGE_ENHANCE) elif func == "Detail": im2 = im.filter(ImageFilter.DETAIL) elif func == "Sharpen": im2 = im.filter(ImageFilter.SHARPEN) elif func == "Smooth": im2 = im.filter(ImageFilter.SMOOTH) elif func == "Blur": im2 = im.filter(ImageFilter.BLUR) elif func == "Greyscale": im2 = ImageOps.grayscale(im) elif func == "+Color": e1 = ImageEnhance.Color(im) im2 = e1.enhance(1.2) elif func == "-Color": e1 = ImageEnhance.Color(im) im2 = e1.enhance(0.85) elif func == "+Brightness": e1 = ImageEnhance.Brightness(im) im2 = e1.enhance(1.1) elif func == "-Brightness": e1 = ImageEnhance.Brightness(im) im2 = e1.enhance(0.91) elif func == "+Contrast": e1 = ImageEnhance.Contrast(im) im2 = e1.enhance(1.06) elif func == "-Contrast": e1 = ImageEnhance.Contrast(im) im2 = e1.enhance(0.97) elif func == "+Sharpness": e1 = ImageEnhance.Sharpness(im) im2 = e1.enhance(2.0) elif func == "-Sharpness": e1 = ImageEnhance.Sharpness(im) im2 = e1.enhance(0.0) else: self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) return im2.save(tmpPath) self.setImage(tmpPath) self.btn_copy.set_sensitive(True) self.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.LEFT_PTR)) self.menu_update(True) try: del im except: pass try: del im2 except: pass gc.collect ################################################################################################# ################################################################################################# def help_about_cb(self, action): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, u"WP Clipper\n\nwpclipper viewer and editor\n\u00a9 2005-2010 by Paul Sherman\nLicensed under GNU GPLv3") dialog.run() dialog.destroy() def file_error(self, action=None): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "\nCould not open the requested image") dialog.run() dialog.destroy() def file_save_err(self, action=None): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, "\nCould not save the file") dialog.run() dialog.destroy() def file_saved(self, action=None, data=""): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, 'Success!\n\nThe new file was saved as: \n%s' % data) dialog.run() dialog.destroy() def file_create_err(self, action=None, data=""): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, '\nProblem creating the file: \n%s' % data) dialog.run() dialog.destroy() def clipboard_error(self, data=""): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_ERROR, gtk.BUTTONS_OK, '\nProblem copying to clipboard: \n%s' % data) dialog.run() dialog.destroy() def clipboard_success(self, data=""): dialog = gtk.MessageDialog(self, gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, gtk.MESSAGE_INFO, gtk.BUTTONS_OK, '\nImage saved to clipboard') dialog.run() dialog.destroy() def delete_event_cb(self, window=None, event=None): try: os.remove(tmpPath) except os.error: pass gtk.main_quit() def set_display(self, evt, data=None): DISPLAY(self, tmpPath, self.curpath) class DISPLAY: def __init__(self, mother, pth, data=None): imName = os.path.basename(pth) #tip = gtk.Tooltip() try: pixbuf = gtk.gdk.pixbuf_new_from_file (pth) except: return (w,h) = (pixbuf.get_width(),pixbuf.get_height()) if w == 0: self.file_error() return maxW = gtk.gdk.screen_width() - 80 maxH = gtk.gdk.screen_height() - 80 if maxW > w: maxW = w + 40 if maxH > h: maxH = h + 40 self.window = gtk.Dialog() if data == None or data == "": self.window.set_title(imName) else: if sys.platform == "win32": sep = '\\' else: sep = '/' p_name = string.split( data, sep )[-1] self.window.set_title(p_name) self.window.set_border_width(0) self.window.set_size_request(maxW, maxH) self.window.set_transient_for(mother) self.window.set_resizable(False) self.scrolled_window = gtk.ScrolledWindow() self.scrolled_window.connect("button-press-event", self.close_me) self.window.connect('delete-event', self.close_me) self.scrolled_window.set_border_width(10) self.scrolled_window.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) self.window.vbox.pack_start(self.scrolled_window, True, True, 0) self.scrolled_window.show() self.dImg = gtk.Image() self.dImg.set_from_pixbuf(pixbuf) del pixbuf gc.collect() self.dImg.show() self.scrolled_window.add_with_viewport(self.dImg) self.window.show() self.window.window.set_cursor(gtk.gdk.Cursor(gtk.gdk.X_CURSOR)) self.window.set_modal(True) def close_me(self, evt=None, data=None): self.window.destroy() def delete_event(self, evt=None, data=None): self.window.destroy() class help_window(gtk.Window): def delete_event(self, e=None): self.destroy() def __init__(self, evt=None): gtk.Window.__init__(self, gtk.WINDOW_TOPLEVEL) self.connect("destroy", self.delete_event) self.set_title('WP Clipper Help') self.set_border_width(0) self.set_size_request(600, 450) self.set_position(gtk.WIN_POS_CENTER) small_font = pango.FontDescription('Verdana,sans-serif 10') file_img = gtk.Image() fimg = gtk.gdk.pixbuf_new_from_xpm_data (file_screen) file_img.set_from_pixbuf(fimg) del fimg gc.collect() box1 = gtk.VBox() self.add(box1) box1.show() box2 = gtk.VBox(spacing=4) box2.set_border_width(4) box1.pack_start(box2) box2.show() notebook = gtk.Notebook() notebook.set_tab_pos(gtk.POS_TOP) box2.pack_start(notebook) notebook.show() names = ['About', 'General Use', 'File Browser', 'Clipboard', 'Editing', 'Saving', 'Dev Team' ] msg = self.mlist() for i in range(len(names)): buffer = names[i] sw=gtk.ScrolledWindow() sw.set_policy(gtk.POLICY_AUTOMATIC,gtk.POLICY_AUTOMATIC) sw.set_shadow_type(gtk.SHADOW_NONE) sw.show() ############################################################################ # add widgets to each frame here if i == 0: label = gtk.Label(msg[i]) sw.add_with_viewport(label) if i == 1: label = gtk.Label(msg[i]) sw.add_with_viewport(label) if i == 2: label = gtk.Label(msg[i]) labelBlank = gtk.Label("\nWPClipper File Browser\n") box_viewing = gtk.VBox() box_viewing.pack_start(labelBlank) box_viewing.pack_start(file_img) box_viewing.pack_start(label) labelBlank.show() file_img.show() box_viewing.show() sw.add_with_viewport(box_viewing) if i == 3: label = gtk.Label(msg[i]) sw.add_with_viewport(label) if i == 4: label = gtk.Label(msg[i]) sw.add_with_viewport(label) if i == 5: label = gtk.Label(msg[i]) sw.add_with_viewport(label) if i == 6: ME_IMAGE = os.path.join(os.path.dirname(os.path.realpath(sys.argv[0])), 'wp_dev_team.jpg') image = gtk.Image() try: pixbuf = gtk.gdk.pixbuf_new_from_file(ME_IMAGE) image.set_from_pixbuf(pixbuf) box_me = gtk.VBox() box_me.pack_start(image) image.show() box_me.show() sw.add_with_viewport(box_me) except: label = gtk.Label(msg[i]) sw.add_with_viewport(label) ########################################################################### label.modify_font(small_font) label.show() lbl = gtk.Label(buffer) lbl.set_padding(2, 2) notebook.append_page(sw, lbl) self.show() def mlist(self): msglist = [""] msg1 = u""" WPClipper (c)2005-2009 by Paul Sherman Distributed under the GNU GPL version 3 A copy of GPL3 is included with the program. WP Clipper is a cross-platform, hybrid image viewer and image editing program. It was designed specifically with WPClipart in mind, but it can be used to view/edit almost any clipart or photograph. [Program background...] It was initially developed on Linux for my kids to use in conjunction with AbiWord (which they used on Windows machines in their middle school.) There were two reasons I made the collection and program: 1] I was uncomfortable with the kids doing image searches online. (See the site information below...) 2] Linux did not have a little viewer/editor program that could copy and paste into AbiWord. Also, for ease of use I wanted the speed and simplicity of a viewer, but with some quick and easy editing for basic things like rotation, some color/contrast adjustments and for fun a few filters. The program was first written using the wxWindows GUI toolkit, as it was then needed for proper clipboard functionality... but updates to pyGTK have made the use of that toolkit possible, and has made the overall software requirements for the program leaner, able to be used on computers with slightly older hardware and in most cases able to run without installing additional dependencies -- as python-gtk is a much more commonly installed development library. It is also available on the OLPC machines. Making the program/collection available to OLPC machines, as well as many commodity PCs in use for education, fits precisely with the goals of WPClipart. [Clipart Site background...] The project started as a "safe" collection of clipart for my kids. Their middle school used AbiWord, and they were often searching for clipart that was both safe and copyright-free. Since this proved to be both difficult and hazardous (since image searches often yielded some very untoward photos) I decided to create a simple collection for their use. My background as both a photographer and a programmer lent itself well to the project, I put it online with my software for others to download and as the months passed it became very popular. I made thumbnail pages and put up some Google ads, (made a bit of change every day), then suddenly the Google image search engine spidered the site and my server was a bit overwhelmed. After fielding 20-30k hits a day for a year or so I ended up putting the collection on a dedicated remote server, and the ad revenue takes care of the expense. And by using good image tagging and submitting XML sitemaps to Google with each update, the custom search function really helps track images down. """ msg2 = u""" [Viewing] CLICK the file name of an image to see its thumbnail. Single-clicking only displays the image filename in the status bar. SINGLE-CLICK the thumnail to see the image full-size. This pops up in a new window. Click anywhere in the new window to dismiss the full-size image. Any editing and/or saving is done while viewing the thumbnail. [Install] Being a Python program the viewer does not need an installer to run, although I make a Windows installer version that can uninstall and does not require any Python/GTK dependencies (as these are not so commonly present and up to date on Windows-based PCs.) Requirements (for non-Windows machines): Python-2.5 GTK-2.10 pyGTK-2.10 PIL (Python Imaging Library)-1.1.6 The program will be available stand-alone, and is always included in the "viewer" folder of the collection itself (both online and within the clipart download packages.) When run from the viewer folder the clipart automatically opens with the clipart collection in the file search list. (American History at the top -- there were 48 category folders and 19,511 images as of this writing.) [Terms of Use] These images are public domain, and that means they can be used and edited for whatever purpose you wish, personal or commercial. No attrribution or linking is required. There are only two modest exceptions to being able to do anything at all with any of the images: * A small percentage of the clipart consists of Company logos, recognizable hardware and postage stamp art, which are not formally PD but are available via Fair Use, which means that they are actually copyrighted but can be used without the owner's permission in many situations. Small credit-card reproductions to use on a website or flier are examples of Fair Use -- but you should realize that you cannot do something like make your own company logo based upon one of the Fair Use items. (Basically, anything that already is a company logo or trademark.) * My website is mine. I do not expect anyone to copy my site or the image collection (in large part) to host online or sell. This would compete with my site, draining what revenue I generate through online ads. These pay for hosting and modestly compensate me all the ink I use in test printing and for the hundreds of hours I spend finding, creating and editing images. That being said, I freely allow a static version of the collection, in its entirety, to be included or packaged for any GPL-licensed operating system. This includes, of course, the OLPC computers and the school servers that they use. For a list of where the images were obtained, as well as a further discussion of obtaining and editing the images in the WPClipart collection, see the "Legal" page at http://www.wpclipart.com/legal.html. """ msg3 = u""" The file browser for wpclipper is a stripped-down version of the standard GTK search dialog. The "Add", "Remove" and FILE-FILTER buttons are removed, but the rest is identical. The DIRECTORY/FILES section is where standard file-browsing takes place. A single-click on a file or folder selects it. A double- click on a folder will open the folder and show the contents in the control. A click on a file will load the new image (only image type files are visible.) Loading involves creating a thumbnail on the right side of the application and putting the original image in a temporary file, ready for editing, saving, or copying to the clipboard. The SHORTCUT FOLDERS are a list of links that open the file browser (on a double-click) to the path selected. The user home folder name is at the top. Next is the file system (usually "C:\\" in Windows, and "/" on Linux.) And if wpclipper is locatted in the clipart "viewer" subdirectory, then "wpclipart-x.x" will also appear in this section. Items can also be dragged from the directory/files section to the shortcut section to be added to the shortcut list. The ENTER LOCATION BUTTON opens a text-entry box where a file or path name can be manually entered. And finally, the FOLDER PATH strip shows the directories above the current list of files. (This bar will scroll via buttons to the right and left if the file path is too long to view.) Clicking on any one of the folder path buttons will re-open the directory/file list in the folder named on that button. This is the easy way to "backtrack" to a higher-level directory. """ msg4 = u""" The COPY TO CLIPBOARD button is fairly self-explanitory, but -- The button is inactive when an image is not loaded. Wpclipper has to REMAIN OPEN until the user uses "Paste" in the application of their choice. When you close wpclipper, the contents of the clipboard are lost. (Of course, you can save the image rather than clipboard-copy if you choose.) The clipboard contents can be pasted into any GTK-based application. The function now also works with OpenOffice Documents. Yeah! """ msg5 = u""" Editing has been made as simple as possible. There are lists of ROTATE, FILTER and ADJUST which allow manipulations to the angle of the image, a series of special-effects filters and small changes to the image contrast/brightness/contrast/sharpness/color, repectively. To conserve menory usage, there is no "undo" feature. However, under the image menu there is a "Restore original" option, which resets the image to the original rendition. The image-changing menus are basic in that there are no parameters to set, so starting from the original after a change of heart rarely involes much loss of time. """ msg6 = u""" Images are saved in their actual dimensions (not thumbnail-sized.) Saving an image for later use or sharing is done through the FILE menu. Files can be saved as a png or a jpg, and by default are saved as "new.png" or "new.jpg" in the user's home folder, though the name and location can be changed via the dialog. There is also a "Save Image" button to quickly save an image as a PNG. As above with the file menu item, the default behavior is to save the image as "new.png", but this can be edited in the save dialog. --This button is a bit redundant, and is mainly shown as a convenience and a remnder that the save option is available. """ msg7 = """ Paul Sherman http://www.wpclipart.com psherma1@rochester.rr.com """ msglist.insert(0,msg1) msglist.remove("") msglist.insert(1,msg2) msglist.insert(2,msg3) msglist.insert(3,msg4) msglist.insert(4,msg5) msglist.insert(5,msg6) msglist.insert(6,msg7) return msglist if __name__ == '__main__': w = Window() gtk.main()